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

Source Code for Module PyFoam.Applications.PotentialRunner

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