def main(): Bash.mkdir('cova') cova_list = Array.frange_stp(1.0, 1.05, 0.05) series = series_vasp.Produce('POSCAR', 'cova') series.set_cova(cova_list) series.make_files() series.append_list_run('run_cova.sh')
def from_new(cls): """ seq ディレクトリを作成し originals ディレクトリ中に初期ファイルを保存 実行ディレクトリを記憶 """ seq_list = glob.glob("seq*/") i = 0 for seq in seq_list: try: j = int(seq.split("seq")[-1].split("/")[0]) if i < j: i = j except ValueError: pass i += 1 dirc = 'seq{0}/originals/'.format(i) str_files = glob.glob('*.str') Bash.mkdir(dirc) for fname in ['IN.CVM', 'def.txt', 'energies.txt'] + str_files: copyfile(fname, os.path.join(dirc, fname)) seq_dirc = "seq{0}".format(str(i)) print("New directory of '{}' is created".format(seq_dirc)) clus_name = cls.get_clus_name(".") results = CEMResults([]) return cls(seq_dirc, None, None, clus_name, results)
def test_plt(self): clean_prev_dir(self.path, 'output') Bash.mkdir(os.path.join(self.path, 'output', 'text')) combi_para = [['Co'], ['Al']] pathA = os.path.join(self.path, 'typeA') pathB = os.path.join(self.path, 'typeB') path_out = os.path.join(self.path, 'output') self.plt_double(combi_para, pathA, pathB, path_out)
def mkdirs(self): """ pathに記された階層ディレクトリを作成 階層の順番はsetした順番となる """ for param in self.series: dst_path = param['path'] Bash.mkdir(dst_path)
def main(): Bash.mkdir('kp') kp_list = Array.frange_stp(0.08, 0.24, 0.02) #kp_list = Array.frange_stp(0.04, 0.07, 0.02) series = series_vasp.Produce('POSCAR', 'kp') series.set_kp_relax(kp_list) series.make_files() series.make_list_run('run.sh')
def test_volume(self): print("SeriesVasp test_volume") os.chdir(self.path) clean_prev_dir('.', 'volume') Bash.mkdir('volume') volume_list = [5, 6, 7] series = series_vasp.Produce('POSCAR', 'volume') series.set_volume(volume_list) series.make_files()
def stack(args): """ hcp-fcc Mg stacking 構造を作成する """ path = args strs = CVMStrs.from_str_file(path) for structure in strs: dirc = str(structure.label).split('*')[0] Bash.mkdir(dirc) structure.make_stack_poscar(os.path.join(dirc, "POSCAR"))
def for_ferrite(): """ ferrite系のcombinatorial """ Bash.mkdir('combi') elem_list = ['Ni', 'Mn', 'Cu', 'Zn', 'Cr'] comp_list = [['O', 'Fe', x] for x in elem_list] series = series_vasp.Produce('POSCAR', 'combi') series.set_elements(comp_list) series.make_files() series.append_list_run('run_combi.sh')
def expand_poscars(self, elements): """ self.poscarsのPOSCARをディレクトリ(ID名)に展開 elements名も追記する self.path中に作成 pathを変えたい場合はself.pathを変更 """ for poscar in self.poscars: Bash.mkdir(os.path.join(self.path, poscar['ID'])) poscar['object'].elements = elements poscar['object'].write_poscar(os.path.join(self.path, poscar['ID'], 'POSCAR'))
def make_system(self, dirname=None): os.chdir(CWD) font = ('Helevetica', 12, 'bold') self.initial.status.configure(text='None', font=font, fg='red') if not dirname: dirname = self.e_dir.get() dirname = "enshu_" + self.e_dir.get() path = os.path.join(CWD, dirname) Bash.mkdir(path) self.initial.listbox.delete(0, tk.END) SYSTEMS = [x[6:] for x in glob.glob('enshu_*')] print(SYSTEMS) self.initial.listbox.insert(tk.END, *SYSTEMS) self.top.destroy()
def for_Fe16N2(): """ perovskite系のcombinatorial """ Bash.mkdir('combi') elem_list = [['Sc', 'As', 'Se', 'Y', 'Mo', 'Tc', 'Ag', 'Cd', 'In', 'Te', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Au', 'Hg', 'Tl', 'Pb', 'Bi'], ['C', 'B', 'N']] combi = Combinatorial(*elem_list) comp_list = [['Fe', x['elements'][0], 'Fe', x['elements'][1]] for x in combi.compositions] series = series_vasp.Produce('POSCAR', 'combi') series.set_elements(comp_list) series.make_files() series.append_list_run('run_combi.sh')
def for_perovskite(): """ perovskite系のcombinatorial """ Bash.mkdir('combi') elem_list = [['Al', 'Co', 'Cr', 'Cu', 'Fe', 'Ga', 'Ge', 'Mn', 'Nb', 'Ni', 'Pd', 'Pt', 'Rh', 'Ru', 'Sb', 'Si', 'Sn', 'Ti', 'V', 'Zn', 'Zr'], ['C', 'B', 'N']] combi = Combinatorial(*elem_list) comp_list = [['Fe', x['elements'][0], x['elements'][1]] for x in combi.compositions] series = series_vasp.Produce('POSCAR', 'combi') series.set_elements(comp_list) series.make_files() series.append_list_run('run_combi.sh')
def extract_strs(self, exch_fix, src_path="../*/str.out", dst_dirc="extracts"): """ src_path 中の等価な全ての構造を genstr から抽出する """ for path in glob.glob(src_path): dst_path = os.path.join( dst_dirc, os.path.basename(os.path.dirname(path))) Bash.mkdir(dst_path) idx = self.get_idx_same_str(os.path.dirname(path), exch_fix=exch_fix) if idx: lines = self.lines[idx[0]:idx[1]] with open(os.path.join(dst_path, "str.out"), 'w') as wfile: wfile.write("".join(lines)) else: with open(os.path.join(dst_path, "too_large"), 'w') as wfile: wfile.write("")
def save_results(temp, plot_data): Bash.mkdir('results_cv1') lines = "x\ty\n" for i in range(len(plot_data[0])): lines += str(plot_data[0][i]) + "\t" lines += str(plot_data[1][i]) + "\n" fname = "raw_" + str(temp) with open(os.path.join('results_cv1', fname), 'w') as wfile: wfile.write(lines) lines = "x_fit\ty_fit\n" for i in range(len(plot_data[2])): lines += str(plot_data[2][i]) + "\t" lines += str(plot_data[3][i]) + "\n" fname = "fit_" + str(temp) with open(os.path.join('results_cv1', fname), 'w') as wfile: wfile.write(lines)
def prep_one(cls, cif_file, dst_dir): """ The dst_dir is current directory, this method search POSCAR and reserve it. If not, it will search whethre dst_dir already exist or not. If it already exist, this module will do nothing. If not, new directory make and prepare POSCAR file. """ if dst_dir == '.': Cabinet.reserve_file('POSCAR') elif glob.glob(dst_dir): line = ("\'{0}\' directory is already exist.\n" "Do Nothing...\n".format(dst_dir.split('/')[-1])) print(line) return else: Bash.mkdir(dst_dir) cls.conv2poscar(cif_file, dst_dir) shutil.copy(cif_file, dst_dir)
def test_normalize(self): """normalize lattice parameter """ print("VaspyPoscar test_normalize") os.chdir(self.path) clean_prev_dir(".", "normalize") Bash.mkdir("normalize") poscar = vaspy.Poscar("POSCAR") poscar.normalize_lattice() poscar.write_poscar("normalize/POSCAR") poscar1 = vaspy.Poscar("POSCAR") poscar2 = vaspy.Poscar("normalize/POSCAR") len1 = poscar1.get_lattice_length() len2 = poscar2.get_lattice_length() vol1 = poscar1.get_cell_volume() vol2 = poscar1.get_cell_volume() self.assertEqual(len1, len2) self.assertEqual(vol1, vol2) self.assertEqual(poscar2.cell_lattices[0, 0], 1) self.assertEqual(poscar2.cell_lattices[0, 1], 0) self.assertEqual(poscar2.cell_lattices[0, 2], 0)
def initialize(): """ seq ディレクトリを作成し originals ディレクトリ中に初期ファイルを保存 """ seq_list = glob.glob("seq*/") i = 0 for seq in seq_list: try: j = int(seq.split("seq")[-1].split("/")[0]) if i < j: i = j except ValueError: pass i += 1 dirc = 'seq{0}/originals/'.format(i) str_files = glob.glob('*.str') Bash.mkdir(dirc) for fname in ['IN.CVM', 'def.txt', 'energies.txt'] + str_files: copyfile(fname, os.path.join(dirc, fname)) return 'seq{0}'.format(i)
def find_cif_files(path): """ This method find **.cif or **.cif.txt in path and path/cifs directory. All cif files are moved in path/cifs/ dirctory """ cifs_dir = os.path.join(path, 'cifs') Bash.mkdir(cifs_dir) search_cif = glob.glob(os.path.join(path, "*.cif")) search_ciftxt = glob.glob(os.path.join(path, "*.cif.txt")) search_cwd = search_cif + search_ciftxt for cif_file in search_cwd: Bash.move(cif_file, cifs_dir) search_cif = glob.glob(os.path.join(cifs_dir, "*.cif")) search_ciftxt = glob.glob(os.path.join(cifs_dir, "*.cif.txt")) search_cifs = search_cif + search_ciftxt if len(search_cifs) == 0: print('I cannot find any .cif file in {0} and {1}' .format(path, cifs_dir)) exit() return search_cifs
def send(self): # cwd = os.path.basename(os.getcwd()) for system in SYSTEMS: drctry = 'enshu_' + system dst = os.path.join('/cooper', 'KSZM_2016', BASE_DIR, drctry) Bash.mkdir(dst) files = ['POSCAR', 'CHGCAR', 'OSZICAR', 'OUTCAR', 'murnaghan_plot.eps', 'band.eps'] for file in files: try: shutil.copyfile(os.path.join(CWD, drctry, file), os.path.join(dst, file)) except IOError: pass top = tk.Toplevel() f = tk.Frame(top) f.pack() label = tk.Label(f, text="Data were send !") label.pack() btn = tk.Button(f, text="OK", command=top.destroy) btn.pack()
def test_cova(self): print("SeriesVasp test_cova") os.chdir(self.path) clean_prev_dir('.', 'cova') Bash.mkdir('cova') cova_list = [round(random.uniform(1, 3), 3) for x in range(0, 3)] series = series_vasp.Produce('POSCAR', 'cova') series.set_cova(cova_list) series.make_files() orig_pos = vaspy.Poscar('POSCAR') vol_orig = orig_pos.get_cell_volume() test_param = random.choice(series.series) test_path = test_param['path'] test = vaspy.Poscar(os.path.join(test_path, 'POSCAR')) len_a, _, len_c = test.get_lattice_length() vol = test.get_cell_volume() self.assertAlmostEqual(len_c/len_a, test_param['cova']) self.assertAlmostEqual(vol_orig, vol)
def test_latt(self): print("SeriesVasp test_latt") os.chdir(self.path) clean_prev_dir('.', 'scale') Bash.mkdir('scale') scale_list = [round(random.uniform(1, 3), 3) for x in range(0, 3)] series = series_vasp.Produce('POSCAR', 'scale') series.set_scale(scale_list) series.make_files() test_param = random.choice(series.series) test_path = test_param['path'] test = vaspy.Poscar(os.path.join(test_path, 'POSCAR')) orig_pos = vaspy.Poscar('POSCAR') orig_a, _, orig_c = orig_pos.get_lattice_length() len_a, _, len_c = test.get_lattice_length() scale = test.cell_scale self.assertAlmostEqual(len_c/len_a, orig_c/orig_a) self.assertAlmostEqual(scale, test_param['scale'])
def main(): Bash.mkdir("cova") # cova_list = Array.frange_stp(0.95/(2**0.5), 1.45/(2**0.5), 0.05/(2**0.5)) # from bcc to fcc # cova_list = Array.frange_stp(0.90, 1.60, 0.05) # from bcc to fcc for D03 rate = 2 ** 0.5 rate = 1.0 / (2 ** 0.5) rate = rate * 2 rate = 1 print(rate) cova_list = Array.frange_stp(0.90 * rate, 1.60 * rate, 0.05 * rate) # cova_list = [1.275, 1.325, 1.375] # cova_list.append(1.00) # cova_list.append(1.05) series = series_vasp.Produce("POSCAR", "cova") series.set_cova(cova_list) series.make_files() series.append_list_run("run_cova.sh")
def make_energies_txt(self, vrange=None): """ 構造の名前は str.out と atoms を使って作成する vrange = [vmin, vmax, dv] を指定すると dv 刻みで体積の異なる energy を出力する volume と energy は固溶サイトあたり """ with open('atoms', 'r') as rfile: lines = rfile.readlines() label = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' atoms = {label[i]:lines[i][:-1] for i in range(len(lines))} self.data.sort(key=lambda x: x['path']) lines_out = "" for i in range(len(self.data)): with open( os.path.join(self.data[i]['path'], "str.out"), 'r') as rfile: lines = rfile.readlines() elements = Counter([x.split()[-1] for x in lines[6:]]) lines_out += self.data[i]['path'] + "*" total_sites = 0 for key in sorted(atoms.keys()): lines_out += key + str(elements[atoms[key]]) total_sites += elements[atoms[key]] energy_per_site = ( self.data[i]['energy'] * sum(self.data[i]['num_atoms']) / total_sites) lines_out += " 1 " + str(energy_per_site) + " 1\n" with open("energies.txt", 'w') as wfile: wfile.write(lines_out) if not vrange: return v_list = np.arange(*vrange) # v_list = np.linspace(vrange[0], vrange[1], 10) lines_out = "" Bash.mkdir("plot_EV") enes = [] for i in range(len(self.data)): with open( os.path.join(self.data[i]['path'], "str.out"), 'r') as rfile: lines = rfile.readlines() elements = Counter([x.split()[-1] for x in lines[6:]]) vols = [] ene = {} for vol in v_list: volume_per_site = vol lines_out += self.data[i]['path'] + "*" sum_sites = 0 for key in sorted(atoms.keys()): lines_out += key + str(elements[atoms[key]]) sum_sites += elements[atoms[key]] volume_per_atom = vol / (sum(self.data[i]['num_atoms']) / sum_sites) self.alt_energy_at_fixed_volume(volume_per_atom) energy_per_site = ( self.data[i]['energy'] * sum(self.data[i]['num_atoms']) / sum_sites) lines_out += " {0} ".format(volume_per_site) + \ str(energy_per_site) + " 1\n" ene.update({volume_per_site: energy_per_site}) vols.append(volume_per_site) enes.append(ene) self['EV'] = enes # print(self['EV']) print("min", "max") print(min(vols), max(vols)) with open("energies.txt", 'w') as wfile: wfile.write(lines_out)