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