Source code for jarvis.io.boltztrap.outputs

"""Class for analyzing BoltzTrap outputs."""

import os
import numpy as np
from collections import OrderedDict, defaultdict

Ry_to_ev = 13.6056980659


[docs]class BoltzTrapOutput(object): """Analyze BoltzTrap output.""" def __init__( self, path="", outtrans_data=[], intrans_data=[], condtens_fixdoping=[], halltens_fixdoping=[], ): """Specify boltztrap folder as path to analze data.""" self.path = path if outtrans_data == []: outtrans_data = self.read_outputtrans() self.outtrans_data = outtrans_data if intrans_data == []: intrans_data = self.read_intrans() self.intrans_data = intrans_data if condtens_fixdoping == []: condtens_fixdoping = self.read_condtens_fixdoping() self.condtens_fixdoping = condtens_fixdoping if halltens_fixdoping == []: halltens_fixdoping = self.read_halltens_fixdoping() self.halltens_fixdoping = halltens_fixdoping
[docs] def to_dict(self): """Return output as a dictionary.""" d = OrderedDict() d["path"] = self.path d["outtrans_data"] = self.outtrans_data d["intrans_data"] = self.intrans_data d["halltens_fixdoping"] = self.halltens_fixdoping d["condtens_fixdoping"] = self.condtens_fixdoping return d
[docs] def read_intrans(self, filename=""): """Read intrans file.""" if filename == "": filename = os.path.join(self.path, "boltztrap.intrans") f = open(filename, "r") lines = f.read().splitlines() f.close() self.intrans_data = lines return lines
[docs] def read_outputtrans(self, filename=""): """Read outtrans file.""" gap = "na" Ef = "na" vbm = "na" cbm = "na" warning = "na" excessN_doping = "na" if filename == "": filename = os.path.join(self.path, "boltztrap.outputtrans") info = {} excessN_doping = {} f = open(filename, "r") lines = f.read().splitlines() f.close() for ii, i in enumerate(lines): if "WARNING" in i: warning = i elif "Doping level number" in i: tmp_dop = float(i.split("=")[1].split()[0]) tmp_excess = float(lines[ii + 1].split()[3]) excessN_doping.setdefault(tmp_excess, tmp_dop) elif "Egap" in i: gap = float(i.split()[1]) * Ry_to_ev elif "VBM" in i: vbm = float(i.split()[1]) * Ry_to_ev cbm = float(i.split()[3]) * Ry_to_ev Ef = float(i.split()[5]) * Ry_to_ev info["gap"] = gap info["Ef"] = Ef info["vbm"] = vbm info["cbm"] = cbm info["warning"] = warning info["excessN_doping"] = excessN_doping # self.outtrans_data=info return info
[docs] def dopinglevel_for_excessN(self, excessN): """Return doping level for excees concentration.""" excessN_doping = self.read_outputtrans()["excessN_doping"] for i, j in excessN_doping.items(): if np.isclose(i, excessN): return j
[docs] def read_condtens_fixdoping(self, filename=""): """Read condtens_fixdoping file.""" if filename == "": filename = os.path.join(self.path, "boltztrap.condtens_fixdoping") f = open(filename, "r") lines = f.read().splitlines() f.close() full_doping_data = [] for i in lines: if "#" not in i and len(i) > 2: full_doping_data.append([float(j) for j in i.split()]) d = np.array(full_doping_data) all_data = {} p_dict = defaultdict(dict) n_dict = defaultdict(dict) for i in d: T = i[0] ef = i[29] * Ry_to_ev N = i[1] N_cm3 = self.dopinglevel_for_excessN(N) # print ('N,N_cm3',N,N_cm3) cond = i[2:11] seeb = i[11:20] kappa = i[20:29] if N > 0: info = {} info["cond"] = cond info["seeb"] = seeb info["kappa"] = kappa info["Ef"] = ef info["N_cm3"] = N_cm3 p_dict[T][N] = info else: info = {} info["cond"] = cond info["seeb"] = seeb info["kappa"] = kappa info["Ef"] = ef info["N_cm3"] = N_cm3 n_dict[T][N] = info all_data["p"] = p_dict all_data["n"] = n_dict # self.condtens_fixdoping=all_data return all_data
[docs] def read_halltens_fixdoping(self, filename=""): """Read halltens file.""" if filename == "": filename = os.path.join(self.path, "boltztrap.halltens_fixdoping") f = open(filename, "r") lines = f.read().splitlines() f.close() full_doping_data = [] for i in lines: if "#" not in i and len(i) > 2: full_doping_data.append([float(j) for j in i.split()]) d = np.array(full_doping_data) all_data = {} p_dict = defaultdict(dict) n_dict = defaultdict(dict) for i in d: T = i[0] ef = i[29] * Ry_to_ev N = i[1] N_cm3 = self.dopinglevel_for_excessN(N) # print ('N,N_cm3',N,N_cm3) hall = i[2:29] if N > 0: info = {} info["hall"] = hall info["Ef"] = ef info["N_cm3"] = N_cm3 p_dict[T][N] = info else: info = {} info["hall"] = hall info["Ef"] = ef info["N_cm3"] = N_cm3 n_dict[T][N] = info all_data["p"] = p_dict all_data["n"] = n_dict # self.halltens_fixdoping=all_data return all_data
[docs] @classmethod def from_dict(self, d={}): """Load from a dictionary.""" return BoltzTrapOutput( path=d["path"], outtrans_data=d["outtrans_data"], intrans_data=d["intrans_data"], halltens_fixdoping=d["halltens_fixdoping"], condtens_fixdoping=d["condtens_fixdoping"], )
""" if __name__ == "__main__": condtens_fix = "boltztrap/boltztrap.condtens_fixdoping" b = BoltzTrapOutput( path="boltztrap" ).read_condtens_fixdoping() b = BoltzTrapOutput( path="boltztrap" ).read_outputtrans() b = BoltzTrapOutput( path="boltztrap" ).to_dict() print(b) """