Skip to content

Commit bb67e30

Browse files
authored
Wannier90 mapping parser (#6)
* Revisions from review * Add initial fhiaims parser * Initial workflow parser classes * Refactor * Linting * Use workflow defs * Parse workflow * Parse workflow * Add phononpy * Fix schema reload * Add wannier90 parser * Linting fix * Revert unnecessary change * Add phonopy test * Add wannier90 test * Fix structlog error
1 parent 88dd048 commit bb67e30

File tree

25 files changed

+316597
-0
lines changed

25 files changed

+316597
-0
lines changed

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,12 @@ exciting_parser_entry_point = "nomad_simulation_parsers.parsers:exciting_parser_
128128
exciting_schema_package_entry_point = "nomad_simulation_parsers.schema_packages:exciting_schema_package_entry_point"
129129
fhiaims_parser_entry_point = "nomad_simulation_parsers.parsers:fhiaims_parser_entry_point"
130130
fhiaims_schema_package_entry_point = "nomad_simulation_parsers.schema_packages:fhiaims_schema_package_entry_point"
131+
phonopy_parser_entry_point = "nomad_simulation_parsers.parsers:phonopy_parser_entry_point"
132+
phonopy_schema_package_entry_point = "nomad_simulation_parsers.schema_packages:phonopy_schema_package_entry_point"
131133
vasp_parser_entry_point = "nomad_simulation_parsers.parsers:vasp_parser_entry_point"
132134
vasp_schema_package_entry_point = "nomad_simulation_parsers.schema_packages:vasp_schema_package_entry_point"
135+
wannier90_parser_entry_point = "nomad_simulation_parsers.parsers:wannier90_parser_entry_point"
136+
wannier90_schema_package_entry_point = "nomad_simulation_parsers.schema_packages:wannier90_schema_package_entry_point"
133137

134138

135139

src/nomad_simulation_parsers/parsers/__init__.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ def load(self):
2727
)
2828

2929

30+
class Wannier90ParserEntryPoint(EntryPoint):
31+
equal_cell_positions_tolerance: float = Field(
32+
1e-2,
33+
description='Tolerance (in angstroms) for the cell positions to be considered'
34+
'equal.',
35+
)
36+
37+
3038
exciting_parser_entry_point = EntryPoint(
3139
name='parsers/exciting',
3240
aliases=['parsers/exciting'],
@@ -45,9 +53,22 @@ def load(self):
4553
description='NOMAD parser for FHIAIMS.',
4654
parser_class_name='nomad_simulation_parsers.parsers.fhiaims.parser.FHIAimsParser',
4755
python_package='nomad_simulation_parsers',
56+
code_name='phonopy',
57+
code_homepage='https://aimsclub.fhi-berlin.mpg.de/',
4858
mainfile_contents_re=r'^(.*\n)*?\s*Invoking FHI-aims \.\.\.',
4959
)
5060

