Wed 28 Aug 21:38:52 CEST 2024
This commit is contained in:
		
							parent
							
								
									d9f4cc608a
								
							
						
					
					
						commit
						b98e96edf7
					
				
							
								
								
									
										575
									
								
								src/SimNDT/engine/efit2d.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										575
									
								
								src/SimNDT/engine/efit2d.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,575 @@ | ||||||
|  | from SimNDT.engine.engineBase import EngineBase | ||||||
|  | 
 | ||||||
|  | try: | ||||||
|  |     import SimNDT.engine.efit2dcython as EFIT2DCython | ||||||
|  | except: | ||||||
|  |     print("error in importation for Serial EFIT2D") | ||||||
|  | 
 | ||||||
|  | from SimNDT.core.material import Material | ||||||
|  | from SimNDT.core.constants import BC | ||||||
|  | 
 | ||||||
|  | import copy | ||||||
|  | import numpy as np | ||||||
|  | 
 | ||||||
|  | global ErrorImportCL | ||||||
|  | 
 | ||||||
|  | try: | ||||||
|  |     import pyopencl as cl | ||||||
|  | 
 | ||||||
|  |     ErrorImportCL = False | ||||||
|  | except ImportError: | ||||||
|  |     ErrorImportCL = True | ||||||
|  | 
 | ||||||
|  | c11 = 4350 * 4350 * 7750 | ||||||
|  | c12 = 4350 * 4350 * 7750 - 2260 * 2260 * 7750 | ||||||
|  | c22 = c11 | ||||||
|  | c44 = 2260 * 2260 * 7750 | ||||||
|  | pzt = Material("pzt", 7750.0, c11, c12, c22, c44) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EFIT2D(EngineBase): | ||||||
|  |     def __init__(self, simPack, Platform): | ||||||
|  |         EngineBase.__init__(self, simPack, Platform) | ||||||
|  | 
 | ||||||
|  |         self.max_value = 0.0 | ||||||
|  |         self._Receiver = False | ||||||
|  | 
 | ||||||
|  |     def setup_CL(self): | ||||||
|  |         if self.Platform == "OpenCL": | ||||||
|  |             self.initFieldsCL() | ||||||
|  | 
 | ||||||
|  |     def materialSetup(self): | ||||||
|  | 
 | ||||||
|  |         Materials = copy.deepcopy(self.simPack.Materials) | ||||||
|  |         MRI, NRI = np.shape(self.simPack.Simulation.Im) | ||||||
|  | 
 | ||||||
|  |         # Condicion de vacio si uno de los materiales es aire | ||||||
|  |         for n in range(len(Materials)): | ||||||
|  |             if Materials[n].Rho < 2.0: | ||||||
|  |                 Materials[n].Rho = 10e23 | ||||||
|  |                 Materials[n].C11 = 1e-20 | ||||||
|  |                 Materials[n].C12 = 1e-20 | ||||||
|  |                 Materials[n].C22 = 1e-20 | ||||||
|  |                 Materials[n].C44 = 1e-20 | ||||||
|  |                 Materials[n].Eta_v = 1e-20 | ||||||
|  |                 Materials[n].Eta_s = 1e-20 | ||||||
|  |             # verificar que no sea cero exactamente | ||||||
|  |             if Materials[n].C44 == 0: | ||||||
|  |                 Materials[n].C44 = 1e-30 | ||||||
|  |             if Materials[n].Eta_s == 0: | ||||||
|  |                 Materials[n].Eta_s = 1e-30 | ||||||
|  | 
 | ||||||
|  |         self.Rho = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.C11 = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.C12 = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.C22 = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.C44 = np.ones((MRI, NRI), dtype=np.float32) * 1e-30 | ||||||
|  |         self.Eta_v = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Eta_s = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  | 
 | ||||||
|  |         for n in range(len(Materials)): | ||||||
|  |             ind = np.nonzero(self.simPack.Simulation.Im == Materials[n].Label) | ||||||
|  |             self.Rho[ind] = Materials[n].Rho | ||||||
|  |             self.C11[ind] = Materials[n].C11 | ||||||
|  |             self.C12[ind] = Materials[n].C12 | ||||||
|  |             self.C22[ind] = Materials[n].C22 | ||||||
|  |             self.C44[ind] = Materials[n].C44 | ||||||
|  |             self.Eta_v[ind] = Materials[n].Eta_v | ||||||
|  |             self.Eta_s[ind] = Materials[n].Eta_s | ||||||
|  | 
 | ||||||
