Wed 28 Aug 21:38:52 CEST 2024
This commit is contained in:
		
							parent
							
								
									13f4cad47a
								
							
						
					
					
						commit
						d29b2d3563
					
				
							
								
								
									
										405
									
								
								src/SimNDT/gui/engineController.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										405
									
								
								src/SimNDT/gui/engineController.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,405 @@ | ||||||
|  | __author__ = 'Miguel Molero' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import time, sys | ||||||
|  | import numpy as np | ||||||
|  | 
 | ||||||
|  | from PySide.QtCore import * | ||||||
|  | from SimNDT.gui.Warnings import WarningParms | ||||||
|  | 
 | ||||||
|  | from SimNDT.engine.efit2d import EFIT2D | ||||||
|  | from SimNDT.graphics.mplWidget import PlotInline | ||||||
|  | from SimNDT.core.signal import Signals | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EngineController(): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, simPack, GL= False, IsReceiverPlot = False, statusBarWidget=None, parent= None): | ||||||
|  | 
 | ||||||
|  |         self.simPack = simPack | ||||||
|  |         self.GL	= GL | ||||||
|  |         self.IsReceiverPlot = IsReceiverPlot | ||||||
|  |         self.statusBarWidget = statusBarWidget | ||||||
|  |         self.parent = parent | ||||||
|  | 
 | ||||||
|  |         Platform = self.simPack.Simulation.Platform | ||||||
|  |         if Platform is not "Serial": | ||||||
|  |             Platform = "OpenCL" | ||||||
|  | 
 | ||||||
|  |         self.Platform = Platform | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def run(self): | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         self.TimeSteps  = self.simPack.Simulation.TimeSteps | ||||||
|  |         Name = self.simPack.Inspection.Name | ||||||
|  | 
 | ||||||
|  |         if Name == "Transmission" or Name == "PulseEcho": | ||||||
|  |             state = self._run_SingleLaunch() | ||||||
|  |             return state | ||||||
|  |         elif Name == "LinearScan": | ||||||
|  |             state = self._run_LinearScan() | ||||||
|  |             return state | ||||||
|  | 
 | ||||||
|  |         elif Name == "Tomography": | ||||||
|  |             state = self._run_Tomography() | ||||||
|  |             return state | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _chooseModel(self): | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         self.SimNDT_FD	= EFIT2D(self.simPack, self.Platform) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             self.SimNDT_FD.setup_CL() | ||||||
|  | 
 | ||||||
|  |         except Exception as e: | ||||||
|  |             msgBox = WarningParms("Error!!!!!!!!!!!!!!!!!! %s"% e.message) | ||||||
|  |             if msgBox.exec_(): | ||||||
|  |                 sys.exit() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def getReceivers(self): | ||||||
|  |         return self.receiver_signals | ||||||
|  | 
 | ||||||
|  |     def _run_SingleLaunch(self): | ||||||
|  |         self.Times = 1.0 | ||||||
|  |         self.n = 0 | ||||||
|  |         self._chooseModel() | ||||||
|  |         start = time.time() | ||||||
|  |         state = self._process() | ||||||
|  |         self.SimNDT_FD.saveOutput() | ||||||
|  |         print ("Elapsed Time: ",  time.time() -start) | ||||||
|  |         self.receiver_signals = self.SimNDT_FD.receiver_signals.copy() | ||||||
|  |         return state | ||||||
|  | 
 | ||||||
|  |     def _run_LinearScan(self): | ||||||
|  |         self.Times = np.size(self.simPack.Inspection.ScanVector) | ||||||
|  |         lscan = np.zeros((int(self.TimeSteps),int(self.Times))).astype(np.float32) | ||||||
|  | 
 | ||||||
|  |         n=0 | ||||||
|  |         self.n = 0 | ||||||
|  | 
 | ||||||
|  |         self.statusBarWidget.labelInspectionStatusBar.setText("#Inspection: %d - %d "%(n,self.Times)) | ||||||
|  |         self.statusBarWidget.labelInspectionStatusBar.show() | ||||||
|  |         QCoreApplication.processEvents() | ||||||
|  | 
 | ||||||
