From 7f8a04280f134da3931edec30fc09b2a096d2f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Ondra=C4=8Dka?= <pavel.ondracka@gmail.com> Date: Tue, 27 Oct 2020 15:23:03 +0100 Subject: [PATCH] Read eigenvalues from the *.energy* files --- wien2kparser/parser_wien2k.py | 60 +++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/wien2kparser/parser_wien2k.py b/wien2kparser/parser_wien2k.py index faeb7f0..6765e88 100644 --- a/wien2kparser/parser_wien2k.py +++ b/wien2kparser/parser_wien2k.py @@ -8,6 +8,7 @@ import sys from nomadcore.simple_parser import mainFunction, AncillaryParser, CachingLevel from nomadcore.simple_parser import SimpleMatcher as SM from nomadcore.local_meta_info import loadJsonFile, InfoKindEl +from nomadcore.unit_conversion import unit_conversion import wien2kparser.wien2k_parser_struct as wien2k_parser_struct import wien2kparser.wien2k_parser_in0 as wien2k_parser_in0 import wien2kparser.wien2k_parser_in1 as wien2k_parser_in1 @@ -133,6 +134,65 @@ class Wien2kContext(object): backend.addValue('single_configuration_to_calculation_method_ref', self.secMethodIndex) backend.addValue('single_configuration_calculation_to_system_ref', self.secSystemIndex) + mainFile = self.parser.fIn.fIn.name + + eigvalKpoint=[] + eigvalKpointMult=[] + eigvalVal=[[]] + + # Read eigenvalues from the energy files + # this can be either case.energy for non spinpolarized serial calculation + # case.energyup and case.energydn for spinpolarized serial calculation + # case.energy_x files for non spinpolarized parallel calculation + # case.energyup_x and case.energydn_x for spinpolarized parallel calculation + suffixes = ["", "up", "dn"] + spin = 0 + + for suf in suffixes: + for i in range(1000): + paraIdx = "" + if i != 0: + paraIdx = "_" + str(i) + fName = mainFile[:-4] + ".energy" + suf + paraIdx + if os.path.exists(fName) and os.stat(fName).st_size > 0: + with open(fName) as g: + if suf == "dn": + spin = 1 + if len(eigvalVal) == 1: + eigvalVal.append([]) + else: + spin = 0 + fromR = unit_conversion.convert_unit_function("rydberg", "J") + eigvalToRead=0 + for l in g: + if len(l) > 90: + continue + #there are no spaces sometime between the numbers but the format is fixed + if eigvalToRead == 0: + kx = float(l[0:19]) + ky = float(l[19:38]) + kz = float(l[38:57]) + eigvalKpointInd = int(l[57:67]) + if len(eigvalKpoint) == eigvalKpointInd - 1: + eigvalKpoint.append([kx, ky, kz]) + eigvalKpointMult.append([int(float(l[79:84]))]) + if len(eigvalVal[spin]) != eigvalKpointInd -1: + break + #raise Exception("Found old eigenvalues for the current k-point while reading from %s,\ + # possible mixing of serial nad parallel runs?" % fName) + eigvalToRead = int(l[73:79]) + eigvalVal[spin].append([]) + else: + eigvalVal[spin][-1].append(fromR(float(l[12:31]))) + eigvalToRead -= 1 + elif i > 0: + break + if eigvalVal[0]: + eigvalGIndex = backend.openSection("section_eigenvalues") + backend.addArrayValues("eigenvalues_values", np.asarray(eigvalVal)) + backend.addArrayValues("eigenvalues_kpoints", np.asarray(eigvalKpoint)) + backend.addArrayValues("eigenvalues_kpoints_multiplicity", np.asarray(eigvalKpointMult)) + backend.closeSection("section_eigenvalues",eigvalGIndex) def onClose_section_system(self, backend, gIndex, section): -- GitLab