|  |         # Find the base materials | ||||||
|  |         for i, item in enumerate(Materials): | ||||||
|  |             if item.Label == 0: | ||||||
|  |                 base_material = i | ||||||
|  | 
 | ||||||
|  |         # Set material in boundaries | ||||||
|  |         ind = np.nonzero(self.simPack.Simulation.Im == 255.0) | ||||||
|  |         self.Rho[ind] = Materials[base_material].Rho | ||||||
|  |         self.C11[ind] = Materials[base_material].C11 | ||||||
|  |         self.C12[ind] = Materials[base_material].C12 | ||||||
|  |         self.C22[ind] = Materials[base_material].C22 | ||||||
|  |         self.C44[ind] = Materials[base_material].C44 | ||||||
|  |         self.Eta_v[ind] = Materials[base_material].Eta_v | ||||||
|  |         self.Eta_s[ind] = Materials[base_material].Eta_s | ||||||
|  | 
 | ||||||
|  |     def initFields(self): | ||||||
|  | 
 | ||||||
|  |         MRI, NRI = np.shape(self.simPack.Simulation.Im) | ||||||
|  |         Signal = self.simPack.Signal | ||||||
|  |         t = self.simPack.Simulation.t | ||||||
|  |         self.source = Signal.generate(t) | ||||||
|  | 
 | ||||||