|  |         start = time.time() | ||||||
|  |         for idx, offset in enumerate(self.simPack.Inspection.ScanVector): | ||||||
|  |             self.simPack.Transducers[0].CenterOffset = offset | ||||||
|  |             self.simPack.Inspection.setInspection(	self.simPack.Scenario, | ||||||
|  |                                                     self.simPack.Transducers[0], | ||||||
|  |                                                     self.simPack.Simulation) | ||||||
|  |             self._chooseModel() | ||||||
|  |             state = self._process(idx) | ||||||
|  |             self.SimNDT_FD.saveOutput() | ||||||
|  |             lscan[:,n] = self.SimNDT_FD.receiver_signals.copy()[:,0] | ||||||
|  |             n+=1 | ||||||
|  | 
 | ||||||
|  |             self.statusBarWidget.labelInspectionStatusBar.setText("#Inspection: %d - %d "%(n,self.Times)) | ||||||
|  |             QCoreApplication.processEvents() | ||||||
|  |             if state == "Stop": | ||||||
|  |                 break | ||||||
|  | 
 | ||||||
|  |         print ("Elapsed Time: ",  time.time() -start) | ||||||
|  | 
 | ||||||
|  |         self.receiver_signals = lscan.copy() | ||||||
|  |         return state | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _run_Tomography(self): | ||||||
|  | 
 | ||||||
|  |         Ntheta = np.size(self.simPack.Inspection.Theta) | ||||||
|  |         Ntheta1		 = Ntheta-1 | ||||||
|  |         if self.simPack.Inspection.OneProjection: | ||||||
|  | 
 | ||||||
|  |             self.n = 0 | ||||||
|  |             self.Times = 1.0 | ||||||
|  |             self.receiver_signals = np.zeros((self.TimeSteps, Ntheta1 ), dtype=np.float32 ) | ||||||
|  |             self._chooseModel() | ||||||
|  |             state = self._process() | ||||||
|  |             self.receiver_signals[:,:] = self.SimNDT_FD.receiver_signals.copy()[:,:] | ||||||
|  | 
 | ||||||
|  |         else: | ||||||
|  |             self.n = 0 | ||||||
|  |             n = 0 | ||||||
|  |             self.Times = Ntheta | ||||||
|  |             self.statusBarWidget.labelInspectionStatusBar.setText("#Inspection: %d - %d "%(n,self.Times)) | ||||||
|  |             self.statusBarWidget.labelInspectionStatusBar.show() | ||||||
|  |             QCoreApplication.processEvents() | ||||||
|  |             self.receiver_signals = np.zeros((int(self.TimeSteps), int(Ntheta1), int(Ntheta)), dtype=np.float32 ) | ||||||
|  | 
 | ||||||
|  |             for idx, theta in enumerate(self.simPack.Inspection.Theta): | ||||||
|  |                 self.simPack.Simulation.rotate_model(theta,self.simPack.Scenario) | ||||||
|  |                 self._chooseModel() | ||||||
|  |                 state = self._process(idx) | ||||||
|  |                 self.receiver_signals[:,:, n] = self.SimNDT_FD.receiver_signals.copy()[:,:] | ||||||
|  |                 n +=1 | ||||||
|  |                 self.statusBarWidget.labelInspectionStatusBar.setText("#Inspection: %d - %d "%(n,self.Times)) | ||||||
|  |                 QCoreApplication.processEvents() | ||||||
|  |                 if state == "Stop": | ||||||
|  |                     break | ||||||
|  | 
 | ||||||
|  |         return state | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _process(self, idx = None): | ||||||
|  |         if self.Platform == "OpenCL": | ||||||
|  |             if self.GL: | ||||||
|  |                 state = self._runGL(idx) | ||||||
|  |                 return state | ||||||
|  |             else: | ||||||
|  |                 state = self._run(idx) | ||||||
|  |                 return state | ||||||
|  |         elif self.Platform == "Serial": | ||||||
|  |             if self.GL: | ||||||
|  |                 state = self._runGLSerial(idx) | ||||||
|  |                 return state | ||||||
|  |             else: | ||||||
|  |                 state = self._runSerial(idx) | ||||||
|  |                 return state | ||||||
|  | 
 | ||||||
