Пример #1
0
class VoluPhon():
    def __init__(self, prcntVolume, filename = None ):
        """
        This class requires a set of  "n_matdyn.modes" files 
        corresponding to different volume expansions 
        prcntVolume - array with 
        """
        self.pw = PWTask(filename = filename)
        self.matdyn = MatdynTask(filename = filename)
        self.__prcntVolume = prcntVolume


    def setA(self, values, fitter):
        self.a = volufit.ValueFit(self.__prcntVolume, values, fitter)

        
    def setC(self, values, fitter):
        self.c = volufit.ValueFit(self.__prcntVolume, values, fitter)


    def setEnergy(self, values, fitter):
        self.energy = volufit.ValueFit(self.__prcntVolume, values, fitter)


    def setPhonons(self, indexRange, fitter):
        """Will read freqs from x_matdyn.modes files and fit the freqs"""
        matdynModesName = self.matdyn.setting.get('flvec')
        self.matdyn.setting.set('flvec', str(indexRange[0]) + '_' + matdynModesName)
        self.matdyn.output.parse()
        Pol, Omega, qPoints = self.matdyn.output.property('multi phonon')
        volOmega = numpy.zeros(shape=(len(indexRange), numpy.shape(Omega)[0], \
                                                      numpy.shape(Omega)[1]  ) )
        volOmega[0] = Omega
        for i in range(1,len(indexRange)):
            self.matdyn.setting.set('flvec', str(indexRange[i]) + '_' + matdynModesName)
            self.matdyn.output.parse()
            Pol, Omega, qPoints = self.matdyn.output.property('multi phonon')
            volOmega[i] = Omega
        self.matdyn.setting.set('flvec', matdynModesName)
        self.freqs = volufit.FreqFit(self.__prcntVolume, volOmega,fitter)


    def gammaDispersion(self, *pathNPoints):        
        #self.pw.input.parse()
        #self.matdyn.input.parse()
        self.dispersion = PHDispersion( self.pw.input.structure.lattice, self.matdyn)
        if self.freqs.fitter.type != 'polynom':
            raise Exception('This method is only relevant for polynomial fit')
        self.dispersion = PHDispersion( self.pw.input.structure.lattice, self.matdyn)
        self.dispersion.setPath(*pathNPoints)
        self.dispersion.setValues(-self.freqs.coeff()[:,:,-1])
        self.dispersion.save('gamma_disp')
        self.dispersion.plot()


    def prcntVolume (self):
        return self.__prcntVolume
Пример #2
0
class VoluPhon():
    def __init__(self, prcntVolume, filename=None):
        """
        This class requires a set of  "n_matdyn.modes" files 
        corresponding to different volume expansions 
        prcntVolume - array with 
        """
        self.pw = PWTask(filename=filename)
        self.matdyn = MatdynTask(filename=filename)
        self.__prcntVolume = prcntVolume

    def setA(self, values, fitter):
        self.a = volufit.ValueFit(self.__prcntVolume, values, fitter)

    def setC(self, values, fitter):
        self.c = volufit.ValueFit(self.__prcntVolume, values, fitter)

    def setEnergy(self, values, fitter):
        self.energy = volufit.ValueFit(self.__prcntVolume, values, fitter)

    def setPhonons(self, indexRange, fitter):
        """Will read freqs from x_matdyn.modes files and fit the freqs"""
        matdynModesName = self.matdyn.setting.get('flvec')
        self.matdyn.setting.set('flvec',
                                str(indexRange[0]) + '_' + matdynModesName)
        self.matdyn.output.parse()
        Pol, Omega, qPoints = self.matdyn.output.property('multi phonon')
        volOmega = numpy.zeros(shape=(len(indexRange), numpy.shape(Omega)[0], \
                                                      numpy.shape(Omega)[1]  ) )
        volOmega[0] = Omega
        for i in range(1, len(indexRange)):
            self.matdyn.setting.set('flvec',
                                    str(indexRange[i]) + '_' + matdynModesName)
            self.matdyn.output.parse()
            Pol, Omega, qPoints = self.matdyn.output.property('multi phonon')
            volOmega[i] = Omega
        self.matdyn.setting.set('flvec', matdynModesName)
        self.freqs = volufit.FreqFit(self.__prcntVolume, volOmega, fitter)

    def gammaDispersion(self, *pathNPoints):
        #self.pw.input.parse()
        #self.matdyn.input.parse()
        self.dispersion = PHDispersion(self.pw.input.structure.lattice,
                                       self.matdyn)
        if self.freqs.fitter.type != 'polynom':
            raise Exception('This method is only relevant for polynomial fit')
        self.dispersion = PHDispersion(self.pw.input.structure.lattice,
                                       self.matdyn)
        self.dispersion.setPath(*pathNPoints)
        self.dispersion.setValues(-self.freqs.coeff()[:, :, -1])
        self.dispersion.save('gamma_disp')
        self.dispersion.plot()

    def prcntVolume(self):
        return self.__prcntVolume
Пример #3
0
#    print abs((a.conj()*b).sum())
#
#    thrsh_scl = 0.8
#    #dispersion = [list(Omegas[0])]
#    idxs = [range(Omegas.shape[1])]
#    for k in range(1, Omegas.shape[0]):
#        omg = []
#        idx = []
#        for i, o1 in zip( idxs[k-1], Omegas[k-1]):
#            for j, o2 in enumerate(Omegas[k]):
#                if ( abs((Pol2[k,j,:].conj()*Pol2[k-1,i,:]).sum()) >  thrsh_scl):
#                    #omg.append(o2)
#                    idx.append(j)
#                    break
#        if len(omg) != 9:
#            print "OMG!!! ", k, Omegas[k-1], Omegas[k],  omg, '\n'
#        #dispersion.append(omg)
#        idxs.append(idx)
#    dispersion = []
#    for k, idx in enumerate(idxs):
#        dispersion.append( Omegas[k, idx])

    #print dispersion
    #print dispersion[0]
    #phDisp.dispersion =  numpy.array(dispersion)

    phDisp.dispersion = phDisp.dispersion*0.1239
    phDisp.solveAllCrossings(thrsh_scl = 0.75)
    phDisp.plot()
    #print phDisp.dispersion
Пример #4
0
    #    print abs((a.conj()*b).sum())
    #
    #    thrsh_scl = 0.8
    #    #dispersion = [list(Omegas[0])]
    #    idxs = [range(Omegas.shape[1])]
    #    for k in range(1, Omegas.shape[0]):
    #        omg = []
    #        idx = []
    #        for i, o1 in zip( idxs[k-1], Omegas[k-1]):
    #            for j, o2 in enumerate(Omegas[k]):
    #                if ( abs((Pol2[k,j,:].conj()*Pol2[k-1,i,:]).sum()) >  thrsh_scl):
    #                    #omg.append(o2)
    #                    idx.append(j)
    #                    break
    #        if len(omg) != 9:
    #            print "OMG!!! ", k, Omegas[k-1], Omegas[k],  omg, '\n'
    #        #dispersion.append(omg)
    #        idxs.append(idx)
    #    dispersion = []
    #    for k, idx in enumerate(idxs):
    #        dispersion.append( Omegas[k, idx])

    #print dispersion
    #print dispersion[0]
    #phDisp.dispersion =  numpy.array(dispersion)

    phDisp.dispersion = phDisp.dispersion * 0.1239
    phDisp.solveAllCrossings(thrsh_scl=0.75)
    phDisp.plot()
    #print phDisp.dispersion