From cde754b33a5afd8c1eb9c7ba7c108fec2effdcd7 Mon Sep 17 00:00:00 2001 From: Daria Tomecka <zarvok79@yahoo.com> Date: Mon, 3 Oct 2016 15:33:34 +0200 Subject: [PATCH] wien2k: update of units and atom positions --- parser/parser-wien2k/wien2k_parser.py | 39 ++++++---------- parser/parser-wien2k/wien2k_parser_struct.py | 48 +++++++++++--------- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/parser/parser-wien2k/wien2k_parser.py b/parser/parser-wien2k/wien2k_parser.py index c0fe715..3011f50 100644 --- a/parser/parser-wien2k/wien2k_parser.py +++ b/parser/parser-wien2k/wien2k_parser.py @@ -3,7 +3,7 @@ import setup_paths from nomadcore.simple_parser import mainFunction, AncillaryParser, CachingLevel from nomadcore.simple_parser import SimpleMatcher as SM from nomadcore.local_meta_info import loadJsonFile, InfoKindEl -import os, sys, json +import os, sys, json, logging import wien2k_parser_struct, wien2k_parser_in0, wien2k_parser_in1c, wien2k_parser_in2c, wien2k_parser_in1, wien2k_parser_in2 @@ -39,18 +39,6 @@ class Wien2kContext(object): def onOpen_section_system(self, backend, gIndex, section): self.secSystemIndex = gIndex - mainFile = self.parser.fIn.fIn.name - fName = mainFile[:-4] + ".struct" - if os.path.exists(fName): - structSuperContext = wien2k_parser_struct.Wien2kStructContext() - structParser = AncillaryParser( - fileDescription = wien2k_parser_struct.buildStructureMatchers(), - parser = self.parser, - cachingLevelForMetaName = wien2k_parser_struct.get_cachingLevelForMetaName(self.metaInfoEnv, CachingLevel.PreOpenedIgnore), - superContext = structSuperContext) - - with open(fName) as fIn: - structParser.parseFile(fIn) def onOpen_section_method(self, backend, gIndex, section): @@ -141,10 +129,10 @@ class Wien2kContext(object): backend.addValue('x_wien2k_smearing_kind', value) - smearing_width = section['x_wien2k_smearing_width__rydberg'] + smearing_width = section['x_wien2k_smearing_width'] if smearing_width is not None: # value = '' - backend.addValue('x_wien2k_smearing_width__rydberg', value) + backend.addValue('x_wien2k_smearing_width', value) # atom labels atom_labels = section['x_wien2k_atom_name'] @@ -162,15 +150,18 @@ class Wien2kContext(object): # need to transpose array since its shape is [number_of_atoms,3] in\the metadata backend.addArrayValues('atom_forces', np.transpose(np.asarray(atom_force))) - # unit_cell - unit_cell = [] - for i in ['a', 'b', 'c']: - uci = section['x_wien2k_unit_cell_param_' + 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)) + mainFile = self.parser.fIn.fIn.name + fName = mainFile[:-4] + ".struct" + if os.path.exists(fName): + structSuperContext = wien2k_parser_struct.Wien2kStructContext() + structParser = AncillaryParser( + fileDescription = wien2k_parser_struct.buildStructureMatchers(), + parser = self.parser, + cachingLevelForMetaName = wien2k_parser_struct.get_cachingLevelForMetaName(self.metaInfoEnv, CachingLevel.PreOpenedIgnore), + superContext = structSuperContext) + + with open(fName) as fIn: + structParser.parseFile(fIn) diff --git a/parser/parser-wien2k/wien2k_parser_struct.py b/parser/parser-wien2k/wien2k_parser_struct.py index 08a3660..35d8cd6 100644 --- a/parser/parser-wien2k/wien2k_parser_struct.py +++ b/parser/parser-wien2k/wien2k_parser_struct.py @@ -5,6 +5,7 @@ from nomadcore.simple_parser import SimpleMatcher as SM from nomadcore.local_meta_info import loadJsonFile, InfoKindEl import os, sys, json, logging import numpy as np +import ase.geometry ################################################################ @@ -29,15 +30,32 @@ class Wien2kStructContext(object): self.initialize_values() def onClose_section_system(self, backend, gIndex, section): + # unit_cell + unit_cell_params = [] + for i in ['a', 'b', 'c']: + uci = section['x_wien2k_unit_cell_param_' + i] + #if uci is not None: + unit_cell_params.append(uci[0]) + for i in ['alfa', 'beta', 'gamma']: + uci = section['x_wien2k_angle_between_unit_axis_' + i] + # if uci is not None: + unit_cell_params.append(uci[0]) + + unit_cell = ase.geometry.cellpar_to_cell(unit_cell_params) + backend.addArrayValues('simulation_cell', unit_cell) + backend.addArrayValues("configuration_periodic_dimensions", np.ones(3, dtype=bool)) + equiv_atoms = section["x_wien2k_section_equiv_atoms"] #logging.error("section: %s", section) labels = [] pos = [] + for eqAtoms in equiv_atoms: label = eqAtoms["x_wien2k_atom_name"][0] x = eqAtoms["x_wien2k_atom_pos_x"] y = eqAtoms["x_wien2k_atom_pos_y"] z = eqAtoms["x_wien2k_atom_pos_z"] + #OB logging.error("equiv_atoms: %s x %s y %s z %s",eqAtoms, x, y, z) if len(x) != len(y) or len(x) != len(z): raise Exception("incorrect parsing, different number of x,y,z components") groupPos = [[x[i],y[i],z[i]] for i in range(len(x))] @@ -45,24 +63,12 @@ class Wien2kStructContext(object): labels += [label for i in range(nAt)] pos += groupPos backend.addValue("atom_labels", labels) - backend.addValue("atom_positions", pos) -##OR -""" - # atom_positions - atom_pos = [] - for i in ['x', 'y', 'z']: - api = section['x_wien2k_atom_pos_' + 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))) - - # atom labels - atom_labels = section['x_wien2k_atom_name'] - if atom_labels is not None: - backend.addArrayValues('atom_labels', np.asarray(atom_labels)) -""" + #backend.addValue("atom_positions", np.dot(pos,unit_cell)) + #ok#backend.addArrayValues('atom_positions', np.transpose(np.asarray(pos))) + backend.addArrayValues('atom_positions', np.asarray(pos)) + + + # description of the input def buildStructureMatchers(): return SM( @@ -76,12 +82,12 @@ def buildStructureMatchers(): SM(r"\w+\s*LATTICE,NONEQUIV\.ATOMS.\s*(?P<x_wien2k_nonequiv_atoms>[0-9]+)"), SM(r"(?P<x_wien2k_calc_mode>.*)"), # SM(r"\s*(?P<x_wien2k_unit_cell_param_a>[-+0-9.eEdD]+)\s*(?P<x_wien2k_unit_cell_param_b>[-+0-9.eEdD]+)\s*(?P<x_wien2k_unit_cell_param_c>[-+0-9.eEdD]+)\s*(?P<x_wien2k_angle_between_unit_axis_alfa>[-+0-9.eEdD]{9})\s*(?P<x_wien2k_angle_between_unit_axis_beta>[-+0-9.eEdD]{9})\s*(?P<x_wien2k_angle_between_unit_axis_gamma>[-+0-9.eEdD]+)"), - SM(r"\s*(?P<x_wien2k_unit_cell_param_a>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_unit_cell_param_b>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_unit_cell_param_c>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_alfa>[-+]?[0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_beta>[-+]?[0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_gamma>[-+]?[0-9]*\.\d*)"), - SM(r"\s*ATOM\s*[-0-9]+:\s*X=(?P<x_wien2k_atom_pos_x>[-+0-9.eEdD]+)\s*Y=(?P<x_wien2k_atom_pos_y>[-+0-9.eEdD]+)\s*Z=(?P<x_wien2k_atom_pos_z>[-+0-9.eEdD]+)", + SM(r"\s*(?P<x_wien2k_unit_cell_param_a__angstrom>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_unit_cell_param_b__angstrom>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_unit_cell_param_c__angstrom>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_alfa>[-+]?[0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_beta>[-+]?[0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_gamma>[-+]?[0-9]*\.\d*)"), + SM(r"\s*ATOM\s*[-0-9]+:\s*X=(?P<x_wien2k_atom_pos_x__angstrom>[-+0-9.eEdD]+)\s*Y=(?P<x_wien2k_atom_pos_y__angstrom>[-+0-9.eEdD]+)\s*Z=(?P<x_wien2k_atom_pos_z__angstrom>[-+0-9.eEdD]+)", repeats=True, sections=["x_wien2k_section_equiv_atoms"], subMatchers=[ - SM(r"\s*[-0-9]+:\s*X=(?P<x_wien2k_atom_pos_x>[-+0-9.eEdD]+)\s*Y=(?P<x_wien2k_atom_pos_y>[-+0-9.eEdD]+)\s*Z=(?P<x_wien2k_atom_pos_z>[-+0-9.eEdD]+)", + SM(r"\s*[-0-9]+:\s*X=(?P<x_wien2k_atom_pos_x__angstrom>[-+0-9.eEdD]+)\s*Y=(?P<x_wien2k_atom_pos_y__angstrom>[-+0-9.eEdD]+)\s*Z=(?P<x_wien2k_atom_pos_z__angstrom>[-+0-9.eEdD]+)", repeats=True ), # SM(r"\s*(?P<atom>.{10})\s*NPT=\s*(?P<NPT>[0-9]+)\s*R0=(?P<r0>[0-9.]+)\s*RMT=\s*(?P<rmt>[0-9.]+)\s*Z:\s*(?P<z>[0-9.]+)",) -- GitLab