示例#1
0
    def run(self):
        fName=self.parser.getArgs()[0]

        dom=parse(fName)
        doc=dom.documentElement

        if doc.tagName!='comparator':
            error("Wrong root-element",doc.tagName,"Expected: 'comparator'")

        self.data=ComparatorData(doc)

        purge=False
        if doc.hasAttribute('purge'):
            purge=eval(doc.getAttribute('purge'))
        if self.opts.purge:
            purge=self.opts.purge
        if self.opts.nopurge:
            purge=False

        steady=False
        if doc.hasAttribute('steady'):
            steady=eval(doc.getAttribute('steady'))
        if self.opts.steady:
            purge=self.opts.steady

        print_(" Parameters read OK ")
        print_()

        aLog=open(self.data.id+".overview","w")
        csv=CSVCollection(self.data.id+".csv")

        rDir=self.data.id+".results"
        rmtree(rDir)
        mkdir(rDir)

        calculated=0
        format="%%0%dd" % len(str(len(self.data)))

        for i in range(len(self.data)):
            runID=(format % i)
            print_(runID,end=" ",file=aLog)
            csv["ID"]=runID

            use,para=self.data[i]
            para["template"]=self.data.template
            para["extension"]=self.data.extension
            para["id"]=self.data.id

            if use:
                calculated+=1

            print_("Executing Variation",i+1,"of",len(self.data),end=" ")
            if calculated!=i+1:
                print_("(",calculated,"actually calculated)")
            else:
                print_()

            print_("Parameters:",end=" ")
            for k,v in iteritems(para):
                print_("%s='%s' " % (k,v),end=" ")
                if v.find(" ")>=0 or v.find("\t")>=0:
                    v="'"+v+"'"
                print_(v,end=" ",file=aLog)
                csv[k]=v

            print_()

            if not use:
                print_("Skipping because not all conditions are satisfied")
                csv.clear()
                print_()
                continue

            cName=("%s."+format) % (self.data.id, i)
            log=open(cName+".log","w")

            para["case"]=cName
            print_("Case-directory:",cName)
            para["results"]=path.join(rDir,runID)
            print_("Results directory:",para["results"])
            mkdir(para["results"])

            if path.exists(cName):
                if self.opts.removeOld:
                    print_("   Removing old case-directory")
                    rmtree(cName)
                else:
                    error("Case-directory",cName,"exists")

            print_("   copying template")
            out=copytree(self.data.template,cName)
            print_("---- Copying",file=log)
            for l in out:
                print_(l,end=" ",file=log)

            print_("   preparing")
            ok,erg=self.data.prep.execute(para,log)
            print_(ok,end=" ",file=aLog)
            csv["prepare OK"]=ok

            for i in range(len(erg)):
                print_(erg[i],end=" ",file=aLog)
                csv["Prepare %02d" % i]=erg[i]

            aLog.flush()

            if self.opts.test:
                print_("   Skipping execution")
            else:
                print_("   running the solver")
                sys.stdout.flush()

                if steady:
                    runnerClass=ConvergenceRunner
                else:
                    runnerClass=AnalyzedRunner

                run=runnerClass(BoundingLogAnalyzer(doTimelines=True,progress=True),
                                argv=[self.data.solver,".",cName],
                                silent=True,
                                lam=Command.parallel,
                                server=self.opts.server)

                run.start()
                ok=run.runOK()
                if ok:
                    print_("   executed OK")
                else:
                    print_("   fatal error")

                for aName in run.listAnalyzers():
                    a=run.getAnalyzer(aName)
                    if 'titles' in dir(a):
                        for tit in a.lines.getValueNames():
                            t,v=a.getTimeline(tit)
                            if len(v)>0:
                                para["result_"+aName+"_"+tit]=v[-1]

                print_(run.runOK(),run.lastTime(),run.run.wallTime(),end=" ",file=aLog)
                csv["Run OK"]=run.runOK()
                csv["End Time"]=run.lastTime()
                csv["Wall Time"]=run.run.wallTime()
                csv["Wall Time (Foam)"]=run.totalClockTime()
                csv["CPU Time"]=run.totalCpuTime()
                csv["Wall Time First Step"]=run.firstClockTime()
                csv["CPU Time First Step"]=run.firstCpuTime()

                para["endTime"]=run.lastTime()
                para["runlog"]=run.logFile

                if self.opts.showDict:
                    print_(para)

                print_("   evaluating results")

                ok,erg=self.data.post.execute(para,log)

                if Command.parallel!=None:
                    print_("  Stoping LAM")
                    Command.parallel.stop()
                    Command.parallel=None

                if ok:
                    print_("  Evaluation OK",end=" ")
                else:
                    print_("  Evaluation failed",end=" ")

                if len(erg)>0:
                    print_(":",erg,end=" ")
                print_()

                print_(ok,end=" ",file=aLog)
                for i in range(len(erg)):
                    print_(erg[i],end=" ",file=aLog)
                    csv["Post %02d" % i]=erg[i]

            if purge:
                print_("   removing the case-directory")
                out=rmtree(cName)
                print_("---- Removing",file=log)
                for l in out:
                    print_(l,end=" ",file=log)

            log.close()
            print_()
            print_(file=log)
            aLog.flush()
            csv.write()

        aLog.close()
