From b6fab8c3f1694d666d5cf6e5802166b48cab045b Mon Sep 17 00:00:00 2001 From: lopa <pardini@physik.hu-berlin.de> Date: Thu, 28 Jun 2018 15:20:48 +0200 Subject: [PATCH] BSE exciton --- .../exciting_parser_XS_input.py | 24 ++-- parser/parser-exciting/exciting_parser_xs.py | 107 ++++++++++++++++++ parser/parser-exciting/parser_exciting.py | 92 ++++++++++++++- .../eu/nomad_lab/parsers/ExcitingParser.scala | 1 + 4 files changed, 211 insertions(+), 13 deletions(-) create mode 100644 parser/parser-exciting/exciting_parser_xs.py diff --git a/parser/parser-exciting/exciting_parser_XS_input.py b/parser/parser-exciting/exciting_parser_XS_input.py index f6561d3..54472c7 100644 --- a/parser/parser-exciting/exciting_parser_XS_input.py +++ b/parser/parser-exciting/exciting_parser_XS_input.py @@ -49,10 +49,10 @@ class InputHandler(xml.sax.handler.ContentHandler): # self.vkloffScrDum = "-1.0 -1.0 -1.0" self.screening = "none" self.bse = "none" - self.screentype = "full" +# self.screentype = "full" ############ BSE variables################ self.aresbse = "True" - self.bsetype = "singlet" +# self.bsetype = "singlet" self.lmaxdielt = 14 self.nstlbse = [0, 0, 0, 0] ######## DA FARE self.nstlbseDum = [0, 0, 0, 0] ######## DA FARE @@ -193,11 +193,11 @@ class InputHandler(xml.sax.handler.ContentHandler): self.rgkmaxScr = attrs.getValue('rgkmax') except: self.rgkmaxSrc = 0.0 - try: - self.screentype = attrs.getValue('screentype') - self.backend.addValue("x_exciting_xs_screening_type", int(self.screentype)) - except: - self.backend.addValue("x_exciting_xs_screening_type", self.screentype) +# try: +# self.screentype = attrs.getValue('screentype') +# self.backend.addValue("x_exciting_xs_screening_type", int(self.screentype)) +# except: +# self.backend.addValue("x_exciting_xs_screening_type", self.screentype) # self.aresbse = "true" # self.bsetype = "singlet" @@ -222,11 +222,11 @@ class InputHandler(xml.sax.handler.ContentHandler): self.backend.addValue("x_exciting_xs_bse_antiresonant", self.aresbse) except: self.backend.addValue("x_exciting_xs_bse_antiresonant", self.aresbse) - try: - self.bsetype = attrs.getValue('bsetype') - self.backend.addValue("x_exciting_xs_bse_type", self.bsetype) - except: - self.backend.addValue("x_exciting_xs_bse_type", self.bsetype) +# try: +# self.bsetype = attrs.getValue('bsetype') +# self.backend.addValue("x_exciting_xs_bse_type", self.bsetype) +# except: +# self.backend.addValue("x_exciting_xs_bse_type", self.bsetype) try: self.lmaxdielt = attrs.getValue('lmaxdielt') self.backend.addValue("x_exciting_xs_bse_angular_momentum_cutoff", int(self.lmaxdielt)) diff --git a/parser/parser-exciting/exciting_parser_xs.py b/parser/parser-exciting/exciting_parser_xs.py new file mode 100644 index 0000000..8453bf4 --- /dev/null +++ b/parser/parser-exciting/exciting_parser_xs.py @@ -0,0 +1,107 @@ +# Copyright 2017-2018 Lorenzo Pardini +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from builtins import object +import setup_paths +import xml.sax +from nomadcore.simple_parser import mainFunction, 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 os, sys, json, logging + +################################################################ +# This is the subparser for the exciting GW output +################################################################ + + +class XSParser(object): + """context for wien2k In2 parser""" + + def __init__(self): + pass +# self.excitonEnergys = [] +# self.vertexLabels = [] +# self.vertexNum = 0 +# self.parser = None +# self.secSingleConfIndex = None + + def startedParsing(self, path, parser): + """called when parsing starts""" + self.parser = parser + # allows to reset values if the same superContext is used to parse different files +# self.initialize_values() + + def parseExciton(self, excFile, backend, excNum, excEn, excBindEn, osclStr, transCoeff): +# if dftSingleConfigurationGindex is not None: +# backend.openNonOverlappingSection("section_calculation_to_calculation_refs") +# backend.addValue("calculation_to_calculation_ref", dftSingleConfigurationGindex) +# backend.addValue("calculation_to_calculation_kind", "starting_point") +# backend.closeNonOverlappingSection("section_calculation_to_calculation_refs") +# logging.error("GW onClose_section_single_configuration_calculation") + with open(excFile) as g: + while 1: + s = g.readline() + if not s: break + s = s.strip() + s = s.split() + if s[0] != "#": + excNum[-1].append(int(s[0])) + excEn[-1].append(float(s[1])) + excBindEn[-1].append(float(s[2])) + osclStr[-1].append(float(s[3])) + transCoeff[-1][0].append(float(s[4])) + transCoeff[-1][1].append(float(s[5])) + +# print("s===",excNum) +# if len(st) == 3: + +# if len(s) >= 40: + +# print("vaaa") +# self.gmaxvr = float(gmaxvr[0]) +# self.unitCellVol = float(unitCellVol[0]) +# backend.openNonOverlappingSection("section_single_configuration_calculation") +# if dftSingleConfigurationGindex is not None: +# backend.openNonOverlappingSection("section_calculation_to_calculation_refs") +# backend.addValue("calculation_to_calculation_ref", dftSingleConfigurationGindex) +# backend.addValue("calculation_to_calculation_kind", "starting_point") +# backend.closeNonOverlappingSection("section_calculation_to_calculation_refs") +# +# dirPath = os.path.dirname(gwFile) +# if os.access(os.path.join(dirPath, "EVALQP.DAT"), os.F_OK): + # eigvalGWFile = os.path.join(dirPath, "EVALQP.DAT") +# elif os.access(os.path.join(dirPath, "EVALQP.TXT"), os.F_OK): +# eigvalGWFile = os.path.join(dirPath, "EVALQP.TXT") + # else: +# pass +# dosGWFile = os.path.join(dirPath, "TDOS-QP.OUT") + # bandCarbGWFile = os.path.join(dirPath, "bandstructure-qp.dat") + # bandBorGWFile = os.path.join(dirPath, "BAND-QP.OUT") + # vertexGWFile = os.path.join(dirPath, "BANDLINES.OUT") + # vertexLabGWFile = os.path.join(dirPath, "bandstructure.xml") + # selfCorGWFile = os.path.join(dirPath, "SELFC.DAT") + # inputFile = os.path.join(dirPath, "input.xml") + # inputgw1File = os.path.join(dirPath, "input-gw.xml") +# inputgw2File = os.path.join(dirPath, "input_gw.xml") + +def get_cachingLevelForMetaName(metaInfoEnv, CachingLvl): + cachingLevelForMetaName = {} +# 'section_single_configuration_calculation': CachingLvl +# } +# cachingLevelForMetaName["gw_fundamental_gap"] = CachingLevel.Cache +# cachingLevelForMetaName["gw_optical_gap"] = CachingLevel.Cache +# cachingLevelForMetaName["gw_fermi_energy"] = CachingLevel.Cache + return cachingLevelForMetaName + diff --git a/parser/parser-exciting/parser_exciting.py b/parser/parser-exciting/parser_exciting.py index 2f2f298..dadf2aa 100644 --- a/parser/parser-exciting/parser_exciting.py +++ b/parser/parser-exciting/parser_exciting.py @@ -23,7 +23,7 @@ from nomadcore.caching_backend import CachingLevel from nomadcore.unit_conversion import unit_conversion from nomadcore.unit_conversion.unit_conversion import convert_unit_function import os, sys, json, exciting_parser_dos,exciting_parser_bandstructure, exciting_parser_gw, exciting_parser_GS_input -import exciting_parser_XS_input +import exciting_parser_XS_input, exciting_parser_xs from ase import Atoms import logging @@ -69,6 +69,10 @@ class ExcitingParserContext(object): self.dummy = 0 self.i=0 self.clathrates = False + self.bsetype = None + self.screentype = None + self.tensorComp = [] + self.excitonEnergies = [] # self.volumeOptIndex = 0 def onOpen_section_run(self, backend, gIndex, section): @@ -227,6 +231,11 @@ class ExcitingParserContext(object): break if os.path.exists(xsFile): + excNum = [] + excEn = [] + excBindEn = [] + osclStr = [] + transCoeff = [] # print("BSE!!!") # if os.path.exists(inputgwFile): inputXSFile = os.path.join(dirPath, "input.xml") @@ -238,10 +247,91 @@ class ExcitingParserContext(object): backend.addValue("method_to_method_ref", self.secMethodIndex) backend.addValue("method_to_method_kind", "starting_point") backend.closeNonOverlappingSection("section_method_to_method_refs") + + for files in os.listdir(dirPath): + if files[0:11] == "EXCITON_BSE": + dummyBse = files[11:13] +# self.tensorComp = files[-6:-4] + self.tensorComp.append(files[-6:-4]) + + if dummyBse == 'si': + self.bsetype = 'singlet' +# name = "EXCITON_BSE" + self.bsetype + elif dummyBse == 'tr': + self.bsetype = 'triplet' + elif dummyBse == 'RP': + self.bsetype = 'RPA' + elif dummyBse == 'IP': + self.bsetype = 'IP' + name = "EXCITON_BSE" + self.bsetype + '_SCR' + if files[len(name):len(name)+4] == 'full': + self.screentype = 'full' + elif files[len(name):len(name)+4] == 'diag': + self.screentype = 'diag' + elif files[len(name):len(name)+4] == 'noin': + self.screentype = 'noinvdiag' + elif files[len(name):len(name)+4] == 'long': + self.screentype = 'longrange' + + backend.addValue("x_exciting_xs_screening_type", self.screentype) + backend.addValue("x_exciting_xs_bse_type", self.bsetype) +# print("===", self.tensorComp[0]) with open(inputXSFile) as f: exciting_parser_XS_input.parseInput(f, backend, self.rgkmax) backend.closeSection("section_method",selfXSSetGIndex) + numberOfComponents = len(self.tensorComp) + + backend.openNonOverlappingSection("section_single_configuration_calculation") + if self.secSingleConfIndex is not None: + backend.openNonOverlappingSection("section_calculation_to_calculation_refs") + backend.addValue("calculation_to_calculation_ref", self.secSingleConfIndex) + backend.addValue("calculation_to_calculation_kind", "starting_point") + backend.closeNonOverlappingSection("section_calculation_to_calculation_refs") + + for i in range(numberOfComponents): + excNum.append([]) + excEn.append([]) + excBindEn.append([]) + osclStr.append([]) + transCoeff.append([[],[]]) + outputXSFile = os.path.join(dirPath, "EXCITON_BSE" + self.bsetype + '_SCR' + self.screentype + "_OC" + self.tensorComp[i] + ".OUT") + with open(outputXSFile) as g: + xsParser = exciting_parser_xs.XSParser() + xsParser.parseExciton(outputXSFile, backend, excNum, excEn, excBindEn, osclStr, transCoeff) #, dftMethodSectionGindex = self.secMethodIndex, +# dftSingleConfigurationGindex = self.secSingleConfIndex) +# backend.addvalue("x_exciting_xs_bse_number_of_components",numberOfComponents) +# backend.addvalue("x_exciting_xs_bse_number_of_excitons",len(excNum)) + backend.addValue("x_exciting_xs_bse_exciton_energies",excEn) +# print("===",excBindEn) + backend.closeNonOverlappingSection("section_single_configuration_calculation") + + +# print(outputXSFile) + +# for files in os.listdir(dirPath): +# if files[0:11] == "EXCITON_BSE": +# dummyBse = files[11:13] +# dummyTenCom = files[-6:-4] +# if dummyBse == 'si': +# self.bsetype = 'singlet' +## name = "EXCITON_BSE" + self.bsetype +# elif dummyBse == 'tr': +# self.bsetype = 'triplet' +# elif dummyBse == 'RP': +# self.bsetype = 'RPA' +# elif dummyBse == 'IP': +# self.bsetype = 'IP' +# name = "EXCITON_BSE" + self.bsetype + '_SCR' +# if files[len(name):len(name)+4] == 'full': +# self.screentype = 'full' +# elif files[len(name):len(name)+4] == 'diag': +# self.screentype = 'diag' +# elif files[len(name):len(name)+4] == 'noin': +# self.screentype = 'noinvdiag' +# elif files[len(name):len(name)+4] == 'long': +# self.screentype = 'longrange' +# print("===",self.screentype) ###########################TEST############################# diff --git a/src/main/scala/eu/nomad_lab/parsers/ExcitingParser.scala b/src/main/scala/eu/nomad_lab/parsers/ExcitingParser.scala index 12ae532..2198d04 100644 --- a/src/main/scala/eu/nomad_lab/parsers/ExcitingParser.scala +++ b/src/main/scala/eu/nomad_lab/parsers/ExcitingParser.scala @@ -49,6 +49,7 @@ object ExcitingParser extends SimpleExternalParserGenerator( "parser-exciting/exciting_parser_input.py", "parser-exciting/exciting_parser_GS_input.py", "parser-exciting/exciting_parser_XS_input.py", + "parser-exciting/exciting_parser_xs.py", "parser-exciting/setup_paths.py", "nomad_meta_info/public.nomadmetainfo.json", "nomad_meta_info/common.nomadmetainfo.json", -- GitLab