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

Source Code for Module PyFoam.Applications.PotentialRunner

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