|  |         self.Vx = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Vy = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Txx = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Txy = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Tyy = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.DVx = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.DVy = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.ABS = np.ones((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.SV = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  | 
 | ||||||
|  |     def staggeredProp(self): | ||||||
|  | 
 | ||||||
|  |         MRI, NRI = np.shape(self.simPack.Simulation.Im) | ||||||
|  | 
 | ||||||
|  |         BXtemp = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         BYtemp = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.BX = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.BY = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.C44_Eff = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  | 
 | ||||||
|  |         BXtemp[:, :] = 1.0 / self.Rho[:, :] | ||||||
|  |         BYtemp[:, :] = 1.0 / self.Rho[:, :] | ||||||
|  | 
 | ||||||
|  |         self.BX[:-2, :] = 0.5 * (BXtemp[1:-1, :] + BXtemp[:-2, :]) | ||||||
|  |         self.BX[-2, :] = np.copy(BXtemp[-2, :]) | ||||||
|  | 
 | ||||||
|  |         self.BY[:, :-2] = 0.5 * (BYtemp[:, 1:-1] + BYtemp[:, :-2]) | ||||||
|  |         self.BY[:, -2] = np.copy(BYtemp[:, -2]) | ||||||
|  | 
 | ||||||
|  |         self.C44_Eff[:-2, :-2] = 4. / ( | ||||||
|  |             (1. / self.C44[:-2, :-2]) + (1. / self.C44[1:-1, :-2]) + (1. / self.C44[:-2, 1:-1]) + ( | ||||||
|  |                 1. / self.C44[1:-1, 1:-1])) | ||||||
|  | 
 | ||||||
|  |         self.Eta_vs = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Eta_ss = np.zeros((MRI, NRI), dtype=np.float32) | ||||||
|  |         self.Eta_vs = self.Eta_v + 2 * self.Eta_s | ||||||
|  |         self.Eta_ss[:-2, :-2] = 4. / ( | ||||||
|  |             (1. / self.Eta_s[:-2, :-2]) + (1. / self.Eta_s[1:-1, :-2]) + (1. / self.Eta_s[:-2, 1:-1]) + ( | ||||||
|  |                 1. / self.Eta_s[1:-1, 1:-1])) | ||||||
|  | 
 | ||||||
|  |     def applyBoundaries(self): | ||||||
|  |         Materials = copy.deepcopy(self.simPack.Materials) | ||||||
|  |         MRI, NRI = np.shape(self.simPack.Simulation.Im) | ||||||
|  | 
 | ||||||
|  |         APARA = 0.015 | ||||||
|  | 
 | ||||||
|  |         Top = int(self.simPack.Simulation.TapGrid[0]) | ||||||
|  |         Bottom = int(self.simPack.Simulation.TapGrid[1]) | ||||||
|  |         Left = int(self.simPack.Simulation.TapGrid[2]) | ||||||
|  |         Right = int(self.simPack.Simulation.TapGrid[3]) | ||||||
|  | 
 | ||||||
|  |         _Top = Top - np.arange(0, Top) | ||||||
|  |         _Bottom = np.arange(MRI - Bottom + 1, MRI) - MRI + Bottom - 1 | ||||||
|  |         _Left = Left - np.arange(0, Left) | ||||||
|  |         _Right = np.arange(NRI - Right + 1, NRI) - NRI + Right - 1 | ||||||
|  | 
 | ||||||
|  |         Boundaries = self.simPack.Boundary | ||||||
|  |         for boundary in Boundaries: | ||||||
|  |             if boundary.Name == "Top" and boundary.BC == BC.AirLayer: | ||||||
|  |                 self.BX[0:Top, :] = 0.0 | ||||||
|  |                 self.BY[0:Top, :] = 0.0 | ||||||
|  |                 self.C11[0:Top, :] = 0.0 | ||||||
|  |                 self.C12[0:Top, :] = 0.0 | ||||||
|  |                 self.C22[0:Top, :] = 0.0 | ||||||
|  |                 self.C44_Eff[0:Top, :] = 0.0 | ||||||
|  |                 self.Eta_vs[0:Top, :] = 0.0 | ||||||
|  |                 self.Eta_ss[0:Top, :] = 0.0 | ||||||
|  | 
 | ||||||
|  |             if boundary.Name == "Bottom" and boundary.BC == BC.AirLayer: | ||||||
|  |                 self.BX[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.BY[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.C11[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.C12[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.C22[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.C44_Eff[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.Eta_vs[MRI - Bottom:, :] = 0.0 | ||||||
|  |                 self.Eta_ss[MRI - Bottom:, :] = 0.0 | ||||||
|  | 
 | ||||||
|  |             if boundary.Name == "Left" and boundary.BC == BC.AirLayer: | ||||||
|  |                 self.BX[:, 0:Left] = 0.0 | ||||||
|  |                 self.BY[:, 0:Left] = 0.0 | ||||||
|  |                 self.C11[:, 0:Left] = 0.0 | ||||||
|  |                 self.C12[:, 0:Left] = 0.0 | ||||||
|  |                 self.C22[:, 0:Left] = 0.0 | ||||||
|  |                 self.C44_Eff[:, 0:Left] = 0.0 | ||||||
|  |                 self.Eta_vs[:, 0:Left] = 0.0 | ||||||
|  |                 self.Eta_ss[:, 0:Left] = 0.0 | ||||||
|  |             if boundary.Name == "Right" and boundary.BC == BC.AirLayer: | ||||||
|  |                 self.BX[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.BY[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.C11[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.C12[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.C22[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.C44_Eff[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.Eta_vs[:, NRI - Right:] = 0.0 | ||||||
|  |                 self.Eta_ss[:, NRI - Right:] = 0.0 | ||||||
|  | 
 | ||||||
|  |         for j in range(0, NRI): | ||||||
|  |             self.ABS[0:Top, j] = np.exp(- ((APARA * _Top) ** 2)) | ||||||
|  |             self.ABS[MRI - Bottom + 1:, j] = np.exp(- ((APARA * _Bottom) ** 2)) | ||||||
|  |         for i in range(0, MRI): | ||||||
|  |             self.ABS[i, 0:Left] = np.exp(- ((APARA * _Left) ** 2)) | ||||||
|  |             self.ABS[i, NRI - Right + 1:] = np.exp(- ((APARA * _Right) ** 2)) | ||||||
|  | 
 | ||||||
|  |     def sourceSetup(self): | ||||||
|  | 
 | ||||||
|  |         longitudinal = self.simPack.Source.Longitudinal | ||||||
|  |         shear = self.simPack.Source.Shear | ||||||
|  | 
 | ||||||
|  |         Pressure = self.simPack.Source.Pressure | ||||||
|  |         Displacement = self.simPack.Source.Displacement | ||||||
|  | 
 | ||||||
|  |         if Pressure and not Displacement: | ||||||
|  |             self.typeSource = 0 | ||||||
|  |         elif not Pressure and Displacement: | ||||||
|  |             self.typeSource = 1 | ||||||
|  |         elif Pressure and Displacement: | ||||||
|  |             self.typeSource = 2 | ||||||
|  |         else: | ||||||
|  |             self.typeSource = 0 | ||||||
|  | 
 | ||||||
|  |         if longitudinal and not shear: | ||||||
|  |             self.typeWave = np.int32(0) | ||||||
|  |         elif not longitudinal and shear: | ||||||
|  |             self.typeWave = np.int32(1) | ||||||
|  |         elif longitudinal and shear: | ||||||
|  |             self.typeWave = np.int32(2) | ||||||
|  |         else: | ||||||
|  |             self.typeWave = np.int32(0) | ||||||
|  | 
 | ||||||
|  |         self.Amplitude = self.simPack.Signal.Amplitude | ||||||
|  |         XL = self.simPack.Inspection.XL | ||||||
|  |         YL = self.simPack.Inspection.YL | ||||||
|  |         NX = np.size(XL, 0) | ||||||
|  | 
 | ||||||
|  |         IsPZT = self.simPack.Transducers[0].PZT | ||||||
|  | 
 | ||||||
|  |         size1 = int((self.simPack.Simulation.TapGrid[0])) | ||||||
|  |         size2 = int((self.simPack.Simulation.TapGrid[1])) | ||||||
|  | 
 | ||||||
|  |         for IT in range(-size1, 0): | ||||||
|  |             for m in range(0, NX): | ||||||
|  |                 xl = int(XL[m, 0]) | ||||||
|  |                 yl = int(YL[m, 0]) | ||||||
|  |                 self.BX[xl + IT, yl] = 1.0 / pzt.Rho if IsPZT else 0 | ||||||
|  |                 self.BY[xl + IT, yl] = 1.0 / pzt.Rho if IsPZT else 0 | ||||||
|  |                 self.C11[xl + IT, yl] = pzt.C11 if IsPZT else 0 | ||||||
|  |                 self.C12[xl + IT, yl] = pzt.C12 if IsPZT else 0 | ||||||
|  |                 self.C22[xl + IT, yl] = pzt.C22 if IsPZT else 0 | ||||||
|  |                 self.C44[xl + IT, yl] = pzt.C44 if IsPZT else 0 | ||||||
|  | 
 | ||||||
|  |         if self.simPack.Inspection.Name == "Transmission": | ||||||
|  |             for IT in range(1, size2): | ||||||
|  |                 for m in range(0, NX): | ||||||
|  |                     xl = int(XL[m, 1]) | ||||||
|  |                     yl = int(YL[m, 1]) | ||||||
|  |                     self.BX[xl + IT, yl] = 1.0 / pzt.Rho if IsPZT else 0 | ||||||
|  |                     self.BY[xl + IT, yl] = 1.0 / pzt.Rho if IsPZT else 0 | ||||||
|  |                     self.C11[xl + IT, yl] = pzt.C11 if IsPZT else 0 | ||||||
|  |                     self.C12[xl + IT, yl] = pzt.C12 if IsPZT else 0 | ||||||
|  |                     self.C22[xl + IT, yl] = pzt.C22 if IsPZT else 0 | ||||||
|  |                     self.C44[xl + IT, yl] = pzt.C44 if IsPZT else 0 | ||||||
|  | 
 | ||||||
|  |     def simSetup(self): | ||||||
|  |         self.MRI, self.NRI = np.shape(self.simPack.Simulation.Im) | ||||||
|  |         XL = self.simPack.Inspection.XL | ||||||
|  |         YL = self.simPack.Inspection.YL | ||||||
|  | 
 | ||||||
|  |         self.NX = np.size(XL, 0) | ||||||
|  |         self.XL = np.copy(np.int32(XL[:, 0])) | ||||||
|  |         self.YL = np.copy(np.int32(YL[:, 0])) | ||||||
|  | 
 | ||||||
|  |         if self.simPack.Transducers[0].Window and not self.simPack.Transducers[0].PointSource: | ||||||
|  |             self.win = np.float32(1.0 - np.cos(2 * np.pi * np.arange(0, self.NX) / (self.NX + 1))) | ||||||
|  |         else: | ||||||
|  |             self.win = np.ones((self.NX,), dtype=np.float32) | ||||||
|  | 
 | ||||||
|  |     def initFieldsCL(self): | ||||||
|  | 
 | ||||||
|  |         self.Txx_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.Txx) | ||||||
|  |         self.Tyy_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.Tyy) | ||||||
|  |         self.Txy_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.Txy) | ||||||
|  |         self.Vx_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.Vx) | ||||||
|  |         self.Vy_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.Vy) | ||||||
|  | 
 | ||||||
|  |         self.DVx_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.DVx) | ||||||
|  |         self.DVy_buf = cl.Buffer(self.ctx, self.mf.READ_WRITE | self.mf.COPY_HOST_PTR, hostbuf=self.DVy) | ||||||
|  | 
 | ||||||
|  |         self.ABS_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.ABS) | ||||||
|  |         self.BX_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.BX) | ||||||
|  |         self.BY_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.BY) | ||||||
|  |         self.C11_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.C11) | ||||||
|  |         self.C12_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.C12) | ||||||
|  |         self.C44_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.C44_Eff) | ||||||
|  | 
 | ||||||
|  |         self.ETA_vs_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.Eta_vs) | ||||||
|  |         self.ETA_s_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.Eta_s) | ||||||
|  |         self.ETA_ss_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.Eta_ss) | ||||||
|  | 
 | ||||||