|  |     # @blab+ | ||||||
|  |     def saveOptions(self, step, idx): | ||||||
|  | 
 | ||||||
|  |         if (self.SimNDT_FD.n % step==0): | ||||||
|  |             value = (self.n/float(self.TimeSteps*self.Times))*100 | ||||||
|  |             self.statusBarWidget.barStatus.setValue(value) | ||||||
|  |             self.statusBarWidget.labelStatusBar.setText(" Steps: %d - %d"%(self.SimNDT_FD.n, self.TimeSteps)) | ||||||
|  |             QCoreApplication.processEvents() | ||||||
|  | 
 | ||||||
|  |         if self.parent.SimNDT_SnapShots.IsEnable: | ||||||
|  |             if (self.SimNDT_FD.n % self.parent.SimNDT_SnapShots.Step==0): | ||||||
|  |                 if not self.parent.SimNDT_SnapShots.enableView and not self.parent.SimNDT_SnapShots.enableImages: | ||||||
|  |                   self.runGL() | ||||||
|  |                 if self.parent.SimNDT_SnapShots.enableImages: | ||||||
|  |                     self.save_fig(idx) | ||||||
|  |                      | ||||||
|  |                 if self.parent.SimNDT_SnapShots.enableSignals: | ||||||
|  |                     # @blab+ Need to enqeue the CL buffers | ||||||
|  |                     # self.Field=indexof["Vx","Vy","[Vx,Vy]","Txx","Txy","Tyy","[Txx:Txy:Tyy]","Dx","Dy","[Dx,Dy]","SV"] | ||||||
|  |                     if self.parent.SimNDT_SnapShots.Field==0: | ||||||
|  |                       self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Vx,self.SimNDT_FD.Vx_buf) | ||||||
|  |                       D = self.SimNDT_FD.Vx | ||||||
|  |                       Label = 'Vx' | ||||||
|  |                     elif self.parent.SimNDT_SnapShots.Field==1: | ||||||
|  |                       self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Vy,self.SimNDT_FD.Vy_buf) | ||||||
|  |                       D = self.SimNDT_FD.Vy | ||||||
|  |                       Label = 'Vy' | ||||||
|  |                     elif self.parent.SimNDT_SnapShots.Field==3: | ||||||
|  |                       self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Txx,self.SimNDT_FD.Txx_buf) | ||||||
|  |                       D = self.SimNDT_FD.Txx | ||||||
|  |                       Label = 'Txx' | ||||||
|  |                     elif self.parent.SimNDT_SnapShots.Field==4: | ||||||
|  |                       self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Txy,self.SimNDT_FD.Txy_buf) | ||||||
|  |                       D = self.SimNDT_FD.Txy | ||||||
|  |                       Label = 'Txy' | ||||||
|  |                     elif self.parent.SimNDT_SnapShots.Field==5: | ||||||
|  |                       self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Tyy,self.SimNDT_FD.Tyy_buf) | ||||||
|  |                       D = self.SimNDT_FD.Tyy | ||||||
|  |                       Label = 'Tyy' | ||||||
|  |                     else: | ||||||
|  |                       msgbox = WarningParms('SnapShots.save_signal: Unsupported field selector #'+self.parent.SimNDT_SnapShots.Field) | ||||||
|  |                       msgbox.exec_() | ||||||
|  |                       raise ValueError('SnapShots.save_signal: Unsupported field selector') | ||||||
|  | 
 | ||||||
|  |                     self.parent.SimNDT_SnapShots.save_signal(D, self.SimNDT_FD.n, Label) | ||||||
|  |                      | ||||||
|  |                 if self.parent.SimNDT_SnapShots.enableFields: | ||||||
|  |                     # TODO self.parent.SimNDT_SnapShots.Field= | ||||||
|  |                     self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Vx,self.SimNDT_FD.Vx_buf) | ||||||
|  |                     self.SimNDT_FD.clEnqueue(self.SimNDT_FD.Vy,self.SimNDT_FD.Vy_buf) | ||||||
|  |                     self.parent.SimNDT_SnapShots.save_fields(self.SimNDT_FD.Vx, self.SimNDT_FD.Vy, self.SimNDT_FD.n) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _run(self, idx): | ||||||
|  |         step  = 50 | ||||||
|  |         while (self.SimNDT_FD.n < self.TimeSteps): | ||||||
|  | 
 | ||||||
