-
Notifications
You must be signed in to change notification settings - Fork 41
/
phonons.py
107 lines (92 loc) · 3.07 KB
/
phonons.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""Phonon recipes for EMT."""
from __future__ import annotations
from typing import TYPE_CHECKING
from quacc import flow
from quacc.recipes.common.phonons import phonon_subflow
from quacc.recipes.emt.core import relax_job, static_job
from quacc.wflow_tools.customizers import customize_funcs
if TYPE_CHECKING:
from typing import Any, Callable
from ase.atoms import Atoms
from quacc.schemas._aliases.phonons import PhononSchema
@flow
def phonon_flow(
atoms: Atoms,
symprec: float = 1e-4,
min_lengths: float | tuple[float, float, float] | None = 20.0,
supercell_matrix: (
tuple[tuple[int, int, int], tuple[int, int, int], tuple[int, int, int]] | None
) = None,
displacement: float = 0.01,
t_step: float = 10,
t_min: float = 0,
t_max: float = 1000,
run_relax: bool = True,
job_params: dict[str, dict[str, Any]] | None = None,
job_decorators: dict[str, Callable | None] | None = None,
) -> PhononSchema:
"""
Carry out a phonon workflow, consisting of:
1. Optional relaxation.
- name: "relax_job"
- job: [quacc.recipes.emt.core.relax_job][]
2. Generation of supercells.
3. Static calculations on supercells
- name: "static_job"
- job: [quacc.recipes.emt.core.static_job][]
4. Calculation of thermodynamic properties.
Parameters
----------
atoms
Atoms object
symprec
Precision for symmetry detection.
min_lengths
Minimum length of each lattice dimension (A).
supercell_matrix
The supercell matrix to use. If specified, it will override any
value specified by `min_lengths`.
displacement
Atomic displacement (A).
t_step
Temperature step (K).
t_min
Min temperature (K).
t_max
Max temperature (K).
run_relax
Whether to run a relaxation beforehand.
job_params
Custom parameters to pass to each Job in the Flow. This is a dictionary where
the keys are the names of the jobs and the values are dictionaries of parameters.
job_decorators
Custom decorators to apply to each Job in the Flow. This is a dictionary where
the keys are the names of the jobs and the values are decorators.
Returns
-------
PhononSchema
Dictionary of results from [quacc.schemas.phonons.summarize_phonopy][].
See the return type-hint for the data structure.
"""
job_param_defaults = {"relax_job": {"opt_params": {"fmax": 1e-3}}}
relax_job_, static_job_ = customize_funcs(
["relax_job", "static_job"],
[relax_job, static_job],
param_defaults=job_param_defaults,
param_swaps=job_params,
decorators=job_decorators,
)
if run_relax:
atoms = relax_job_(atoms)["atoms"]
return phonon_subflow(
atoms,
static_job_,
symprec=symprec,
min_lengths=min_lengths,
supercell_matrix=supercell_matrix,
displacement=displacement,
t_step=t_step,
t_min=t_min,
t_max=t_max,
additional_fields={"name": "EMT Phonons"},
)