1
2 """
3 Application class that implements pyFoamSteadyRunner
4 """
5
6 from os import path,environ
7
8 from PyFoamApplication import PyFoamApplication
9
10 from PyFoam.Execution.BasicRunner import BasicRunner
11 from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory
12
13 from PyFoam.Execution.ParallelExecution import LAMMachine
14 from PyFoam.Error import warning,error
15
16 from PyFoam.FoamInformation import oldAppConvention as oldApp
17
20 description="""
21 Runs the potentialFoam solver on a case to get a decent initial condition.
22
23 Copies the current fields for U and p to backup-files.
24 """
25
26 PyFoamApplication.__init__(self,
27 args=args,
28 description=description,
29 usage="%prog [options] <caseDirectory>",
30 interspersed=True,
31 nr=1)
32
34 self.parser.add_option("--procnr",
35 type="int",
36 dest="procnr",
37 default=None,
38 help="The number of processors the run should be started on")
39 self.parser.add_option("--machinefile",
40 dest="machinefile",
41 default=None,
42 help="The machinefile that specifies the parallel machine")
43 self.parser.add_option("--non-orthogonal-correctors",
44 type="int",
45 dest="noCorr",
46 default=None,
47 help="The number of non-orthogonal corrections")
48 self.parser.add_option("--tolerance",
49 type="float",
50 dest="tolerance",
51 default=None,
52 help="Overwrite the tolerance of the linear solver")
53 self.parser.add_option("--relTol",
54 type="float",
55 dest="relTol",
56 default=None,
57 help="Overwrite the relative tolerance of the linear solver")
58 self.parser.add_option("--no-write-p",
59 action="store_false",
60 dest="writep",
61 default=True,
62 help="Don't write pressure p")
63 self.parser.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 self.parser.add_option("--pRefValue",
69 type="int",
70 dest="pRefValue",
71 default=None,
72 help="Sets the pressure reference value for closed cases")
73
75 cName=self.parser.getArgs()[0]
76 sol=SolutionDirectory(cName,archive=None)
77 initial=sol[0]
78 if "U" not in initial or "p" not in initial:
79 error("Either 'p' or 'U' missing from the initial directory",initial.baseName())
80 if self.opts.writep:
81 initial["p.prepotential"]=initial["p"]
82 initial["U.prepotential"]=initial["U"]
83
84 lam=None
85 if self.opts.procnr!=None or self.opts.machinefile!=None:
86 lam=LAMMachine(machines=self.opts.machinefile,nr=self.opts.procnr)
87
88 if self.opts.writep:
89 writep=["-writep"]
90 else:
91 writep=[]
92
93 argv=["potentialFoam"]
94 if oldApp():
95 argv+=[".",cName]
96 else:
97 argv+=["-case",cName]
98
99 run=BasicRunner(argv=argv+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