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