diff --git a/parser/parser-exciting/exciting_parser_dos.py b/parser/parser-exciting/exciting_parser_dos.py index f3955f2c3596c7728c3a3b33e6369aa4ba5b94f3..dab13d6018e2940206b5f7c3adc4ecc6f39bee4a 100644 --- a/parser/parser-exciting/exciting_parser_dos.py +++ b/parser/parser-exciting/exciting_parser_dos.py @@ -6,7 +6,7 @@ from nomadcore.unit_conversion.unit_conversion import convert_unit from nomadcore.unit_conversion import unit_conversion class DosHandler(xml.sax.handler.ContentHandler): - def __init__(self, backend, spinTreat): + def __init__(self, backend, spinTreat, unitCellVol): self.backend = backend self.dosSectionGIndex = -1 self.inDos = False @@ -24,6 +24,7 @@ class DosHandler(xml.sax.handler.ContentHandler): self.numDosVal = 0 self.dosProjDummy = [] self.dosProjDummy2 = [] + self.unitCellVol = float(unitCellVol[0]) def endDocument(self): # self.inDos = False @@ -32,10 +33,13 @@ class DosHandler(xml.sax.handler.ContentHandler): # self.backend.closeSection("section_atom_projected_dos",self.dosProjSectionGIndex) self.dosSectionGIndex = -1 # self.dosProjSectionGIndex = -1 +# print("self.unitCellVol=",self.unitCellVol) def startElement(self, name, attrs): ha_per_joule = convert_unit(1, "hartree", "J") - bohr_cube_to_m_cube = convert_unit(1, "bohr^3", "m^3") +# bohr_cube_to_m_cube = convert_unit(1, "bohr^3", "m^3") +# print("bohr_cube_to_m_cube = ", bohr_cube_to_m_cube ) +# print("ha_per_joule= ",ha_per_joule) fromH = unit_conversion.convert_unit_function("hartree", "J") if name == "totaldos": self.dosSectionGIndex = self.backend.openSection("section_dos") @@ -50,11 +54,11 @@ class DosHandler(xml.sax.handler.ContentHandler): self.inDosProj = True elif name == "point": if self.inDos: - self.totDos.append(ha_per_joule*bohr_cube_to_m_cube*float(attrs.getValue('dos'))) + self.totDos.append(ha_per_joule*self.unitCellVol*float(attrs.getValue('dos'))) # self.energy.append(float(attrs.getValue('e'))) self.energy.append(fromH(float(attrs.getValue('e')))) elif self.inDosProj: - self.dosProj.append(ha_per_joule*bohr_cube_to_m_cube*float(attrs.getValue('dos'))) + self.dosProj.append(ha_per_joule*self.unitCellVol*float(attrs.getValue('dos'))) # self.energy.append(float(attrs.getValue('e'))) self.energy.append(fromH(float(attrs.getValue('e')))) elif name == "diagram": @@ -154,8 +158,8 @@ class DosHandler(xml.sax.handler.ContentHandler): def characters(self, content): pass -def parseDos(inF, backend, spinTreat): - handler = DosHandler(backend, spinTreat) +def parseDos(inF, backend, spinTreat, unitCellVol): + handler = DosHandler(backend, spinTreat, unitCellVol) logging.error("will parse") xml.sax.parse(inF, handler) logging.error("did parse") diff --git a/parser/parser-exciting/exciting_parser_gw.py b/parser/parser-exciting/exciting_parser_gw.py index b4debaa31ebf3bc13956e88992e44df348bfc5fa..fba6d26b0e1fefce720fcbd968de10fa933b90fc 100644 --- a/parser/parser-exciting/exciting_parser_gw.py +++ b/parser/parser-exciting/exciting_parser_gw.py @@ -21,8 +21,10 @@ class GWParser(object): self.vertexLabels = [] self.vertexNum = 0 - def parseGW(self, gwFile, backend, dftMethodSectionGindex, dftSingleConfigurationGindex): + def parseGW(self, gwFile, backend, dftMethodSectionGindex, dftSingleConfigurationGindex, xcName, unitCellVol): # logging.error("GW onClose_section_single_configuration_calculation") +# print("xcNameGW=", xcName) + self.unitCellVol = float(unitCellVol[0]) backend.openNonOverlappingSection("section_single_configuration_calculation") if dftSingleConfigurationGindex is not None: backend.openNonOverlappingSection("section_calculation_to_calculation_refs") @@ -48,6 +50,7 @@ class GWParser(object): if os.path.exists(inputFile): selfGWSetGIndex = backend.openSection("section_method") backend.addValue('electronic_structure_method', "G0W0") + backend.addValue('x_exciting_gw_starting_point', xcName) if dftMethodSectionGindex is not None: m2mGindex = backend.openNonOverlappingSection("section_method_to_method_refs") backend.addValue("method_to_method_ref", dftMethodSectionGindex) @@ -58,20 +61,25 @@ class GWParser(object): npol = 0 scrtype = "rpa" snempty = 0 + pnempty = 0 coreflag = "all" fgrid = "gaule2" + lmaxmb = 3 + epsmb = 0.0001 +# gmb = 1.0 + sciavtype = "isotropic" k1 = 0 k2 = 0 # f1 = 0 # f2 = 0 s1 = 0 s2 = 0 - # m1 = 0 - # m2 = 0 - # bc1 = 0 - # bc2 = 0 - # sc1 = 0 - # sc2 = 0 + m1 = 0 + m2 = 0 + bc1 = 0 + bc2 = 0 + sc1 = 0 + sc2 = 0 with open(inputFile) as g: i = 0 while 1: @@ -86,12 +94,12 @@ class GWParser(object): # if s[0] == "</freqgrid>": f2 = i if s[0] == "<selfenergy": s1 = i if s[0] == "</selfenergy>": s2 = i - # if s[0] == "<mixbasis": m1 = i - # if s[0] == "</mixbasis>": m2 = i - # if s[0] == "<barecoul": bc1 = i - # if s[0] == "</barecoul>": bc2 = i - # if s[0] == "<scrcoul": sc1 = i - # if s[0] == "</scrcoul>": sc2 = i + if s[0] == "<mixbasis": m1 = i + if s[0] == "</mixbasis>": m2 = i + if s[0] == "<barecoul": bc1 = i + if s[0] == "</barecoul>": bc2 = i + if s[0] == "<scrcoul": sc1 = i + if s[0] == "</scrcoul>": sc2 = i with open(inputFile) as g: i = 0 while 1: @@ -108,19 +116,35 @@ class GWParser(object): actype = s[1][1:-1] if (s[0] == "npol") and (i >= k1): npol = s[1][1:-1] + if (s[0] == "nempty") and (i >= k1) and (i <= k2): + pnempty = s[1][1:-1] if (s[0] == "scrtype") and (i >= k1): scrtype = s[1][1:-1] if (s[0] == "nempty") and (i >= s1) and (i <= s2): snempty = s[1][1:-1] + if (s[0] == "nempty") and (i >= m1) and (i <= m2): + lmaxmb = s[1][1:-1] + if (s[0] == "nempty") and (i >= m1) and (i <= m2): + epsmb = s[1][1:-1] +# if (s[0] == "nempty") and (i >= m1) and (i <= m2): +# gmb = s[1][1:-1] + if (s[0] == "sciavtype") and (i >= sc11) and (i <= sc2): + sciavtype = s[1][1:-1] if (s[0] == "fgrid") and (i >= k1): fgrid = s[1][1:-1] - backend.addValue("x_exciting_GW_frequency_grid_type", fgrid) - backend.addValue("x_exciting_GW_self_energy_c_empty_states", int(snempty)) - backend.addValue("x_exciting_GW_core_treatment", coreflag) - backend.addValue("x_exciting_GW_self_energy_singularity_treatment", singularity) - backend.addValue("x_exciting_GW_self_energy_c_analytical_continuation", actype) - backend.addValue("x_exciting_GW_self_energy_c_number_of_poles", int(npol)) - backend.addValue("x_exciting_GW_screened_Coulomb", scrtype) + backend.addValue("x_exciting_gw_frequency_grid_type", fgrid) + backend.addValue("x_exciting_gw_self_energy_c_empty_states", int(snempty)) + backend.addValue("x_exciting_gw_core_treatment", coreflag) + backend.addValue("x_exciting_gw_self_energy_singularity_treatment", singularity) + backend.addValue("x_exciting_gw_self_energy_c_analytical_continuation", actype) + backend.addValue("x_exciting_gw_self_energy_c_number_of_poles", int(npol)) + backend.addValue("x_exciting_gw_screened_Coulomb", scrtype) + backend.addValue("x_exciting_gw_polarizability_empty_states", int(pnempty)) + backend.addValue("x_exciting_gw_basis_set", "mixed") + backend.addValue("x_exciting_gw_mixed_basis_lmax", lmaxmb) + backend.addValue("x_exciting_gw_mixed_basis_tolerance", epsmb) +# backend.addValue("x_exciting_gw_mixed_basis_gmax", gmb) + backend.addValue("x_exciting_gw_screened_coulomb_volume_average",sciavtype) backend.closeSection("section_method",selfGWSetGIndex) if os.path.exists(vertexGWFile): @@ -192,17 +216,17 @@ class GWParser(object): backend.addValue("number_of_eigenvalues", len(qpE[0])) backend.addValue("number_of_eigenvalues_kpoints", len(qpGWKpoint)) backend.addValue("eigenvalues_values", qpE) - backend.addValue("x_exciting_GW_qp_linearization_prefactor", Znk) + backend.addValue("x_exciting_gw_qp_linearization_prefactor", Znk) backend.closeSection("section_eigenvalues",eigvalGWGIndex) - backend.addValue("x_exciting_GW_self_energy_x", Sx) - backend.addValue("x_exciting_GW_self_energy_c", Sc) + backend.addValue("x_exciting_gw_self_energy_x", Sx) + backend.addValue("x_exciting_gw_self_energy_c", Sc) ####################DOS###################### if os.path.exists(dosGWFile): dosGWGIndex = backend.openSection("section_dos") ha_per_joule = unit_conversion.convert_unit(1, "hartree", "J") - bohr_cube_to_m_cube = unit_conversion.convert_unit(1, "bohr^3", "m^3") +# bohr_cube_to_m_cube = unit_conversion.convert_unit(1, "bohr^3", "m^3") fromH = unit_conversion.convert_unit_function("hartree", "J") with open(dosGWFile) as g: dosValues = [[],[]] @@ -212,7 +236,7 @@ class GWParser(object): if not s: break s = s.strip() s = s.split() - ene, value = fromH(float(s[0])), ha_per_joule*bohr_cube_to_m_cube*float(s[1]) + ene, value = fromH(float(s[0])), ha_per_joule*self.unitCellVol*float(s[1]) dosEnergies.append(ene) if not self.spinTreat: for i in range(0,2): diff --git a/parser/parser-exciting/parser_exciting.py b/parser/parser-exciting/parser_exciting.py index d7ad68b0e00eadbecf81fb4c917ebb3881592e0f..d65bc613cffcb7c2226874d71b62960d33e8273a 100644 --- a/parser/parser-exciting/parser_exciting.py +++ b/parser/parser-exciting/parser_exciting.py @@ -30,6 +30,8 @@ class ExcitingParserContext(object): self.sim_cell = [] self.cell_format = '' self.secRunIndex = None + self.unit_cell_vol = 0 + self.xcName = None def onOpen_section_system(self, backend, gIndex, section): self.secSystemIndex = gIndex @@ -50,14 +52,16 @@ class ExcitingParserContext(object): dirPath = os.path.dirname(self.parser.fIn.name) gw_File = os.path.join(dirPath, "GW_INFO.OUT") gwFile = os.path.join(dirPath, "GWINFO.OUT") - +# print("xcName= ",self.xcName) for gFile in [gw_File, gwFile]: if os.path.exists(gFile): # logging.error("Starting GW") gwParser = exciting_parser_gw.GWParser() gwParser.parseGW(gFile, backend, dftMethodSectionGindex = self.secMethodIndex, - dftSingleConfigurationGindex = self.secSingleConfIndex) + dftSingleConfigurationGindex = self.secSingleConfIndex, + xcName = self.xcName, + unitCellVol = self.unit_cell_vol) # logging.error("Finished GW") break @@ -74,6 +78,8 @@ class ExcitingParserContext(object): backend.addValue("simulation_cell", cell) def onClose_x_exciting_section_reciprocal_lattice_vectors(self, backend, gIndex, section): +# self.unit_cell_vol = section["x_exciting_unit_cell_volume"] +# print("self.unit_cell_vol= ",self.unit_cell_vol) recLatticeX = section["x_exciting_geometry_reciprocal_lattice_vector_x"] recLatticeY = section["x_exciting_geometry_reciprocal_lattice_vector_y"] recLatticeZ = section["x_exciting_geometry_reciprocal_lattice_vector_z"] @@ -84,6 +90,7 @@ class ExcitingParserContext(object): def onClose_x_exciting_section_xc(self, backend, gIndex, section): xcNr = section["x_exciting_xc_functional"][0] +# print("xcNr= ",xcNr) xc_internal_map = { 2: ['LDA_C_PZ', 'LDA_X_PZ'], 3: ['LDA_C_PW', 'LDA_X_PZ'], @@ -98,6 +105,8 @@ class ExcitingParserContext(object): 406: ['HYB_GGA_XC_PBEH'] } for xcName in xc_internal_map[xcNr]: + self.xcName = xcName +# print("xcName= ",self.xcName) gi = backend.openSection("section_XC_functionals") backend.addValue("XC_functional_name", xcName) backend.closeSection("section_XC_functionals", gi) @@ -115,7 +124,7 @@ class ExcitingParserContext(object): if os.path.exists(dosFile): with open(dosFile) as f: - exciting_parser_dos.parseDos(f, backend, self.spinTreat) + exciting_parser_dos.parseDos(f, backend, self.spinTreat, self.unit_cell_vol) if os.path.exists(bandFile): with open(bandFile) as g: exciting_parser_bandstructure.parseBand(g, backend, self.spinTreat) @@ -236,6 +245,8 @@ class ExcitingParserContext(object): def onClose_section_system(self, backend, gIndex, section): + self.unit_cell_vol = section["x_exciting_unit_cell_volume"] +# print("self.unit_cell_vol= ",self.unit_cell_vol) backend.addArrayValues('configuration_periodic_dimensions', np.asarray([True, True, True])) self.secSystemDescriptionIndex = gIndex