def hexVolOpt(a0, c0_a0, volumeExpansion): '''provide initial(equilibrium) lattice parameters a0, c0/a0, and \ desired volume expansion in percents at which one should run \ the optimization ''' qe = QECalc('config.ini') if qe.structure.lattice.ibrav != 4: raise Exception("The lattice must be hexagonal") # Initial(equilibrium) volume: c0 = a0 * c0_a0 volume = a0 * a0 * c0 volume = volume + volume * volumeExpansion / 100. # initial assumption: all latice parameters expand equally in percents cExpansion = (1. + volumeExpansion / 100.)**(1. / 3.) c = c0 * cExpansion prcntC = 0.2 # percent of c we want to bracket around it for minima search(does not have to warantee the minima is inside)s brentOut = brent(getHexEnergy, (volume, qe), (c - c * prcntC / 100, c + c * prcntC / 100), tol=1.e-5, full_output=1) print brentOut c = brentOut[0] energy = brentOut[1] a = np.sqrt(volume / c) return a, c / a, energy
def __init__(self, fname, indexRange, prcntVolume, modePrefix): """indexRange is for files' indexing. prcntVolume - coresponding volume expansions""" self.qecalc = QECalc(fname) self.__modePrefix = modePrefix self.__indexRange = indexRange self.__prcntVolume = prcntVolume if len(indexRange) != len(prcntVolume): raise Exception( "QuasiHarmonic dimensions: indexRange != prcntVolume") self.loadPhonons() self.__polyOrder = 1 self.fitMatdyn()
# for a, c in zip(aRange, cRange): # varnameValue(task.pwscfInput, 'celldm(1)', a) # varnameValue(task.pwscfInput, 'celldm(2)', a) # varnameValue(task.pwscfInput, 'celldm(3)', c/a) # task.getLauncher() # energies.append(task.getEstimator()) # file = open('energies'+strvolumeExpansion)+'.txt','w') # for a,c, e in zip(aRange, cRange, energies): # print a, c, e if __name__ == '__main__': # volPercRange = scipy.linspace(0.1, 3.0, 29) volPercRange = scipy.linspace(0.2, 1.2, 6) qe = QECalc('config.ini') a0 = qe.structure.lattice.a c0 = qe.structure.lattice.c apar = [] c_apar = [] print volPercRange for volPrcnt in volPercRange: print "Optimizing volume at " + str(volPrcnt) + "% expansion" a, c_a, vol = hexVolOpt(a0, c0 / a0, volPrcnt) print vol, a, c_a apar.append(a) c_apar.append(c_a) print "a:" print apar print "c/a:" print c_apar
v) + self.fitPhononEnergy.fittedValue(v) def minimizeTotalFreeEnergy(self, minVol, maxVol): import scipy.optimize brentOut=scipy.optimize.brent(self.totalFreeEnergy,(), (minVol, maxVol),\ tol = 1.e-5, full_output = 1) # print '\n\nBrentOut:' # print brentOut optPrcntVolume = brentOut[0] optFreeEnergy = brentOut[1] return optPrcntVolume if __name__ == "__main__": qecalc = QECalc("config.ini") voluPhon = VoluPhon("config.ini", prcntVol) voluPhon.setA(a_range[indexRange], 'polynom', 1, True) c_range = a_range * c_a_range voluPhon.setC(c_range[indexRange], 'polynom', 1, True) # Generate phonon doses from different fc files for i in indexRange: os.system('cp ' + str(i) + '_' + fc_name + ' ' + fc_name) qecalc.matdynLauncher() os.system('cp ' + matdynfldos + ' ' + str(i) + '_' + matdynfldos) #plot free energies: for temperature in temperatures: lines = '' phonon = [] for i, v in zip(indexRange, prcntVol):