|  |         self.XL_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.XL) | ||||||
|  |         self.YL_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.YL) | ||||||
|  | 
 | ||||||
|  |         self.WIN_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.win) | ||||||
|  | 
 | ||||||
|  |         if not self.simPack.Inspection.Name == "Tomography": | ||||||
|  |             self._Receiver = True | ||||||
|  |             XL = self.simPack.Inspection.XL | ||||||
|  |             YL = self.simPack.Inspection.YL | ||||||
|  |             self.receiver_buf = cl.Buffer(self.ctx, self.mf.WRITE_ONLY | self.mf.COPY_HOST_PTR, | ||||||
|  |                                           hostbuf=self.receiver_signals) | ||||||
|  |             self.XXL = np.copy(np.int32(XL[:, 1])) | ||||||
|  |             self.YYL = np.copy(np.int32(YL[:, 1])) | ||||||
|  |             self.XXL_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.XXL) | ||||||
|  |             self.YYL_buf = cl.Buffer(self.ctx, self.mf.READ_ONLY | self.mf.COPY_HOST_PTR, hostbuf=self.YYL) | ||||||
|  | 
 | ||||||
|  |         self.program = cl.Program(self.ctx, self.kernel()).build() | ||||||
|  | 
 | ||||||
|  |     def receiverSetup(self): | ||||||
|  |         TimeSteps = int(self.simPack.Simulation.TimeSteps) | ||||||
|  |         N_IR = np.size(self.simPack.Inspection.IR, 1) | ||||||
|  |         self.receiver_signals = np.zeros((TimeSteps, N_IR - 1), dtype=np.float32) | ||||||
|  | 
 | ||||||
