def execute(self, para, log): f = replaceValues(self.filename, para) v = replaceValues(self.value, para) s = replaceValues(self.subexpression, para) k = replaceValues(self.key, para) try: dictFile = ParsedParameterFile(f, backup=True) val = dictFile[k] except KeyError: self.error("Key: ", k, "not existing in File", f) except IOError: e = sys.exc_info()[ 1] # Needed because python 2.5 does not support 'as e' self.error("Problem with file", k, ":", e) try: exec_("dictFile[k]" + s + "=v") except Exception: e = sys.exc_info()[ 1] # Needed because python 2.5 does not support 'as e' error("Problem with subexpression:", sys.exc_info()[0], ":", e) dictFile.writeFile() return True, None
def getVCS(vcs, path, init=False, tolerant=False): """Factory to create a proper VCS-interface :param vcs: name of the VCS-implementation :param path: path which is under version control :param init: whether the Version-control should be initialized here :param tolerant: If there is no interface for the VCS in question return None""" table = { "hg" : "HgInterface" , "git" : "GitInterface", "svn" : "SvnInterface", "svk" : "SvkInterface" } if vcs not in table: if tolerant: return None else: error("Unknown VCS",vcs,". Known are",list(table.keys())) modName=table[vcs] if PY3: # fix the import. dot="." else: dot="" exec_("from "+dot+modName+" import "+modName) return eval(modName+"(path,init)")
def run(self): fName = self.parser.getArgs()[0] all = self.parser.getArgs()[1] if all[0] == '"': all = all[1:] if all[-1] == '"': all = all[:-1] val = self.parser.getArgs()[2] if self.opts.stripQuotes: if val[0] == '"': val = val[1:] if val[-1] == '"': val = val[:-1] match = re.compile("([a-zA-Z_][a-zA-Z0-9_]*)(.*)").match(all) if match == None: self.error("Expression", all, "not usable as an expression") key = match.group(1) sub = None if len(match.groups()) > 1: if match.group(2) != "": sub = match.group(2) if self.opts.verbatim: newValue = val else: newValue = eval(val) try: dictFile = ParsedParameterFile(fName, backup=True) val = dictFile[key] except KeyError: self.error("Key: ", key, "not existing in File", fName) except IOError: e = sys.exc_info()[ 1] # Needed because python 2.5 does not support 'as e' self.error("Problem with file", fName, ":", e) if sub == None: dictFile[key] = newValue else: try: exec_("dictFile[key]" + sub + "=newValue") except Exception: e = sys.exc_info()[ 1] # Needed because python 2.5 does not support 'as e' self.error("Problem with subexpression:", sys.exc_info()[0], ":", e) if self.opts.test: print_(str(dictFile)) else: dictFile.writeFile()
def run(self): fName=self.parser.getArgs()[0] all=self.parser.getArgs()[1] if all[0]=='"': all=all[1:] if all[-1]=='"': all=all[:-1] val=self.parser.getArgs()[2] if self.opts.stripQuotes: if val[0]=='"': val=val[1:] if val[-1]=='"': val=val[:-1] match=re.compile("([a-zA-Z_][a-zA-Z0-9_]*)(.*)").match(all) if match==None: self.error("Expression",all,"not usable as an expression") key=match.group(1) sub=None if len(match.groups())>1: if match.group(2)!="": sub=match.group(2) if self.opts.verbatim: newValue=val else: newValue=eval(val) try: dictFile=ParsedParameterFile(fName,backup=True) val=dictFile[key] except KeyError: self.error("Key: ",key,"not existing in File",fName) except IOError: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' self.error("Problem with file",fName,":",e) if sub==None: dictFile[key]=newValue else: try: exec_("dictFile[key]"+sub+"=newValue") except Exception: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' self.error("Problem with subexpression:",sys.exc_info()[0],":",e) if self.opts.test: print_(str(dictFile)) else: dictFile.writeFile()
def eval(self, expr, locals): """Eval a python-eval-expression. Sets ``self.locals_ptr`` to ``locales`` and compiles the code before evaluating. """ if expr[:len(substituteIdString)] == substituteIdString: goOn = True replacement = expr[len(substituteIdString):] while goOn: try: value = replacement % locals goOn = False except KeyError: e = sys.exc_info()[ 1] # Needed because python 2.5 does not support 'as e' kExpr = "%(" + e.args[0] + ")" replacement = replacement.replace(kExpr, "%" + kExpr) return value # print value sav = self.locals_ptr self.locals_ptr = locals doEval = True if expr[:len(execIdString)] == execIdString: doEval = False if doEval: globals = {"__builtins__": self.eval_allowed_globals} if PY3: globals.update(locals) try: x = eval(self.compile(expr), globals, locals) except: e = sys.exc_info()[ 1] # Needed because python 2.5 does not support 'as e' print_("Problem avaluating", expr, ":", e) raise e else: # globals= {"__builtins__":self.eval_allowed_globals} globals = {"__builtins__": __builtins__} expr = expr[len(execIdString):] exec_(self.compile(expr, mode="exec"), globals, locals) x = None self.locals_ptr = sav return x
def eval(self, expr, locals): """Eval a python-eval-expression. Sets ``self.locals_ptr`` to ``locales`` and compiles the code before evaluating. """ if expr[:len(substituteIdString)]==substituteIdString: goOn=True replacement=expr[len(substituteIdString):] while goOn: try: value=replacement % locals goOn=False except KeyError: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' kExpr="%("+e.args[0]+")" replacement=replacement.replace(kExpr,"%"+kExpr) return value # print value sav = self.locals_ptr self.locals_ptr = locals doEval=True if expr[:len(execIdString)]==execIdString: doEval=False if doEval: globals= {"__builtins__":self.eval_allowed_globals} if PY3: globals.update(locals) try: x = eval(self.compile(expr),globals, locals) except: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' print_("Problem avaluating",expr,":",e) raise e else: # globals= {"__builtins__":self.eval_allowed_globals} globals= {"__builtins__":__builtins__} expr=expr[len(execIdString):] exec_(self.compile(expr,mode="exec"),globals,locals) x = None self.locals_ptr = sav return x
def execute(self,para,log): f=replaceValues(self.filename,para) v=replaceValues(self.value,para) s=replaceValues(self.subexpression,para) k=replaceValues(self.key,para) try: dictFile=ParsedParameterFile(f,backup=True) val=dictFile[k] except KeyError: self.error("Key: ",k,"not existing in File",f) except IOError: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' self.error("Problem with file",k,":",e) try: exec_("dictFile[k]"+s+"=v") except Exception: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' error("Problem with subexpression:",sys.exc_info()[0],":",e) dictFile.writeFile() return True,None
def calculateVariables(self,_args_): """Add derived variables to the argument dictionary""" for _a_ in _args_: exec_("%s = '%s'" % (_a_,_args_[_a_])) if self.varTree(): for _a_ in self.varTree().getElementsByTagName("var"): _nm_=_a_.getAttribute("name") if _nm_ in ["_args_","_a_","_nm_"]: error("Variable",_nm_,"is needed for this routine to work") if len(_a_.firstChild.nodeValue)>0: exec_(_a_.firstChild.nodeValue) exec_("_args_['"+_nm_+"']=str("+_nm_+")") return _args_
def calculateVariables(self, _args_): """Add derived variables to the argument dictionary""" for _a_ in _args_: exec_("%s = '%s'" % (_a_, _args_[_a_])) if self.varTree(): for _a_ in self.varTree().getElementsByTagName("var"): _nm_ = _a_.getAttribute("name") if _nm_ in ["_args_", "_a_", "_nm_"]: error("Variable", _nm_, "is needed for this routine to work") if len(_a_.firstChild.nodeValue) > 0: exec_(_a_.firstChild.nodeValue) exec_("_args_['" + _nm_ + "']=str(" + _nm_ + ")") return _args_
def prepare(self, sol, cName=None, overrideParameters=None, numberOfProcessors=None): """Do the actual preparing :param numberOfProcessors: If set this overrides the value set in the command line""" if cName == None: cName = sol.name if self.opts.onlyVariables: self.opts.verbose = True vals = {} vals, self.metaData = self.getDefaultValues(cName) vals.update( self.addDictValues( "System", "Automatically defined values", { "casePath": '"' + path.abspath(cName) + '"', "caseName": '"' + path.basename(path.abspath(cName)) + '"', "foamVersion": foamVersion(), "foamFork": foamFork(), "numberOfProcessors": numberOfProcessors if numberOfProcessors != None else self.opts.numberOfProcessors })) if len(self.opts.extensionAddition) > 0: vals.update( self.addDictValues( "ExtensionAdditions", "Additional extensions to be processed", dict((e, True) for e in self.opts.extensionAddition))) valsWithDefaults = set(vals.keys()) self.info("Looking for template values", cName) for f in self.opts.valuesDicts: self.info("Reading values from", f) vals.update( ParsedParameterFile(f, noHeader=True, doMacroExpansion=True).getValueDict()) setValues = {} for v in self.opts.values: self.info("Updating values", v) vals.update(eval(v)) setValues.update(eval(v)) if overrideParameters: vals.update(overrideParameters) unknownValues = set(vals.keys()) - valsWithDefaults if len(unknownValues) > 0: self.warning("Values for which no default was specified: " + ", ".join(unknownValues)) if self.opts.verbose and len(vals) > 0: print_("\nUsed values\n") nameLen = max(len("Name"), max(*[len(k) for k in vals.keys()])) format = "%%%ds - %%s" % nameLen print_(format % ("Name", "Value")) print_("-" * 40) for k, v in sorted(iteritems(vals)): print_(format % (k, v)) print_("") else: self.info("\nNo values specified\n") self.checkCorrectOptions(vals) derivedScript = path.join(cName, self.opts.derivedParametersScript) derivedAdded = None derivedChanged = None if path.exists(derivedScript): self.info("Deriving variables in script", derivedScript) scriptText = open(derivedScript).read() glob = {} oldVals = vals.copy() exec_(scriptText, glob, vals) derivedAdded = [] derivedChanged = [] for k, v in iteritems(vals): if k not in oldVals: derivedAdded.append(k) elif vals[k] != oldVals[k]: derivedChanged.append(k) if len(derivedChanged) > 0 and ( not self.opts.allowDerivedChanges and not configuration().getboolean("PrepareCase", "AllowDerivedChanges")): self.error( self.opts.derivedParametersScript, "changed values of", " ".join(derivedChanged), "\nTo allow this set --allow-derived-changes or the configuration item 'AllowDerivedChanges'" ) if len(derivedAdded) > 0: self.info("Added values:", " ".join(derivedAdded)) if len(derivedChanged) > 0: self.info("Changed values:", " ".join(derivedChanged)) if len(derivedAdded) == 0 and len(derivedChanged) == 0: self.info("Nothing added or changed") else: self.info("No script", derivedScript, "for derived values") if self.opts.onlyVariables: return self.__writeToStateFile(sol, "Starting") if self.opts.doClear: self.info("Clearing", cName) self.__writeToStateFile(sol, "Clearing") sol.clear(processor=True, pyfoam=True, vtk=True, removeAnalyzed=True, keepParallel=False, clearHistory=False, clearParameters=True, additional=["postProcessing"]) self.__writeToStateFile(sol, "Done clearing") if self.opts.writeParameters: fName = path.join(cName, self.parameterOutFile) self.info("Writing parameters to", fName) with WriteParameterFile(fName, noHeader=True) as w: w.content.update(vals, toString=True) w["foamVersion"] = vals["foamVersion"] w.writeFile() if self.opts.writeReport: fName = path.join(cName, self.parameterOutFile + ".rst") self.info("Writing report to", fName) with open(fName, "w") as w: helper = RestructuredTextHelper(defaultHeading=1) w.write(".. title:: " + self.__strip(vals["caseName"]) + "\n") w.write(".. sectnum::\n") w.write(".. header:: " + self.__strip(vals["caseName"]) + "\n") w.write(".. header:: " + time.asctime() + "\n") w.write(".. footer:: ###Page### / ###Total###\n\n") w.write("Parameters set in case directory " + helper.literal(self.__strip(vals["casePath"])) + " at " + helper.emphasis(time.asctime()) + "\n\n") w.write(".. contents::\n\n") if len(self.opts.valuesDicts): w.write(helper.heading("Parameter files")) w.write("Parameters read from files\n\n") w.write( helper.enumerateList([ helper.literal(f) for f in self.opts.valuesDicts ])) w.write("\n") if len(setValues) > 0: w.write(helper.heading("Overwritten parameters")) w.write( "These parameters were set from the command line\n\n") w.write(helper.definitionList(setValues)) w.write("\n") w.write(helper.heading("Parameters with defaults")) w.write(self.makeReport(vals)) if len(unknownValues) > 0: w.write(helper.heading("Unspecified parameters")) w.write( "If these parameters are actually used then specify them in " + helper.literal(self.defaultParameterFile) + "\n\n") tab = helper.table(True) for u in unknownValues: tab.addRow(u) tab.addItem("Value", vals[u]) w.write(str(tab)) if not derivedAdded is None: w.write(helper.heading("Derived Variables")) w.write("Script with derived Parameters" + helper.literal(derivedScript) + "\n\n") if len(derivedAdded) > 0: w.write("These values were added:\n") tab = helper.table(True) for a in derivedAdded: tab.addRow(a) tab.addItem("Value", str(vals[a])) w.write(str(tab)) if len(derivedChanged) > 0: w.write("These values were changed:\n") tab = helper.table(True) for a in derivedChanged: tab.addRow(a) tab.addItem("Value", str(vals[a])) tab.addItem("Old", str(oldVals[a])) w.write(str(tab)) w.write("The code of the script:\n") w.write(helper.code(scriptText)) self.addToCaseLog(cName) for over in self.opts.overloadDirs: self.info("Overloading files from", over) self.__writeToStateFile(sol, "Overloading") self.overloadDir(sol.name, over) self.__writeToStateFile(sol, "Initial") zeroOrig = path.join(sol.name, "0.org") hasOrig = path.exists(zeroOrig) cleanZero = True if not hasOrig: self.info("Not going to clean '0'") self.opts.cleanDirectories.remove("0") cleanZero = False if self.opts.doCopy: if hasOrig: self.info("Found 0.org. Clearing 0") zeroDir = path.join(sol.name, "0") if path.exists(zeroDir): rmtree(zeroDir) else: self.info("No 0-directory") self.info("") else: cleanZero = False if self.opts.doTemplates: self.__writeToStateFile(sol, "Templates") self.searchAndReplaceTemplates( sol.name, vals, self.opts.templateExt, ignoreDirectories=self.opts.ignoreDirectories) self.info("") backupZeroDir = None if self.opts.doMeshCreate: self.__writeToStateFile(sol, "Meshing") if self.opts.meshCreateScript: scriptName = path.join(sol.name, self.opts.meshCreateScript) if not path.exists(scriptName): self.error("Script", scriptName, "does not exist") elif path.exists(path.join(sol.name, self.defaultMeshCreate)): scriptName = path.join(sol.name, self.defaultMeshCreate) else: scriptName = None if scriptName: self.info("Executing", scriptName, "for mesh creation") if self.opts.verbose: echo = "Mesh: " else: echo = None self.executeScript(scriptName, workdir=sol.name, echo=echo) else: self.info( "No script for mesh creation found. Looking for 'blockMeshDict'" ) if sol.blockMesh() != "": self.info(sol.blockMesh(), "found. Executing 'blockMesh'") bm = BasicRunner(argv=["blockMesh", "-case", sol.name]) bm.start() if not bm.runOK(): self.error("Problem with blockMesh") for r in sol.regions(): self.info("Checking region", r) s = SolutionDirectory(sol.name, region=r, archive=None, paraviewLink=False) if s.blockMesh() != "": self.info(s.blockMesh(), "found. Executing 'blockMesh'") bm = BasicRunner(argv=[ "blockMesh", "-case", sol.name, "-region", r ]) bm.start() if not bm.runOK(): self.error("Problem with blockMesh") self.info("") if cleanZero and path.exists(zeroDir): self.warning("Mesh creation recreated 0-directory") if self.opts.keepZeroDirectoryFromMesh: backupZeroDir = zeroDir + ".bakByPyFoam" self.info("Backing up", zeroDir, "to", backupZeroDir) move(zeroDir, backupZeroDir) else: self.info("Data in", zeroDir, "will be removed") self.__writeToStateFile(sol, "Done Meshing") if self.opts.doCopy: self.__writeToStateFile(sol, "Copying") self.copyOriginals(sol.name) self.info("") if backupZeroDir: self.info("Copying backups from", backupZeroDir, "to", zeroDir) self.overloadDir(zeroDir, backupZeroDir) self.info("Removing backup", backupZeroDir) rmtree(backupZeroDir) if self.opts.doPostTemplates: self.__writeToStateFile(sol, "Post-templates") self.searchAndReplaceTemplates( sol.name, vals, self.opts.postTemplateExt, ignoreDirectories=self.opts.ignoreDirectories) self.info("") if self.opts.doCaseSetup: self.__writeToStateFile(sol, "Case setup") if self.opts.caseSetupScript: scriptName = path.join(sol.name, self.opts.caseSetupScript) if not path.exists(scriptName): self.error("Script", scriptName, "does not exist") elif path.exists(path.join(sol.name, self.defaultCaseSetup)): scriptName = path.join(sol.name, self.defaultCaseSetup) else: scriptName = None if scriptName: self.info("Executing", scriptName, "for case setup") if self.opts.verbose: echo = "Case:" else: echo = None self.executeScript(scriptName, workdir=sol.name, echo=echo) elif path.exists(path.join(sol.name, "system", "setFieldsDict")): self.info( "So setup script found. But 'setFieldsDict'. Executing setFields" ) sf = BasicRunner(argv=["setFields", "-case", sol.name]) sf.start() if not sf.runOK(): self.error("Problem with setFields") else: self.info("No script for case-setup found. Nothing done") self.info("") self.__writeToStateFile(sol, "Done case setup") if self.opts.doFinalTemplates: self.__writeToStateFile(sol, "Final templates") self.searchAndReplaceTemplates( sol.name, vals, self.opts.finalTemplateExt, ignoreDirectories=self.opts.ignoreDirectories) if self.opts.doTemplateClean: self.info("Clearing templates") for d in self.opts.cleanDirectories: for e in [ self.opts.templateExt, self.opts.postTemplateExt, self.opts.finalTemplateExt ]: self.cleanExtension(path.join(sol.name, d), e) self.info("") self.info("Case setup finished") self.__writeToStateFile(sol, "Finished OK")
def buildCase(self, cName, args): """Builds the case @param cName: The name of the case directory @param args: The arguments (as a dictionary)""" args = self.calculateVariables(args) os.mkdir(cName) for d in self.parameterTree().getElementsByTagName("directory"): dName = path.join(cName, d.getAttribute("name")) if not path.isdir(dName): os.mkdir(dName) sName = path.join(self.templatePath(), d.getAttribute("name")) for f in d.getElementsByTagName("file"): dFile = path.join(dName, f.getAttribute("name")) shutil.copy(path.join(sName, f.getAttribute("name")), dFile) if len(f.getElementsByTagName("parameter")) > 0: pf = ParsedParameterFile(dFile) for p in f.getElementsByTagName("parameter"): pName = p.getAttribute("name") pValue = self.expandVars(p.getAttribute("value"), args) exec_("pf" + pName + "=" + pValue) pf.writeFile() prep = self.getSingleElement(self.doc, "meshpreparation") util = prep.getElementsByTagName("utility") copy = self.getSingleElement(prep, "copy", optional=True) if len(util) > 0 and copy: error("Copy and utilitiy mesh preparation specified") elif len(util) > 0: for u in util: app = u.getAttribute("command") arg = self.expandVars(u.getAttribute("arguments"), args) argv = [app, "-case", cName] + arg.split() if oldApp(): argv[1] = "." run = BasicRunner(argv=argv, silent=True, logname="CaseBuilder.prepareMesh." + app) run.start() if not run.runOK(): error(app, "failed. Check the logs") elif copy: source = self.expandVars(copy.getAttribute("template"), args) time = self.expandVars(copy.getAttribute("time"), args) if time == "": time = "constant" shutil.copytree(path.join(source, time, "polyMesh"), path.join(cName, "constant", "polyMesh")) else: error("Neither copy nor utilitiy mesh preparation specified") dName = path.join(cName, self.initialDir()) if not path.isdir(dName): os.mkdir(dName) sName = path.join(self.templatePath(), self.initialDir()) for f in self.fieldTree().getElementsByTagName("field"): dFile = path.join(dName, f.getAttribute("name")) shutil.copy(path.join(sName, f.getAttribute("name")), dFile) default = self.makeBC(self.getSingleElement(f, "defaultbc"), args) CreateBoundaryPatches(args=[ "--fix-types", "--overwrite", "--clear", "--default=" + default, dFile ]) bcDict = {} bounds = self.boundaries() for b in f.getElementsByTagName("bc"): nm = b.getAttribute("name") if nm not in bounds: error("Boundary", nm, "not in list", bounds, "for field", f.getAttribute("name")) bcDict[nm] = b for name, pattern in self.boundaryPatterns(): if name in bcDict: default = self.makeBC(bcDict[name], args) CreateBoundaryPatches(args=[ "--filter=" + pattern, "--overwrite", "--default=" + default, dFile ]) ic = self.expandVars( self.getSingleElement(f, "ic").getAttribute("value"), args) pf = ParsedParameterFile(dFile) pf["internalField"] = "uniform " + ic pf.writeFile()
def verifyArguments(self, args): """Validate the arguments with the provided code (if it exists)""" totalMsg = "" for a in self.argTree().getElementsByTagName("arg"): msg = None nm = a.getAttribute("name") verify = self.getSingleElement(a, "verify", optional=True) if verify: valid = self.getSingleElement(verify, "validator", optional=True) script = self.getSingleElement(verify, "script", optional=True) if valid and script: error( "Variable", nm, "has script and validator. Only one of them supported") elif valid: typ = valid.getAttribute("type") arg = args[nm] isNumeric = False if typ == "float": isNumeric = True try: tmp = float(arg) except ValueError: msg = "Not a floating point number" elif typ == "integer": isNumeric = True try: tmp = int(arg) except ValueError: msg = "Not an integer number" elif typ == "file": if not path.exists(arg): msg = "File " + arg + " does not exist" elif typ == "selection": vals = valid.getAttribute("values").split("|") if not arg in vals: msg = "Not in list of possible values: " + ", ".join( vals) elif typ == "vector": tmp = FoamStringParser("a " + arg + ";") if type(tmp['a']) != Vector: msg = "Is not a valid vector" else: error("No validator implemented for type", typ, "in variable", nm) if isNumeric and not msg: if valid.hasAttribute("min"): if float(arg) < float(valid.getAttribute("min")): msg = "Must be bigger than " + valid.getAttribute( "min") if valid.hasAttribute("max"): if float(arg) > float(valid.getAttribute("max")): msg = "Must be smaller than " + valid.getAttribute( "max") elif script: if script.getAttribute("plugin") != "python": error( "Only plugin-type 'python' is supported for variable", nm) code = script.firstChild.nodeValue arg = args[nm] exec_(code) if msg: totalMsg += nm + ": " + msg + " " if totalMsg == "": totalMsg = None return totalMsg
def buildCase(self,cName,args): """Builds the case :param cName: The name of the case directory :param args: The arguments (as a dictionary)""" args=self.calculateVariables(args) os.mkdir(cName) for d in self.parameterTree().getElementsByTagName("directory"): dName=path.join(cName,d.getAttribute("name")) if not path.isdir(dName): os.mkdir(dName) sName=path.join(self.templatePath(),d.getAttribute("name")) for f in d.getElementsByTagName("file"): dFile=path.join(dName,f.getAttribute("name")) shutil.copy(path.join(sName,f.getAttribute("name")),dFile) if len(f.getElementsByTagName("parameter"))>0: pf=ParsedParameterFile(dFile) for p in f.getElementsByTagName("parameter"): pName=p.getAttribute("name") pValue=self.expandVars(p.getAttribute("value"),args) exec_("pf"+pName+"="+pValue) pf.writeFile() prep=self.getSingleElement(self.doc,"meshpreparation") util=prep.getElementsByTagName("utility") copy=self.getSingleElement(prep,"copy",optional=True) if len(util)>0 and copy: error("Copy and utilitiy mesh preparation specified") elif len(util)>0: for u in util: app=u.getAttribute("command") arg=self.expandVars(u.getAttribute("arguments"),args) argv=[app,"-case",cName]+arg.split() if oldApp(): argv[1]="." run=BasicRunner(argv=argv,silent=True,logname="CaseBuilder.prepareMesh."+app) run.start() if not run.runOK(): error(app,"failed. Check the logs") elif copy: source=self.expandVars(copy.getAttribute("template"),args) time=self.expandVars(copy.getAttribute("time"),args) if time=="": time="constant" shutil.copytree(path.join(source,time,"polyMesh"), path.join(cName,"constant","polyMesh")) else: error("Neither copy nor utilitiy mesh preparation specified") dName=path.join(cName,self.initialDir()) if not path.isdir(dName): os.mkdir(dName) sName=path.join(self.templatePath(),self.initialDir()) for f in self.fieldTree().getElementsByTagName("field"): dFile=path.join(dName,f.getAttribute("name")) shutil.copy(path.join(sName,f.getAttribute("name")),dFile) default=self.makeBC(self.getSingleElement(f,"defaultbc"),args) CreateBoundaryPatches(args=["--fix-types", "--overwrite", "--clear", "--default="+default, dFile]) bcDict={} bounds=self.boundaries() for b in f.getElementsByTagName("bc"): nm=b.getAttribute("name") if nm not in bounds: error("Boundary",nm,"not in list",bounds,"for field",f.getAttribute("name")) bcDict[nm]=b for name,pattern in self.boundaryPatterns(): if name in bcDict: default=self.makeBC(bcDict[name],args) CreateBoundaryPatches(args=["--filter="+pattern, "--overwrite", "--default="+default, dFile]) ic=self.expandVars(self.getSingleElement(f,"ic").getAttribute("value"),args) pf=ParsedParameterFile(dFile) pf["internalField"]="uniform "+ic pf.writeFile()
def verifyArguments(self,args): """Validate the arguments with the provided code (if it exists)""" totalMsg="" for a in self.argTree().getElementsByTagName("arg"): msg=None nm=a.getAttribute("name") verify=self.getSingleElement(a,"verify",optional=True) if verify: valid=self.getSingleElement(verify,"validator",optional=True) script=self.getSingleElement(verify,"script",optional=True) if valid and script: error("Variable",nm,"has script and validator. Only one of them supported") elif valid: typ=valid.getAttribute("type") arg=args[nm] isNumeric=False if typ=="float": isNumeric=True try: tmp=float(arg) except ValueError: msg="Not a floating point number" elif typ=="integer": isNumeric=True try: tmp=int(arg) except ValueError: msg="Not an integer number" elif typ=="file": if not path.exists(arg): msg="File "+arg+" does not exist" elif typ=="selection": vals=valid.getAttribute("values").split("|") if not arg in vals: msg="Not in list of possible values: "+", ".join(vals) elif typ=="vector": tmp=FoamStringParser("a "+arg+";") if type(tmp['a'])!=Vector: msg="Is not a valid vector" else: error("No validator implemented for type",typ,"in variable",nm) if isNumeric and not msg: if valid.hasAttribute("min"): if float(arg)<float(valid.getAttribute("min")): msg="Must be bigger than "+valid.getAttribute("min") if valid.hasAttribute("max"): if float(arg)>float(valid.getAttribute("max")): msg="Must be smaller than "+valid.getAttribute("max") elif script: if script.getAttribute("plugin")!="python": error("Only plugin-type 'python' is supported for variable",nm) code=script.firstChild.nodeValue arg=args[nm] exec_(code) if msg: totalMsg+=nm+": "+msg+" " if totalMsg=="": totalMsg=None return totalMsg
def prepare(self,sol, cName=None, overrideParameters=None, numberOfProcessors=None): """Do the actual preparing @param numberOfProcessors: If set this overrides the value set in the command line""" if cName==None: cName=sol.name if self.opts.onlyVariables: self.opts.verbose=True vals={} vals,self.metaData=self.getDefaultValues(cName) vals.update(self.addDictValues("System", "Automatically defined values", { "casePath" : '"'+path.abspath(cName)+'"', "caseName" : '"'+path.basename(path.abspath(cName))+'"', "foamVersion" : foamVersion(), "foamFork" : foamFork(), "numberOfProcessors" : numberOfProcessors if numberOfProcessors!=None else self.opts.numberOfProcessors })) if len(self.opts.extensionAddition)>0: vals.update(self.addDictValues("ExtensionAdditions", "Additional extensions to be processed", dict((e,True) for e in self.opts.extensionAddition))) valsWithDefaults=set(vals.keys()) self.info("Looking for template values",cName) for f in self.opts.valuesDicts: self.info("Reading values from",f) vals.update(ParsedParameterFile(f, noHeader=True, doMacroExpansion=True).getValueDict()) setValues={} for v in self.opts.values: self.info("Updating values",v) vals.update(eval(v)) setValues.update(eval(v)) if overrideParameters: vals.update(overrideParameters) unknownValues=set(vals.keys())-valsWithDefaults if len(unknownValues)>0: self.warning("Values for which no default was specified: "+ ", ".join(unknownValues)) if self.opts.verbose and len(vals)>0: print_("\nUsed values\n") nameLen=max(len("Name"), max(*[len(k) for k in vals.keys()])) format="%%%ds - %%s" % nameLen print_(format % ("Name","Value")) print_("-"*40) for k,v in sorted(iteritems(vals)): print_(format % (k,v)) print_("") else: self.info("\nNo values specified\n") self.checkCorrectOptions(vals) derivedScript=path.join(cName,self.opts.derivedParametersScript) if path.exists(derivedScript): self.info("Deriving variables in script",derivedScript) scriptText=open(derivedScript).read() glob={} oldVals=vals.copy() exec_(scriptText,glob,vals) added=[] changed=[] for k,v in iteritems(vals): if k not in oldVals: added.append(k) elif vals[k]!=oldVals[k]: changed.append(k) if len(changed)>0 and (not self.opts.allowDerivedChanges and not configuration().getboolean("PrepareCase","AllowDerivedChanges")): self.error(self.opts.derivedParametersScript, "changed values of"," ".join(changed), "\nTo allow this set --allow-derived-changes or the configuration item 'AllowDerivedChanges'") if len(added)>0: self.info("Added values:"," ".join(added)) if len(changed)>0: self.info("Changed values:"," ".join(changed)) if len(added)==0 and len(changed)==0: self.info("Nothing added or changed") else: self.info("No script",derivedScript,"for derived values") if self.opts.onlyVariables: return if self.opts.doClear: self.info("Clearing",cName) sol.clear(processor=True, pyfoam=True, vtk=True, removeAnalyzed=True, keepParallel=False, clearHistory=False, clearParameters=True, additional=["postProcessing"]) if self.opts.writeParameters: fName=path.join(cName,self.parameterOutFile) self.info("Writing parameters to",fName) with WriteParameterFile(fName,noHeader=True) as w: w.content.update(vals,toString=True) w["foamVersion"]=vals["foamVersion"] w.writeFile() if self.opts.writeReport: fName=path.join(cName,self.parameterOutFile+".rst") self.info("Writing report to",fName) with open(fName,"w") as w: helper=RestructuredTextHelper(defaultHeading=1) w.write(".. title:: "+self.__strip(vals["caseName"])+"\n") w.write(".. sectnum::\n") w.write(".. header:: "+self.__strip(vals["caseName"])+"\n") w.write(".. header:: "+time.asctime()+"\n") w.write(".. footer:: ###Page### / ###Total###\n\n") w.write("Parameters set in case directory "+ helper.literal(self.__strip(vals["casePath"]))+" at "+ helper.emphasis(time.asctime())+"\n\n") w.write(".. contents::\n\n") if len(self.opts.valuesDicts): w.write(helper.heading("Parameter files")) w.write("Parameters read from files\n\n") w.write(helper.enumerateList([helper.literal(f) for f in self.opts.valuesDicts])) w.write("\n") if len(setValues)>0: w.write(helper.heading("Overwritten parameters")) w.write("These parameters were set from the command line\n\n") w.write(helper.definitionList(setValues)) w.write("\n") w.write(helper.heading("Parameters with defaults")) w.write(self.makeReport(vals)) if len(unknownValues)>0: w.write(helper.heading("Unspecified parameters")) w.write("If these parameters are actually used then specify them in "+ helper.literal(self.defaultParameterFile)+"\n\n") tab=helper.table(True) for u in unknownValues: tab.addRow(u) tab.addItem("Value",vals[u]) w.write(str(tab)) self.addToCaseLog(cName) for over in self.opts.overloadDirs: self.info("Overloading files from",over) self.overloadDir(sol.name,over) zeroOrig=path.join(sol.name,"0.org") hasOrig=path.exists(zeroOrig) cleanZero=True if not hasOrig: self.info("Not going to clean '0'") self.opts.cleanDirectories.remove("0") cleanZero=False if self.opts.doCopy: if hasOrig: self.info("Found 0.org. Clearing 0") zeroDir=path.join(sol.name,"0") if path.exists(zeroDir): rmtree(zeroDir) else: self.info("No 0-directory") self.info("") else: cleanZero=False if self.opts.doTemplates: self.searchAndReplaceTemplates(sol.name, vals, self.opts.templateExt) self.info("") backupZeroDir=None if self.opts.doMeshCreate: if self.opts.meshCreateScript: scriptName=path.join(sol.name,self.opts.meshCreateScript) if not path.exists(scriptName): self.error("Script",scriptName,"does not exist") elif path.exists(path.join(sol.name,self.defaultMeshCreate)): scriptName=path.join(sol.name,self.defaultMeshCreate) else: scriptName=None if scriptName: self.info("Executing",scriptName,"for mesh creation") if self.opts.verbose: echo="Mesh: " else: echo=None result="".join(execute([scriptName],workdir=sol.name,echo=echo)) open(scriptName+".log","w").write(result) else: self.info("No script for mesh creation found. Looking for 'blockMeshDict'") if sol.blockMesh()!="": self.info(sol.blockMesh(),"found. Executing 'blockMesh'") bm=BasicRunner(argv=["blockMesh","-case",sol.name]) bm.start() if not bm.runOK(): self.error("Problem with blockMesh") for r in sol.regions(): self.info("Checking region",r) s=SolutionDirectory(sol.name,region=r, archive=None,paraviewLink=False) if s.blockMesh()!="": self.info(s.blockMesh(),"found. Executing 'blockMesh'") bm=BasicRunner(argv=["blockMesh","-case",sol.name, "-region",r]) bm.start() if not bm.runOK(): self.error("Problem with blockMesh") self.info("") if cleanZero and path.exists(zeroDir): self.warning("Mesh creation recreated 0-directory") if self.opts.keepZeroDirectoryFromMesh: backupZeroDir=zeroDir+".bakByPyFoam" self.info("Backing up",zeroDir,"to",backupZeroDir) move(zeroDir,backupZeroDir) else: self.info("Data in",zeroDir,"will be removed") if self.opts.doCopy: self.copyOriginals(sol.name) self.info("") if backupZeroDir: self.info("Copying backups from",backupZeroDir,"to",zeroDir) self.overloadDir(zeroDir,backupZeroDir) self.info("Removing backup",backupZeroDir) rmtree(backupZeroDir) if self.opts.doPostTemplates: self.searchAndReplaceTemplates(sol.name, vals, self.opts.postTemplateExt) self.info("") if self.opts.doCaseSetup: if self.opts.caseSetupScript: scriptName=path.join(sol.name,self.opts.caseSetupScript) if not path.exists(scriptName): self.error("Script",scriptName,"does not exist") elif path.exists(path.join(sol.name,self.defaultCaseSetup)): scriptName=path.join(sol.name,self.defaultCaseSetup) else: scriptName=None if scriptName: self.info("Executing",scriptName,"for case setup") if self.opts.verbose: echo="Case:" else: echo=None result="".join(execute([scriptName],workdir=sol.name,echo=echo)) open(scriptName+".log","w").write(result) else: self.info("No script for case-setup found. Nothing done") self.info("") if self.opts.doFinalTemplates: self.searchAndReplaceTemplates(sol.name, vals, self.opts.finalTemplateExt) if self.opts.doTemplateClean: self.info("Clearing templates") for d in self.opts.cleanDirectories: for e in [self.opts.templateExt, self.opts.postTemplateExt, self.opts.finalTemplateExt]: self.cleanExtension(path.join(sol.name,d),e) self.info("") self.info("Case setup finished")