示例#2
0
文件: Benchmark.py 项目: floli/tools
    def run(self):
        config=ConfigParser.ConfigParser()
        files=self.parser.getArgs()

        good=config.read(files)
        # will work with 2.4
        # if len(good)!=len(files):
        #    print "Problem while trying to parse files",files
        #    print "Only ",good," could be parsed"
        #    sys.exit(-1)

        benchName=config.get("General","name")
        if self.opts.nameAddition!=None:
            benchName+="_"+self.opts.nameAddition
        if self.opts.foamVersion!=None:
            benchName+="_v"+self.opts.foamVersion
            
        isParallel=config.getboolean("General","parallel")
        lam=None

        if isParallel:
            nrCpus=config.getint("General","nProcs")
            machineFile=config.get("General","machines")
            if not path.exists(machineFile):
                self.error("Machine file ",machineFile,"needed for parallel run")
            lam=LAMMachine(machineFile,nr=nrCpus)
            if lam.cpuNr()>nrCpus:
                self.error("Wrong number of CPUs: ",lam.cpuNr())

            print "Running parallel on",lam.cpuNr(),"CPUs"

        if config.has_option("General","casesDirectory"):
            casesDirectory=path.expanduser(config.get("General","casesDirectory"))
        else:
            casesDirectory=foamTutorials()

        if not path.exists(casesDirectory):
            self.error("Directory",casesDirectory,"needed with the benchmark cases is missing")
        else:
            print "Using cases from directory",casesDirectory

        benchCases=[]
        config.remove_section("General")

        for sec in config.sections():
            print "Reading: ",sec
            skipIt=False
            skipReason=""
            if config.has_option(sec,"skip"):
                skipIt=config.getboolean(sec,"skip")
                skipReason="Switched off in file"
            if self.opts.excases!=None and not skipIt:
                for p in self.opts.excases:
                    if fnmatch(sec,p):
                        skipIt=True
                        skipReason="Switched off by pattern '"+p+"'"
            if self.opts.cases!=None:
                for p in self.opts.cases:
                    if fnmatch(sec,p):
                        skipIt=False
                        skipReason=""
                
            if skipIt:
                print "Skipping case ..... Reason:"+skipReason
                continue
            sol=config.get(sec,"solver")
            cas=config.get(sec,"case")
            pre=eval(config.get(sec,"prepare"))
            preCon=[]
            if config.has_option(sec,"preControlDict"):
                preCon=eval(config.get(sec,"preControlDict"))
            con=eval(config.get(sec,"controlDict"))
            bas=config.getfloat(sec,"baseline")
            wei=config.getfloat(sec,"weight")
            add=[]
            if config.has_option(sec,"additional"):
                add=eval(config.get(sec,"additional"))
                print "Adding: ", add
            util=[]
            if config.has_option(sec,"utilities"):
                util=eval(config.get(sec,"utilities"))
                print "Utilities: ", util    
            nr=99999
            if config.has_option(sec,"nr"):
                nr=eval(config.get(sec,"nr"))
            sp=None
            if config.has_option(sec,"blockSplit"):
                sp=eval(config.get(sec,"blockSplit"))
            toRm=[]
            if config.has_option(sec,"filesToRemove"):
                toRm=eval(config.get(sec,"filesToRemove"))
            setInit=[]
            if config.has_option(sec,"setInitial"):
                setInit=eval(config.get(sec,"setInitial"))

            parallelOK=False
            if config.has_option(sec,"parallelOK"):
                parallelOK=config.getboolean(sec,"parallelOK")

            deMet=["metis"]
            if config.has_option(sec,"decomposition"):
                deMet=config.get(sec,"decomposition").split()

            if deMet[0]=="metis":
                pass
            elif deMet[0]=="simple":
                if len(deMet)<2:
                    deMet.append(0)
                else:
                    deMet[1]=int(deMet[1])
            else:
                print "Unimplemented decomposition method",deMet[0],"switching to metis"
                deMet=["metis"]

            if isParallel==False or parallelOK==True:
                if path.exists(path.join(casesDirectory,sol,cas)):
                    benchCases.append( (nr,sec,sol,cas,pre,con,preCon,bas,wei,add,util,sp,toRm,setInit,deMet) )
                else:
                    print "Skipping",sec,"because directory",path.join(casesDirectory,sol,cas),"could not be found"
            else:
                print "Skipping",sec,"because not parallel"

        benchCases.sort()

        parallelString=""
        if isParallel:
            parallelString=".cpus="+str(nrCpus)

        resultFile=open("Benchmark."+benchName+"."+uname()[1]+parallelString+".results","w")

        totalSpeedup=0
        minSpeedup=None
        maxSpeedup=None
        totalWeight =0
        runsOK=0
        currentEstimate = 1.

        print "\nStart Benching\n"
        
        csv=CSVCollection("Benchmark."+benchName+"."+uname()[1]+parallelString+".csv")
        
