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