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