|  |             if self.parent.StopSimulation: | ||||||
|  |                 return "Stop" | ||||||
|  | 
 | ||||||
|  |             if self.parent.PauseSimulation: | ||||||
|  |                 while True: | ||||||
|  |                     if self.parent.StopSimulation: | ||||||
|  |                         return "Stop" | ||||||
|  |                     if not self.parent.PauseSimulation: | ||||||
|  |                         break | ||||||
|  |                     QCoreApplication.processEvents() | ||||||
|  | 
 | ||||||
|  |             self.SimNDT_FD.run() | ||||||
|  |             self.SimNDT_FD.n +=1 | ||||||
|  |             self.n +=1 | ||||||
|  | 
 | ||||||
|  |             self.saveOptions(step, idx) | ||||||
|  |              | ||||||
|  |         if self.parent.SimNDT_SnapShots.enableVolume: | ||||||
|  |             self.parent.SimNDT_SnapShots.save_vol() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _runSerial(self, idx): | ||||||
|  |         step  = 10 | ||||||
|  |         while (self.SimNDT_FD.n < self.TimeSteps): | ||||||
|  | 
 | ||||||
|  |             if self.parent.StopSimulation: | ||||||
|  |                 return "Stop" | ||||||
|  | 
 | ||||||
|  |             if self.parent.PauseSimulation: | ||||||
|  |                 while True: | ||||||
|  |                     if self.parent.StopSimulation: | ||||||
|  |                         return "Stop" | ||||||
|  |                     if not self.parent.PauseSimulation: | ||||||
|  |                         break | ||||||
|  |                     QCoreApplication.processEvents() | ||||||
|  | 
 | ||||||
|  |             self.SimNDT_FD.runSerial() | ||||||
|  |             self.SimNDT_FD.n +=1 | ||||||
|  |             self.n +=1 | ||||||
|  | 
 | ||||||
|  |             self.saveOptions(step, idx) | ||||||
|  |         if self.parent.SimNDT_SnapShots.enableVolume: | ||||||
|  |             self.parent.SimNDT_SnapShots.save_vol() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _runGL(self, idx): | ||||||
|  | 
 | ||||||
|  |         DB = self.parent.SimNDT_SnapShots.DB | ||||||
|  |         self.parent.GraphicView.setImage(np.float32(self.SimNDT_FD.SV), DB) | ||||||
|  |         step  = 50 | ||||||
|  | 
 | ||||||
|  |         if self.IsReceiverPlot: | ||||||
|  |             SimulationTime = self.parent.SimNDT_Simulation.SimulationTime | ||||||
|  |             sig = self.SimNDT_FD.receiver_signals | ||||||
|  |             self.plot = PlotInline() | ||||||
|  |             self.plot.init(sig, SimulationTime) | ||||||
|  |             self.plot.show() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         while (self.SimNDT_FD.n < self.TimeSteps): | ||||||
|  | 
 | ||||||
|  |             if self.parent.StopSimulation: | ||||||
|  |                 return "Stop" | ||||||
|  | 
 | ||||||
|  |             if self.parent.PauseSimulation: | ||||||
|  |                 while True: | ||||||
|  |                     if self.parent.StopSimulation: | ||||||
|  |                         return "Stop" | ||||||
|  |                     if not self.parent.PauseSimulation: | ||||||
|  |                         break | ||||||
|  |                     QCoreApplication.processEvents() | ||||||
|  | 
 | ||||||
|  |             self.SimNDT_FD.run() | ||||||
|  |             self.SimNDT_FD.n+=1 | ||||||
|  |             self.n +=1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             if (self.SimNDT_FD.n % step==0): | ||||||
|  |                 self.SimNDT_FD.runGL() | ||||||
|  |                 self.parent.GraphicView.updateWithImage(self.SimNDT_FD.SV, self.SimNDT_FD.n*self.SimNDT_FD.dt*1e6) | ||||||
|  | 
 | ||||||