|  |     # @blab+ | ||||||
|  |     def clEnqueue(self, Var, Var_buf): | ||||||
|  |         # external access to Txx .. for snapshoting needs enqueueing of CL buffers | ||||||
|  |         cl.enqueue_copy(self.queue, Var, Var_buf) | ||||||
|  | 
 | ||||||
|  |     def receivers(self, Var, Var_buf): | ||||||
|  |         if self._Receiver: | ||||||
|  |             self.program.Receiver_EFIT2D(self.queue, (self.NX,), None, self.Txx_buf, self.receiver_buf, | ||||||
|  |                                          np.int32(self.n), | ||||||
|  |                                          self.XXL_buf, self.YYL_buf).wait() | ||||||
|  |         else: | ||||||
|  |             cl.enqueue_copy(self.queue, Var, Var_buf) | ||||||
|  |             self.receiver_signals[self.n, :] = self.simPack.Inspection.getReceivers(Var) | ||||||
|  | 
 | ||||||
|  |     def saveOutput(self): | ||||||
|  |         if self._Receiver: | ||||||
|  |             cl.enqueue_copy(self.queue, self.receiver_signals, self.receiver_buf).wait() | ||||||
|  | 
 | ||||||
|  |     def receiversSerial(self, Var): | ||||||
|  |         self.receiver_signals[self.n, :] = self.simPack.Inspection.getReceivers(Var) | ||||||
|  | 
 | ||||||
|  |     def run(self): | ||||||
|  | 
 | ||||||
|  |         y = np.float32(self.source[self.n]) | ||||||
|  |         self.program.Velocity_EFIT2D_Voigt(self.queue, (self.NRI, self.MRI,), None, | ||||||
|  |                                            self.Txx_buf, self.Txy_buf, self.Tyy_buf, | ||||||
|  |                                            self.Vx_buf, self.Vy_buf, self.DVx_buf, self.DVy_buf, | ||||||
|  |                                            self.BX_buf, self.BY_buf, self.ABS_buf, self.ddx).wait() | ||||||
|  | 
 | ||||||
|  |         if self.typeSource == 1 or self.typeSource == 2: | ||||||
|  |             self.program.Source_Vel_EFIT2D(self.queue, (self.NX,), None, | ||||||
|  |                                            self.Vx_buf, | ||||||
|  |                                            self.Vy_buf, | ||||||
|  |                                            self.XL_buf, | ||||||
|  |                                            self.YL_buf, | ||||||
|  |                                            y, self.typeWave, self.WIN_buf).wait() | ||||||
|  | 
 | ||||||
