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

Source Code for Module PyFoam.Applications.PotentialRunner

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