1
2 """
3 Application class that implements pyFoamSteadyRunner
4 """
5
6 import sys
7
8 from os import path,environ
9 from optparse import OptionGroup
10
11 from .PyFoamApplication import PyFoamApplication
12
13 from PyFoam.Execution.BasicRunner import BasicRunner
14 from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory
15
16 from PyFoam.Error import warning,error
17
18 from PyFoam.FoamInformation import oldAppConvention as oldApp
19
20 from .CommonParallel import CommonParallel
21 from .CommonStandardOutput import CommonStandardOutput
22 from .CommonServer import CommonServer
23 from .CommonVCSCommit import CommonVCSCommit
24 from .CommonLibFunctionTrigger import CommonLibFunctionTrigger
25
26 from PyFoam.FoamInformation import oldTutorialStructure,foamVersion
27
28 from PyFoam.ThirdParty.six import print_
29
30 -class PotentialRunner(PyFoamApplication,
31 CommonStandardOutput,
32 CommonServer,
33 CommonLibFunctionTrigger,
34 CommonParallel,
35 CommonVCSCommit):
36 - def __init__(self,
37 args=None,
38 **kwargs):
39 description="""\
40 Runs the potentialFoam solver on a case to get a decent initial
41 condition.
42
43 Copies the current fields for U and p to backup-files.
44 """
45
46 PyFoamApplication.__init__(self,
47 args=args,
48 description=description,
49 usage="%prog [options] <caseDirectory>",
50 interspersed=True,
51 nr=1,
52 **kwargs)
53
55 pot=OptionGroup(self.parser,
56 "Solver settings",
57 "Basic settings for the potentialFoam-solver")
58
59 pot.add_option("--non-orthogonal-correctors",
60 type="int",
61 dest="noCorr",
62 default=None,
63 help="The number of non-orthogonal corrections")
64 pot.add_option("--tolerance",
65 type="float",
66 dest="tolerance",
67 default=None,
68 help="Overwrite the tolerance of the linear solver")
69 pot.add_option("--relTol",
70 type="float",
71 dest="relTol",
72 default=None,
73 help="Overwrite the relative tolerance of the linear solver")
74 pot.add_option("--no-write-p",
75 action="store_false",
76 dest="writep",
77 default=True,
78 help="Don't write pressure p")
79 pot.add_option("--pRefCell",
80 type="int",
81 dest="pRefCell",
82 default=None,
83 help="Sets the number of the reference cell for closed cases")
84 pot.add_option("--pRefValue",
85 type="int",
86 dest="pRefValue",
87 default=None,
88 help="Sets the pressure reference value for closed cases")
89 self.parser.add_option_group(pot)
90
91 CommonParallel.addOptions(self)
92 CommonStandardOutput.addOptions(self)
93 CommonServer.addOptions(self,False)
94 CommonLibFunctionTrigger.addOptions(self)
95 CommonVCSCommit.addOptions(self)
96
98 cName=self.parser.getArgs()[0]
99 sol=SolutionDirectory(cName,archive=None)
100 self.addLocalConfig(cName)
101 initial=sol[0]
102 if "U" not in initial or "p" not in initial:
103 error("Either 'p' or 'U' missing from the initial directory",initial.baseName())
104 if self.opts.writep:
105 initial["p.prepotential"]=initial["p"]
106 initial["U.prepotential"]=initial["U"]
107
108 lam=self.getParallel(sol)
109
110 if self.opts.writep:
111 writep=["-writep"]
112 else:
113 writep=[]
114
115 argv=["potentialFoam"]
116 if oldApp():
117 argv+=[".",cName]
118 else:
119 argv+=["-case",cName]
120
121 self.setLogname(default="Potential",useApplication=False)
122
123 self.checkAndCommit(sol)
124
125 run=BasicRunner(argv=argv+writep,
126 server=self.opts.server,
127 logname=self.opts.logname,
128 compressLog=self.opts.compress,
129 silent=self.opts.progress or self.opts.silent,
130 lam=lam,
131 logTail=self.opts.logTail,
132 echoCommandLine=self.opts.echoCommandPrefix,
133 noLog=self.opts.noLog)
134
135 print_("Setting system-directory for potentialFoam")
136 trig=PotentialTrigger(sol,
137 self.opts.noCorr,
138 self.opts.tolerance,
139 self.opts.relTol,
140 pRefCell=self.opts.pRefCell,
141 pRefValue=self.opts.pRefValue,
142 removeLibs=self.opts.removeLibs,
143 removeFunctions=self.opts.removeFunctions)
144 run.addEndTrigger(trig.resetIt)
145
146 self.addToCaseLog(cName,"Starting")
147
148 run.start()
149
150 self.setData(run.data)
151
152 self.addToCaseLog(cName,"Ending")
153
154 from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
155
157 - def __init__(self,
158 sol,
159 correctors,
160 tolerance,
161 relTol,
162 pRefValue=None,
163 pRefCell=None,
164 removeLibs=False,
165 removeFunctions=False):
166 self.solution=ParsedParameterFile(path.join(sol.systemDir(),"fvSolution"),backup=True)
167 self.schemes=ParsedParameterFile(path.join(sol.systemDir(),"fvSchemes"),backup=True)
168 self.control=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=True)
169 self.controlOrig=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=False)
170
171 pre=environ["FOAM_TUTORIALS"]
172 if not oldTutorialStructure():
173 pre=path.join(pre,"basic")
174 pot=SolutionDirectory(path.join(pre,"potentialFoam","cylinder"),archive=None,paraviewLink=False)
175
176 self.fresh=True
177
178 try:
179 if "SIMPLE" not in self.solution and foamVersion()[0]<2:
180 self.solution["SIMPLE"]=ParsedParameterFile(path.join(pot.systemDir(),"fvSolution"),backup=False)["SIMPLE"]
181
182 if foamVersion()[0]<2:
183 solutionBlock=self.solution["SIMPLE"]
184 else:
185 self.solution["potentialFlow"]={}
186 solutionBlock=self.solution["potentialFlow"]
187
188 if "nNonOrthogonalCorrectors" not in solutionBlock and correctors==None:
189 correctors=3
190 warning("Setting number of correctors to default value",correctors)
191 if correctors!=None:
192 solutionBlock["nNonOrthogonalCorrectors"]=correctors
193
194 if pRefCell!=None:
195 solutionBlock["pRefCell"]=pRefCell
196 if pRefValue!=None:
197 solutionBlock["pRefValue"]=pRefValue
198
199 if tolerance!=None:
200 try:
201 self.solution["solvers"]["p"][1]["tolerance"]=tolerance
202 except KeyError:
203
204 self.solution["solvers"]["p"]["tolerance"]=tolerance
205
206 if relTol!=None:
207 try:
208 self.solution["solvers"]["p"][1]["relTol"]=relTol
209 except KeyError:
210
211 self.solution["solvers"]["p"]["relTol"]=relTol
212
213 self.schemes.content=ParsedParameterFile(path.join(pot.systemDir(),"fvSchemes"),backup=False).content
214 self.control.content=ParsedParameterFile(path.join(pot.systemDir(),"controlDict"),backup=False).content
215 for k in ["functions","libs"]:
216 if k in self.control:
217 print_("Remove",k,"from controlDict")
218 del self.control[k]
219
220 if "functions" in self.controlOrig and not removeFunctions:
221 print_("Copying functions over")
222 self.control["functions"]=self.controlOrig["functions"]
223 if "libs" in self.controlOrig and not removeLibs:
224 print_("Copying libs over")
225 self.control["libs"]=self.controlOrig["libs"]
226
227 self.solution.writeFile()
228 self.schemes.writeFile()
229 self.control.writeFile()
230 except Exception:
231 e = sys.exc_info()[1]
232 warning("Restoring defaults")
233 self.solution.restore()
234 self.schemes.restore()
235 self.control.restore()
236 raise e
237
239 if self.fresh:
240 warning("Trigger called: Resetting fvSchemes and fvSolution")
241 self.solution.restore()
242 self.schemes.restore()
243 self.control.restore()
244 self.fresh=False
245
246
247