|  |         self.program.Stress_EFIT2D_Voigt(self.queue, (self.NRI, self.MRI,), None, | ||||||
|  |                                          self.Txx_buf, self.Txy_buf, self.Tyy_buf, | ||||||
|  |                                          self.Vx_buf, self.Vy_buf, self.DVx_buf, self.DVy_buf, | ||||||
|  |                                          self.C11_buf, self.C12_buf, self.C44_buf, self.ETA_vs_buf, | ||||||
|  |                                          self.ETA_s_buf, self.ETA_ss_buf, self.ABS_buf).wait() | ||||||
|  | 
 | ||||||
|  |         if self.typeSource == 0 or self.typeSource == 2: | ||||||
|  |             self.program.Source_EFIT2D(self.queue, (self.NX,), None, | ||||||
|  |                                        self.Txx_buf, | ||||||
|  |                                        self.Tyy_buf, | ||||||
|  |                                        self.Txy_buf, | ||||||
|  |                                        self.XL_buf, | ||||||
|  |                                        self.YL_buf, | ||||||
|  |                                        y, self.typeWave, self.WIN_buf).wait() | ||||||
|  | 
 | ||||||
|  |         self.receivers(self.Txx, self.Txx_buf) | ||||||
|  | 
 | ||||||
|  |     def runGL(self): | ||||||
|  |         cl.enqueue_copy(self.queue, self.Vx, self.Vx_buf) | ||||||
|  |         cl.enqueue_copy(self.queue, self.Vy, self.Vy_buf) | ||||||
|  |         self.SV = np.sqrt(self.Vx ** 2 + self.Vy ** 2) | ||||||
|  |         value = np.max(np.abs(self.SV)) | ||||||
|  |         self.max_value = self.max_value if self.max_value >= value else value | ||||||
|  |         self.SV = 20. * np.log10(np.abs(self.SV) / self.max_value + 1e-40) | ||||||
|  | 
 | ||||||
|  |     def runGLSerial(self, step=50): | ||||||
|  | 
 | ||||||
|  |         vx = np.copy(self.Vx) | ||||||
|  |         vy = np.copy(self.Vy) | ||||||
|  | 
 | ||||||
|  |         self.SV = np.sqrt(vx ** 2 + vy ** 2) | ||||||
|  |         value = np.max(np.abs(self.SV)) | ||||||
|  |         self.max_value = self.max_value if self.max_value >= value else value | ||||||
|  |         self.SV = 20. * np.log10(np.abs(self.SV) / self.max_value + 1e-40) | ||||||
|  | 
 | ||||||
|  |     def runSerial(self): | ||||||
|  | 
 | ||||||
|  |         y = np.float32(self.source[self.n]) | ||||||
|  | 
 | ||||||
|  |         self.Vx, self.Vy, self.DVx, self.DVy = EFIT2DCython.velocityVoigt(self.Txx, self.Txy, self.Tyy, | ||||||
|  |                                                                           self.Vx, self.Vy, self.DVx, self.DVy, | ||||||
|  |                                                                           self.BX, self.BY, self.ABS, self.ddx, | ||||||
|  |                                                                           self.dt) | ||||||
|  | 
 | ||||||
|  |         if self.typeSource == 1 or self.typeSource == 2: | ||||||
|  |             self.Vx, self.Vy = EFIT2DCython.sourceVel(self.Vx, self.Vy, self.XL, self.YL, y, self.typeWave, self.win, | ||||||
|  |                                                       self.dtdxx) | ||||||
|  | 
 | ||||||
|  |         self.Txx, self.Tyy, self.Txy = EFIT2DCython.stressVoigt(self.Txx, self.Txy, self.Tyy, | ||||||
|  |                                                                 self.Vx, self.Vy, self.DVx, self.DVy, | ||||||
|  |                                                                 self.C11, self.C12, self.C44_Eff, | ||||||
|  |                                                                 self.Eta_vs, self.Eta_s, self.Eta_ss, self.ABS, | ||||||
|  |                                                                 self.dtx) | ||||||
|  | 
 | ||||||
|  |         if self.typeSource == 0 or self.typeSource == 2: | ||||||
|  |             self.Txx, self.Tyy = EFIT2DCython.sourceStress(self.Txx, self.Tyy, self.XL, self.YL, y, self.typeWave, | ||||||
|  |                                                            self.win, self.dtdxx) | ||||||
|  | 
 | ||||||
|  |         self.receiversSerial(self.Txx) | ||||||
|  | 
 | ||||||
|  |     def kernel(self): | ||||||
|  | 
 | ||||||