#        csvHeaders=["description","solver","case","caseDir","base",
#                    "benchmark","machine","arch","cpus","os","version",
#                    "wallclocktime","cputime","cputimeuser","cputimesystem","maxmemory","cpuusage","speedup"]

        for nr,description,solver,case,prepare,control,preControl,base,weight,additional,utilities,split,toRemove,setInit,decomposition in benchCases:
            #    control.append( ("endTime",-2000) )
            print "Running Benchmark: ",description
            print "Solver: ",solver
            print "Case: ",case
            caseName=solver+"_"+case+"_"+benchName+"."+uname()[1]+".case"
            print "Short name: ",caseName
            caseDir=caseName+".runDir"

            csv["description"]=description
            csv["solver"]=solver
            csv["case"]=case
            csv["caseDir"]=caseDir
            csv["base"]=base

            csv["benchmark"]=benchName
            csv["machine"]=uname()[1]
            csv["arch"]=uname()[4]
            if lam==None:
                csv["cpus"]=1
            else:
                csv["cpus"]=lam.cpuNr()
            csv["os"]=uname()[0]
            csv["version"]=uname()[2]
            
            workDir=path.realpath(path.curdir)

            orig=SolutionDirectory(path.join(casesDirectory,solver,case),
                                   archive=None,
                                   paraviewLink=False)
            for a in additional+utilities:
                orig.addToClone(a)
            orig.cloneCase(path.join(workDir,caseDir))

            if oldApp():
                argv=[solver,workDir,caseDir]
            else:
                argv=[solver,"-case",path.join(workDir,caseDir)]
                
            run=BasicRunner(silent=True,argv=argv,logname="BenchRunning",lam=lam)
            runDir=run.getSolutionDirectory()
            controlFile=ParameterFile(runDir.controlDict())

            for name,value in preControl:
                print "Setting parameter",name,"to",value,"in controlDict"
                controlFile.replaceParameter(name,value)

            for rm in toRemove:
                fn=path.join(caseDir,rm)
                print "Removing file",fn
                remove(fn)

            for field,bc,val in setInit:
                print "Setting",field,"on",bc,"to",val
                SolutionFile(runDir.initialDir(),field).replaceBoundary(bc,val)

            oldDeltaT=controlFile.replaceParameter("deltaT",0)

            for u in utilities:
                print "Building utility ",u
                execute("wmake 2>&1 >%s %s" % (path.join(caseDir,"BenchCompile."+u),path.join(caseDir,u)))

            print "Preparing the case: "
            if lam!=None:
                prepare=prepare+[("decomposePar","")]
                if decomposition[0]=="metis":
                    lam.writeMetis(SolutionDirectory(path.join(workDir,caseDir)))
                elif decomposition[0]=="simple":
                    lam.writeSimple(SolutionDirectory(path.join(workDir,caseDir)),decomposition[1])

            if split:
                print "Splitting the mesh:",split
                bm=BlockMesh(runDir.blockMesh())
                bm.refineMesh(split)

            for pre,post in prepare:
                print "Doing ",pre," ...."
                post=post.replace("%case%",caseDir)
                if oldApp():
                    args=string.split("%s %s %s %s" % (pre,workDir,caseDir,post))
                else:
                    args=string.split("%s -case %s %s" % (pre,path.join(workDir,caseDir),post))
                util=BasicRunner(silent=True,argv=args,logname="BenchPrepare_"+pre)
                util.start()

            controlFile.replaceParameter("deltaT",oldDeltaT)

            #    control.append(("endTime",-1000))
            for name,value in control:
                print "Setting parameter",name,"to",value,"in controlDict"
                controlFile.replaceParameter(name,value)

            print "Starting at ",asctime(localtime(time()))
            print " Baseline is %f, estimated speedup %f -> estimated end at %s " % (base,currentEstimate,asctime(localtime(time()+base/currentEstimate)))
            print "Running the case ...."
            run.start()

            speedup=None
            cpuUsage=0
            speedupOut=-1

            try:
                speedup=base/run.run.wallTime()
                cpuUsage=100.*run.run.cpuTime()/run.run.wallTime()
            except ZeroDivisionError:
                print "Division by Zero: ",run.run.wallTime()

            if not run.runOK():
                print "\nWARNING!!!!"
                print "Run had a problem, not using the results. Check the log\n"
                speedup=None

            if speedup!=None:
                speedupOut=speedup

                totalSpeedup+=speedup*weight
                totalWeight +=weight
                runsOK+=1
                if maxSpeedup==None:
                    maxSpeedup=speedup
                elif speedup>maxSpeedup:
                    maxSpeedup=speedup
                if minSpeedup==None:
                    minSpeedup=speedup
                elif speedup<minSpeedup:
                    minSpeedup=speedup

            print "Wall clock: ",run.run.wallTime()
            print "Speedup: ",speedup," (Baseline: ",base,")"
            print "CPU Time: ",run.run.cpuTime()
            print "CPU Time User: "******"CPU Time System: ",run.run.cpuSystemTime()
            print "Memory: ",run.run.usedMemory()
            print "CPU Usage: %6.2f%%" % (cpuUsage)

            csv["wallclocktime"]=run.run.wallTime()
            csv["cputime"]=run.run.cpuTime()
            csv["cputimeuser"]=run.run.cpuUserTime()
            csv["cputimesystem"]=run.run.cpuSystemTime()
            csv["maxmemory"]=run.run.usedMemory()
            csv["cpuusage"]=cpuUsage
            if speedup!=None:
                csv["speedup"]=speedup
            else:
                csv["speedup"]="##"
                
            csv.write()
            
            resultFile.write("Case %s WallTime %g CPUTime %g UserTime %g SystemTime %g Memory %g MB  Speedup %g\n" %(caseName,run.run.wallTime(),run.run.cpuTime(),run.run.cpuUserTime(),run.run.cpuSystemTime(),run.run.usedMemory(),speedupOut))

            resultFile.flush()
            
            if speedup!=None:
                currentEstimate=totalSpeedup/totalWeight

            if self.opts.removeCases:
                print "Clearing case",
                if speedup==None:
                    print "not ... because it failed"
                else:
                    print "completely"
                    rmtree(caseDir,ignore_errors=True)

            print
            print
        
        if lam!=None:
            lam.stop()

        print "Total Speedup: ",currentEstimate," ( ",totalSpeedup," / ",totalWeight, " ) Range: [",minSpeedup,",",maxSpeedup,"]"

        print runsOK,"of",len(benchCases),"ran OK"

        resultFile.write("Total Speedup: %g\n" % (currentEstimate))
        if minSpeedup and maxSpeedup:
            resultFile.write("Range: [ %g , %g ]\n" % (minSpeedup,maxSpeedup))

        resultFile.close()
