Source code for wannier90

#!/usr/bin/env python
#"""Written by Niraj K. Nepal, Ph.D"""
"""Module to prepare wannier90 input files"""
import os
import json
import numpy as np
from ase.io import espresso
from kpoint_path import kpoint_path

[docs] def epw_bandcheck(infile='scf.in', out="ex.win", proj=" ", json_file="wannier90.json", dft="QE"): """ function to write input file for wannier90 calculations. Default: 'ex.win' parameters ------------- infile : input file for scf calculation out : output file. Default: 'ex.win' proj : 'scdm' if used SCDM projection, '' otherwise json_file: JSON file containing element-value pairs for configurational settings dft: DFT package name, can be 'QE' (Quantum ESPRESSO), 'VASP', or 'other' """ if os.path.isfile("scf_dir/{}".format(infile)): data = espresso.read_espresso_in("scf_dir/{}".format(infile)) else: print("Creates wannier-vasp.in from json file\n") # Load settings from combined JSON file with open(json_file, 'r') as read_json_file: all_settings = json.load(read_json_file) config_settings = all_settings["config_settings"] plot_settings = all_settings["plot_settings"] if dft in ("VASP","vasp"): # Write the WANNIER90_WIN file for VASP with open("wannier-vasp.in", 'w') as wannier_vasp_file: settings_str = " ".join(["{}={}\n".format(k, v) for k, v in config_settings.items()]) # Include projection settings for VASP settings_str += "Begin Projections\n" if proj == 'scdm': settings_str += "auto_projections=.true.\n" elif proj == "fromfile": if os.path.isfile("../../projection.in"): os.system("cp ../../projection.in .") if os.path.isfile("projection.in"): with open("projection.in", "r") as gfile: lines = gfile.readlines() len_l = len(lines) projections = "" for line in lines: projections += line #projections = " ".join([line.strip() for line in lines]) settings_str += "{}".format(projections) else: print("projection.in file not found\n") print("write projections in different line, 'X:s', 'Y:pz', ... so on\n") else: settings_str += "random\n" settings_str += "End Projections\n" settings_str += " ".join(["{}={}\n".format(k, v) for k, v in plot_settings.items()]) if plot_settings['bands_plot'] == '.true.': kpoint_path(infile) settings_str += "Begin Kpoint_Path\n" with open("wannier_kpath.in", "r") as gfile: lines = gfile.readlines() for line in lines: settings_str += line settings_str += "END Kpoint_Path\n" num_wann = config_settings["num_wann"] wannier_vasp_file.write(f"NUM_WANN = {num_wann}\n") wannier_vasp_file.write("WANNIER90_WIN = \" \n") wannier_vasp_file.write("{}".format(settings_str)) wannier_vasp_file.write("\"") elif dft in ("QE","qe"): # Extract relevant data from the input file cell = data.cell symbol = data.get_chemical_symbols() pos = data.get_scaled_positions() kmesh = np.loadtxt('kmesh.grid') # Write the standard EPW input file with open(out, 'w') as epw_write: # Write configuration settings from JSON file for key, value in config_settings.items(): epw_write.write("{} = {}\n".format(key, value)) # Write Kpoint Path epw_write.write("Begin Kpoint_Path\n") with open("wannier_kpath.in", "r") as gfile: lines = gfile.readlines() for line in lines: epw_write.write(line) epw_write.write("End Kpoint_Path\n\n") # Write projections based on the 'proj' parameter if proj == 'scdm': epw_write.write("auto_projections = .true.\n") elif proj == "fromfile": if os.path.isfile("projection.in"): with open("projection.in", "r") as gfile: lines = gfile.readlines() len_l = len(lines) epw_write.write("begin projections\n") for i in range(len_l): epw_write.write("{}\n".format(lines[i].split("\n")[0])) epw_write.write("end projections\n") else: print("projection.in file not found\n") print("write projections in different line, 'X:s', 'Y:pz', ... so on\n") else: epw_write.write("begin projections\n") epw_write.write("random\n") epw_write.write("end projections\n") # Write remaining data for key, value in plot_settings.items(): epw_write.write("{} = {}\n".format(key, value)) epw_write.write("begin unit_cell_cart\n") epw_write.write("Ang\n") for lat in cell: epw_write.write("{} {} {}\n".format(lat[0], lat[1], lat[2])) epw_write.write("end unit_cell_cart\n\n") epw_write.write("begin atoms_frac\n") for sym, pos in zip(symbol, pos): epw_write.write("{} {} {} {}\n".format(sym, pos[0], pos[1], pos[2])) epw_write.write("end atoms_frac\n\n") epw_write.write("mp_grid : {} {} {}\n".format(int(kmesh[0]), int(kmesh[1]), int(kmesh[2]))) epw_write.write("begin kpoints\n") with open('wann_grid.out', 'r') as gfile: lines = gfile.readlines() for line in lines: epw_write.write(line) epw_write.write("end kpoints\n") else: print("Allowed values for 'dft' parameter are 'QE' or 'VASP'.")
if __name__ == "__main__": epw_bandcheck(dft="VASP")