|  |                 if self.IsReceiverPlot: | ||||||
|  |                     self.SimNDT_FD.saveOutput() | ||||||
|  |                     sig = self.SimNDT_FD.receiver_signals[self.SimNDT_FD.n-1,0] | ||||||
|  |                     self.plot.update(sig) | ||||||
|  | 
 | ||||||
|  |             elif self.IsReceiverPlot: | ||||||
|  |                 self.SimNDT_FD.saveOutput() | ||||||
|  |                 sig = self.SimNDT_FD.receiver_signals[self.SimNDT_FD.n-1,0] | ||||||
|  |                 self.plot.data.append(sig) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             self.saveOptions(step, idx) | ||||||
|  | 
 | ||||||
|  |         if self.parent.SimNDT_SnapShots.enableVolume: | ||||||
|  |             self.parent.SimNDT_SnapShots.save_vol() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def _runGLSerial(self, idx): | ||||||
|  | 
 | ||||||
|  |         DB = self.parent.SimNDT_SnapShots.DB | ||||||
|  |         self.parent.GraphicView.setImage(np.float32(self.SimNDT_FD.SV), DB) | ||||||
|  |         step  = 10 | ||||||
|  | 
 | ||||||
|  |         if self.IsReceiverPlot: | ||||||
|  |             SimulationTime = self.parent.SimNDT_Simulation.SimulationTime | ||||||
|  |             sig = self.SimNDT_FD.receiver_signals | ||||||
|  |             self.plot = PlotInline() | ||||||
|  |             self.plot.init(sig, SimulationTime) | ||||||
|  |             self.plot.show() | ||||||
|  | 
 | ||||||
|  |         while (self.SimNDT_FD.n < self.TimeSteps): | ||||||
|  | 
 | ||||||
|  |             if self.parent.StopSimulation: | ||||||
|  |                 return "Stop" | ||||||
|  | 
 | ||||||
|  |             if self.parent.PauseSimulation: | ||||||
|  |                 while True: | ||||||
|  |                     if self.parent.StopSimulation: | ||||||
|  |                         return "Stop" | ||||||
|  |                     if not self.parent.PauseSimulation: | ||||||
|  |                         break | ||||||
|  |                     QCoreApplication.processEvents() | ||||||
|  | 
 | ||||||
|  |             self.SimNDT_FD.runSerial() | ||||||
|  |             self.SimNDT_FD.n+=1 | ||||||
|  |             self.n +=1 | ||||||
|  | 
 | ||||||
|  |             if (self.SimNDT_FD.n % step==0): | ||||||
|  |                 self.SimNDT_FD.runGLSerial() | ||||||
|  |                 self.parent.GraphicView.updateWithImage(self.SimNDT_FD.SV,self.SimNDT_FD.n*self.SimNDT_FD.dt*1e6) | ||||||
|  | 
 | ||||||
|  |                 if self.IsReceiverPlot: | ||||||
|  |                     sig = self.SimNDT_FD.receiver_signals[self.SimNDT_FD.n-1,0] | ||||||
|  |                     self.plot.update(sig) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             elif self.IsReceiverPlot: | ||||||
|  |                 sig = self.SimNDT_FD.receiver_signals[self.SimNDT_FD.n-1,0] | ||||||
|  |                 self.plot.data.append(sig) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             self.saveOptions(step, idx) | ||||||
|  | 
 | ||||||
|  |         if self.parent.SimNDT_SnapShots.enableVolume: | ||||||
|  |             self.parent.SimNDT_SnapShots.save_vol() | ||||||
|  | 
 | ||||||
|  |     def runGL (self, idx = None): | ||||||
|  |         if self.Platform == "OpenCL": | ||||||
|  |             self.SimNDT_FD.runGL() | ||||||
|  | 
 | ||||||
|  |         elif self.Platform == "Serial": | ||||||
|  |             self.SimNDT_FD.runGLSerial() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def save_fig(self, idx = None): | ||||||
|  |         if self.Platform == "OpenCL": | ||||||
|  |             self.SimNDT_FD.runGL() | ||||||
|  | 
 | ||||||
|  |         elif self.Platform == "Serial": | ||||||
|  |             self.SimNDT_FD.runGLSerial() | ||||||
|  |         self.parent.SimNDT_SnapShots.save_fig(self.SimNDT_FD.SV, self.SimNDT_FD.n, idx) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user