|  |         macro = """ | ||||||
|  | 					 #define MRI		%s | ||||||
|  | 					 #define NRI		%s | ||||||
|  | 					 #define ind(i, j)	( ( (i)*NRI) + (j) ) | ||||||
|  | 					 #define dtx		%gf | ||||||
|  | 					 #define dtdxx		%gf | ||||||
|  | 					 #define Stencil	2 | ||||||
|  | 					 #define NX			%s | ||||||
|  | 					 #define dt			%gf | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		""" % (str(self.MRI), str(self.NRI), self.dtx, self.dtdxx, | ||||||
|  |                str(self.NX), self.dt) | ||||||
|  | 
 | ||||||
|  |         return macro + """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			__kernel void Receiver_EFIT2D(__global float *Buffer, __global float *receiver, const int t, | ||||||
|  | 							              __global const int *XXL, __global const int *YYL){ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			  __private float _tmp = 0.0f; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			   for (int i=0; i<get_global_size(0); ++i) | ||||||
|  | 		       { | ||||||
|  | 				 _tmp +=  Buffer[ind(XXL[i],YYL[i])]; | ||||||
|  | 			   } | ||||||
|  | 			   receiver[t] = _tmp/(float)get_global_size(0); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			__kernel void Source_Vel_EFIT2D(__global float *Vx, __global float *Vy,  | ||||||
|  | 										__global const int	 *XL, __global const int *YL,   | ||||||
|  | 										  const float source, const int Stype, __global const float *win){ | ||||||
|  | 
 | ||||||
|  | 					 uint m =  get_global_id(0); | ||||||
|  | 
 | ||||||
|  | 					 int ix = XL[m]; | ||||||
|  | 					 int iy = YL[m]; | ||||||
|  | 					 if (Stype ==0){ | ||||||
|  | 					  Vx[ind(ix,iy)]   -= (source*dtdxx)*win[m]; | ||||||
|  | 					 } | ||||||
|  | 					else if (Stype ==1){ | ||||||
|  | 					  Vy[ind(ix,iy)]   -= (source*dtdxx)*win[m]; | ||||||
|  | 					 } | ||||||
|  | 					else if (Stype ==2){ | ||||||
|  | 					  Vx[ind(ix,iy)]   -= (source*dtdxx)*win[m]; | ||||||
|  | 					  Vy[ind(ix,iy)]   -= (source*dtdxx)*win[m]; | ||||||
|  | 					 } | ||||||
|  | 
 | ||||||
|  | 			   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			__kernel void Source_EFIT2D(__global float *Txx, __global float *Tyy, __global float *Txy, | ||||||
|  | 										__global const int	 *XL, __global const int *YL,   | ||||||
|  | 										  const float source, const int Stype,__global const float *win){ | ||||||
|  | 
 | ||||||
|  | 					 uint m =  get_global_id(0); | ||||||
|  | 
 | ||||||
|  | 					 int ix = XL[m]; | ||||||
|  | 					 int iy = YL[m]; | ||||||
|  | 					 if (Stype ==0){ | ||||||
|  | 					  Txx[ind(ix,iy)]	-= (source*dtdxx)*win[m]; | ||||||
|  | 					  //Txy[ind(ix,iy)]	   = 0; | ||||||
|  | 					 } | ||||||
|  | 					else if (Stype ==1){ | ||||||
|  | 					  Tyy[ind(ix,iy)]	-= (source*dtdxx)*win[m]; | ||||||
|  | 					  //Txy[ind(ix,iy)]	   = 0; | ||||||
|  | 					 } | ||||||
|  | 					else if (Stype ==2){ | ||||||
|  | 					  Txx[ind(ix,iy)]	-= (source*dtdxx)*win[m]; | ||||||
|  | 					  Tyy[ind(ix,iy)]	-= (source*dtdxx)*win[m]; | ||||||
|  | 					  //Txy[ind(ix,iy)]	   = 0; | ||||||
|  | 					 } | ||||||
|  | 
 | ||||||
|  | 			   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		  __kernel void Velocity_EFIT2D_Voigt( __global float *Txx, __global float *Txy, __global float *Tyy, | ||||||
|  | 											   __global float *vx,	__global float *vy, | ||||||
|  | 											   __global float *dvx, __global float *dvy, | ||||||
|  | 											   __global const float *BX, __global const float *BY, | ||||||
|  | 											   __global const float *ABS, const float ddx){ | ||||||
|  | 
 | ||||||
|  | 					int j = get_global_id(0); | ||||||
|  | 					int i = get_global_id(1); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 						  if (i <  MRI-1 && j>0){ | ||||||
|  | 								dvx[ind(i,j)]	 = (BX[ind(i,j)]*ddx)*( Txx[ind(i+1,j)] - Txx[ind(i,j)]	  + Txy[ind(i,j)] - Txy[ind(i,j-1)] ); | ||||||
|  | 								vx[ind(i,j)]	+= dt*dvx[ind(i,j)]; | ||||||
|  | 						  } | ||||||
|  | 
 | ||||||
|  | 						  if (i > 0 &&	j< NRI-1){ | ||||||
|  | 								dvy[ind(i,j)]	 = (BY[ind(i,j)]*ddx)*( Txy[ind(i,j)]  - Txy[ind(i-1,j)] + Tyy[ind(i,j+1)] - Tyy[ind(i,j)]		 ); | ||||||
|  | 								vy[ind(i,j)]	+= dt*dvy[ind(i,j)]; | ||||||
|  | 
 | ||||||
|  | 						  } | ||||||
|  | 
 | ||||||
|  | 						   barrier(CLK_GLOBAL_MEM_FENCE); | ||||||
|  | 							// Apply absorbing boundary conditions | ||||||
|  | 						   vx[ind(i,j)]	  *= ABS[ind(i,j)]; | ||||||
|  | 						   vy[ind(i,j)]	  *= ABS[ind(i,j)]; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 						 } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 				__kernel void Stress_EFIT2D_Voigt(__global float *Txx, __global float *Txy, __global float *Tyy, | ||||||
|  | 												  __global float *vx,  __global float *vy, | ||||||
|  | 												  __global float *dvx, __global float *dvy, | ||||||
|  | 												  __global const float *C11,   __global const float *C12, __global const float *C44, | ||||||
|  | 												  __global const float *ETA_VS, __global const float *ETA_S, __global const float *ETA_SS, | ||||||
|  | 												  __global const float *ABS) { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 						int j = get_global_id(0); | ||||||
|  | 						int i = get_global_id(1); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 						if (i>0 &&	j>0 ){ | ||||||
|  | 								Txx[ind(i,j)] += (	( C11[ind(i,j)]* dtx )*(vx[ind(i,j)] - vx[ind(i-1,j)]) + | ||||||
|  | 													( C12[ind(i,j)]* dtx )*(vy[ind(i,j)] - vy[ind(i,j-1)]) + | ||||||
|  | 													( (ETA_VS[ind(i,j)])*dtx) * (dvx[ind(i,j)] - dvx[ind(i-1,j)]) + | ||||||
|  | 													( (ETA_S [ind(i,j)])*dtx) * (dvy[ind(i,j)] - dvy[ind(i,j-1)]) ); | ||||||
|  | 
 | ||||||
|  | 								Tyy[ind(i,j)] += (	( C12[ind(i,j)]* dtx )*(vx[ind(i,j)] - vx[ind(i-1,j)]) + | ||||||
|  | 													( C11[ind(i,j)]* dtx )*(vy[ind(i,j)] - vy[ind(i,j-1)]) + | ||||||
|  | 													( (ETA_VS[ind(i,j)])*dtx) *(dvy[ind(i,j)] - dvy[ind(i,j-1)]) + | ||||||
|  | 													( (ETA_S [ind(i,j)])*dtx) * (dvx[ind(i,j)] - dvx[ind(i-1,j)]) ); | ||||||
|  | 						 } | ||||||
|  | 
 | ||||||
|  | 						 if (i<MRI-1  && j<NRI-1){ | ||||||
|  | 								Txy[ind(i,j)] +=	(  ( C44[ind(i,j)]	   * dtx )*(vx[ind(i,j+1)] - vx[ind(i,j)] + vy[ind(i+1,j)] - vy[ind(i,j)])		+ | ||||||
|  | 													   ( ETA_SS[ind(i,j)]  * dtx )*(dvx[ind(i,j+1)] - dvx[ind(i,j)] + dvy[ind(i+1,j)] - dvy[ind(i,j)] ) ); | ||||||
|  | 								 } | ||||||
|  | 
 | ||||||
|  | 						  barrier(CLK_GLOBAL_MEM_FENCE); | ||||||
|  | 
 | ||||||
|  | 						  Txx[ind(i,j)] *= ABS[ind(i,j)]; | ||||||
|  | 						  Tyy[ind(i,j)] *= ABS[ind(i,j)]; | ||||||
|  | 						  Txy[ind(i,j)] *= ABS[ind(i,j)]; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		""" | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user