diff --git a/parser/parser-elastic/elastic_parser_input.py b/parser/parser-elastic/elastic_parser_input.py new file mode 100644 index 0000000000000000000000000000000000000000..07ec197e8ade478380d15237aa59d1339ead46d8 --- /dev/null +++ b/parser/parser-elastic/elastic_parser_input.py @@ -0,0 +1,93 @@ +import xml.sax +import logging +import numpy as np +from nomadcore.unit_conversion.unit_conversion import convert_unit_function +from nomadcore.unit_conversion.unit_conversion import convert_unit +from nomadcore.unit_conversion import unit_conversion + +class InputHandler(xml.sax.handler.ContentHandler): + + def __init__(self, backend): + self.backend = backend + self.inputSectionGIndex = -1 + self.basevect = [] + self.latticeDummy = '' + self.CurrentData = '' + self.atomCoor = [] + self.atomCoorDummy = [] + self.speciesfileDummy = '' + self.speciesfile = [] + self.scale = 1 + self.cell = [] + self.cellDummy = [] + + def endDocument(self): + bohr_to_m = convert_unit(1, "bohr", "m") + for i in range(0,len(self.cellDummy)): + for j in range(0,3): + self.cell[i].append(float(self.cellDummy[i][j])*self.scale*bohr_to_m) +# print("cell=",self.cell) + self.backend.addValue("lattice_vectors", self.cell) + self.backend.addValue('atom_positions',self.atomCoor) + for i in range(0,len(self.atomCoor)): + self.speciesfile.append(self.speciesfileDummy) + # print("len(self.atomCoor)=",len(self.atomCoor)) + # print("self.atomCoor=",self.atomCoor) + # print("self.speciesfile=",self.speciesfile) + self.backend.addValue("atom_labels", self.speciesfile) + def startElement(self, name, attrs): + self.CurrentData = name + if name == "crystal": + self.scale = float(attrs.getValue('scale')) + elif name == 'species': + self.speciesfileDummy = attrs.getValue('speciesfile')[:-4] +# self.backend.addValue("atom_labels", self.speciesfile[:-4]) +# print("self.speciesfile=",self.speciesfile) + elif name == 'atom': + self.atomCoorDummy = attrs.getValue('coord').split() + for j in range(0,3): + self.atomCoorDummy[j]=float(self.atomCoorDummy[j]) + self.atomCoor.append(self.atomCoorDummy) +# print("self.atomCoor=",self.atomCoor) + else: + pass + + def endElement(self, name): + pass + + def characters(self, content): +# cell = [] + if self.CurrentData == 'basevect': + self.latticeDummy = content + lattice = self.latticeDummy.split() + if lattice != []: + self.cellDummy.append(lattice) + self.cell.append([]) +# if lattice[i] != []: +# cell.append(lattice) +# for i in range(0,2): +# print("lattice=",cell) + else: + pass +# print("cell=",cell) +# for i in range(0,len(lattice)): +# if lattice[i] != []: +# cell.append(lattice) +# for i in range(0,2): +# print("lattice=",cell) +# else: +# pass + +# for i in range(0,len(lattice)): +# if lattice[i] != []: +# cell.append(lattice) +# print("lattice=",cell) +# for i in range(0,2): +# def endElement(self, name): +# pass + +def parseInput(inF, backend): + handler = InputHandler(backend) + logging.error("will parse") + xml.sax.parse(inF, handler) + logging.error("did parse") diff --git a/parser/parser-elastic/parser_elastic.py b/parser/parser-elastic/parser_elastic.py index 26de0e447747896dfb2feb2cf6857cac021258e2..e944920411c5819db43d389e75d03ca0a75d16c2 100644 --- a/parser/parser-elastic/parser_elastic.py +++ b/parser/parser-elastic/parser_elastic.py @@ -1,11 +1,12 @@ from builtins import object import setup_paths import numpy as np +from nomadcore.unit_conversion.unit_conversion import convert_unit from nomadcore.parser_backend import JsonParseEventsWriterBackend from nomadcore.simple_parser import mainFunction from nomadcore.simple_parser import SimpleMatcher as SM from nomadcore.local_meta_info import loadJsonFile, InfoKindEl -import os, sys, json +import os, sys, json, elastic_parser_input class SampleContext(object): @@ -17,6 +18,7 @@ class SampleContext(object): self.mainFile = None self.etaEC = [] self.fitEC = [] + self.SGN = 0 def initialize_values(self): """allows to reset values if the same superContext is used to parse different files""" @@ -31,14 +33,46 @@ class SampleContext(object): def onClose_section_run(self, backend, gIndex, section): pass + def onClose_section_system(self, backend, gIndex, section): + self.SGN = int(section["x_elastic_space_group_number"][0]) + mainFile = self.parser.fIn.fIn.name + dirPath = os.path.dirname(mainFile) + self.mainFile = self.parser.fIn.name #####exciting sbt -> zip file#### YES + self.mainFilePath = self.mainFile[0:-12] #####exciting sbt -> zip file#### YES +# print("self.mainFileUri=",self.mainFileUri) +# dirPath = self.mainFileUri[0:-12] #####exciting LOCAL HOME or from NOMAD URI nmd:// ####### YES +# print("dirPath=",dirPath) +# for files in os.listdir(self.mainFilePath): + for files in os.listdir(dirPath): + if files[-3:] == "xml": + inputFile = files +# print("os.path.cwd()=",os.getcwd()) +# print("inputFile=",inputFile) + else: + pass +# print("dirPath=",dirPath) + os.chdir(self.mainFilePath) +# os.chdir(dirPath) + with open(inputFile) as f: + elastic_parser_input.parseInput(f, backend) +# print(os.listdir(dirPath)) +# if os.path.exist([-3:]) == "xml": +# inputFile = os.path.exist() +# inputFile = os.path.join(dirPath, "input.xml") +# print("inputFile=",inputFile) + def onClose_section_method(self, backend, gIndex, section): - SGN = int(section["x_elastic_space_group_number"][0]) + ha_per_joule = convert_unit(1, "hartree", "J") +# giga = 10**9 + giga = 1.0 +# SGN = int(section["x_elastic_space_group_number"][0]) # print("SGN=",SGN) elCode = section['x_elastic_code'] elasticGIndex = backend.openSection("section_single_configuration_calculation") - self.mainFile = self.parser.fIn.name #####exciting sbt -> zip file#### - self.mainFilePath = self.mainFile[0:-12] #####exciting sbt -> zip file#### -# self.mainFilePath = self.mainFileUri[0:-12] #####exciting LOCAL HOME or from NOMAD URI nmd:// ####### +# self.mainFile = self.parser.fIn.name #####exciting sbt -> zip file#### NO +# self.mainFilePath = self.mainFile[0:-12] #####exciting sbt -> zip file#### NO + self.mainFilePath = self.mainFileUri[0:-12] #####exciting LOCAL HOME or from NOMAD URI nmd:// ####### NO +# print("2222222=",self.mainFilePath) mdr = float(section['x_elastic_max_lagrangian_strain'][0]) ordr = int(section['x_elastic_elastic_constant_order'][0]) nds = int(section['x_elastic_number_of_distorted_structures'][0]) @@ -49,7 +83,7 @@ class SampleContext(object): polFit4Cross = polFit4 - 1 polFit6Cross = polFit6 - 1 ext_uri = [] - os.chdir(self.mainFilePath) + # os.chdir(self.mainFilePath) ###################NEW################### # for def_str in os.listdir(): @@ -148,7 +182,7 @@ class SampleContext(object): s = s.strip() dummy_eta, dummy_energy = s.split() eta[-1].append(float(dummy_eta)) - energy[-1].append(float(dummy_energy)) + energy[-1].append(float(dummy_energy)*ha_per_joule) os.chdir('../') defTyp = [] @@ -169,34 +203,35 @@ class SampleContext(object): for i in range(0,6): s[i] = s[i].strip() # print("s[i]=",s[i]) - if s[i] == '0.0': - defTyp[-1].append(float(s[i])) - elif s[i] == 'eta': - defTyp[-1].append(mdr) - elif s[i] == '2eta': - defTyp[-1].append(2.0*mdr) - elif s[i] == '-eta': - defTyp[-1].append(-mdr) - elif s[i] == '.5eta': - defTyp[-1].append(0.5*mdr) - elif s[i] == '-2eta': - defTyp[-1].append(-2.0*mdr) - elif s[i] == '3eta': - defTyp[-1].append(3.0*mdr) - elif s[i] == '4eta': - defTyp[-1].append(4.0*mdr) - elif s[i] == '5eta': - defTyp[-1].append(5.0*mdr) - elif s[i] == '6eta': - defTyp[-1].append(6.0*mdr) - elif s[i] == '-3eta': - defTyp[-1].append(-3.0*mdr) - elif s[i] == '-5eta': - defTyp[-1].append(-5.0*mdr) - elif s[i] == '-6eta': - defTyp[-1].append(-6.0*mdr) - elif s[i] == '-4eta': - defTyp[-1].append(-4.0*mdr) + defTyp[-1].append(s[i]) +# if s[i] == '0.0': +# defTyp[-1].append(float(s[i])) +# elif s[i] == 'eta': +# defTyp[-1].append(mdr) +# elif s[i] == '2eta': +# defTyp[-1].append(2.0*mdr) +# elif s[i] == '-eta': +# defTyp[-1].append(-mdr) +# elif s[i] == '.5eta': +# defTyp[-1].append(0.5*mdr) +# elif s[i] == '-2eta': +# defTyp[-1].append(-2.0*mdr) +# elif s[i] == '3eta': +# defTyp[-1].append(3.0*mdr) +# elif s[i] == '4eta': +# defTyp[-1].append(4.0*mdr) +# elif s[i] == '5eta': +# defTyp[-1].append(5.0*mdr) +# elif s[i] == '6eta': +# defTyp[-1].append(6.0*mdr) +# elif s[i] == '-3eta': +# defTyp[-1].append(-3.0*mdr) +# elif s[i] == '-5eta': +# defTyp[-1].append(-5.0*mdr) +# elif s[i] == '-6eta': +# defTyp[-1].append(-6.0*mdr) +# elif s[i] == '-4eta': +# defTyp[-1].append(-4.0*mdr) f.close() # print("defTyp=",defTyp) @@ -209,6 +244,8 @@ class SampleContext(object): # backend.closeSection("x_elastic_section_single_configuration_calculation", elasticGIndex) os.chdir('Energy-vs-Strain') +# ha_per_joule = convert_unit(1, "hartree", "J") +# print("ha_per_joule=",ha_per_joule) d2E6_val = [] d2E4_val = [] d2E2_val = [] @@ -237,7 +274,7 @@ class SampleContext(object): d2E_eta_tot[-1].append([]) elif len(s) >= 30: d2E_eta, d2E_values = s.split() - d2E_val_tot[-1][-1].append(float(d2E_values)) + d2E_val_tot[-1][-1].append(float(d2E_values)*giga) d2E_eta_tot[-1][-1].append(float(d2E_eta)) f.close() else: @@ -255,7 +292,7 @@ class SampleContext(object): d2E_eta_tot[-1].append([]) elif len(s) >= 30: d2E_eta, d2E_values = s.split() - d2E_val_tot[-1][-1].append(float(d2E_values)) + d2E_val_tot[-1][-1].append(float(d2E_values)*giga) d2E_eta_tot[-1][-1].append(float(d2E_eta)) f.close() d2E6_val.append(d2E_val_tot[i-1][0]) @@ -359,29 +396,29 @@ class SampleContext(object): except ValueError: continue else: - EC_eigen.append(float(s[0])) + EC_eigen.append(float(s[0])*giga) elif "B_V" in s: - B_V = float(s[5]) + B_V = float(s[5])*giga elif "G_V" in s: - G_V = float(s[5]) + G_V = float(s[5])*giga elif "B_R" in s: - B_R = float(s[5]) + B_R = float(s[5])*giga elif "G_R" in s: - G_R = float(s[5]) + G_R = float(s[5])*giga elif "B_H" in s: - B_H = float(s[5]) + B_H = float(s[5])*giga elif "G_H" in s: - G_H = float(s[5]) + G_H = float(s[5])*giga elif "E_V" in s: - E_V = float(s[5]) + E_V = float(s[5])*giga elif "nu_V" in s: nu_V = float(s[5]) elif "E_R" in s: - E_R = float(s[5]) + E_R = float(s[5])*giga elif "nu_R" in s: nu_R = float(s[5]) elif "E_H" in s: - E_H = float(s[5]) + E_H = float(s[5])*giga elif "nu_H" in s: nu_H = float(s[5]) elif len(s) == 6 and s[0] != "Elastic" and s[0] != "Eigenvalues": @@ -399,8 +436,9 @@ class SampleContext(object): for i in range(0,6): for j in range(0,6): - ECMat[i][j] = float(ECMat[i][j]) - complMat[i][j] = float(complMat[i][j]) + voigtMat[i][j] = voigtMat[j][i] + ECMat[i][j] = float(ECMat[j][i])*giga + complMat[i][j] = float(complMat[j][i])/giga # backend.addValue("x_elastic_deformation_types", defTyp) # backend.addValue("x_elastic_number_of_deformations", defNum) @@ -559,7 +597,7 @@ class SampleContext(object): C444 = float(s[2]) - if(149 <= SGN and SGN <= 167): # Rhombohedral I + if(149 <= self.SGN and self.SGN <= 167): # Rhombohedral I LC = 'RI' ECs= 14 @@ -686,7 +724,7 @@ class SampleContext(object): ECmat[5][5][3] = C124 - elif(168 <= SGN and SGN <= 176): # Hexagonal II + elif(168 <= self.SGN and self.SGN <= 176): # Hexagonal II LC = 'HII' ECs= 12 @@ -777,7 +815,7 @@ class SampleContext(object): ECmat[5][5][2] = D ECmat[5][5][5] = -C116 - elif(177 <= SGN and SGN <= 194): # Hexagonal I + elif(177 <= self.SGN and self.SGN <= 194): # Hexagonal I LC = 'HI' ECs= 10 @@ -853,7 +891,7 @@ class SampleContext(object): ECmat[5][5][1] = C ECmat[5][5][2] = D - elif(195 <= SGN and SGN <= 206): # Cubic II + elif(195 <= self.SGN and self.SGN <= 206): # Cubic II LC = 'CII' ECs= 8 @@ -923,7 +961,7 @@ class SampleContext(object): ECmat[5][5][1] = C155 ECmat[5][5][2] = C144 - elif(207 <= SGN and SGN <= 230): # Cubic I + elif(207 <= self.SGN and self.SGN <= 230): # Cubic I LC = 'CI' ECs= 6 @@ -1027,11 +1065,16 @@ mainFileDescription = \ # SM(r"\s*Order of elastic constants\s*=\s*(?P<x_elastic_elastic_constant_order>[0-9]+)"), SM(r"\s*Method of calculation\s*=\s*(?P<x_elastic_calculation_method>[-a-zA-Z]+)"), SM(r"\s*DFT code name\s*=\s*(?P<x_elastic_code>[-a-zA-Z]+)"), - SM(r"\s*Space-group number\s*=\s*(?P<x_elastic_space_group_number>[0-9]+)"), - SM(r"\s*Volume of equilibrium unit cell\s*=\s*(?P<x_elastic_unit_cell_volume>[-0-9.]+)\s*\[a.u\^3\]"), + SM(name = 'system', + startReStr = r"\s*Space-group number\s*=\s*(?P<x_elastic_space_group_number>[0-9]+)", + sections = ['section_system'], + subMatchers = [ +# SM(r"\s*Space-group number\s*=\s*(?P<x_elastic_space_group_number>[0-9]+)"), + SM(r"\s*Volume of equilibrium unit cell\s*=\s*(?P<x_elastic_unit_cell_volume__bohr3>[-0-9.]+)\s*\[a.u\^3\]") + ]), SM(r"\s*Maximum Lagrangian strain\s*=\s*(?P<x_elastic_max_lagrangian_strain>[0-9.]+)"), SM(r"\s*Number of distorted structures\s*=\s*(?P<x_elastic_number_of_distorted_structures>[0-9]+)") - ]) + ] ) ])