Source code for jarvis.io.boltztrap.inputs

"""Class for writing inputs for BoltzTrap calculations."""
import numpy as np
from jarvis.io.vasp.outputs import Vasprun
from jarvis.analysis.structure.spacegroup import Spacegroup3D

Ry_to_ev = 13.6056980659
Angs_to_Bohr = 1.88973


[docs]class WriteInputs(object): """Write input files for BoltzTrap.""" def __init__( self, vasprun_path="", dos_type="HISTO", tmax=1300, tgrid=50, doping=[], run_type="BOLTZ", symprec=1e-2, energy_grid=0.005, lpfac=10, energy_span_around_fermi=1.5, energy=None, struct=None, intrans=None, ): """ Require following information. energy: energy window. struct: Atoms object. intrans: name of intrans. vasprun_path: path of vasprun file. dos_type: type of densit of states. tmax: maximum temperature. tgrid: temperature grid. doping: doping levels run_type: symprec: symmetry precision. energy_grid: energy grid. lpfac: energy_span_around_fermi: """ self.energy = energy self.struct = struct self.intrans = intrans self.vasprun_path = vasprun_path self.vrun = Vasprun(filename=vasprun_path) self.energy_grid = energy_grid self.lpfac = lpfac self.run_type = run_type self.energy_span_around_fermi = energy_span_around_fermi self.tmax = tmax self.tgrid = tgrid self.dos_type = dos_type self.doping = doping if self.doping == []: for d in [1e16, 1e17, 1e18, 1e19, 1e20, 1e21]: self.doping.extend([1 * d, 2.5 * d, 5 * d, 7.5 * d]) self.doping.append(1e22)
[docs] def write_intrans(self, filename="boltztrap.intrans"): """Write BoltzTrap input intrans file.""" f = open(filename, "w") scissor = 0.0 nelect = int(float(self.vrun.all_input_parameters["NELECT"])) setgap = 1 if scissor > 0.0001 else 0 f.write("GENE # use generic interface\n") f.write( "1 0 %d %f # iskip (not presently used) idebug " "setgap shiftgap \n" % (setgap, scissor / float(Ry_to_ev)) ) f.write( "0.0 %f %f %6.1f # Fermilevel (Ry),energygrid,energy " "span around Fermilevel, number of electrons\n" % ( self.energy_grid / float(Ry_to_ev), self.energy_span_around_fermi / float(Ry_to_ev), nelect, ) ) f.write( "CALC # CALC (calculate expansion " "coeff), NOCALC read from file\n" ) f.write( "%d # lpfac, number of latt-points " "per k-point\n" % self.lpfac ) f.write( "%s # run mode (only BOLTZ is " "supported)\n" % self.run_type ) f.write( ".15 # (efcut) energy range of " "chemical potential\n" ) f.write( "{} {} # Tmax, temperature grid\n".format( self.tmax, self.tgrid ) ) f.write( "-1. # energyrange of bands given DOS output sig_xxx and " "dos_xxx (xxx is band number)\n" ) f.write(self.dos_type + "\n") self.taurf = 0 self.tauexp = 0 self.tauen = 0 f.write("{} {} {} 0 0 0\n".format(self.taurf, self.tauexp, self.tauen)) f.write("{}\n".format(2 * len(self.doping))) for i in self.doping: f.write(str(i) + "\n") for i in self.doping: f.write(str(-i) + "\n") f.close()
[docs] def write_struct(self, filename="boltztrap.struct"): """Write BoltzTrap based struct file.""" atoms = self.vrun.all_structures[-1] spg = Spacegroup3D(atoms) spg_symb = spg.space_group_symbol formula = atoms.composition.formula operations = spg._dataset["rotations"] lattice_mat = np.array(atoms.lattice_mat) * Angs_to_Bohr f = open(filename, "w") f.write("%s %s\n" % (formula, spg_symb)) f.write( "%12.8f %12.8f %12.8f\n" % (lattice_mat[0][0], lattice_mat[0][1], lattice_mat[0][2]) ) f.write( "%12.8f %12.8f %12.8f\n" % (lattice_mat[1][0], lattice_mat[1][1], lattice_mat[1][2]) ) f.write( "%12.8f %12.8f %12.8f\n" % (lattice_mat[2][0], lattice_mat[2][1], lattice_mat[2][2]) ) f.write("%d\n" % (len(operations))) for c in operations: for row in c: f.write("{}\n".format(" ".join(str(i) for i in row))) f.close()
[docs] def write_energy(self, filename="boltztrap.energyso", trim=0.1): """Write energy information from DFT.""" kpoints = self.vrun.kpoints._kpoints eigs_up, eigs_dn = self.vrun.eigenvalues ef = self.vrun.efermi target = 2 * int(len(eigs_dn[0]) * (1 - trim)) # +1 # print("target", target) f = open(filename, "w") line = str("system \n") + str(len(kpoints)) + "\n" f.write(line) for i, j, k in zip(kpoints, eigs_up, eigs_dn): count = 0 line = (" ".join(map(str, i))) + str(" ") + str(target) + "\n" # f.write(line) f.write("%12.8f %12.8f %12.8f %d\n" % (i[0], i[1], i[2], target)) for m, n in zip(j, k): count = count + 2 if count <= target: en_up = round((m[0] - ef) / float(Ry_to_ev), 8) en_dn = round((n[0] - ef) / float(Ry_to_ev), 8) f.write("%18.8f\n" % (en_up)) f.write("%18.8f\n" % (en_dn)) f.close()
""" if __name__ == "__main__": from jarvis.io.vasp.outputs import Vasprun vrun = Vasprun( "/rk2/knc6/JARVIS-DFT/Elements-bulkk/mp-149_bulk_PBEBO/MAIN-RELAX-bulk@mp-149/vasprun.xml" ) print(vrun.final_energy) inp = WriteInputs( vasprun_path="/rk2/knc6/JARVIS-DFT/Elements-bulkk/mp-149_bulk_PBEBO/MAIN-RELAX-bulk@mp-149/vasprun.xml" ) inp.write_energy() inp.write_struct() inp.write_intrans() cmd = "~/anaconda2/bin/x_trans BoltzTraP -so" os.system(cmd) """