def setCelldm(self, celldm=None, **kwargs): if not self.celldm: if not celldm: if not self.periodic: if 'margin' not in kwargs: margin = qtk.setting.box_margin else: margin = kwargs['margin'] self.box = self.getSize() + \ 2*np.array([margin, margin, margin]) self.celldm = copy.deepcopy(self.box) self.celldm.extend([0, 0, 0]) else: self.periodic = True self.celldm = celldm self.box = celldm[:3] self.R_scale = qtk.xyz2fractional(self.R, celldm) else: if celldm: self.periodic = True for i in range(len(celldm)): self.celldm[i] = celldm[i] self.box = celldm[:3] for i in range(self.N): for j in range(3): if self.scale: self.R[i, j] = self.R_scale[i, j] * \ self.celldm[j] / float(self.scale[j]) else: self.R[i, j] = self.R_scale[i, j] * celldm[j] return self.celldm
def __init__(self, qmout, **kwargs): PlanewaveOutput.__init__(self, qmout, **kwargs) out_file = open(qmout) data = out_file.readlines() out_file.close() EStrList = filter(lambda x: 'Etotal' in x, data) EList = filter(lambda x: 'ETOT' in x, data) self.scf_step = len(EList) if self.scf_step > 0: Et_list = [float(filter(None, s.split(' '))[2]) for s in EList] self.Et = Et_list[-1] elif len(EStrList) > 0: EStr = EStrList[-1] self.Et = float(EStr.split(' ')[-1]) if len(EStrList) > 0: EStr = EStrList[-1] detailInd = data.index(EStr) self.detail = data[detailInd - 7:detailInd] GStr = filter(lambda x: 'G(1)' in x, data)[-1] ind_g = len(data) - data[::-1].index(GStr) - 1 G_lattice = [] for i in range(3): G_lattice.append( np.fromstring(data[ind_g + i].split('=')[-1], sep=' ')) self.G_lattice = np.array(G_lattice) xangst = filter(lambda x: 'xangst' in x, data)[-1] angst_n = len(data) - data[::-1].index(xangst) - 1 xcart = filter(lambda x: 'xcart' in x, data)[-1] cart_n = len(data) - data[::-1].index(xcart) - 1 Rstr = copy.deepcopy(data[angst_n:cart_n]) Rstr[0] = Rstr[0].replace('xangst', '') R = [[float(r) for r in filter(None, s.split(' '))] for s in Rstr] N = len(R) ZstrOriginal = filter(lambda x: ' typat' in x, data)[-1] Zstr = ZstrOriginal.replace('typat', '') Zind = [int(z) for z in filter(None, Zstr.split(' '))] ZindItr = data.index(ZstrOriginal) while len(Zind) != N: ZindItr += 1 ZindNewStr = filter(None, data[ZindItr].split(' ')) ZindNew = [int(z) for z in ZindNewStr] Zind.extend(ZindNew) NZnuc = filter(lambda x: 'ntypat' in x, data)[-1] NZnuc = int(filter(None, NZnuc.split(' '))[-1]) Znuc = filter(lambda x: 'znucl ' in x, data)[-1] line_znuc = len(data) - data[::-1].index(Znuc) Znuc = filter(None, Znuc.replace('znucl', '').split(' ')) Znuc = [float(z) for z in Znuc] while len(Znuc) < NZnuc: Znuc_new = filter(None, data[line_znuc].split(' ')) Znuc_new = [float(z) for z in Znuc_new] Znuc.extend(Znuc_new) line_znuc = line_znuc + 1 build = [] for i in range(N): Z = [Znuc[Zind[i] - 1]] Z.extend(R[i]) build.append(Z) self.molecule = qtk.Molecule() self.molecule.build(build) if self.scf_step > 0: fStr = filter(lambda x: 'tesian forces (hartree/b' in x, data)[-1] fInd = data.index(fStr) fData = data[fInd + 1:fInd + 1 + N] force = [] for f in fData: fStr = filter(None, f.split(' '))[1:] force.append([float(fs) for fs in fStr]) self.force = np.array(force) self.occupation = [] try: r1p = re.compile(r'^[ a-z]{17} +[ 0-9.E+-]+$') r2p = re.compile(r'^ +[a-z]+ +.*$') report = filter(r2p.match, filter(r1p.match, data)) occ_ptn_lst = filter(lambda x: ' occ ' in x, report) if len(occ_ptn_lst) > 0: occ_pattern = occ_ptn_lst[-1] occ_pattern_ind = len(report) - report[::-1].index(occ_pattern) occ_pattern_end = report[occ_pattern_ind] occ_ind_start = len(data) - data[::-1].index(occ_pattern) - 1 occ_ind_end = len(data) - data[::-1].index(occ_pattern_end) - 1 for i in range(occ_ind_start, occ_ind_end): for occ in filter(None, data[i].split(' ')): try: self.occupation.append(float(occ)) except Exception as err: pass except Exception as err: qtk.warning("error when extracting occupation number with" +\ " error message: %s" % str(err)) cell_pattern = re.compile(r'^ R.*=.* G.*=.*$') cell_list = filter(cell_pattern.match, data) cell = [] for cstr in cell_list: cell.append([float(c) for c in filter(None, cstr.split(' '))[1:4]]) self.lattice = np.array(cell) / 1.889726124993 self.celldm = qtk.lattice2celldm(self.lattice) self.molecule.R_scale = qtk.xyz2fractional(self.molecule.R, self.celldm) eigStr = os.path.join(os.path.split(qmout)[0], '*_EIG') eigFileList = sorted(glob.glob(eigStr)) if len(eigFileList) != 0: if 'eig_index' in kwargs: eig_i = kwargs['eig_index'] else: eig_i = -1 if len(eigFileList) > 1: qtk.warning( "more than one o_EIG files found " + \ "loading last file with name: %s" % eigFileList[eig_i] ) eigFile = open(eigFileList[eig_i]) eigData = eigFile.readlines() eigFile.close() unitStr = filter(lambda x: 'Eigenvalues' in x, eigData)[0] unitStr = unitStr.replace('(', '').replace(')', '') unit = filter(None, unitStr.split(' '))[1] spinList = filter(lambda x: 'SPIN' in x, eigData) if len(spinList) != 0: spinFactor = 2 maxInd = eigData.index(spinList[-1]) else: spinFactor = 1 maxInd = len(eigData) ind = [] for kStr in filter(lambda x: 'kpt#' in x, eigData): ind.append(eigData.index(kStr)) band = [] kpoints = [] if spinFactor == 1: for i in range(len(ind)): wcoord = eigData[ind[i]].split('wtk=')[-1].split(', kpt=') weight = float(wcoord[0]) cStr = filter(None, wcoord[1].split('(')[0].split(' ')) coord = [float(c) for c in cStr] coord.append(weight) kpoints.append(coord) s = ind[i] + 1 if i < len(ind) - 1: e = ind[i + 1] else: e = len(eigData) eig_i = filter(None, ''.join(eigData[s:e]).split(' ')) band.append([ qtk.convE(float(ew), '%s-eV' % unit)[0] for ew in eig_i ]) self.band = np.array(band) self.kpoints = np.array(kpoints) self.mo_eigenvalues = np.array(band[0]).copy() if len(self.occupation) > 0: diff = np.diff(self.occupation) ind = np.array(range(len(diff))) pos = diff[np.where(abs(diff) > 0.5)] mask = np.in1d(diff, pos) if len(ind[mask]) > 0: N_state = ind[mask][0] else: qtk.warning("occupation number not available... " + \ "try to use molecule object with closed shell assumption" ) N_state = self.molecule.getValenceElectrons() / 2 - 1 vb = max(self.band[:, N_state]) cb = min(self.band[:, N_state + 1]) vb_pos = np.argmax(self.band[:, N_state]) cb_pos = np.argmin(self.band[:, N_state + 1]) self.Eg = cb - vb if vb_pos == cb_pos: self.Eg_direct = True else: self.Eg_direct = False self.fermi_index = N_state else: qtk.warning("spin polarized band data " +\ "extraction is not yet implemented") else: qtk.warning('no k-point information (o_EIG file) found')
def __init__(self, qmout, **kwargs): PlanewaveOutput.__init__(self, qmout, **kwargs) out_file = open(qmout) data = out_file.readlines() out_file.close() Et_pattern = re.compile("^.*total energy *=.*$") f_pattern = re.compile("^.*atom.*type.*force.*=.*$") Et_list = filter(Et_pattern.match, data) f_list = filter(f_pattern.match, data) if len(Et_list) > 0: Et_str = filter(Et_pattern.match, data)[-1] Et = float(Et_str.split()[-2]) self.Et, self.unit = qtk.convE(Et, 'Ry-Eh') out_folder = os.path.split(os.path.abspath(qmout))[0] save = glob.glob(os.path.join(out_folder, '*.save')) # extract force information if len(f_list) > 0: fstr = [filter(None, fstr.split('=')[-1].split(' ')) for fstr in f_list] # atomic unit force, HF/au, converted from Ry/au self.force = 0.5 * np.array( [[float(comp) for comp in atm] for atm in fstr] ) # extract band structure from xml files if save: save = save[0] try: data_xml = os.path.join(save, 'data-file.xml') xml_file = open(data_xml) tree = ET.parse(xml_file) xml_file.close() self.xml = tree.getroot() kpoints = [] band = [] # extract celldm celldm = [] cellVec = [] for i in range(1, 4): cellvStr = filter(None, self.xml[2][4][i].text.replace('\n', '').split(' ') ) cellVec.append([float(v) for v in cellvStr]) self.celldm = qtk.cellVec2celldm(cellVec) # extract structure R = [] N = int(self.xml[3][0].text.replace('\n', '')) Nsp = int(self.xml[3][1].text.replace('\n', '')) for i in range(N): RiStr = self.xml[3][5+Nsp+i].get('tau') Ri = [float(r) * 0.529177249 for r in RiStr.split(' ')] ni = self.xml[3][5+Nsp+i].get('SPECIES') Z = [qtk.n2Z(ni)] Z.extend(Ri) R.append(Z) self.molecule = qtk.Molecule() self.molecule.build(R) # access data for each kpoint for k in self.xml[-2]: k_str = k[0].text coord = [float(c) for c in k_str.split()] weight = float(k[1].text.split()[0]) coord.append(weight) kpoints.append(coord) ev_file = os.path.join(save, k[2].attrib['iotk_link']) k_xml_file = open(ev_file) k_xml = ET.parse(k_xml_file) k_xml_file.close() ev_k = k_xml.getroot() ev_str = ev_k[2].text.split() ev = [qtk.convE(float(entry), 'Eh-eV')[0]\ for entry in ev_str] band.append(ev) occ_str = ev_k[3].text.split() occ = [float(entry) for entry in occ_str] self.kpoints = np.array(kpoints) self.mo_eigenvalues = copy.deepcopy(band[0]) self.band = np.array(band) self.occupation = occ diff = np.diff(occ) pos = diff[np.where(abs(diff) > 0.5)] mask = np.in1d(diff, pos) ind = np.array(range(len(diff))) if len(ind[mask]) > 0: N_state = ind[mask][0] vb = max(self.band[:, N_state]) cb = min(self.band[:, N_state + 1]) vb_pos = np.argmax(self.band[:, N_state]) cb_pos = np.argmin(self.band[:, N_state + 1]) self.Eg = cb - vb if vb_pos == cb_pos: self.Eg_direct = True else: self.Eg_direct = False cell = [] for i in range(1, 4): vec = filter( None, self.xml[2][4][i].text.replace('\n', '').split(' ')) cell.append([float(v) for v in vec]) self.lattice = np.array(cell) / 1.889726124993 self.celldm = qtk.lattice2celldm(self.lattice) self.molecule.R_scale = qtk.xyz2fractional( self.molecule.R, self.celldm) except IOError: qtk.warning('xml file of job %s not found' % qmout) else: qtk.warning('job %s not finished' % qmout)
def __init__(self, qmout, **kwargs): PlanewaveOutput.__init__(self, qmout, **kwargs) out_file = open(qmout) data = out_file.readlines() out_file.close() Et_pattern = re.compile("^.*total energy *=.*$") f_pattern = re.compile("^.*atom.*type.*force.*=.*$") Et_list = filter(Et_pattern.match, data) f_list = filter(f_pattern.match, data) if len(Et_list) > 0: Et_str = filter(Et_pattern.match, data)[-1] Et = float(Et_str.split()[-2]) self.Et, self.unit = qtk.convE(Et, 'Ry-Eh') out_folder = os.path.split(os.path.abspath(qmout))[0] save = glob.glob(os.path.join(out_folder, '*.save')) # extract force information if len(f_list) > 0: fstr = [ filter(None, fstr.split('=')[-1].split(' ')) for fstr in f_list ] # atomic unit force, HF/au, converted from Ry/au self.force = 0.5 * np.array([[float(comp) for comp in atm] for atm in fstr]) # extract band structure from xml files if save: save = save[0] try: data_xml = os.path.join(save, 'data-file.xml') xml_file = open(data_xml) tree = ET.parse(xml_file) xml_file.close() self.xml = tree.getroot() kpoints = [] band = [] # extract celldm celldm = [] cellVec = [] for i in range(1, 4): cellvStr = filter( None, self.xml[2][4][i].text.replace('\n', '').split(' ')) cellVec.append([float(v) for v in cellvStr]) self.celldm = qtk.cellVec2celldm(cellVec) # extract structure R = [] N = int(self.xml[3][0].text.replace('\n', '')) Nsp = int(self.xml[3][1].text.replace('\n', '')) for i in range(N): RiStr = self.xml[3][5 + Nsp + i].get('tau') Ri = [float(r) * 0.529177249 for r in RiStr.split(' ')] ni = self.xml[3][5 + Nsp + i].get('SPECIES') Z = [qtk.n2Z(ni)] Z.extend(Ri) R.append(Z) self.molecule = qtk.Molecule() self.molecule.build(R) # access data for each kpoint for k in self.xml[-2]: k_str = k[0].text coord = [float(c) for c in k_str.split()] weight = float(k[1].text.split()[0]) coord.append(weight) kpoints.append(coord) ev_file = os.path.join(save, k[2].attrib['iotk_link']) k_xml_file = open(ev_file) k_xml = ET.parse(k_xml_file) k_xml_file.close() ev_k = k_xml.getroot() ev_str = ev_k[2].text.split() ev = [qtk.convE(float(entry), 'Eh-eV')[0]\ for entry in ev_str] band.append(ev) occ_str = ev_k[3].text.split() occ = [float(entry) for entry in occ_str] self.kpoints = np.array(kpoints) self.mo_eigenvalues = copy.deepcopy(band[0]) self.band = np.array(band) self.occupation = occ diff = np.diff(occ) pos = diff[np.where(abs(diff) > 0.5)] mask = np.in1d(diff, pos) ind = np.array(range(len(diff))) if len(ind[mask]) > 0: N_state = ind[mask][0] vb = max(self.band[:, N_state]) cb = min(self.band[:, N_state + 1]) vb_pos = np.argmax(self.band[:, N_state]) cb_pos = np.argmin(self.band[:, N_state + 1]) self.Eg = cb - vb if vb_pos == cb_pos: self.Eg_direct = True else: self.Eg_direct = False cell = [] for i in range(1, 4): vec = filter( None, self.xml[2][4][i].text.replace('\n', '').split(' ')) cell.append([float(v) for v in vec]) self.lattice = np.array(cell) / 1.889726124993 self.celldm = qtk.lattice2celldm(self.lattice) self.molecule.R_scale = qtk.xyz2fractional( self.molecule.R, self.celldm) except IOError: qtk.warning('xml file of job %s not found' % qmout) else: qtk.warning('job %s not finished' % qmout)
def __init__(self, qmout, **kwargs): PlanewaveOutput.__init__(self, qmout, **kwargs) out_file = open(qmout) data = out_file.readlines() out_file.close() EStrList = filter(lambda x: 'Etotal' in x, data) EList = filter(lambda x: 'ETOT' in x, data) self.scf_step = len(EList) if self.scf_step > 0: Et_list = [float(filter(None, s.split(' '))[2]) for s in EList] self.Et = Et_list[-1] elif len(EStrList) > 0: EStr = EStrList[-1] self.Et = float(EStr.split(' ')[-1]) if len(EStrList) > 0: EStr = EStrList[-1] detailInd = data.index(EStr) self.detail = data[detailInd-7:detailInd] xangst = filter(lambda x: 'xangst' in x, data)[-1] angst_n = len(data) - data[::-1].index(xangst) - 1 xcart = filter(lambda x: 'xcart' in x, data)[-1] cart_n = len(data) - data[::-1].index(xcart) - 1 Rstr = copy.deepcopy(data[angst_n:cart_n]) Rstr[0] = Rstr[0].replace('xangst', '') R = [[float(r) for r in filter(None, s.split(' '))] for s in Rstr] N = len(R) ZstrOriginal = filter(lambda x: ' typat' in x, data)[-1] Zstr = ZstrOriginal.replace('typat', '') Zind = [int(z) for z in filter(None, Zstr.split(' '))] ZindItr = data.index(ZstrOriginal) while len(Zind) != N: ZindItr += 1 ZindNewStr = filter(None, data[ZindItr].split(' ')) ZindNew = [int(z) for z in ZindNewStr] Zind.extend(ZindNew) Znuc = filter(lambda x: 'znucl ' in x, data)[-1] Znuc = filter(None, Znuc.replace('znucl', '').split(' ')) Znuc = [float(z) for z in Znuc] build = [] for i in range(N): Z = [Znuc[Zind[i]-1]] Z.extend(R[i]) build.append(Z) self.molecule = qtk.Molecule() self.molecule.build(build) if self.scf_step > 0: fStr = filter(lambda x: 'tesian forces (hartree/b' in x, data)[-1] fInd = data.index(fStr) fData = data[fInd+1:fInd+1+N] force = [] for f in fData: fStr = filter(None, f.split(' '))[1:] force.append([float(fs) for fs in fStr]) self.force = np.array(force) self.occupation = [] try: r1p = re.compile(r'^[ a-z]{17} +[ 0-9.E+-]+$') r2p = re.compile(r'^ +[a-z]+ +.*$') report = filter(r2p.match, filter(r1p.match, data)) occ_pattern = filter(lambda x: ' occ ' in x, report)[-1] occ_pattern_ind = len(report) - report[::-1].index(occ_pattern) occ_pattern_end = report[occ_pattern_ind] occ_ind_start = len(data) - data[::-1].index(occ_pattern) - 1 occ_ind_end = len(data) - data[::-1].index(occ_pattern_end) - 1 for i in range(occ_ind_start, occ_ind_end): for occ in filter(None, data[i].split(' ')): try: self.occupation.append(float(occ)) except: pass except Exception as err: qtk.warning("error when extracting occupation number with" +\ " error message: %s" % str(err)) cell_pattern = re.compile(r'^ R.*=.* G.*=.*$') cell_list = filter(cell_pattern.match, data) cell = [] for cstr in cell_list: cell.append( [float(c) for c in filter(None, cstr.split(' '))[1:4]]) self.lattice = np.array(cell) / 1.889726124993 self.celldm = qtk.lattice2celldm(self.lattice) self.molecule.R_scale = qtk.xyz2fractional( self.molecule.R, self.celldm) eigStr = os.path.join(os.path.split(qmout)[0], '*_EIG') eigFileList = glob.glob(eigStr) if len(eigFileList) != 0: if len(eigFileList) > 1: qtk.warning("more than one o_EIG files found") eigFile = open(eigFileList[0]) eigData = eigFile.readlines() eigFile.close() spinList = filter(lambda x: 'SPIN' in x, eigData) if len(spinList) != 0: spinFactor = 2 maxInd = eigData.index(spinList[-1]) else: spinFactor = 1 maxInd = len(eigData) ind = [] for kStr in filter(lambda x: 'kpt#' in x, eigData): ind.append(eigData.index(kStr)) band = [] kpoints = [] if spinFactor == 1: for i in range(len(ind)): wcoord = eigData[ind[i]].split('wtk=')[-1].split(', kpt=') weight = float(wcoord[0]) cStr = filter(None, wcoord[1].split('(')[0].split(' ')) coord = [float(c) for c in cStr] coord.append(weight) kpoints.append(coord) s = ind[i] + 1 if i < len(ind) - 1: e = ind[i+1] else: e = len(eigData) eig_i = filter(None, ''.join(eigData[s:e]).split(' ')) band.append([qtk.convE(float(ew), 'Eh-eV')[0] for ew in eig_i]) self.band = np.array(band) self.kpoints = np.array(kpoints) self.mo_eigenvalues = np.array(band[0]).copy() if len(self.occupation) > 0: diff = np.diff(self.occupation) ind = np.array(range(len(diff))) pos = diff[np.where(abs(diff) > 0.5)] mask = np.in1d(diff, pos) if len(ind[mask]) > 0: N_state = ind[mask][0] vb = max(self.band[:, N_state]) cb = min(self.band[:, N_state + 1]) vb_pos = np.argmax(self.band[:, N_state]) cb_pos = np.argmin(self.band[:, N_state + 1]) self.Eg = cb - vb if vb_pos == cb_pos: self.Eg_direct = True else: self.Eg_direct = False else: qtk.warning("spin polarized band data " +\ "extraction is not yet implemented") else: qtk.warning('no k-point information (o_EIG file) found')