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

Source Code for Module PyFoam.Applications.PotentialRunner

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