1
2 """
3 Application class that implements pyFoamSteadyRunner
4 """
5
6 from os import path,environ
7
8 from PyFoamApplication import PyFoamApplication
9 from PyFoam.FoamInformation import changeFoamVersion
10
11 from PyFoam.Execution.BasicRunner import BasicRunner
12 from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory
13
14 from PyFoam.Execution.ParallelExecution import LAMMachine
15 from PyFoam.Error import warning,error
16
19 description="""
20 Runs the potentialFoam solver on a case to get a decent initial condition.
21
22 Copies the current fields for U and p to backup-files.
23 """
24
25 PyFoamApplication.__init__(self,
26 args=args,
27 description=description,
28 usage="%prog [options] <caseDirectory>",
29 interspersed=True,
30 nr=1)
31
33 self.parser.add_option("--procnr",
34 type="int",
35 dest="procnr",
36 default=None,
37 help="The number of processors the run should be started on")
38 self.parser.add_option("--machinefile",
39 dest="machinefile",
40 default=None,
41 help="The machinefile that specifies the parallel machine")
42 self.parser.add_option("--foamVersion",
43 dest="foamVersion",
44 default=None,
45 help="Change the OpenFOAM-version that is to be used")
46 self.parser.add_option("--non-orthogonal-correctors",
47 type="int",
48 dest="noCorr",
49 default=None,
50 help="The number of non-orthogonal corrections")
51 self.parser.add_option("--tolerance",
52 type="float",
53 dest="tolerance",
54 default=None,
55 help="Overwrite the tolerance of the linear solver")
56 self.parser.add_option("--relTol",
57 type="float",
58 dest="relTol",
59 default=None,
60 help="Overwrite the relative tolerance of the linear solver")
61 self.parser.add_option("--no-write-p",
62 action="store_false",
63 dest="writep",
64 default=True,
65 help="Don't write pressure p")
66 self.parser.add_option("--pRefCell",
67 type="int",
68 dest="pRefCell",
69 default=None,
70 help="Sets the number of the reference cell for closed cases")
71 self.parser.add_option("--pRefValue",
72 type="int",
73 dest="pRefValue",
74 default=None,
75 help="Sets the pressure reference value for closed cases")
76
78 if self.opts.foamVersion!=None:
79 changeFoamVersion(self.opts.foamVersion)
80
81 cName=self.parser.getArgs()[0]
82 sol=SolutionDirectory(cName,archive=None)
83 initial=sol[0]
84 if "U" not in initial or "p" not in initial:
85 error("Either 'p' or 'U' missing from the initial directory",initial.baseName())
86 if self.opts.writep:
87 initial["p.prepotential"]=initial["p"]
88 initial["U.prepotential"]=initial["U"]
89
90 lam=None
91 if self.opts.procnr!=None or self.opts.machinefile!=None:
92 lam=LAMMachine(machines=self.opts.machinefile,nr=self.opts.procnr)
93
94 if self.opts.writep:
95 writep=["-writep"]
96 else:
97 writep=[]
98
99 run=BasicRunner(argv=["potentialFoam",".",cName]+writep,
100 server=False,
101 logname="PotentialFoam",
102 lam=lam)
103
104 print "Setting system-directory for potentialFoam"
105 trig=PotentialTrigger(sol,
106 self.opts.noCorr,
107 self.opts.tolerance,
108 self.opts.relTol,
109 pRefCell=self.opts.pRefCell,
110 pRefValue=self.opts.pRefValue)
111 run.addEndTrigger(trig.resetIt)
112
113 run.start()
114
115 import re
116 from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
117
119 - def __init__(self,sol,correctors,tolerance,relTol,pRefValue=None,pRefCell=None):
120 self.solution=ParsedParameterFile(path.join(sol.systemDir(),"fvSolution"),backup=True)
121 self.schemes=ParsedParameterFile(path.join(sol.systemDir(),"fvSchemes"),backup=True)
122 self.control=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=True)
123 pot=SolutionDirectory(path.join(environ["FOAM_TUTORIALS"],"potentialFoam","cylinder"),archive=None,paraviewLink=False)
124
125 self.fresh=True
126
127 try:
128 if "SIMPLE" not in self.solution:
129 self.solution["SIMPLE"]=ParsedParameterFile(path.join(pot.systemDir(),"fvSolution"),backup=False)["SIMPLE"]
130
131 if "nNonOrthogonalCorrectors" not in self.solution["SIMPLE"] and correctors==None:
132 correctors=3
133 warning("Setting number of correctors to default value",correctors)
134 if correctors!=None:
135 self.solution["SIMPLE"]["nNonOrthogonalCorrectors"]=correctors
136
137 if pRefCell!=None:
138 self.solution["SIMPLE"]["pRefCell"]=pRefCell
139 if pRefValue!=None:
140 self.solution["SIMPLE"]["pRefValue"]=pRefValue
141
142 if tolerance!=None:
143 self.solution["solvers"]["p"][1]["tolerance"]=tolerance
144 if relTol!=None:
145 self.solution["solvers"]["p"][1]["relTol"]=relTol
146
147 self.schemes.content=ParsedParameterFile(path.join(pot.systemDir(),"fvSchemes"),backup=False).content
148 self.control.content=ParsedParameterFile(path.join(pot.systemDir(),"controlDict"),backup=False).content
149
150 self.solution.writeFile()
151 self.schemes.writeFile()
152 self.control.writeFile()
153 except Exception,e:
154 warning("Restoring defaults")
155 self.solution.restore()
156 self.schemes.restore()
157 self.control.restore()
158 raise e
159
161 if self.fresh:
162 warning("Trigger called: Resetting fvSchemes and fvSolution")
163 self.solution.restore()
164 self.schemes.restore()
165 self.control.restore()
166 self.fresh=False
167