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