Wed 28 Aug 21:38:52 CEST 2024

This commit is contained in:
sbosse 2024-08-28 21:39:45 +02:00
parent 13f4cad47a
commit d29b2d3563

View 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)