Package PyFoam :: Package Applications :: Module PotentialRunner
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Applications.PotentialRunner

  1  #  ICE Revision: $Id$ 
  2  """ 
  3  Application class that implements pyFoamSteadyRunner 
  4  """ 
  5   
  6  import sys 
  7   
  8  from os import path,environ 
  9  from optparse import OptionGroup 
 10   
 11  from .PyFoamApplication import PyFoamApplication 
 12   
 13  from PyFoam.Execution.BasicRunner import BasicRunner 
 14  from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory 
 15   
 16  from PyFoam.Error import warning,error 
 17   
 18  from PyFoam.FoamInformation import oldAppConvention as oldApp 
 19   
 20  from .CommonParallel import CommonParallel 
 21  from .CommonStandardOutput import CommonStandardOutput 
 22  from .CommonServer import CommonServer 
 23  from .CommonVCSCommit import CommonVCSCommit 
 24  from .CommonLibFunctionTrigger import CommonLibFunctionTrigger 
 25   
 26  from PyFoam.FoamInformation import oldTutorialStructure,foamVersion 
 27   
 28  from PyFoam.ThirdParty.six import print_ 
 29   
30 -class PotentialRunner(PyFoamApplication, 31 CommonStandardOutput, 32 CommonServer, 33 CommonLibFunctionTrigger, 34 CommonParallel, 35 CommonVCSCommit):
36 - def __init__(self, 37 args=None, 38 **kwargs):
39 description="""\ 40 Runs the potentialFoam solver on a case to get a decent initial 41 condition. 42 43 Copies the current fields for U and p to backup-files. 44 """ 45 46 PyFoamApplication.__init__(self, 47 args=args, 48 description=description, 49 usage="%prog [options] <caseDirectory>", 50 interspersed=True, 51 nr=1, 52 **kwargs)
53
54 - def addOptions(self):
55 pot=OptionGroup(self.parser, 56 "Solver settings", 57 "Basic settings for the potentialFoam-solver") 58 59 pot.add_option("--non-orthogonal-correctors", 60 type="int", 61 dest="noCorr", 62 default=None, 63 help="The number of non-orthogonal corrections") 64 pot.add_option("--tolerance", 65 type="float", 66 dest="tolerance", 67 default=None, 68 help="Overwrite the tolerance of the linear solver") 69 pot.add_option("--relTol", 70 type="float", 71 dest="relTol", 72 default=None, 73 help="Overwrite the relative tolerance of the linear solver") 74 pot.add_option("--no-write-p", 75 action="store_false", 76 dest="writep", 77 default=True, 78 help="Don't write pressure p") 79 pot.add_option("--pRefCell", 80 type="int", 81 dest="pRefCell", 82 default=None, 83 help="Sets the number of the reference cell for closed cases") 84 pot.add_option("--pRefValue", 85 type="int", 86 dest="pRefValue", 87 default=None, 88 help="Sets the pressure reference value for closed cases") 89 self.parser.add_option_group(pot) 90 91 CommonParallel.addOptions(self) 92 CommonStandardOutput.addOptions(self) 93 CommonServer.addOptions(self,False) 94 CommonLibFunctionTrigger.addOptions(self) 95 CommonVCSCommit.addOptions(self)
96
97 - def run(self):
98 cName=self.parser.getArgs()[0] 99 sol=SolutionDirectory(cName,archive=None) 100 self.addLocalConfig(cName) 101 initial=sol[0] 102 if "U" not in initial or "p" not in initial: 103 error("Either 'p' or 'U' missing from the initial directory",initial.baseName()) 104 if self.opts.writep: 105 initial["p.prepotential"]=initial["p"] 106 initial["U.prepotential"]=initial["U"] 107 108 lam=self.getParallel(sol) 109 110 if self.opts.writep: 111 writep=["-writep"] 112 else: 113 writep=[] 114 115 argv=["potentialFoam"] 116 if oldApp(): 117 argv+=[".",cName] 118 else: 119 argv+=["-case",cName] 120 121 self.setLogname(default="Potential",useApplication=False) 122 123 self.checkAndCommit(sol) 124 125 run=BasicRunner(argv=argv+writep, 126 server=self.opts.server, 127 logname=self.opts.logname, 128 compressLog=self.opts.compress, 129 silent=self.opts.progress or self.opts.silent, 130 lam=lam, 131 logTail=self.opts.logTail, 132 echoCommandLine=self.opts.echoCommandPrefix, 133 noLog=self.opts.noLog) 134 135 print_("Setting system-directory for potentialFoam") 136 trig=PotentialTrigger(sol, 137 self.opts.noCorr, 138 self.opts.tolerance, 139 self.opts.relTol, 140 pRefCell=self.opts.pRefCell, 141 pRefValue=self.opts.pRefValue, 142 removeLibs=self.opts.removeLibs, 143 removeFunctions=self.opts.removeFunctions) 144 run.addEndTrigger(trig.resetIt) 145 146 self.addToCaseLog(cName,"Starting") 147 148 run.start() 149 150 self.setData(run.data) 151 152 self.addToCaseLog(cName,"Ending")
153 154 from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile 155
156 -class PotentialTrigger:
157 - def __init__(self, 158 sol, 159 correctors, 160 tolerance, 161 relTol, 162 pRefValue=None, 163 pRefCell=None, 164 removeLibs=False, 165 removeFunctions=False):
166 self.solution=ParsedParameterFile(path.join(sol.systemDir(),"fvSolution"),backup=True) 167 self.schemes=ParsedParameterFile(path.join(sol.systemDir(),"fvSchemes"),backup=True) 168 self.control=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=True) 169 self.controlOrig=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=False) 170 171 pre=environ["FOAM_TUTORIALS"] 172 if not oldTutorialStructure(): 173 pre=path.join(pre,"basic") 174 pot=SolutionDirectory(path.join(pre,"potentialFoam","cylinder"),archive=None,paraviewLink=False) 175 176 self.fresh=True 177 178 try: 179 if "SIMPLE" not in self.solution and foamVersion()[0]<2: 180 self.solution["SIMPLE"]=ParsedParameterFile(path.join(pot.systemDir(),"fvSolution"),backup=False)["SIMPLE"] 181 182 if foamVersion()[0]<2: 183 solutionBlock=self.solution["SIMPLE"] 184 else: 185 self.solution["potentialFlow"]={} 186 solutionBlock=self.solution["potentialFlow"] 187 188 if "nNonOrthogonalCorrectors" not in solutionBlock and correctors==None: 189 correctors=3 190 warning("Setting number of correctors to default value",correctors) 191 if correctors!=None: 192 solutionBlock["nNonOrthogonalCorrectors"]=correctors 193 194 if pRefCell!=None: 195 solutionBlock["pRefCell"]=pRefCell 196 if pRefValue!=None: 197 solutionBlock["pRefValue"]=pRefValue 198 199 if tolerance!=None: 200 try: 201 self.solution["solvers"]["p"][1]["tolerance"]=tolerance 202 except KeyError: 203 # 1.6 format 204 self.solution["solvers"]["p"]["tolerance"]=tolerance 205 206 if relTol!=None: 207 try: 208 self.solution["solvers"]["p"][1]["relTol"]=relTol 209 except KeyError: 210 # 1.6 format 211 self.solution["solvers"]["p"]["relTol"]=relTol 212 213 self.schemes.content=ParsedParameterFile(path.join(pot.systemDir(),"fvSchemes"),backup=False).content 214 self.control.content=ParsedParameterFile(path.join(pot.systemDir(),"controlDict"),backup=False).content 215 for k in ["functions","libs"]: 216 if k in self.control: 217 print_("Remove",k,"from controlDict") 218 del self.control[k] 219 220 if "functions" in self.controlOrig and not removeFunctions: 221 print_("Copying functions over") 222 self.control["functions"]=self.controlOrig["functions"] 223 if "libs" in self.controlOrig and not removeLibs: 224 print_("Copying libs over") 225 self.control["libs"]=self.controlOrig["libs"] 226 227 self.solution.writeFile() 228 self.schemes.writeFile() 229 self.control.writeFile() 230 except Exception: 231 e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' 232 warning("Restoring defaults") 233 self.solution.restore() 234 self.schemes.restore() 235 self.control.restore() 236 raise e
237
238 - def resetIt(self):
239 if self.fresh: 240 warning("Trigger called: Resetting fvSchemes and fvSolution") 241 self.solution.restore() 242 self.schemes.restore() 243 self.control.restore() 244 self.fresh=False
245 246 # Should work with Python3 and Python2 247