Fri 29 Nov 2024 04:30:50 PM CET
This commit is contained in:
		
							parent
							
								
									61025b7ca7
								
							
						
					
					
						commit
						3805bcf341
					
				
							
								
								
									
										127
									
								
								src/SimNDT/core/simulation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/SimNDT/core/simulation.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,127 @@ | ||||||
|  | #!/usr/bin/env python | ||||||
|  | # encoding: utf-8 | ||||||
|  | """ | ||||||
|  | simulation.py | ||||||
|  | 
 | ||||||
|  | Created by Miguel Molero on 2013-09-30. | ||||||
|  | Copyright (c) 2013 MMolero. All rights reserved. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import numpy as np | ||||||
|  | from scipy.misc import imresize | ||||||
|  | from scipy.misc import imrotate | ||||||
|  | 
 | ||||||
|  | from SimNDT.core.material import Material | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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 Simulation: | ||||||
|  | 
 | ||||||
|  |     def __init__(self, TimeScale=1, MaxFreq=2, PointCycle=10, SimTime=50, Order=2, Device ="CPU"): | ||||||
|  | 
 | ||||||
|  |         self.TimeScale         = TimeScale | ||||||
|  |         self.MaxFreq           = MaxFreq | ||||||
|  |         self.PointCycle        = PointCycle | ||||||
|  |         self.SimulationTime    = SimTime | ||||||
|  | 
 | ||||||
|  |         self.dx = 0 | ||||||
|  |         self.dt = 0 | ||||||
|  |         # self.dx = Dx | ||||||
|  |         # self.dt = Dt | ||||||
|  |         self.t  = 0 | ||||||
|  |         self.Order    = Order | ||||||
|  |         self.Device   = Device | ||||||
|  |         self.Platform = 0 | ||||||
|  |         self.MRI = 0 | ||||||
|  |         self.NRI = 0 | ||||||
|  |         self.Im  = 0 | ||||||
|  |         self.TapGrid   = 0 | ||||||
|  |         self.Rgrid     = 0 | ||||||
|  |         self.TimeSteps = 0 | ||||||
|  | 
 | ||||||
|  |     def job_parameters(self, materiales, transducer): | ||||||
|  | 
 | ||||||
|  |         indVL = [mat.VL for mat in materiales if mat.VL > 400] | ||||||
|  |         indVT = [mat.VT for mat in materiales if mat.VT > 400] | ||||||
|  | 
 | ||||||
|  |         if transducer.PZT: | ||||||
|  |             indVL.append(pzt.VL) | ||||||
|  |             indVL.append(pzt.VT) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         VL	= np.array(indVL) | ||||||
|  |         VT	= np.array(indVT) | ||||||
|  |         V	= np.hstack( (VL, VT) ) | ||||||
|  | 
 | ||||||
|  |         self.dx = np.float32( np.min([V]) / (self.PointCycle * self.MaxFreq) ) | ||||||
|  | 
 | ||||||
|  |         if self.Order== 2: | ||||||
|  |             self.dt = 0.5 * self.TimeScale * np.float32( 0.7071 * self.dx / (	 np.max([V]) ) ) | ||||||
|  |         elif self.Order == 4: | ||||||
|  |             self.dt = self.TimeScale * np.float32( 0.48 * self.dx / (	 np.max([V]) ) ) | ||||||
|  | 
 | ||||||
|  |         self.TimeSteps = round(self.SimulationTime/self.dt) | ||||||
|  |         self.t = self.dt*np.arange(0,self.TimeSteps) | ||||||
|  | 
 | ||||||
|  |         print("Updated simulation job parameters dx="+str(self.dx)+" dt="+str(self.dt)+ " TimeSteps="+str(self.TimeSteps)+" t="+str(self.t)) | ||||||
|  | 
 | ||||||
|  |     def jobByUser(self, dx, dt): | ||||||
|  | 
 | ||||||
|  |         self.dx = dx | ||||||
|  |         self.dt = dt | ||||||
|  | 
 | ||||||
|  |         self.TimeSteps = round(self.SimulationTime/self.dt) | ||||||
|  |         self.t = self.dt*np.arange(0,self.TimeSteps) | ||||||
|  | 
 | ||||||
|  |     def create_numericalModel(self, scenario): | ||||||
|  | 
 | ||||||
|  |         #Spatial Scale | ||||||
|  |         Pixel_mm = float(scenario.Pixel_mm) | ||||||
|  | 
 | ||||||
|  |         Mp	= np.shape(scenario.Iabs)[0]*1e-3/Pixel_mm/self.dx | ||||||
|  |         self.Rgrid = float(Mp/np.shape(scenario.Iabs)[0]) | ||||||
|  |         self.TapGrid = np.around(scenario.Tap * self.Rgrid) | ||||||
|  |         self.Im = imresize(scenario.Iabs, self.Rgrid, interp='nearest') | ||||||
|  |         self.MRI, self.NRI = np.shape(self.Im) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def rotate_model(self, theta, scenario): | ||||||
|  |         Theta = theta * (180.0/np.pi) - 270. | ||||||
|  |         if Theta != 0: | ||||||
|  |             print ("type scenario: ", np.shape(scenario.I)) | ||||||
|  |             I = imrotate(np.uint8(scenario.I), Theta, interp ='nearest') | ||||||
|  |             print ("type scenario I: ", np.shape(I)) | ||||||
|  |             Iabs = scenario.applyBoundaries(I) | ||||||
|  |             self.Im = imresize(np.uint8(Iabs), self.Rgrid, interp='nearest') | ||||||
|  |             self.MRI, self.NRI = np.shape(self.Im) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def setDevice(self,Device): | ||||||
|  |         self.Device = Device | ||||||
|  | 
 | ||||||
|  |     def setPlatform(self, Platform): | ||||||
|  |         self.Platform = Platform | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def reLoad(self, Materials, Scenario, Transducer): | ||||||
|  | 
 | ||||||
|  |         self.job_parameters(Materials, Transducer) | ||||||
|  |         self.create_numericalModel(Scenario) | ||||||
|  |          | ||||||
|  |     def __str__(self): | ||||||
|  |         return "Simulation(TimeScale={}, MaxFreq={}, PointCycle={}, SimulationTime={}, Order={}, Device={})".format( | ||||||
|  |             self.TimeScale, self.MaxFreq, self.PointCycle, self.SimulationTime, self.Order, self.Device | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     def __repr__(self): | ||||||
|  |         return "Simulation(TimeScale={}, MaxFreq={}, PointCycle={}, SimulationTime={}, Order={}, Device={} dx={} dt={})".format( | ||||||
|  |             self.TimeScale, self.MaxFreq, self.PointCycle, self.SimulationTime, self.Order, self.Device, self.dx, self.dt | ||||||
|  |         ) | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user