Exemplo n.º 1
0
def prepare(infname='POSCAR', dlt1max=0.01, dlt2max=0.06):

    #...original system
    nsys0 = NAPSystem(fname=infname)
    #orig_atoms = read(infname,format='vasp')
    orig_atoms = nsys0.to_ase_atoms()

    #...get deformations
    fmats = get_deformations(dlt1max, dlt2max)

    #...deform original system and save to _prefix_##/POSCAR
    for i, fmat in enumerate(fmats):
        atoms = orig_atoms.copy()
        #nsys = copy.deepcopy(nsys0)
        dname = _prefix + "{0:02d}".format(i)
        os.system('mkdir -p {}'.format(dname))
        print(dname)
        cell0 = atoms.get_cell()
        emat = 0.5 * (np.dot(fmat.T, fmat) - np.identity(3)) + np.identity(3)
        cell = np.dot(emat, cell0)
        #print(i,emat,cell)
        # cell = np.dot(cell0,fmat.T)
        atoms.set_cell(cell, scale_atoms=True)
        atoms.write(dname + '/POSCAR',
                    format='vasp',
                    vasp5=True,
                    direct=True,
                    sort=False)

    print('prepare done')
    print('')
    print('After performing VASP or pmd calculations in these directories, ' +
          'run the following command:')
    print('  $ python elasticity.py analyze str.ref')
    print('or')
    print('  $ python elasticity.py analyze strs.pmd')
    print('')
Exemplo n.º 2
0
Arquivo: pmdrun.py Projeto: medgbb/nap
    def read_results(self, relax=False):
        """
        Only erg.pmd and frc.pmd are to be read.
        """
        outfname = 'out.' + self.label
        ergfname = 'erg.' + self.label
        frcfname = 'frc.' + self.label
        strfname = 'strs.' + self.label
        if not os.path.exists(outfname):
            raise RuntimeError(outfname + ' does not exists.')
        if not os.path.exists(ergfname):
            raise RuntimeError(ergfname + ' does not exists.')
        if not os.path.exists(frcfname):
            raise RuntimeError(frcfname + ' does not exists.')
        if not os.path.exists(strfname):
            print('Warning: ' + strfname + ' does not exists.')

        self.results = {k: None for k in self.implemented_properties}

        fout = open(outfname, 'r')
        lines = fout.readlines()
        if CALC_END_MARK not in lines[-1]:
            raise RuntimeError(self.label + ' seems to stop somewhere..')
        if relax:
            relax_converged = False
            num_step_relax = -1
            for line in lines:
                if 'Damped MD converged with' in line:
                    relax_converged = True
                    num_step_relax = int(line.split()[4])
                    break
            if not relax_converged:
                print('')
                print('** Warning: pmd relaxation does not' +\
                    ' seem to be converged**')
                print('')
            self.results['num_step_relax'] = num_step_relax
        fout.close()

        with open(ergfname, 'r') as f:
            erg = float(f.readline().split()[0])
            self.results['energy'] = erg

        with open(frcfname, 'r') as f:
            num = int(f.readline().split()[0])
            frcs = np.zeros((num, 3))
            for i in range(num):
                data = [float(x) for x in f.readline().split()]
                frcs[i, 0:3] = data[0:3]
            self.results['forces'] = frcs

        if os.path.exists(strfname):
            try:
                with open(strfname, 'r') as f:
                    strs = np.array([float(x) for x in f.readline().split()])
                self.results['stress'] = strs
            except:
                self.results['srress'] = None

        if relax:
            posfile = 'pmdfin'
            nsys = NAPSystem(fname=posfile, specorder=self.specorder)
            #tmpatoms = read_pmd(fname=posfile,specorder=self.specorder)
            tmpatoms = nsys.to_ase_atoms()
            self.results['relaxed_scaled_positions'] \
                = tmpatoms.get_scaled_positions()
            self.results['relaxed_cell'] = tmpatoms.get_cell()