def cmpt_deepmd_lammps(jdata, conf_dir, task_name) : conf_path = os.path.abspath(conf_dir) conf_poscar = os.path.join(conf_path, 'POSCAR') task_path = re.sub('confs', global_task_name, conf_path) task_path = os.path.join(task_path, task_name) equi_stress = Stress(np.loadtxt(os.path.join(task_path, 'equi.stress.out'))) lst_dfm_path = glob.glob(os.path.join(task_path, 'dfm-*')) lst_strain = [] lst_stress = [] for ii in lst_dfm_path : strain = np.loadtxt(os.path.join(ii, 'strain.out')) stress = lammps.get_stress(os.path.join(ii, 'log.lammps')) # convert from pressure to stress stress = -stress lst_strain.append(Strain(strain)) lst_stress.append(Stress(stress)) et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = equi_stress, vasp = False) # et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = None) # bar to GPa # et = -et / 1e4 print_et(et) result = os.path.join(task_path,'result') result_et(et,conf_dir,result) if 'upload_username' in jdata.keys() and task_name=='deepmd': upload_username=jdata['upload_username'] util.insert_data('elastic','deepmd',upload_username,result)
def cmpt_deepmd_lammps(jdata, conf_dir, task_name): deepmd_model_dir = jdata['deepmd_model_dir'] deepmd_type_map = jdata['deepmd_type_map'] ntypes = len(deepmd_type_map) conf_path = os.path.abspath(conf_dir) conf_poscar = os.path.join(conf_path, 'POSCAR') task_path = re.sub('confs', global_task_name, conf_path) task_path = os.path.join(task_path, task_name) equi_stress = Stress(np.loadtxt(os.path.join(task_path, 'equi.stress.out'))) lst_dfm_path = glob.glob(os.path.join(task_path, 'dfm-*')) lst_strain = [] lst_stress = [] for ii in lst_dfm_path: strain = np.loadtxt(os.path.join(ii, 'strain.out')) stress = lammps.get_stress(os.path.join(ii, 'log.lammps')) # convert from pressure to stress stress = -stress lst_strain.append(Strain(strain)) lst_stress.append(Stress(stress)) et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress=equi_stress, vasp=False) # et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = None) # bar to GPa # et = -et / 1e4 print_et(et)
def _compute_lower(self, output_file, all_tasks, all_res): output_file = os.path.abspath(output_file) res_data = {} ptr_data = output_file + '\n' equi_stress = Stress( np.loadtxt( os.path.join(os.path.dirname(output_file), 'equi.stress.out'))) lst_strain = [] lst_stress = [] for ii in all_tasks: with open(os.path.join(ii, 'inter.json')) as fp: idata = json.load(fp) inter_type = idata['type'] strain = np.loadtxt(os.path.join(ii, 'strain.out')) if inter_type == 'vasp': stress = vasp.get_stress(os.path.join(ii, 'OUTCAR')) # convert from pressure in kB to stress stress *= -1000 lst_strain.append(Strain(strain)) lst_stress.append(Stress(stress)) elif inter_type in ['deepmd', 'meam', 'eam_fs', 'eam_alloy']: stress = lammps.get_stress(os.path.join(ii, 'log.lammps')) # convert from pressure to stress stress = -stress lst_strain.append(Strain(strain)) lst_stress.append(Stress(stress)) et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress=equi_stress, vasp=False) res_data['elastic_tensor'] = [] for ii in range(6): for jj in range(6): res_data['elastic_tensor'].append(et.voigt[ii][jj] / 1e4) ptr_data += "%7.2f " % (et.voigt[ii][jj] / 1e4) ptr_data += '\n' BV = et.k_voigt / 1e4 GV = et.g_voigt / 1e4 EV = 9 * BV * GV / (3 * BV + GV) uV = 0.5 * (3 * BV - 2 * GV) / (3 * BV + GV) res_data['BV'] = BV res_data['GV'] = GV res_data['EV'] = EV res_data['uV'] = uV ptr_data += "# Bulk Modulus BV = %.2f GPa\n" % BV ptr_data += "# Shear Modulus GV = %.2f GPa\n" % GV ptr_data += "# Youngs Modulus EV = %.2f GPa\n" % EV ptr_data += "# Poission Ratio uV = %.2f " % uV with open(output_file, 'w') as fp: json.dump(res_data, fp, indent=4) return res_data, ptr_data
def cmpt_lammps(jdata, conf_dir, task_name): strain_direct = jdata['strain_direct'] a, b = strain_direct[0], strain_direct[1] conf_path = os.path.abspath(conf_dir) conf_poscar = os.path.join(conf_path, 'POSCAR') task_path = re.sub('confs', global_task_name, conf_path) task_path = os.path.join(task_path, task_name) lst_dfm_path = glob.glob(os.path.join(task_path, 'dfm-*')) lst_strain = [] lst_stress = [] print('conf_dir:', conf_dir) print('strain\t stress(kB)') for ii in lst_dfm_path: strain = np.loadtxt(os.path.join(ii, 'strain.out')) stress = lammps.get_stress(os.path.join(ii, 'log.lammps')) # convert from pressure to stress stress = -stress / 1000 lst_strain.append(strain[a, b]) lst_stress.append(stress[a, b]) index = np.argsort(lst_strain) for ii in range(len(lst_strain)): print('%7.4f %7.4f' % (lst_strain[index[ii]], lst_stress[index[ii]]))
def make_lammps(jdata, conf_dir,task_type) : fp_params = jdata['lammps_params'] model_dir = fp_params['model_dir'] type_map = fp_params['type_map'] model_dir = os.path.abspath(model_dir) model_name =fp_params['model_name'] if not model_name and task_type =='deepmd': models = glob.glob(os.path.join(model_dir, '*pb')) model_name = [os.path.basename(ii) for ii in models] assert len(model_name)>0,"No deepmd model in the model_dir" else: models = [os.path.join(model_dir,ii) for ii in model_name] model_param = {'model_name' : fp_params['model_name'], 'param_type': fp_params['model_param_type']} ntypes = len(type_map) norm_def = jdata['norm_deform'] shear_def = jdata['shear_deform'] conf_path = os.path.abspath(conf_dir) conf_poscar = os.path.join(conf_path, 'POSCAR') # get equi poscar equi_path = re.sub('confs', global_equi_name, conf_path) equi_path = os.path.join(equi_path, task_type) equi_dump = os.path.join(equi_path, 'dump.relax') task_path = re.sub('confs', global_task_name, conf_path) task_path = os.path.join(task_path, task_type) os.makedirs(task_path, exist_ok=True) task_poscar = os.path.join(task_path, 'POSCAR') lammps.poscar_from_last_dump(equi_dump, task_poscar, type_map) # get equi stress equi_log = os.path.join(equi_path, 'log.lammps') stress = lammps.get_stress(equi_log) np.savetxt(os.path.join(task_path, 'equi.stress.out'), stress) # gen strcture # ss = Structure.from_file(conf_poscar) # print(ss) # ss = ss.from_file(task_poscar) # print(ss) ss = Structure.from_file(task_poscar) # gen defomations norm_strains = [-norm_def, -0.5*norm_def, 0.5*norm_def, norm_def] shear_strains = [-shear_def, -0.5*shear_def, 0.5*shear_def, shear_def] print('gen with norm '+str(norm_strains)) print('gen with shear '+str(shear_strains)) dfm_ss = DeformedStructureSet(ss, symmetry = False, norm_strains = norm_strains, shear_strains = shear_strains) n_dfm = len(dfm_ss) # gen tasks cwd = os.getcwd() # make lammps.in if task_type=='deepmd': fc = lammps.make_lammps_elastic('conf.lmp', ntypes, lammps.inter_deepmd, model_name) elif task_type=='meam': fc = lammps.make_lammps_elastic('conf.lmp', ntypes, lammps.inter_meam, model_param) f_lammps_in = os.path.join(task_path, 'lammps.in') with open(f_lammps_in, 'w') as fp : fp.write(fc) cwd = os.getcwd() os.chdir(task_path) for ii in model_name : if os.path.exists(ii) : os.remove(ii) for (ii,jj) in zip(models, model_name) : os.symlink(os.path.relpath(ii), jj) share_models = [os.path.join(task_path,ii) for ii in model_name] for ii in range(n_dfm) : # make dir dfm_path = os.path.join(task_path, 'dfm-%03d' % ii) os.makedirs(dfm_path, exist_ok=True) os.chdir(dfm_path) for jj in ['conf.lmp', 'lammps.in'] + model_name : if os.path.isfile(jj): os.remove(jj) # make conf dfm_ss.deformed_structures[ii].to('POSCAR', 'POSCAR') lammps.cvt_lammps_conf('POSCAR', 'conf.lmp') ptypes = vasp.get_poscar_types('POSCAR') lammps.apply_type_map('conf.lmp', type_map, ptypes) # record strain strain = Strain.from_deformation(dfm_ss.deformations[ii]) np.savetxt('strain.out', strain) # link lammps.in os.symlink(os.path.relpath(f_lammps_in), 'lammps.in') # link models for (ii,jj) in zip(share_models, model_name) : os.symlink(os.path.relpath(ii), jj) cwd = os.getcwd()
def make_lammps(jdata, conf_dir, task_type): fp_params = jdata['lammps_params'] model_dir = fp_params['model_dir'] type_map = fp_params['type_map'] model_dir = os.path.abspath(model_dir) model_name = fp_params['model_name'] if not model_name: models = glob.glob(os.path.join(model_dir, '*pb')) model_name = [os.path.basename(ii) for ii in models] else: models = [os.path.join(model_dir, ii) for ii in model_name] model_param = { 'model_name': fp_params['model_name'], 'param_type': fp_params['model_param_type'] } ntypes = len(type_map) strain_start = jdata['strain_start'] strain_end = jdata['strain_end'] strain_step = jdata['strain_step'] strain_direct = jdata['strain_direct'] conf_path = os.path.abspath(conf_dir) conf_poscar = os.path.join(conf_path, 'POSCAR') # get equi poscar equi_path = re.sub('confs', global_equi_name, conf_path) equi_path = os.path.join(equi_path, task_type) equi_dump = os.path.join(equi_path, 'dump.relax') task_path = re.sub('confs', global_task_name, conf_path) task_path = os.path.join(task_path, task_type) os.makedirs(task_path, exist_ok=True) task_poscar = os.path.join(task_path, 'POSCAR') lammps.poscar_from_last_dump(equi_dump, task_poscar, type_map) # get equi stress equi_log = os.path.join(equi_path, 'log.lammps') stress = lammps.get_stress(equi_log) np.savetxt(os.path.join(task_path, 'equi.stress.out'), stress) # gen strcture ss = Structure.from_file(task_poscar) # gen defomations norm_strains = np.arange(strain_start, strain_end, strain_step) print('gen with norm ' + str(norm_strains)) deformations = [] for ii in norm_strains: strain = Strain.from_index_amount(strain_direct, ii) deformations.append(strain.get_deformation_matrix()) deformed_structures = [ defo.apply_to_structure(ss) for defo in deformations ] n_dfm = len(deformed_structures) # gen tasks cwd = os.getcwd() # make lammps.in if task_type == 'deepmd': fc = lammps.make_lammps_elastic('conf.lmp', ntypes, lammps.inter_deepmd, model_name) elif task_type == 'meam': fc = lammps.make_lammps_elastic('conf.lmp', ntypes, lammps.inter_meam, model_param) f_lammps_in = os.path.join(task_path, 'lammps.in') with open(f_lammps_in, 'w') as fp: fp.write(fc) cwd = os.getcwd() if task_type == 'deepmd': os.chdir(task_path) for ii in model_name: if os.path.exists(ii): os.remove(ii) for (ii, jj) in zip(models, model_name): os.symlink(os.path.relpath(ii), jj) share_models = glob.glob(os.path.join(task_path, '*pb')) else: share_models = models for ii in range(n_dfm): # make dir dfm_path = os.path.join(task_path, 'dfm-%03d' % ii) os.makedirs(dfm_path, exist_ok=True) os.chdir(dfm_path) for jj in ['conf.lmp', 'lammps.in'] + model_name: if os.path.isfile(jj): os.remove(jj) # make conf deformed_structures[ii].to('POSCAR', 'POSCAR') lammps.cvt_lammps_conf('POSCAR', 'conf.lmp') ptypes = vasp.get_poscar_types('POSCAR') lammps.apply_type_map('conf.lmp', type_map, ptypes) # record strain strain = Strain.from_deformation(deformations[ii]) np.savetxt('strain.out', strain) # link lammps.in os.symlink(os.path.relpath(f_lammps_in), 'lammps.in') # link models for (ii, jj) in zip(share_models, model_name): os.symlink(os.path.relpath(ii), jj) cwd = os.getcwd()
def make_confs(self, path_to_work, path_to_equi, refine=False): path_to_work = os.path.abspath(path_to_work) path_to_equi = os.path.abspath(path_to_equi) task_list = [] cwd = os.getcwd() norm_def = self.norm_deform shear_def = self.shear_deform norm_strains = [-norm_def, -0.5 * norm_def, 0.5 * norm_def, norm_def] shear_strains = [ -shear_def, -0.5 * shear_def, 0.5 * shear_def, shear_def ] print('gen with norm ' + str(norm_strains)) print('gen with shear ' + str(shear_strains)) equi_contcar = os.path.join(path_to_equi, 'CONTCAR') if not os.path.exists(equi_contcar): raise RuntimeError("please do relaxation first") ss = Structure.from_file(equi_contcar) dfm_ss = DeformedStructureSet(ss, symmetry=False, norm_strains=norm_strains, shear_strains=shear_strains) n_dfm = len(dfm_ss) os.chdir(path_to_work) if os.path.isfile('POSCAR'): os.remove('POSCAR') os.symlink(os.path.relpath(equi_contcar), 'POSCAR') # task_poscar = os.path.join(output, 'POSCAR') # stress equi_outcar = os.path.join(path_to_equi, 'OUTCAR') equi_log = os.path.join(path_to_equi, 'log.lammps') if os.path.exists(equi_outcar): stress = vasp.get_stress(equi_outcar) np.savetxt('equi.stress.out', stress) elif os.path.exists(equi_log): stress = lammps.get_stress(equi_log) np.savetxt('equi.stress.out', stress) os.chdir(cwd) if refine: task_list = make_refine(self.parameter['init_from_suffix'], self.parameter['output_suffix'], path_to_work, n_dfm) os.chdir(cwd) else: for ii in range(n_dfm): output_task = os.path.join(path_to_work, 'task.%06d' % ii) os.makedirs(output_task, exist_ok=True) os.chdir(output_task) for jj in [ 'INCAR', 'POTCAR', 'POSCAR', 'conf.lmp', 'in.lammps' ]: if os.path.exists(jj): os.remove(jj) task_list.append(output_task) dfm_ss.deformed_structures[ii].to('POSCAR', 'POSCAR') # record strain strain = Strain.from_deformation(dfm_ss.deformations[ii]) np.savetxt('strain.out', strain) os.chdir(cwd) return task_list