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

Source Code for Module PyFoam.Applications.PotentialRunner

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