示例#3
0
    def run(self):
        config = ConfigParser.ConfigParser()
        files = self.parser.getArgs()

        good = config.read(files)
        # will work with 2.4
        # if len(good)!=len(files):
        #    print_("Problem while trying to parse files",files)
        #    print_("Only ",good," could be parsed")
        #    sys.exit(-1)

        benchName = config.get("General", "name")
        if self.opts.nameAddition != None:
            benchName += "_" + self.opts.nameAddition
        if self.opts.foamVersion != None:
            benchName += "_v" + self.opts.foamVersion

        isParallel = config.getboolean("General", "parallel")
        lam = None

        if isParallel:
            nrCpus = config.getint("General", "nProcs")
            machineFile = config.get("General", "machines")
            if not path.exists(machineFile):
                self.error("Machine file ", machineFile,
                           "needed for parallel run")
            lam = LAMMachine(machineFile, nr=nrCpus)
            if lam.cpuNr() > nrCpus:
                self.error("Wrong number of CPUs: ", lam.cpuNr())

            print_("Running parallel on", lam.cpuNr(), "CPUs")

        if config.has_option("General", "casesDirectory"):
            casesDirectory = path.expanduser(
                config.get("General", "casesDirectory"))
        else:
            casesDirectory = foamTutorials()

        if not path.exists(casesDirectory):
            self.error("Directory", casesDirectory,
                       "needed with the benchmark cases is missing")
        else:
            print_("Using cases from directory", casesDirectory)

        benchCases = []
        config.remove_section("General")

        for sec in config.sections():
            print_("Reading: ", sec)
            skipIt = False
            skipReason = ""
            if config.has_option(sec, "skip"):
                skipIt = config.getboolean(sec, "skip")
                skipReason = "Switched off in file"
            if self.opts.excases != None and not skipIt:
                for p in self.opts.excases:
                    if fnmatch(sec, p):
                        skipIt = True
                        skipReason = "Switched off by pattern '" + p + "'"
            if self.opts.cases != None:
                for p in self.opts.cases:
                    if fnmatch(sec, p):
                        skipIt = False
                        skipReason = ""

            if skipIt:
                print_("Skipping case ..... Reason:" + skipReason)
                continue
            sol = config.get(sec, "solver")
            cas = config.get(sec, "case")
            pre = eval(config.get(sec, "prepare"))
            preCon = []
            if config.has_option(sec, "preControlDict"):
                preCon = eval(config.get(sec, "preControlDict"))
            con = eval(config.get(sec, "controlDict"))
            bas = config.getfloat(sec, "baseline")
            wei = config.getfloat(sec, "weight")
            add = []
            if config.has_option(sec, "additional"):
                add = eval(config.get(sec, "additional"))
                print_("Adding: ", add)
            util = []
            if config.has_option(sec, "utilities"):
                util = eval(config.get(sec, "utilities"))
                print_("Utilities: ", util)
            nr = 99999
            if config.has_option(sec, "nr"):
                nr = eval(config.get(sec, "nr"))
            sp = None
            if config.has_option(sec, "blockSplit"):
                sp = eval(config.get(sec, "blockSplit"))
            toRm = []
            if config.has_option(sec, "filesToRemove"):
                toRm = eval(config.get(sec, "filesToRemove"))
            setInit = []
            if config.has_option(sec, "setInitial"):
                setInit = eval(config.get(sec, "setInitial"))

            parallelOK = False
            if config.has_option(sec, "parallelOK"):
                parallelOK = config.getboolean(sec, "parallelOK")

            deMet = ["metis"]
            if config.has_option(sec, "decomposition"):
                deMet = config.get(sec, "decomposition").split()

            if deMet[0] == "metis":
                pass
            elif deMet[0] == "simple":
                if len(deMet) < 2:
                    deMet.append(0)
                else:
                    deMet[1] = int(deMet[1])
            else:
                print_("Unimplemented decomposition method", deMet[0],
                       "switching to metis")
                deMet = ["metis"]

            if isParallel == False or parallelOK == True:
                if path.exists(path.join(casesDirectory, sol, cas)):
                    benchCases.append(
                        (nr, sec, sol, cas, pre, con, preCon, bas, wei, add,
                         util, sp, toRm, setInit, deMet))
                else:
                    print_("Skipping", sec, "because directory",
                           path.join(casesDirectory, sol, cas),
                           "could not be found")
            else:
                print_("Skipping", sec, "because not parallel")

        benchCases.sort()

        parallelString = ""
        if isParallel:
            parallelString = ".cpus=" + str(nrCpus)

        resultFile = open(
            "Benchmark." + benchName + "." + uname()[1] + parallelString +
            ".results", "w")

        totalSpeedup = 0
        minSpeedup = None
        maxSpeedup = None
        totalWeight = 0
        runsOK = 0
        currentEstimate = 1.

        print_("\nStart Benching\n")

        csv = CSVCollection("Benchmark." + benchName + "." + uname()[1] +
                            parallelString + ".csv")

        #        csvHeaders=["description","solver","case","caseDir","base",
        #                    "benchmark","machine","arch","cpus","os","version",
        #                    "wallclocktime","cputime","cputimeuser","cputimesystem","maxmemory","cpuusage","speedup"]

        for nr, description, solver, case, prepare, control, preControl, base, weight, additional, utilities, split, toRemove, setInit, decomposition in benchCases:
            #    control.append( ("endTime",-2000) )
            print_("Running Benchmark: ", description)
            print_("Solver: ", solver)
            print_("Case: ", case)
            caseName = solver + "_" + case + "_" + benchName + "." + uname(
            )[1] + ".case"
            print_("Short name: ", caseName)
            caseDir = caseName + ".runDir"

            csv["description"] = description
            csv["solver"] = solver
            csv["case"] = case
            csv["caseDir"] = caseDir
            csv["base"] = base

            csv["benchmark"] = benchName
            csv["machine"] = uname()[1]
            csv["arch"] = uname()[4]
            if lam == None:
                csv["cpus"] = 1
            else:
                csv["cpus"] = lam.cpuNr()
            csv["os"] = uname()[0]
            csv["version"] = uname()[2]

            workDir = path.realpath(path.curdir)

            orig = SolutionDirectory(path.join(casesDirectory, solver, case),
                                     archive=None,
                                     paraviewLink=False)
            for a in additional + utilities:
                orig.addToClone(a)
            orig.cloneCase(path.join(workDir, caseDir))

            if oldApp():
                argv = [solver, workDir, caseDir]
            else:
                argv = [solver, "-case", path.join(workDir, caseDir)]

            run = BasicRunner(silent=True,
                              argv=argv,
                              logname="BenchRunning",
                              lam=lam)
            runDir = run.getSolutionDirectory()
            controlFile = ParameterFile(runDir.controlDict())

            for name, value in preControl:
                print_("Setting parameter", name, "to", value,
                       "in controlDict")
                controlFile.replaceParameter(name, value)

            for rm in toRemove:
                fn = path.join(caseDir, rm)
                print_("Removing file", fn)
                remove(fn)

            for field, bc, val in setInit:
                print_("Setting", field, "on", bc, "to", val)
                SolutionFile(runDir.initialDir(),
                             field).replaceBoundary(bc, val)

            oldDeltaT = controlFile.replaceParameter("deltaT", 0)

            for u in utilities:
                print_("Building utility ", u)
                execute("wmake 2>&1 >%s %s" % (path.join(
                    caseDir, "BenchCompile." + u), path.join(caseDir, u)))

            print_("Preparing the case: ")
            if lam != None:
                prepare = prepare + [("decomposePar", "")]
                if decomposition[0] == "metis":
                    lam.writeMetis(
                        SolutionDirectory(path.join(workDir, caseDir)))
                elif decomposition[0] == "simple":
                    lam.writeSimple(
                        SolutionDirectory(path.join(workDir, caseDir)),
                        decomposition[1])

            if split:
                print_("Splitting the mesh:", split)
                bm = BlockMesh(runDir.blockMesh())
                bm.refineMesh(split)

            for pre, post in prepare:
                print_("Doing ", pre, " ....")
                post = post.replace("%case%", caseDir)
                if oldApp():
                    args = string.split("%s %s %s %s" %
                                        (pre, workDir, caseDir, post))
                else:
                    args = string.split(
                        "%s -case %s %s" %
                        (pre, path.join(workDir, caseDir), post))
                util = BasicRunner(silent=True,
                                   argv=args,
                                   logname="BenchPrepare_" + pre)
                util.start()

            controlFile.replaceParameter("deltaT", oldDeltaT)

            #    control.append(("endTime",-1000))
            for name, value in control:
                print_("Setting parameter", name, "to", value,
                       "in controlDict")
                controlFile.replaceParameter(name, value)

            print_("Starting at ", asctime(localtime(time())))
            print_(
                " Baseline is %f, estimated speedup %f -> estimated end at %s "
                % (base, currentEstimate,
                   asctime(localtime(time() + base / currentEstimate))))
            print_("Running the case ....")
            run.start()

            speedup = None
            cpuUsage = 0
            speedupOut = -1

            try:
                speedup = base / run.run.wallTime()
                cpuUsage = 100. * run.run.cpuTime() / run.run.wallTime()
            except ZeroDivisionError:
                print_("Division by Zero: ", run.run.wallTime())

            if not run.runOK():
                print_("\nWARNING!!!!")
                print_(
                    "Run had a problem, not using the results. Check the log\n"
                )
                speedup = None

            if speedup != None:
                speedupOut = speedup

                totalSpeedup += speedup * weight
                totalWeight += weight
                runsOK += 1
                if maxSpeedup == None:
                    maxSpeedup = speedup
                elif speedup > maxSpeedup:
                    maxSpeedup = speedup
                if minSpeedup == None:
                    minSpeedup = speedup
                elif speedup < minSpeedup:
                    minSpeedup = speedup

            print_("Wall clock: ", run.run.wallTime())
            print_("Speedup: ", speedup, " (Baseline: ", base, ")")
            print_("CPU Time: ", run.run.cpuTime())
            print_("CPU Time User: "******"CPU Time System: ", run.run.cpuSystemTime())
            print_("Memory: ", run.run.usedMemory())
            print_("CPU Usage: %6.2f%%" % (cpuUsage))

            csv["wallclocktime"] = run.run.wallTime()
            csv["cputime"] = run.run.cpuTime()
            csv["cputimeuser"] = run.run.cpuUserTime()
            csv["cputimesystem"] = run.run.cpuSystemTime()
            csv["maxmemory"] = run.run.usedMemory()
            csv["cpuusage"] = cpuUsage
            if speedup != None:
                csv["speedup"] = speedup
            else:
                csv["speedup"] = "##"

            csv.write()

            resultFile.write(
                "Case %s WallTime %g CPUTime %g UserTime %g SystemTime %g Memory %g MB  Speedup %g\n"
                % (caseName, run.run.wallTime(), run.run.cpuTime(),
                   run.run.cpuUserTime(), run.run.cpuSystemTime(),
                   run.run.usedMemory(), speedupOut))

            resultFile.flush()

            if speedup != None:
                currentEstimate = totalSpeedup / totalWeight

            if self.opts.removeCases:
                print_("Clearing case", end=" ")
                if speedup == None:
                    print_("not ... because it failed")
                else:
                    print_("completely")
                    rmtree(caseDir, ignore_errors=True)

            print_()
            print_()