Skip to content

Commit e766c49

Browse files
Add dataclass for Murnaghan (#64)
* Add dataclass for Murnaghan * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * add hdf5 file * fix values --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 07a2d5e commit e766c49

File tree

5 files changed

+123
-6
lines changed

5 files changed

+123
-6
lines changed

pyiron_dataclasses/v1/converter.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
LammpsOutput,
2929
LammpsPotential,
3030
)
31+
from pyiron_dataclasses.v1.murn import (
32+
MurnaghanInput,
33+
MurnaghanJob,
34+
MurnaghanOutput,
35+
)
3136
from pyiron_dataclasses.v1.sphinx import (
3237
BornOppenheimer,
3338
PawPot,
@@ -68,6 +73,7 @@ def get_dataclass(job_dict: dict) -> Callable:
6873
"<class 'pyiron_atomistics.lammps.lammps.Lammps'>": _convert_lammps_job_dict,
6974
"<class 'pyiron_atomistics.sphinx.sphinx.Sphinx'>": _convert_sphinx_job_dict,
7075
"<class 'pyiron_atomistics.vasp.vasp.Vasp'>": _convert_vasp_job_dict,
76+
"<class 'pyiron_atomistics.atomistics.master.murnaghan.Murnaghan'>": _convert_murnaghan_job_dict,
7177
}
7278
return funct_dict[job_dict["TYPE"]](job_dict=job_dict)
7379

@@ -920,6 +926,49 @@ def _convert_vasp_job_dict(job_dict):
920926
)
921927

922928

929+
def _convert_murnaghan_job_dict(job_dict):
930+
input_dict = _convert_generic_parameters_to_dictionary(
931+
generic_parameter_dict=job_dict["input"]["parameters"]
932+
)
933+
return MurnaghanJob(
934+
job_id=job_dict["job_id"],
935+
server=Server(
936+
user=job_dict["server"]["user"],
937+
host=job_dict["server"]["host"],
938+
run_mode=job_dict["server"]["run_mode"],
939+
queue=job_dict["server"]["queue"],
940+
qid=job_dict["server"]["qid"],
941+
cores=job_dict["server"]["cores"],
942+
threads=job_dict["server"]["threads"],
943+
new_hdf=job_dict["server"]["new_hdf"],
944+
run_time=job_dict["server"]["run_time"],
945+
memory_limit=job_dict["server"]["memory_limit"],
946+
accept_crash=job_dict["server"]["accept_crash"],
947+
),
948+
status=job_dict["status"],
949+
calculation_input=MurnaghanInput(
950+
num_points=input_dict["num_points"],
951+
fit_type=input_dict["fit_type"],
952+
fit_order=input_dict["fit_order"],
953+
vol_range=input_dict["vol_range"],
954+
axes=input_dict["axes"],
955+
strains=input_dict["strains"],
956+
allow_aborted=input_dict["allow_aborted"],
957+
),
958+
calculation_output=MurnaghanOutput(
959+
energy=job_dict["output"]["energy"],
960+
equilibrium_b_prime=job_dict["output"]["equilibrium_b_prime"],
961+
equilibrium_bulk_modulus=job_dict["output"]["equilibrium_bulk_modulus"],
962+
equilibrium_energy=job_dict["output"]["equilibrium_energy"],
963+
equilibrium_volume=job_dict["output"]["equilibrium_volume"],
964+
error=job_dict["output"]["error"],
965+
id=job_dict["output"]["id"],
966+
volume=job_dict["output"]["volume"],
967+
structure=job_dict["output"]["structure"],
968+
),
969+
)
970+
971+
923972
def _convert_generic_parameters_to_string(generic_parameter_dict: dict) -> str:
924973
output_str = ""
925974
for p, v in zip(

pyiron_dataclasses/v1/murn.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from dataclasses import dataclass
2+
from typing import Optional
3+
4+
import numpy as np
5+
6+
from pyiron_dataclasses.v1.atomistic import Structure
7+
from pyiron_dataclasses.v1.job import Executable, Server
8+
9+
10+
@dataclass
11+
class MurnaghanInput:
12+
num_points: int
13+
fit_type: str
14+
fit_order: Optional[int]
15+
vol_range: float
16+
axes: tuple[str]
17+
strains: Optional[list[float]]
18+
allow_aborted: bool
19+
20+
21+
@dataclass
22+
class MurnaghanOutput:
23+
energy: np.ndarray
24+
equilibrium_b_prime: float
25+
equilibrium_bulk_modulus: float
26+
equilibrium_energy: float
27+
equilibrium_volume: float
28+
error: np.ndarray
29+
id: np.ndarray
30+
volume: np.ndarray
31+
structure: Structure
32+
33+
34+
@dataclass
35+
class MurnaghanJob:
36+
job_id: int
37+
server: Server
38+
status: str
39+
calculation_input: MurnaghanInput
40+
calculation_output: MurnaghanOutput
342 KB
Binary file not shown.

tests/test_pyiron_atomistics_live.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,21 @@ def test_lammps_calc_minimize(self):
117117
job_lammps.calculation_output.generic.energy_tot[-1],
118118
-13.4486826111902 * ureg.eV,
119119
)
120+
121+
def test_murnaghan_lammps(self):
122+
job = self.project.create.job.Lammps("lmp")
123+
job.structure = self.project.create.structure.bulk("Al", cubic=True)
124+
murn = self.project.create.job.Murnaghan("murn")
125+
murn.ref_job = job
126+
murn.run()
127+
job_dict = read_dict_from_hdf(
128+
file_name=murn.project_hdf5.file_name,
129+
h5_path="/",
130+
recursive=True,
131+
slash="ignore",
132+
)
133+
job_murn = get_dataclass(job_dict[murn.job_name])
134+
self.assertEqual(
135+
job_murn.calculation_output.equilibrium_bulk_modulus,
136+
81.0404454580153,
137+
)

tests/test_pyiron_atomistics_static.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,19 @@ def test_all(self):
2727
recursive=True,
2828
slash="ignore",
2929
)[hdf5_file.split(".")[0]]
30-
self.assertEqual(
31-
get_dataclass(job_dict=job_dict).calculation_output.generic.energy_tot[
32-
-1
33-
],
34-
energy_dict[hdf5_file],
35-
)
30+
if hdf5_file in ["sx.h5", "lmp.h5", "vasp.h5"]:
31+
self.assertEqual(
32+
get_dataclass(
33+
job_dict=job_dict
34+
).calculation_output.generic.energy_tot[-1],
35+
energy_dict[hdf5_file],
36+
)
37+
elif hdf5_file == "murn.h5":
38+
self.assertEqual(
39+
get_dataclass(
40+
job_dict=job_dict
41+
).calculation_output.equilibrium_bulk_modulus,
42+
81.04044545801592,
43+
)
44+
else:
45+
raise ValueError()

0 commit comments

Comments
 (0)