1
+ from collections .abc import Callable
2
+ from pathlib import Path
3
+
1
4
import pytest
2
5
from emmet .core .tasks import TaskDoc
3
6
from jobflow import run_locally
6
9
7
10
from atomate2 .vasp .jobs .mp import (
8
11
MPGGARelaxMaker ,
12
+ MPGGAStaticMaker ,
9
13
MPMetaGGARelaxMaker ,
10
14
MPMetaGGAStaticMaker ,
11
15
MPPreRelaxMaker ,
@@ -32,6 +36,7 @@ def test_mp_pre_relax_maker_default_values():
32
36
for key , expected in expected_incar .items ():
33
37
actual = maker .input_set_generator .config_dict ["INCAR" ][key ]
34
38
assert actual == expected , f"{ key = } , { actual = } , { expected = } "
39
+ assert maker .input_set_generator .inherit_incar is False
35
40
36
41
37
42
def test_mp_meta_gga_relax_maker_default_values ():
@@ -41,9 +46,12 @@ def test_mp_meta_gga_relax_maker_default_values():
41
46
for key , expected in expected_incar .items ():
42
47
actual = maker .input_set_generator .config_dict ["INCAR" ][key ]
43
48
assert actual == expected , f"{ key = } , { actual = } , { expected = } "
49
+ assert maker .input_set_generator .inherit_incar is False
44
50
45
51
46
- def test_mp_meta_gga_static_maker (mock_vasp , clean_dir , vasp_test_dir ):
52
+ def test_mp_meta_gga_static_maker (
53
+ mock_vasp : Callable , clean_dir : None , vasp_test_dir : Path
54
+ ):
47
55
# map from job name to directory containing reference input/output files
48
56
ref_paths = {
49
57
"MP meta-GGA static" : "Si_mp_meta_gga_relax/r2scan_final_static" ,
@@ -57,11 +65,11 @@ def test_mp_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir):
57
65
58
66
mock_vasp (ref_paths , fake_run_vasp_kwargs )
59
67
60
- job = MPMetaGGAStaticMaker (
61
- input_set_generator = MPScanRelaxSet (
62
- bandgap = 0.8249 , user_incar_settings = { "LWAVE" : True , "LCHARG" : True }
63
- )
64
- ) .make (si_struct )
68
+ input_set_gen = MPScanRelaxSet (
69
+ bandgap = 0.8249 , user_incar_settings = { "LWAVE" : True , "LCHARG" : True }
70
+ )
71
+ maker = MPMetaGGAStaticMaker ( input_set_generator = input_set_gen )
72
+ job = maker .make (si_struct )
65
73
66
74
# ensure flow runs successfully
67
75
responses = run_locally (job , create_folders = True , ensure_success = True )
@@ -70,9 +78,12 @@ def test_mp_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir):
70
78
task_doc = responses [job .uuid ][1 ].output
71
79
assert isinstance (task_doc , TaskDoc )
72
80
assert task_doc .output .energy == pytest .approx (- 46.8613738 )
81
+ assert maker .input_set_generator .inherit_incar is False
73
82
74
83
75
- def test_mp_meta_gga_relax_maker (mock_vasp , clean_dir , vasp_test_dir ):
84
+ def test_mp_meta_gga_relax_maker (
85
+ mock_vasp : Callable , clean_dir : None , vasp_test_dir : Path
86
+ ):
76
87
# map from job name to directory containing reference input/output files
77
88
ref_paths = {
78
89
"MP meta-GGA relax" : "Si_mp_meta_gga_relax/r2scan_relax" ,
@@ -88,11 +99,11 @@ def test_mp_meta_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir):
88
99
89
100
mock_vasp (ref_paths , fake_run_vasp_kwargs )
90
101
91
- job = MPMetaGGARelaxMaker (
92
- input_set_generator = MPScanRelaxSet (
93
- bandgap = 0.4786 , user_incar_settings = { "LWAVE" : True , "LCHARG" : True }
94
- )
95
- ) .make (si_struct )
102
+ input_set_gen = MPScanRelaxSet (
103
+ bandgap = 0.4786 , user_incar_settings = { "LWAVE" : True , "LCHARG" : True }
104
+ )
105
+ maker = MPMetaGGARelaxMaker ( input_set_generator = input_set_gen )
106
+ job = maker .make (si_struct )
96
107
97
108
# ensure flow runs successfully
98
109
responses = run_locally (job , create_folders = True , ensure_success = True )
@@ -101,9 +112,10 @@ def test_mp_meta_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir):
101
112
task_doc = responses [job .uuid ][1 ].output
102
113
assert isinstance (task_doc , TaskDoc )
103
114
assert task_doc .output .energy == pytest .approx (- 46.86703814 )
115
+ assert maker .input_set_generator .inherit_incar is False
104
116
105
117
106
- def test_mp_gga_relax_maker (mock_vasp , clean_dir , vasp_test_dir ):
118
+ def test_mp_gga_relax_maker (mock_vasp : Callable , clean_dir : None , vasp_test_dir : Path ):
107
119
# map from job name to directory containing reference input/output files
108
120
ref_paths = {
109
121
"MP GGA relax" : "Si_mp_gga_relax/GGA_Relax_1" ,
@@ -117,7 +129,8 @@ def test_mp_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir):
117
129
118
130
mock_vasp (ref_paths , fake_run_vasp_kwargs )
119
131
120
- job = MPGGARelaxMaker ().make (si_struct )
132
+ maker = MPGGARelaxMaker ()
133
+ job = maker .make (si_struct )
121
134
122
135
# ensure flow runs successfully
123
136
responses = run_locally (job , create_folders = True , ensure_success = True )
@@ -126,3 +139,17 @@ def test_mp_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir):
126
139
task_doc = responses [job .uuid ][1 ].output
127
140
assert isinstance (task_doc , TaskDoc )
128
141
assert task_doc .output .energy == pytest .approx (- 10.84140641 )
142
+ assert maker .input_set_generator .inherit_incar is False
143
+
144
+
145
+ # TODO ideally should have a set of ref files and a full test for an MP static calc
146
+ def test_mp_gga_static_maker_prev_dir (vasp_test_dir : Path ):
147
+ prev_dir = f"{ vasp_test_dir } /Si_hse_band_structure/hse_static/outputs"
148
+ structure = Structure .from_file (f"{ prev_dir } /POSCAR.gz" )
149
+
150
+ maker = MPGGAStaticMaker ()
151
+ input_set = maker .input_set_generator .get_input_set (
152
+ structure = structure , potcar_spec = True , prev_dir = prev_dir
153
+ )
154
+ assert input_set .incar ["ENCUT" ] == 520
155
+ assert maker .input_set_generator .inherit_incar is False
0 commit comments