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