예제 #1
0
    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
예제 #2
0
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)")
예제 #3
0
    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()
예제 #4
0
    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()
예제 #5
0
    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_
예제 #9
0
    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_
예제 #10
0
    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")
예제 #11
0
    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()
예제 #12
0
    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")