61+
phonopy_parser_entry_point = EntryPoint(
62+
name='parsers/phonopy',
63+
aliases=['parsers/phonopy'],
64+
description='NOMAD parser for PHONOPY.',
65+
mainfile_name_re='.*/phon[^/]+yaml',
66+
parser_class_name='nomad_simulation_parsers.parsers.phonopy.parser.PhonopyParser',
67+
code_name='phonopy',
68+
python_package='nomad_simulation_parsers',
69+
code_homepage='https://phonopy.github.io/phonopy/',
70+
)
71+
5172
vasp_parser_entry_point = EntryPoint(
5273
name='parsers/vasp',
5374
description='Parser for VASP XML and OUTCAR outputs',
@@ -64,3 +85,15 @@ def load(self):
6485
mainfile_alternative=True,
6586
supported_compressions=['gz', 'bz2', 'xz'],
6687
)
88+
89+
wannier90_parser_entry_point = Wannier90ParserEntryPoint(
90+
name='parsers/wannier90',
91+
aliases=['parsers/wannier90'],
92+
description='NOMAD parser for WANNIER90.',
93+
parser_class_name='nomad_simulation_parsers.parsers.wannier90.parser.Wannier90Parser',
94+
python_package='nomad_simulation_parsers',
95+
mainfile_contents_re=r'\|\s*WANNIER90\s*\|',
96+
code_name='Wannier90',
97+
code_homepage='http://www.wannier.org/',
98+
code_category='Atomistic code',
99+
)
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
import re
2+
3+
from nomad.parsing.file_parser.text_parser import Quantity, TextParser
4+
5+
RE_N = r'[\n\r]'
6+
7+
8+
class WInParser(TextParser):
9+
def init_quantities(self):
10+
def str_proj_to_list(val_in: str) -> list[str]:
11+
# To avoid inconsistent regex that can contain or not spaces
12+
val_n = [re.sub(r'\s.*', '', x) for x in val_in.split('\n') if x]
13+
return [v.strip('[]').replace(' ', '').split(':') for v in val_n]
14+
15+
self._quantities = [
16+
Quantity(
17+
'energy_fermi', r'\n\rfermi_energy\s*=\s*([\d\.\-]+)', repeats=False
18+
),
19+
Quantity(
20+
'projections',
21+
r'[bB]egin [pP]rojections([\s\S]+?)(?:[eE]nd [pP]rojections)',
22+
repeats=False,
23+
str_operation=str_proj_to_list,
24+
),
25+
]
26+
27+
28+
class HrParser(TextParser):
29+
def init_quantities(self):
30+
self._quantities = [
31+
Quantity('degeneracy_factors', r'\s*written on[\s\w]*:\d*:\d*\s*([\d\s]+)'),
32+
Quantity('hoppings', r'\s*([-\d\s.]+)', repeats=False),
33+
]
34+
35+
36+
class WOutParser(TextParser):
37+
def __init__(self):
38+
super().__init__(None)
39+
40+
def init_quantities(self):
41+
kmesh_quantities = [
42+
Quantity('n_points', r'Total points[\s=]*(\d+)', dtype=int, repeats=False),
43+
Quantity(
44+
'grid', r'Grid size *\= *(\d+) *x *(\d+) *x *(\d+)', repeats=False
45+
),
46+
Quantity('k_points', r'\|[\s\d]*(-*\d.[^\|]+)', repeats=True, dtype=float),
47+
]
48+
49+
klinepath_quantities = [
50+
Quantity(
51+
'high_symm_name',
52+
r'\| *From\: *([a-zA-Z]+) [\d\.\-\s]*To\: *([a-zA-Z]+)',
53+
repeats=True,
54+
),
55+
Quantity(
56+
'high_symm_value',
57+
r'\| *From\: *[a-zA-Z]* *([\d\.\-\s]+)To\: *[a-zA-Z]* *([\d\.\-\s]+)\|',
58+
repeats=True,
59+
),
60+
]
61+
62+
disentangle_quantities = [
63+
Quantity(
64+
'outer',
65+
r'\|\s*Outer:\s*([-\d.]+)\s*\w*\s*([-\d.]+)\s*\((?P<__unit>\w+)\)',
66+
dtype=float,
67+
repeats=False,
68+
),
69+
Quantity(
70+
'inner',
71+
r'\|\s*Inner:\s*([-\d.]+)\s*\w*\s*([-\d.]+)\s*\((?P<__unit>\w+)\)',
72+
dtype=float,
73+
repeats=False,
74+
),
75+
]
76+
77+
structure_quantities = [
78+
Quantity('labels', r'\|\s*([A-Z][a-z]*)', repeats=True),
79+
Quantity(
80+
'positions',
81+
r'\|\s*([\-\d\.]+)\s*([\-\d\.]+)\s*([\-\d\.]+)',
82+
repeats=True,
83+
dtype=float,
84+
),
85+
]
86+
87+
self._quantities = [
88+
# Program quantities
89+
Quantity('version', r'\s*\|\s*Release\:\s*([\d\.]+)\s*', repeats=False),
90+
# System quantities
91+
Quantity('lattice_vectors', r'\s*a_\d\s*([\d\-\s\.]+)', repeats=True),
92+
Quantity(
93+
'reciprocal_lattice_vectors', r'\s*b_\d\s*([\d\-\s\.]+)', repeats=True
94+
),
95+
Quantity(
96+
'structure',
97+
rf'(\s*Fractional Coordinate[\s\S]+?)(?:{RE_N}\s*'
98+
rf'(PROJECTIONS|K-POINT GRID))',
99+
repeats=False,
100+
sub_parser=TextParser(quantities=structure_quantities),
101+
),
102+
# Method quantities
103+
Quantity(
104+
'k_mesh',
105+
r'\s*(K-POINT GRID[\s\S]+?)(?:-\s*MAIN)',
106+
repeats=False,
107+
sub_parser=TextParser(quantities=kmesh_quantities),
108+
),
109+
Quantity(
110+
'k_line_path',
111+
r'\s*(K-space path sections\:[\s\S]+?)(?:\*-------)',
112+
repeats=False,
113+
sub_parser=TextParser(quantities=klinepath_quantities),
114+
),
115+
Quantity(
116+
'Nwannier',
117+
r'\|\s*Number of Wannier Functions\s*\:\s*(\d+)',
118+
repeats=False,
119+
),
120+
Quantity(
121+
'Nband',
122+
r'\|\s*Number of input Bloch states\s*\:\s*(\d+)',
123+
repeats=False,
124+
),
125+
Quantity(
126+
'Niter', r'\|\s*Total number of iterations\s*\:\s*(\d+)', repeats=False
127+
),
128+
Quantity(
129+
'conv_tol',
130+
r'\|\s*Convergence tolerence\s*\:\s*([\d.eE-]+)',
131+
repeats=False,
132+
),
133+
Quantity(
134+
'energy_windows',
135+
r'(\|\s*Energy\s*Windows\s*\|[\s\S]+?)'
136+
r'(?:Number of target bands to extract:)',
137+
repeats=False,
138+
sub_parser=TextParser(quantities=disentangle_quantities),
139+
),
140+
# Band related quantities
141+
Quantity(
142+
'n_k_segments',
143+
r'\|\s*Number of K-path sections\s*\:\s*(\d+)',
144+
repeats=False,
145+
),
146+
Quantity(
147+
'div_first_k_segment',
148+
r'\|\s*Divisions along first K-path section\s*\:\s*(\d+)',
149+
repeats=False,
150+
),
151+
Quantity(
152+
'band_segments_points',
153+
r'\|\s*From\:\s*\w+([\d\s\-\.]+)To\:\s*\w+([\d\s\-\.]+)',
154+
repeats=True,
155+
),
156+
]

src/nomad_simulation_parsers/parsers/wannier90/hr_parser.py

Whitespace-only changes.

0 commit comments

Comments
 (0)