]> SALOME platform Git repositories - tools/solverlab.git/blob - CoreFlows/gui/src/ui/MainCFWidget.py
Salome HOME
9aaeabd62be685a521e8836abae5c21fde49e111
[tools/solverlab.git] / CoreFlows / gui / src / ui / MainCFWidget.py
1 from PyQt4 import QtGui, QtCore
2 from PyQt4.uic import loadUi
3 from utils import completeResPath
4
5 import CoreFlows as cf
6 import cdmath as cm
7
8 class MainCFWidget(QtGui.QTabWidget):
9   def __init__(self):
10     QtGui.QTabWidget.__init__(self)
11     loadUi(completeResPath("MainCFWidget.ui"), self)
12     self._python_dump = []
13     
14   def scanWidgets(self):
15     print self.tabModel
16     dictCF={}
17     for k in self.__dict__:
18       att = self.__dict__[k] 
19       if isinstance(att, QtGui.QWidget):
20         name = str(att.objectName())
21         if name != "":
22 #          print(name)
23           if name.endswith("RadioButton"):
24             assert(isinstance(att, QtGui.QRadioButton))
25             if att.isChecked() :
26               # parse name
27               name=name[:len(name)-len("_RadioButton")]#On retire le suffixe _Radiobutton
28               if name.startswith("Dim") :
29                 dictCF["spaceDim"]=int(name[len("Dim")])
30               elif name=="DriftModel" or "name==SinglePhase" or name.endswith("Equation") or name.endswith("TwoFluid") :
31                 dictCF["ModelName"]=name
32               elif name=="InputFileName" :
33                 dictCF["InputFileName"]=True
34               elif name=="MeshCreation" :
35                 dictCF["MeshCreation"]=True
36           elif name.endswith("spinBox") :
37             assert(isinstance(att, QtGui.QSpinBox))
38             val = att.value()
39             # parse name
40             name=name[:len(name)-len("_spinBox")]#On retire le suffixe _SpinBox
41             if name=="Nx" :
42               dictCF["Nx"]=val
43             elif name=="Ny" :
44               dictCF["Ny"]=val
45             elif name=="Nz" :
46               dictCF["Nz"]=val
47             elif name=="NO_MaxNbOfTimeStep" :
48               dictCF["MaxNbOfTimeStep"]=val
49             elif name=="NO_FreqSave" :
50               dictCF["FreqSave"]=val
51           elif name.endswith("doubleSpinBox"):
52             assert(isinstance(att, QtGui.QDoubleSpinBox))
53             val = att.value()
54             # parse name
55             name=name[:len(name)-len("_doubleSpinBox")]#On retire le suffixe _doubleSpinBox
56             if name.endswith("Conductivity") :
57               dictCF["Conductivity"]=val
58             elif name.endswith("Conductivity_Phase1") :
59               dictCF["Conductivity1"]=val
60             elif name.endswith("Conductivity_Phase2") :
61               dictCF["Conductivity2"]=val
62             elif name.endswith("Viscosity") :
63               dictCF["Viscosity"]=val
64             elif name.endswith("Viscosity_Phase1") :
65               dictCF["Viscosity1"]=val
66             elif name.endswith("Viscosity_Phase2") :
67               dictCF["Viscosity2"]=val
68             elif name.endswith("HeatSource") :
69               dictCF["HeatSource"]=val
70             elif name.endswith("FrictionCoefficients") :
71               dictCF["FrictionCoefficients"]=val
72             elif name.endswith("Gravity_1d") :
73               dictCF["Gravity_1d"]=val
74             elif name.endswith("Gravity_2d") :
75               dictCF["Gravity_2d"]=val
76             elif name.endswith("Gravity_3d") :
77               dictCF["Gravity_3d"]=val
78             elif name=="Xinf" :
79               dictCF["Xinf"]=val
80             elif name=="Xsup" :
81               dictCF["Xsup"]=val
82             elif name=="Yinf" :
83               dictCF["Yinf"]=val
84             elif name=="Ysup" :
85               dictCF["Ysup"]=val
86             elif name=="Zinf" :
87               dictCF["Zinf"]=val
88             elif name=="Zsup" :
89               dictCF["Zsup"]=val
90             elif name=="NO_TimeMax" :
91               dictCF["TimeMax"]=val
92             elif name=="NO_Precision" :
93               dictCF["Precision"]=val
94             elif name=="NO_CFL" :
95               dictCF["CFL"]=val
96             elif name.endswith("_IC") :#Initial conditions
97               name=name[:len(name)-len("_IC")]#On retire le suffixe _IC
98               if name.endswith("Concentration") :
99                 dictCF["InitialConcentration"]=val
100               elif name.endswith("Alpha") :
101                 dictCF["InitialAlpha"]=val
102               elif name.endswith("Pressure") :
103                 dictCF["InitialPressure"]=val
104               elif name.endswith("Temperature") :
105                 dictCF["InitialTemperature"]=val
106               elif name.endswith("Velocity_1d") :
107                 dictCF["InitialVelocity_1d"]=val
108               elif name.endswith("Velocity_2d") :
109                 dictCF["InitialVelocity_2d"]=val
110               elif name.endswith("Velocity_3d") :
111                 dictCF["InitialVelocity_3d"]=val
112             elif name.endswith("_BC") :#Boundary conditions
113               name=name[3:len(name)-len("_BC")]#On retire le préfixe SP_ ou DM_ au début et le suffixe _BC à la fin
114               dictCF[name]=val
115           elif name.endswith('comboBox'):
116             assert(isinstance(att, QtGui.QComboBox))
117             val = att.currentText()
118             # parse name
119             name=name[:len(name)-len("_comboBox")]#On retire le suffixe _comboBox
120             if name.endswith("1barOr155bar") :
121               dictCF["pressureEstimate"]=val
122             elif name.endswith("GasOrLiquid") :
123               dictCF["fluidType"]=val
124             elif name.endswith("_BC") :#Boundary conditions
125               name=name[4:len(name)-len("_BC")]#On retire le préfixe SP_ ou DM_ au début et le suffixe _BC à la fin
126               dictCF[name]=val
127             elif name=="NO_Method" :
128               dictCF["Method"]=val
129             elif name=="NO_LS" :
130               dictCF["LS"]=val #Linear solver
131             elif name=="NO_Scheme" :
132               dictCF["Scheme"]=val 
133             elif name=="NO_Scheme_type" :
134               dictCF["Scheme_type"]=val 
135             elif name=="NO_Preconditioner" :
136               dictCF["Preconditioner"]=val 
137           elif name.endswith('lineEdit'):
138             assert(isinstance(att, QtGui.QLineEdit))
139             val = str(att.text())
140             # parse name
141             name=name[:len(name)-len("_lineEdit")]#On retire le suffixe _comboBox
142             #print(name,val)
143             if name=="NO_ResultFileName" :
144               dictCF["ResultFileName"]=val
145             elif name=="InputFileName" :
146               dictCF["InputFileName"]=val
147
148     return dictCF  
149           
150   def onLaunchSimu(self):
151     print "Reading widgets"
152     dictCF = self.scanWidgets()
153
154     print "Setting Model and VV_Constant"
155     ######## Setting Model and VV_Constant #########################
156     if dictCF["ModelName"]=="SinglePhase" :
157       exec "myProblem = cf.%s(cf.%s,cf.%s,%s)" % (dictCF["ModelName"],dictCF["fluidType"],dictCF["pressureEstimate"],dictCF["spaceDim"])
158       nVar =  myProblem.getNumberOfVariables()
159       VV_Constant =[0]*nVar
160       VV_Constant[0] = dictCF["InitialPressure"]
161       VV_Constant[1] = dictCF["InitialVelocity_1d"]
162       if dictCF["spaceDim"] >1 :
163         VV_Constant[2] = dictCF["InitialVelocity_2d"]
164         if dictCF["spaceDim"] >2 :
165           VV_Constant[3] = dictCF["InitialVelocity_3d"]
166       VV_Constant[nVar-1] = dictCF["InitialTemperature"]
167     elif dictCF["ModelName"]=="DriftModel" :
168       exec "myProblem = cf.%s(cf.%s,%s)" % (dictCF["ModelName"],dictCF["pressureEstimate"],dictCF["spaceDim"])
169       nVar =  myProblem.getNumberOfVariables()
170       VV_Constant =[0]*nVar
171       VV_Constant[0] = dictCF["InitialConcentration"]
172       VV_Constant[1] = dictCF["InitialPressure"]
173       VV_Constant[2] = dictCF["InitialVelocity_1d"]
174       if dictCF["spaceDim"] >1 :
175         VV_Constant[3] = dictCF["InitialVelocity_2d"]
176         if dictCF["spaceDim"] >2 :
177           VV_Constant[4] = dictCF["InitialVelocity_3d"]
178       VV_Constant[nVar-1] = dictCF["InitialTemperature"]
179     else :
180       raise NameError('Model not yet handled', dictCF["ModelName"])  
181
182     print "Setting initial data"
183     ############ setting initial data ################################
184     if dictCF["spaceDim"] ==1 :
185       print "spaceDim= ", dictCF["spaceDim"]
186       print "VV_Constant= ", VV_Constant
187       print "Xinf= ", dictCF["Xinf"]
188       print "Xsup= ", dictCF["Xsup"]
189       print "Nx= ", dictCF["Nx"]
190       myProblem.setInitialFieldConstant( dictCF["spaceDim"], VV_Constant, dictCF["Xinf"], dictCF["Xsup"], dictCF["Nx"],"Left","Right");
191       print "Initial field set"
192     elif dictCF["spaceDim"] ==2 :
193       myProblem.setInitialFieldConstant( dictCF["spaceDim"], VV_Constant, dictCF["Xinf"], dictCF["Xsup"], dictCF["Nx"],"Left","Right", dictCF["Yinf"], dictCF["Ysup"], dictCF["Ny"],"Bottom","Top");
194     elif dictCF["spaceDim"] ==3 :
195       myProblem.setInitialFieldConstant( dictCF["spaceDim"], VV_Constant, dictCF["Xinf"], dictCF["Xsup"], dictCF["Nx"],"Back","Front", dictCF["Yinf"], dictCF["Ysup"], dictCF["Ny"],"Left","Right", dictCF["Zinf"], dictCF["Zsup"], dictCF["Nz"],"Bottom","Top");
196     else :
197       raise NameError('Dimension should be 1, 2 or 3', dictCF["spaceDim"])  
198
199 #    for k, v in dictCF.items():
200 #        line = "cf.set%s(%s)" % (k, v)
201 #        #exec line
202 #        self._python_dump.append(line)
203
204     ######## 1D for the moment ######################
205     if dictCF["ModelName"]=="SinglePhase" :
206       myProblem.setInletBoundaryCondition("Left",dictCF["Temperature_Left"],dictCF["Concentration_Left"],dictCF["Velocity_1d_Left"])
207       myProblem.setOutletBoundaryCondition("Right", dictCF["Pressure_Right"]);
208     elif dictCF["ModelName"]=="DriftModel" :
209       myProblem.setInletBoundaryCondition("Left",dictCF["DM_Temperature_Left"],dictCF["DM_Velocity_1d_Left"])
210       myProblem.setOutletBoundaryCondition("Right", dictCF["DM_Pressure_Right"]);
211
212     ########## Physical forces #################
213     myProblem.setHeatSource(dictCF["HeatSource"]);
214     gravite=[0]*dictCF["spaceDim"]
215     gravite[0]=dictCF["Gravity_1d"]
216     if dictCF["spaceDim"] >1 :
217       gravite[1]=dictCF["Gravity_2d"]
218       if dictCF["spaceDim"] >2 :
219         gravite[2]=dictCF["Gravity_3d"]
220     myProblem.setGravity(gravite)
221
222     ########## Numerical options ###############
223     exec "myProblem.setNumericalScheme(cf.%s, cf.%s)" % (dictCF["Scheme"],dictCF["Method"])
224     myProblem.setWellBalancedCorrection(True);  
225
226     myProblem.setCFL(dictCF["CFL"]);
227     myProblem.setPrecision(dictCF["Precision"]);
228     myProblem.setMaxNbOfTimeStep(dictCF["MaxNbOfTimeStep"]);
229     myProblem.setTimeMax(dictCF["TimeMax"]);
230     myProblem.setFreqSave(dictCF["FreqSave"]);
231     myProblem.setFileName(dictCF["ResultFileName"]);
232     myProblem.saveConservativeField(True);
233     #myProblem.setVerbose(True);
234     myProblem.usePrimitiveVarsInNewton(True);
235     if(dictCF["spaceDim"]>1):
236       myProblem.saveVelocity();
237       pass
238
239     myProblem.initialize()
240
241     ok = myProblem.run()
242
243     if (ok):
244       print( "Simulation " + dictCF["ResultFileName"] + " is successful !" );
245       pass
246     else:
247       print( "Simulation " + dictCF["ResultFileName"] + "  failed ! " );
248       pass
249
250     print( "------------ End of calculation !!! -----------" );
251
252     myProblem.terminate()
253     
254     # TODO use a helper object here.