Source code for PyFoam.Applications.PotentialRunner

#  ICE Revision: $Id$
"""
Application class that implements pyFoamSteadyRunner
"""

import sys

from os import path,environ
from optparse import OptionGroup

from .PyFoamApplication import PyFoamApplication

from PyFoam.Execution.BasicRunner import BasicRunner
from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory

from PyFoam.Error import warning,error

from PyFoam.FoamInformation import oldAppConvention as oldApp

from .CommonParallel import CommonParallel
from .CommonStandardOutput import CommonStandardOutput
from .CommonServer import CommonServer
from .CommonVCSCommit import CommonVCSCommit
from .CommonLibFunctionTrigger import CommonLibFunctionTrigger

from PyFoam.FoamInformation import oldTutorialStructure,foamVersion

from PyFoam.ThirdParty.six import print_

[docs]class PotentialRunner(PyFoamApplication, CommonStandardOutput, CommonServer, CommonLibFunctionTrigger, CommonParallel, CommonVCSCommit): def __init__(self, args=None, **kwargs): description="""\ Runs the potentialFoam solver on a case to get a decent initial condition. Copies the current fields for U and p to backup-files. """ PyFoamApplication.__init__(self, args=args, description=description, usage="%prog [options] <caseDirectory>", interspersed=True, nr=1, findLocalConfigurationFile=self.localConfigFromCasename, **kwargs)
[docs] def addOptions(self): pot=OptionGroup(self.parser, "Solver settings", "Basic settings for the potentialFoam-solver") pot.add_option("--non-orthogonal-correctors", type="int", dest="noCorr", default=None, help="The number of non-orthogonal corrections") pot.add_option("--tolerance", type="float", dest="tolerance", default=None, help="Overwrite the tolerance of the linear solver") pot.add_option("--relTol", type="float", dest="relTol", default=None, help="Overwrite the relative tolerance of the linear solver") pot.add_option("--no-write-p", action="store_false", dest="writep", default=True, help="Don't write pressure p") pot.add_option("--pRefCell", type="int", dest="pRefCell", default=None, help="Sets the number of the reference cell for closed cases") pot.add_option("--pRefValue", type="int", dest="pRefValue", default=None, help="Sets the pressure reference value for closed cases") self.parser.add_option_group(pot) CommonParallel.addOptions(self) CommonStandardOutput.addOptions(self) CommonServer.addOptions(self,False) CommonLibFunctionTrigger.addOptions(self) CommonVCSCommit.addOptions(self)
[docs] def run(self): cName=self.parser.getArgs()[0] sol=SolutionDirectory(cName,archive=None) # self.addLocalConfig(cName) initial=sol[0] if "U" not in initial or "p" not in initial: error("Either 'p' or 'U' missing from the initial directory",initial.baseName()) if self.opts.writep: initial["p.prepotential"]=initial["p"] initial["U.prepotential"]=initial["U"] lam=self.getParallel(sol) if self.opts.writep: writep=["-writep"] else: writep=[] argv=["potentialFoam"] if oldApp(): argv+=[".",cName] else: argv+=["-case",cName] self.setLogname(default="Potential",useApplication=False) self.checkAndCommit(sol) run=BasicRunner(argv=argv+writep, server=self.opts.server, logname=self.opts.logname, compressLog=self.opts.compress, silent=self.opts.progress or self.opts.silent, lam=lam, logTail=self.opts.logTail, echoCommandLine=self.opts.echoCommandPrefix, noLog=self.opts.noLog) print_("Setting system-directory for potentialFoam") trig=PotentialTrigger(sol, self.opts.noCorr, self.opts.tolerance, self.opts.relTol, pRefCell=self.opts.pRefCell, pRefValue=self.opts.pRefValue, removeLibs=self.opts.removeLibs, removeFunctions=self.opts.removeFunctions) run.addEndTrigger(trig.resetIt) self.addToCaseLog(cName,"Starting") run.start() self.setData(run.data) self.addToCaseLog(cName,"Ending")
from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
[docs]class PotentialTrigger: def __init__(self, sol, correctors, tolerance, relTol, pRefValue=None, pRefCell=None, removeLibs=False, removeFunctions=False): self.solution=ParsedParameterFile(path.join(sol.systemDir(),"fvSolution"),backup=True) self.schemes=ParsedParameterFile(path.join(sol.systemDir(),"fvSchemes"),backup=True) self.control=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=True) self.controlOrig=ParsedParameterFile(path.join(sol.systemDir(),"controlDict"),backup=False) pre=environ["FOAM_TUTORIALS"] if not oldTutorialStructure(): pre=path.join(pre,"basic") pot=SolutionDirectory(path.join(pre,"potentialFoam","cylinder"),archive=None,paraviewLink=False) self.fresh=True try: if "SIMPLE" not in self.solution and foamVersion()[0]<2: self.solution["SIMPLE"]=ParsedParameterFile(path.join(pot.systemDir(),"fvSolution"),backup=False)["SIMPLE"] if foamVersion()[0]<2: solutionBlock=self.solution["SIMPLE"] else: self.solution["potentialFlow"]={} solutionBlock=self.solution["potentialFlow"] if "nNonOrthogonalCorrectors" not in solutionBlock and correctors==None: correctors=3 warning("Setting number of correctors to default value",correctors) if correctors!=None: solutionBlock["nNonOrthogonalCorrectors"]=correctors if pRefCell!=None: solutionBlock["pRefCell"]=pRefCell if pRefValue!=None: solutionBlock["pRefValue"]=pRefValue if tolerance!=None: try: self.solution["solvers"]["p"][1]["tolerance"]=tolerance except KeyError: # 1.6 format self.solution["solvers"]["p"]["tolerance"]=tolerance if relTol!=None: try: self.solution["solvers"]["p"][1]["relTol"]=relTol except KeyError: # 1.6 format self.solution["solvers"]["p"]["relTol"]=relTol self.schemes.content=ParsedParameterFile(path.join(pot.systemDir(),"fvSchemes"),backup=False).content self.control.content=ParsedParameterFile(path.join(pot.systemDir(),"controlDict"),backup=False).content for k in ["functions","libs"]: if k in self.control: print_("Remove",k,"from controlDict") del self.control[k] if "functions" in self.controlOrig and not removeFunctions: print_("Copying functions over") self.control["functions"]=self.controlOrig["functions"] if "libs" in self.controlOrig and not removeLibs: print_("Copying libs over") self.control["libs"]=self.controlOrig["libs"] self.solution.writeFile() self.schemes.writeFile() self.control.writeFile() except Exception: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' warning("Restoring defaults") self.solution.restore() self.schemes.restore() self.control.restore() raise e
[docs] def resetIt(self): if self.fresh: warning("Trigger called: Resetting fvSchemes and fvSolution") self.solution.restore() self.schemes.restore() self.control.restore() self.fresh=False
# Should work with Python3 and Python2