Skip to content
Snippets Groups Projects
Commit 49df352d authored by shanghui's avatar shanghui
Browse files

Add input file parser.

parent 098eb520
Branches
Tags 1.1.0
No related merge requests found
from builtins import object
import setup_paths
import numpy as np
import nomadcore.ActivateLogging
from nomadcore.caching_backend import CachingLevel
from nomadcore.simple_parser import AncillaryParser, mainFunction
from nomadcore.simple_parser import SimpleMatcher as SM
from QboxCommon import get_metaInfo
import logging, os, re, sys
############################################################
# This is the parser for the input file of qbox.
############################################################
############################################################
###############[1] transfer PARSER CONTEXT #################
############################################################
logger = logging.getLogger("nomad.qboxInputParser")
class QboxInputParserContext(object):
def __init__(self):
self.functionals = []
def initialize_values(self):
"""Initializes the values of certain variables.
This allows a consistent setting and resetting of the variables,
when the parsing starts and when a section_run closes.
"""
self.secMethodIndex = None
self.secSystemDescriptionIndex = None
self.singleConfCalcs = []
def startedParsing(self, fInName, parser):
"""Function is called when the parsing starts.
Get compiled parser, filename and metadata.
Args:
fInName: The file name on which the current parser is running.
parser: The compiled parser. Is an object of the class SimpleParser in nomadcore.simple_parser.py.
"""
self.parser = parser
self.fName = fInName
# save metadata
self.metaInfoEnv = self.parser.parserBuilder.metaInfoEnv
# allows to reset values if the same superContext is used to parse different files
self.initialize_values()
def onClose_section_run(self, backend, gIndex, section):
"""Trigger called when section_run is closed.
"""
# reset all variables
self.initialize_values()
# frame sequence
sampling_method = "geometry_optimization"
samplingGIndex = backend.openSection("section_sampling_method")
backend.addValue("sampling_method", sampling_method)
backend.closeSection("section_sampling_method", samplingGIndex)
frameSequenceGIndex = backend.openSection("section_frame_sequence")
backend.addValue("frame_sequence_to_sampling_ref", samplingGIndex)
backend.addArrayValues("frame_sequence_local_frames_ref", np.asarray(self.singleConfCalcs))
backend.closeSection("section_frame_sequence", frameSequenceGIndex)
def onClose_x_qbox_section_functionals(self, backend, gIndex, section):
functional_list = section["x_qbox_functional_name"]
if not functional_list: # default is LDA in qbox
functional = "LDA"
else :
functional = functional_list[-1] # use the xc appeared the last time
if functional:
functionalMap = {
"LDA": ["LDA_X", "LDA_C_PZ"],
"VMN": ["LDA_X", "LDA_C_VWN"],
"PBE": ["GGA_X_PBE","GGA_C_PBE"],
"PBE0": ["GGA_X_PBE","GGA_C_PBE"],
"B3LYP": ["HYB_GGA_XC_B3LYP5"]
#need to be extended to add alpha_PBE0 :coefficient of Hartree-Fock exchange in the PBE0 xc functional
}
# Push the functional string into the backend
nomadNames = functionalMap.get(functional)
if not nomadNames:
raise Exception("Unhandled xc functional %s found" % functional)
for name in nomadNames:
s = backend.openSection("section_XC_functionals")
backend.addValue('XC_functional_name', name)
backend.closeSection("section_XC_functionals", s)
###################################################################
# (3.4) onClose for geometry and force (section_system)
# todo: maybe we can move the force to onClose_section_single_configuration_calculation in the future.
###################################################################
def onOpen_section_method(self, backend, gIndex, section):
# keep track of the latest method section
self.secMethodIndex = gIndex
def onOpen_section_system(self, backend, gIndex, section):
# keep track of the latest system description section
self.secSystemDescriptionIndex = gIndex
def onClose_section_system(self, backend, gIndex, section):
"""Trigger called when section_system is closed.
Writes atomic positions, atom labels and lattice vectors.
"""
# keep track of the latest system description section
self.secSystemDescriptionIndex = gIndex
#------1.atom_positions
atom_pos = []
for i in ['x', 'y', 'z']:
api = section['x_qbox_geometry_atom_positions_' + i]
if api is not None:
atom_pos.append(api)
if atom_pos:
# need to transpose array since its shape is [number_of_atoms,3] in the metadata
backend.addArrayValues('atom_positions', np.transpose(np.asarray(atom_pos)))
#------2.atom labels
atom_labels = section['x_qbox_geometry_atom_labels']
if atom_labels is not None:
backend.addArrayValues('atom_labels', np.asarray(atom_labels))
#----3. unit_cell
unit_cell = []
for i in ['x', 'y', 'z']:
uci = section['x_qbox_geometry_lattice_vector_' + i]
if uci is not None:
unit_cell.append(uci)
if unit_cell:
backend.addArrayValues('simulation_cell', np.asarray(unit_cell))
backend.addArrayValues("configuration_periodic_dimensions", np.ones(3, dtype=bool))
def onOpen_section_single_configuration_calculation(self, backend, gIndex, section):
self.singleConfCalcs.append(gIndex)
def onClose_section_single_configuration_calculation(self, backend, gIndex, section):
# write the references to section_method and section_system
backend.addValue('single_configuration_to_calculation_method_ref', self.secMethodIndex)
backend.addValue('single_configuration_calculation_to_system_ref', self.secSystemDescriptionIndex)
#############################################################
#################[2] MAIN PARSER STARTS HERE ###############
#############################################################
def build_QboxInputFileSimpleMatcher():
"""Builds the SimpleMatcher to parse the input file of qbox (*.i) .
First, several subMatchers are defined, which are then used to piece together
the final SimpleMatcher.
SimpleMatchers are called with 'SM (' as this string has length 4,
which allows nice formating of nested SimpleMatchers in python.
Returns:
SimpleMatcher that parses input file of qbox.
"""
####################################################################
# (2) submatcher for control method that echo INPUT file (section_method)
####################################################################
calculationMethodSubMatcher = SM(name = 'calculationMethods',
startReStr = "",
#endReStr = r"\s*",
repeats = True,
sections = ["section_method"],
subMatchers = [
#--------k_point-------------
SM(r"\s*kpoint add\s+(?P<x_qbox_k_point_x>[-+0-9.eEdD]+)\s+(?P<x_qbox_k_point_y>[-+0-9.eEdD]+)\s+(?P<x_qbox_k_point_z>[-+0-9.eEdD]+)\s+(?P<x_qbox_k_point_weight>[-+0-9.eEdD]+)\s*",repeats = True),
#--------set method---------
SM(r"\s*set\s+ecut\s+(?P<x_qbox_ecut__rydberg>[0-9.]+)\s*"),
SM(r"\s*set\s+wf_dyn\s+(?P<x_qbox_wf_dyn>[A-Za-z0-9]+)\s*"),
SM(r"\s*set\s+atoms_dyn\s+(?P<x_qbox_atoms_dyn>[A-Za-z0-9]+)\s*"),
SM(r"\s*set\s+cell_dyn\s+(?P<x_qbox_cell_dyn>[A-Za-z0-9]+)\s*"),
#--------set xc---------
SM(name = "qboxXC",
startReStr = r"\s*set\s+xc\s+(?P<x_qbox_functional_name>[A-Za-z0-9]+)\s*",
sections = ["x_qbox_section_functionals"]
),
#-------set efield---------
SM (r"\s*set\s+e_field\s*(?P<x_qbox_efield_x>[-+0-9.]+)\s+(?P<x_qbox_efield_y>[-+0-9.]+)\s+(?P<x_qbox_efield_z>[-+0-9.]+)\s*",repeats = True)
#???both this version adn qbox_section_efield version could not give mather for efield, need to check.
])
########################################
# return main Parser
########################################
return SM (name = 'Root',
startReStr = "",
forwardMatch = True,
weak = True,
subMatchers = [
#=============================================================================
# read OUPUT file *.r, the method part comes from INPUT file *.i, so we
# do not need to parser INPUT file, the OUTPUT file contains all information
#=============================================================================
SM (name = 'NewRun',
startReStr = r"",
#endReStr = r"\s*<end_time",
repeats = False,
required = True,
forwardMatch = True,
fixedStartValues={'program_name': 'qbox', 'program_basis_set_type': 'plane waves'},
sections = ['section_run'],
subMatchers = [
#-----------input method---------------------
calculationMethodSubMatcher
]) # CLOSING SM NewRun
]) # END Root
def get_cachingLevelForMetaName(metaInfoEnv):
"""Sets the caching level for the metadata.
Args:
metaInfoEnv: metadata which is an object of the class InfoKindEnv in nomadcore.local_meta_info.py.
Returns:
Dictionary with metaname as key and caching level as value.
"""
# manually adjust caching of metadata
cachingLevelForMetaName = {
'eigenvalues_values': CachingLevel.Cache,
'eigenvalues_kpoints':CachingLevel.Cache
}
# Set caching for temparary storage variables
for name in metaInfoEnv.infoKinds:
if ( name.startswith('x_qbox_store_')
or name.startswith('x_qbox_cell_')):
cachingLevelForMetaName[name] = CachingLevel.Cache
return cachingLevelForMetaName
def main():
"""Main function.
Set up everything for the parsing of the qbox main file and run the parsing.
"""
# get main file description
QboxInputFileSimpleMatcher = build_QboxInputFileSimpleMatcher()
# loading metadata from nomad-meta-info/meta_info/nomad_meta_info/qbox.nomadmetainfo.json
metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../../../nomad-meta-info/meta_info/nomad_meta_info/qbox.nomadmetainfo.json"))
metaInfoEnv = get_metaInfo(metaInfoPath)
# set parser info
parserInfo = {'name':'qbox-input-parser', 'version': '1.0'}
# get caching level for metadata
cachingLevelForMetaName = get_cachingLevelForMetaName(metaInfoEnv)
# start parsing
mainFunction(mainFileDescription = QboxInputFileSimpleMatcher,
metaInfoEnv = metaInfoEnv,
parserInfo = parserInfo,
cachingLevelForMetaName = cachingLevelForMetaName,
superContext = QboxInputParserContext())
if __name__ == "__main__":
main()
......@@ -10,7 +10,7 @@ import QboxXMLParser
import logging, os, re, sys
############################################################
# This is the parser for the main file of qbox.
# This is the parser for the main file of qbox (for the output file *.r) .
############################################################
......@@ -74,11 +74,11 @@ class QboxParserContext(object):
#################################################################
# (2) onClose for INPUT control (section_method)
#################################################################
def onClose_qbox_section_xml_file(self, backend, gIndex, section):
def onClose_x_qbox_section_xml_file(self, backend, gIndex, section):
qbox_loading_xml_file_list = section['qbox_loading_xml_file']
x_qbox_loading_xml_file_list = section['x_qbox_loading_xml_file']
xml_file = qbox_loading_xml_file_list[-1]
xml_file = x_qbox_loading_xml_file_list[-1]
if xml_file is not None:
logger.warning("This output showed this calculation need to load xml file, so we need this xml file ('%s') to read geometry information" % os.path.normpath(xml_file) )
......@@ -99,8 +99,8 @@ class QboxParserContext(object):
logger.warning("Could not find xml file in directory '%s'. " % os.path.dirname(os.path.abspath(self.fName)))
def onClose_qbox_section_functionals(self, backend, gIndex, section):
functional_list = section["qbox_functional_name"]
def onClose_x_qbox_section_functionals(self, backend, gIndex, section):
functional_list = section["x_qbox_functional_name"]
if not functional_list: # default is LDA in qbox
functional = "LDA"
......@@ -195,7 +195,7 @@ class QboxParserContext(object):
#------1.atom_positions
atom_pos = []
for i in ['x', 'y', 'z']:
api = section['qbox_geometry_atom_positions_' + i]
api = section['x_qbox_geometry_atom_positions_' + i]
if api is not None:
atom_pos.append(api)
if atom_pos:
......@@ -203,14 +203,14 @@ class QboxParserContext(object):
backend.addArrayValues('atom_positions', np.transpose(np.asarray(atom_pos)))
#------2.atom labels
atom_labels = section['qbox_geometry_atom_labels']
atom_labels = section['x_qbox_geometry_atom_labels']
if atom_labels is not None:
backend.addArrayValues('atom_labels', np.asarray(atom_labels))
#------3.atom force
atom_force = []
for i in ['x', 'y', 'z']:
api = section['qbox_atom_force_' + i]
api = section['x_qbox_atom_force_' + i]
if api is not None:
atom_force.append(api)
if atom_force:
......@@ -221,7 +221,7 @@ class QboxParserContext(object):
#----4. unit_cell
unit_cell = []
for i in ['x', 'y', 'z']:
uci = section['qbox_geometry_lattice_vector_' + i]
uci = section['x_qbox_geometry_lattice_vector_' + i]
if uci is not None:
unit_cell.append(uci)
if unit_cell:
......@@ -240,15 +240,15 @@ class QboxParserContext(object):
backend.addValue('single_configuration_calculation_to_system_ref', self.secSystemDescriptionIndex)
def onClose_qbox_section_stress_tensor(self, backend, gIndex, section):
qbox_stress_tensor = []
def onClose_x_qbox_section_stress_tensor(self, backend, gIndex, section):
x_qbox_stress_tensor = []
for i in ['xx', 'yy', 'zz', 'xy', 'yz', 'xz']:
api = section['qbox_stress_tensor_' + i]
api = section['x_qbox_stress_tensor_' + i]
if api is not None:
qbox_stress_tensor.append(api)
if qbox_stress_tensor:
x_qbox_stress_tensor.append(api)
if x_qbox_stress_tensor:
# need to transpose array since its shape is [number_of_atoms,3] in the metadata
backend.addArrayValues('stress_tensor', np.transpose(np.asarray(qbox_stress_tensor)))
backend.addArrayValues('stress_tensor', np.transpose(np.asarray(x_qbox_stress_tensor)))
......@@ -276,14 +276,14 @@ def build_QboxMainFileSimpleMatcher():
#####################################################################
# (1) submatcher for header
#note: we add qbox_section_functionals here because we want to add
#note: we add x_qbox_section_functionals here because we want to add
# a default LDA here even 'set xc' is not shown in *.i file.
#####################################################################
headerSubMatcher = SM(name = 'ProgramHeader',
startReStr = r"\s*I qbox\s+(?P<program_version>[0-9.]+)",
sections = ["qbox_section_functionals"],
sections = ["x_qbox_section_functionals"],
subMatchers = [
SM(r"\s*<nodename>\s+(?P<qbox_nodename>[a-zA-Z0-9.-]+)\s+</nodename>")
SM(r"\s*<nodename>\s+(?P<x_qbox_nodename>[a-zA-Z0-9.-]+)\s+</nodename>")
])
####################################################################
......@@ -313,28 +313,28 @@ def build_QboxMainFileSimpleMatcher():
SM(name = "qboxXMLfile",
startReStr = r"\s*LoadCmd",
forwardMatch = True, #use this or not like qboxXC
sections = ["qbox_section_xml_file"],
sections = ["x_qbox_section_xml_file"],
subMatchers = [
SM(r"\s*LoadCmd:\s*loading from\s+(?P<qbox_loading_xml_file>[A-Za-z0-9./-_]+)"),
SM(r"\s*LoadCmd:\s*loading from\s+(?P<x_qbox_loading_xml_file>[A-Za-z0-9./-_]+)"),
]), # CLOSING qbox_section_xml_file
#--------k_point-------------
SM(r"\s*\[qbox\]\s+<cmd>\s*kpoint add\s+(?P<qbox_k_point_x>[-+0-9.eEdD]+)\s+(?P<qbox_k_point_y>[-+0-9.eEdD]+)\s+(?P<qbox_k_point_z>[-+0-9.eEdD]+)\s+(?P<qbox_k_point_weight>[-+0-9.eEdD]+)\s*</cmd>",repeats = True),
SM(r"\s*\[qbox\]\s+<cmd>\s*kpoint add\s+(?P<x_qbox_k_point_x>[-+0-9.eEdD]+)\s+(?P<x_qbox_k_point_y>[-+0-9.eEdD]+)\s+(?P<x_qbox_k_point_z>[-+0-9.eEdD]+)\s+(?P<x_qbox_k_point_weight>[-+0-9.eEdD]+)\s*</cmd>",repeats = True),
#--------set method---------
SM(r"\s*\[qbox\]\s*\[qbox\]\s*<cmd>\s*set\s+ecut\s+(?P<qbox_ecut__rydberg>[0-9.]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s+<cmd>\s*set\s+wf_dyn\s+(?P<qbox_wf_dyn>[A-Za-z0-9]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s+<cmd>\s*set\s+atoms_dyn\s+(?P<qbox_atoms_dyn>[A-Za-z0-9]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s+<cmd>\s*set\s+cell_dyn\s+(?P<qbox_cell_dyn>[A-Za-z0-9]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s*\[qbox\]\s*<cmd>\s*set\s+ecut\s+(?P<x_qbox_ecut__rydberg>[0-9.]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s+<cmd>\s*set\s+wf_dyn\s+(?P<x_qbox_wf_dyn>[A-Za-z0-9]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s+<cmd>\s*set\s+atoms_dyn\s+(?P<x_qbox_atoms_dyn>[A-Za-z0-9]+)\s*</cmd>"),
SM(r"\s*\[qbox\]\s+<cmd>\s*set\s+cell_dyn\s+(?P<x_qbox_cell_dyn>[A-Za-z0-9]+)\s*</cmd>"),
#--------set xc---------
SM(name = "qboxXC",
startReStr = r"\s*\[qbox\]\s+<cmd>\s*set\s+xc\s+(?P<qbox_functional_name>[A-Za-z0-9]+)\s*</cmd>",
sections = ["qbox_section_functionals"]
startReStr = r"\s*\[qbox\]\s+<cmd>\s*set\s+xc\s+(?P<x_qbox_functional_name>[A-Za-z0-9]+)\s*</cmd>",
sections = ["x_qbox_section_functionals"]
),
#-------set efield---------
SM (r"\s*\[qbox\]\s*\[qbox\]\s*<cmd>\s*set\s+e_field\s*(?P<qbox_efield_x>[-+0-9.]+)\s+(?P<qbox_efield_y>[-+0-9.]+)\s+(?P<qbox_efield_z>[-+0-9.]+)\s*</cmd>",repeats = True)
SM (r"\s*\[qbox\]\s*\[qbox\]\s*<cmd>\s*set\s+e_field\s*(?P<x_qbox_efield_x>[-+0-9.]+)\s+(?P<x_qbox_efield_y>[-+0-9.]+)\s+(?P<x_qbox_efield_z>[-+0-9.]+)\s*</cmd>",repeats = True)
#???both this version adn qbox_section_efield version could not give mather for efield, need to check.
])
......@@ -381,51 +381,51 @@ def build_QboxMainFileSimpleMatcher():
subMatchers = [
SM (startReStr = r"\s*<unit_cell\s*",
subMatchers = [
SM (r"\s*[a-z]=\"\s*(?P<qbox_geometry_lattice_vector_x__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_lattice_vector_y__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_lattice_vector_z__bohr>[-+0-9.]+)\s*\"", repeats = True)
SM (r"\s*[a-z]=\"\s*(?P<x_qbox_geometry_lattice_vector_x__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_lattice_vector_y__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_lattice_vector_z__bohr>[-+0-9.]+)\s*\"", repeats = True)
]),
SM (startReStr = r"\s*<atom\s+name=\"(?P<qbox_geometry_atom_labels>[a-zA-Z0-9]+)\"",
SM (startReStr = r"\s*<atom\s+name=\"(?P<x_qbox_geometry_atom_labels>[a-zA-Z0-9]+)\"",
subMatchers = [
SM (r"\s*<position>\s+(?P<qbox_geometry_atom_positions_x__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_atom_positions_y__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_atom_positions_z__bohr>[-+0-9.]+)\s*</position>", repeats = True),
SM (r"\s*<force>\s+(?P<qbox_atom_force_x__hartree_bohr_1>[-+0-9.]+)\s+(?P<qbox_atom_force_y__hartree_bohr_1>[-+0-9.]+)\s+(?P<qbox_atom_force_z__hartree_bohr_1>[-+0-9.]+)\s*</force>", repeats = True)
SM (r"\s*<position>\s+(?P<x_qbox_geometry_atom_positions_x__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_atom_positions_y__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_atom_positions_z__bohr>[-+0-9.]+)\s*</position>", repeats = True),
SM (r"\s*<force>\s+(?P<x_qbox_atom_force_x__hartree_bohr_1>[-+0-9.]+)\s+(?P<x_qbox_atom_force_y__hartree_bohr_1>[-+0-9.]+)\s+(?P<x_qbox_atom_force_z__hartree_bohr_1>[-+0-9.]+)\s*</force>", repeats = True)
], repeats = True)
])
#####################################################################
# (3.5) submatcher for OUTPUT stress_tensor(qbox_section_stress_tensor)
# (3.5) submatcher for OUTPUT stress_tensor(x_qbox_section_stress_tensor)
#####################################################################
stresstensorSubMatcher = SM(name = 'StressTensor',
startReStr = r"\s*<stress_tensor\s*unit=\"GPa\">",
sections = ['qbox_section_stress_tensor'],
sections = ['x_qbox_section_stress_tensor'],
subMatchers = [
SM (r"\s*<sigma_xx>\s+(?P<qbox_stress_tensor_xx__GPa>[-+0-9.]+)\s*</sigma_xx>"),
SM (r"\s*<sigma_yy>\s+(?P<qbox_stress_tensor_yy__GPa>[-+0-9.]+)\s*</sigma_yy>"),
SM (r"\s*<sigma_zz>\s+(?P<qbox_stress_tensor_zz__GPa>[-+0-9.]+)\s*</sigma_zz>"),
SM (r"\s*<sigma_xy>\s+(?P<qbox_stress_tensor_xy__GPa>[-+0-9.]+)\s*</sigma_xy>"),
SM (r"\s*<sigma_yz>\s+(?P<qbox_stress_tensor_yz__GPa>[-+0-9.]+)\s*</sigma_yz>"),
SM (r"\s*<sigma_xz>\s+(?P<qbox_stress_tensor_xz__GPa>[-+0-9.]+)\s*</sigma_xz>")
SM (r"\s*<sigma_xx>\s+(?P<x_qbox_stress_tensor_xx__GPa>[-+0-9.]+)\s*</sigma_xx>"),
SM (r"\s*<sigma_yy>\s+(?P<x_qbox_stress_tensor_yy__GPa>[-+0-9.]+)\s*</sigma_yy>"),
SM (r"\s*<sigma_zz>\s+(?P<x_qbox_stress_tensor_zz__GPa>[-+0-9.]+)\s*</sigma_zz>"),
SM (r"\s*<sigma_xy>\s+(?P<x_qbox_stress_tensor_xy__GPa>[-+0-9.]+)\s*</sigma_xy>"),
SM (r"\s*<sigma_yz>\s+(?P<x_qbox_stress_tensor_yz__GPa>[-+0-9.]+)\s*</sigma_yz>"),
SM (r"\s*<sigma_xz>\s+(?P<x_qbox_stress_tensor_xz__GPa>[-+0-9.]+)\s*</sigma_xz>")
])
####################################################################
# (4.1) submatcher for properties : MLWF (qbox_section_MLWF)
# (4.1) submatcher for properties : MLWF (x_qbox_section_MLWF)
####################################################################
MLWFSubMatcher = SM(name = 'MLWF',
startReStr = r"\s*<mlwfs>",
sections = ["qbox_section_MLWF"],
sections = ["x_qbox_section_MLWF"],
subMatchers = [
SM (r"\s*<mlwf center=\"\s*(?P<qbox_geometry_MLWF_atom_positions_x__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_MLWF_atom_positions_y__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_MLWF_atom_positions_z__bohr>[-+0-9.]+)\s*\"\s+spread=\"\s*(?P<qbox_geometry_MLWF_atom_spread__bohr>[-+0-9.]+)\s*\"", repeats = True)
SM (r"\s*<mlwf center=\"\s*(?P<x_qbox_geometry_MLWF_atom_positions_x__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_MLWF_atom_positions_y__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_MLWF_atom_positions_z__bohr>[-+0-9.]+)\s*\"\s+spread=\"\s*(?P<x_qbox_geometry_MLWF_atom_spread__bohr>[-+0-9.]+)\s*\"", repeats = True)
])
####################################################################
# (4.2) submatcher for properties : dipole (qbox_section_dipole)
# (4.2) submatcher for properties : dipole (x_qbox_section_dipole)
####################################################################
dipoleSubMatcher = SM(name = 'Dipole',
startReStr = r"\s*<dipole>",
sections = ["qbox_section_dipole"],
sections = ["x_qbox_section_dipole"],
subMatchers = [
SM (r"\s*<dipole_total>\s+(?P<qbox_dipole_x>[-+0-9.]+)\s+(?P<qbox_dipole_y>[-+0-9.]+)\s+(?P<qbox_dipole_z>[-+0-9.]+)\s*</dipole_total>", repeats = True)
SM (r"\s*<dipole_total>\s+(?P<x_qbox_dipole_x>[-+0-9.]+)\s+(?P<x_qbox_dipole_y>[-+0-9.]+)\s+(?P<x_qbox_dipole_z>[-+0-9.]+)\s*</dipole_total>", repeats = True)
])
########################################
......@@ -507,8 +507,8 @@ def get_cachingLevelForMetaName(metaInfoEnv):
# Set caching for temparary storage variables
for name in metaInfoEnv.infoKinds:
if ( name.startswith('qbox_store_')
or name.startswith('qbox_cell_')):
if ( name.startswith('x_qbox_store_')
or name.startswith('x_qbox_cell_')):
cachingLevelForMetaName[name] = CachingLevel.Cache
return cachingLevelForMetaName
......
......@@ -46,7 +46,7 @@ class QboxXMLParserContext(object):
#------1.atom_positions
atom_pos = []
for i in ['x', 'y', 'z']:
api = section['qbox_geometry_atom_positions_' + i]
api = section['x_qbox_geometry_atom_positions_' + i]
if api is not None:
atom_pos.append(api)
if atom_pos:
......@@ -54,7 +54,7 @@ class QboxXMLParserContext(object):
backend.addArrayValues('atom_positions', np.transpose(np.asarray(atom_pos)))
#------2.atom labels
atom_labels = section['qbox_geometry_atom_labels']
atom_labels = section['x_qbox_geometry_atom_labels']
if atom_labels is not None:
backend.addArrayValues('atom_labels', np.asarray(atom_labels))
......@@ -82,11 +82,11 @@ def build_QboxXMLFileSimpleMatcher():
subMatchers = [
SM (startReStr = r"\s*<unit_cell\s*",
subMatchers = [
SM (r"\s*[a-z]=\"\s*(?P<qbox_geometry_lattice_vector_x__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_lattice_vector_y__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_lattice_vector_z__bohr>[-+0-9.]+)\s*\"", repeats = True)
SM (r"\s*[a-z]=\"\s*(?P<x_qbox_geometry_lattice_vector_x__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_lattice_vector_y__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_lattice_vector_z__bohr>[-+0-9.]+)\s*\"", repeats = True)
]),
SM (startReStr = r"\s*<atom\s+name=\"(?P<qbox_geometry_atom_labels>[a-zA-Z0-9]+)\"",
SM (startReStr = r"\s*<atom\s+name=\"(?P<x_qbox_geometry_atom_labels>[a-zA-Z0-9]+)\"",
subMatchers = [
SM (r"\s*<position>\s+(?P<qbox_geometry_atom_positions_x__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_atom_positions_y__bohr>[-+0-9.]+)\s+(?P<qbox_geometry_atom_positions_z__bohr>[-+0-9.]+)\s*</position>", repeats = True),
SM (r"\s*<position>\s+(?P<x_qbox_geometry_atom_positions_x__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_atom_positions_y__bohr>[-+0-9.]+)\s+(?P<x_qbox_geometry_atom_positions_z__bohr>[-+0-9.]+)\s*</position>", repeats = True),
], repeats = True)
])
......@@ -130,7 +130,7 @@ def get_cachingLevelForMetaName(metaInfoEnv, CachingLvl):
}
# Set all band metadata to Cache as they need post-processsing.
for name in metaInfoEnv.infoKinds:
if name.startswith('qbox_'):
if name.startswith('x_qbox_'):
cachingLevelForMetaName[name] = CachingLevel.Cache
return cachingLevelForMetaName
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment