Exemplo n.º 1
0
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
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
#    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
Exemplo n.º 4
0
            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):