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