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