def sweep(runspath,resultspath,inputtemplatepath,sweepdicarr): sweeplog = open(resultspath+"/sweep.log","w+") sweeplog.write("runspath "+runspath+"\n") sweeplog.write("resultspath "+resultspath+"\n") sweeplog.write("inputtemplatepath "+inputtemplatepath+"\n") rundirlog = open(resultspath+"/rundir.log","w+") inputtree = etree.parse(inputtemplatepath) for irun, sweepdic in enumerate(sweepdicarr): time.sleep(0.1) runpath, rundir = tstamp_folder.tstamp_folder(runspath) os.chdir(runpath) sweeplog.write("\n"+"runpath "+runpath+"\n") rundirlog.write(runpath+"\n") inputdscr="Input file generated by sweep.py script\n" inputdscr=inputdscr+"input.xml template in: %s\n"%(inputtemplatepath) inputdscr=inputdscr+"results path is: %s\n"%(resultspath) for xpath,value in sweepdic.items(): sweeplog.write("\t"+"sweepvar "+xpath+"\n") sweeplog.write("\t"+"value "+str(value)+"\n") inputdscr=inputdscr+"sweeping variable: "+xpath+"\n" inputdscr=inputdscr+"value: "+str(value)+"\n" setinputxml.setByXpath(inputtree,xpath,str(value)) setinputxml.setByXpath(inputtree,"/input/keywords",inputdscr) inputtree.write(runpath+"/input.xml",pretty_print="true") sweeplog.close() rundirlog.close()
def energy(var, data): runpath = data[0] runcommand = data[1] xpath = data[2] os.chdir(runpath) os.system("rm -f info.xml") inputtree = etree.parse("input.xml") nvar = len(var) for i in range(nvar): setinputxml.setByXpath(inputtree, xpath[i], str(var[i])) inputtree.write("input.xml", pretty_print="true") os.system(runcommand) while not os.path.exists("info.xml"): time.sleep(1) time.sleep(5) return -queryinfoxml.getLastTotalEnergy()
def optimize( runpath, resultspath, inputtemplatepath, vararr, runcommand, ftolerance=1.0e-4, xtolerance=1.0e-4, itmax=500 ): amoebalog = open(resultspath + "/amoeba.log", "w+") optimizelog = open(resultspath + "/optimize.log", "w+") optimizelog.write("runpath " + runpath + "\n") optimizelog.write("resultspath " + resultspath + "\n") optimizelog.write("inputtemplatepath " + inputtemplatepath + "\n") optimizelog.write("Variables:\n") inputtree = etree.parse(inputtemplatepath) inputdscr = "Input file generated by script optimize.py \n" inputdscr = inputdscr + "runpath: %s\n" % (runpath) inputdscr = inputdscr + "resultspath: %s\n" % (resultspath) inputdscr = inputdscr + "input template from path: %s\n" % (inputtemplatepath) inputdscr = inputdscr + "optimization varibales:\n" for var in vararr: optimizelog.write("xpath: " + var[0] + "\n") optimizelog.write("guess: " + str(var[1]) + "\n") optimizelog.write("scale: " + str(var[2]) + "\n") inputdscr = inputdscr + "xpath: " + str(var[0]) + "\n" inputdscr = inputdscr + "guess: " + str(var[1]) + "\n" inputdscr = inputdscr + "scale: " + str(var[2]) + "\n" optimizelog.flush() setinputxml.setByXpath(inputtree, "/input/keywords", inputdscr) inputtree.write(runpath + "/input.xml", pretty_print="true") guess = [] scale = [] data = [] data.append(runpath) data.append(runcommand) data.append([]) for var in vararr: data[-1].append(var[0]) # build xpath array guess.append(var[1]) # build array of initial guess values for the variables scale.append(var[2]) simplex, fvalue, iteration = amoeba.amoeba(guess, scale, energy, ftolerance, xtolerance, itmax, data, amoebalog) amoebalog.write("%d\t" % (iteration)) amoebalog.write("%1.10f\t" % (fvalue)) for value in simplex: amoebalog.write("%1.10f\t" % (value)) amoebalog.write("\n") amoebalog.flush() optimizelog.write("\nOptimization converged after %d iterations of amoeba.py\n" % (iteration)) optimizelog.write("\nOptimized variables found:\n") for i, var in enumerate(vararr): optimizelog.write("xpath: " + var[0] + "\n") optimizelog.write("optimized value: %1.0f\n\n" % (simplex[i])) optimizelog.flush() optimizelog.close() amoebalog.close()