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