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('')
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()