phono3py/test/conftest.py

511 lines
13 KiB
Python
Raw Normal View History

2021-07-18 13:48:47 +08:00
"""Pytest conftest.py."""
2023-05-30 18:01:53 +08:00
from pathlib import Path
2021-10-23 10:35:40 +08:00
2022-08-28 18:00:58 +08:00
import numpy as np
2020-08-26 11:55:17 +08:00
import phonopy
2021-10-23 10:35:40 +08:00
import pytest
from phonopy import Phonopy
2021-01-24 08:00:34 +08:00
from phonopy.interface.phonopy_yaml import read_cell_yaml
2022-08-28 18:00:58 +08:00
from phonopy.structure.atoms import PhonopyAtoms
2021-01-24 08:00:34 +08:00
2021-10-23 10:35:40 +08:00
import phono3py
2023-05-30 18:01:53 +08:00
from phono3py import Phono3py
2020-08-22 19:54:11 +08:00
2023-05-30 18:01:53 +08:00
cwd = Path(__file__).parent
def pytest_addoption(parser):
2023-12-25 09:03:22 +08:00
"""Activate v2 emulation with --v2 option."""
parser.addoption(
2023-12-25 09:03:22 +08:00
"--v2",
action="store_true",
default=False,
help="Run with phono3py v2.x emulation.",
)
2020-08-23 09:42:49 +08:00
2020-08-22 19:54:11 +08:00
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2022-08-28 18:00:58 +08:00
def agno2_cell() -> PhonopyAtoms:
2021-07-18 13:48:47 +08:00
"""Return AgNO2 cell (Imm2)."""
2023-05-30 18:01:53 +08:00
cell = read_cell_yaml(cwd / "AgNO2_cell.yaml")
2021-01-24 08:00:34 +08:00
return cell
2022-08-28 18:00:58 +08:00
@pytest.fixture(scope="session")
def aln_cell() -> PhonopyAtoms:
"""Return AlN cell (P6_3mc)."""
a = 3.111
c = 4.978
lattice = [[a, 0, 0], [-a / 2, a * np.sqrt(3) / 2, 0], [0, 0, c]]
symbols = ["Al", "Al", "N", "N"]
positions = [
[1.0 / 3, 2.0 / 3, 0.0009488200000000],
[2.0 / 3, 1.0 / 3, 0.5009488200000001],
[1.0 / 3, 2.0 / 3, 0.6190511800000000],
[2.0 / 3, 1.0 / 3, 0.1190511800000000],
]
cell = PhonopyAtoms(cell=lattice, symbols=symbols, scaled_positions=positions)
return cell
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of Si 2x2x2.
* with symmetry
* full fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
2020-08-25 06:24:35 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_grg(request) -> Phono3py:
"""Return Phono3py instance of Si 2x2x2.
* with symmetry
* full fc
* GR-grid
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
use_grg=True,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_nosym(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of Si 2x2x2.
* without symmetry
* no fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
is_symmetry=False,
produce_fc=False,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_nomeshsym(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of Si 2x2x2.
* without mesh-symmetry
* no fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
is_mesh_symmetry=False,
produce_fc=False,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_compact_fc(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of Si 2x2x2.
* with symmetry
* compact fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
is_compact_fc=True,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
2021-01-27 15:05:08 +08:00
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si111.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
2020-08-26 11:55:17 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_alm(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm if available on test side
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si111.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="alm",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_iterha_111() -> Phonopy:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* no fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phonopy_params-Si111-iterha.yaml.gz"
2021-10-15 15:49:41 +08:00
return phonopy.load(yaml_filename, log_level=1, produce_fc=False)
2020-09-25 18:22:19 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_fd(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm if available on test side
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_alm(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm if available on test side
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="alm",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_alm_fd(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm for fc2 if available on test side
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="alm|",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_fd_alm(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm for fc3 if available on test side
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="|alm",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_alm_cutoff(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm if available on test side
* cutoff=3
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="alm",
fc_calculator_options="cutoff = 3",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_alm_cutoff_fc2(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm if available on test side
* cutoff=3 only for fc2
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="alm",
fc_calculator_options="cutoff = 3|",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def si_pbesol_111_222_alm_cutoff_fc3(request) -> Phono3py:
"""Return Phono3py instance of Si 1x1x1.
* with symmetry
* full fc
* use alm if available on test side
* cutoff=3 only for fc3
"""
pytest.importorskip("alm")
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
fc_calculator="alm",
fc_calculator_options="|cutoff = 3",
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def nacl_pbe(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of NaCl 2x2x2.
* with symmetry
* full fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def nacl_pbe_compact_fc(request) -> Phono3py:
"""Return Phono3py instance of NaCl 2x2x2.
2021-07-18 13:48:47 +08:00
* with symmetry
* compact fc
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
is_compact_fc=True,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
2021-02-22 15:02:01 +08:00
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def nacl_pbe_cutoff_fc3(request) -> Phono3py:
"""Return Phono3py instance of NaCl 2x2x2 with cutoff-pair-distance.
2021-07-18 13:48:47 +08:00
* cutoff pair with 5
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
ph3 = phono3py.load(
yaml_filename,
produce_fc=False,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
forces = ph3.forces
ph3.generate_displacements(cutoff_pair_distance=5)
dataset = ph3.dataset
2021-10-15 15:49:41 +08:00
dataset["first_atoms"][0]["forces"] = forces[0]
dataset["first_atoms"][1]["forces"] = forces[1]
count = 2
2021-10-15 15:49:41 +08:00
for first_atoms in dataset["first_atoms"]:
for second_atoms in first_atoms["second_atoms"]:
assert second_atoms["id"] == count + 1
second_atoms["forces"] = forces[count]
count += 1
ph3.dataset = dataset
ph3.produce_fc3()
# ph3.produce_fc3(symmetrize_fc3r=True)
return ph3
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def nacl_pbe_cutoff_fc3_all_forces(request) -> Phono3py:
"""Return Phono3py instance of NaCl 2x2x2 with cutoff-pair-distance.
* cutoff pair with 5
* All forces are set.
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
ph3 = phono3py.load(
yaml_filename,
produce_fc=False,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
forces = ph3.forces
ph3.generate_displacements(cutoff_pair_distance=5)
ph3.forces = forces
ph3.produce_fc3()
return ph3
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def nacl_pbe_cutoff_fc3_compact_fc(request) -> Phono3py:
"""Return Phono3py instance of NaCl 2x2x2 with cutoff-pair-distance.
* cutoff pair with 5
* All forces are set.
* Compact FC
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
ph3 = phono3py.load(
yaml_filename,
produce_fc=False,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
log_level=1,
)
forces = ph3.forces
ph3.generate_displacements(cutoff_pair_distance=5)
ph3.forces = forces
ph3.produce_fc3(is_compact_fc=True)
return ph3
2021-10-15 15:49:41 +08:00
@pytest.fixture(scope="session")
2023-05-30 18:01:53 +08:00
def aln_lda(request) -> Phono3py:
2021-07-18 13:48:47 +08:00
"""Return Phono3py instance of AlN 3x3x2.
* with symmetry
* full fc.
"""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phono3py_params_AlN332.yaml.xz"
2023-12-25 14:19:55 +08:00
enable_v2 = request.config.getoption("--v2")
2021-10-15 15:49:41 +08:00
return phono3py.load(
yaml_filename,
2023-12-25 14:19:55 +08:00
make_r0_average=not enable_v2,
2021-10-15 15:49:41 +08:00
log_level=1,
)
@pytest.fixture(scope="session")
def ph_nacl() -> Phonopy:
"""Return Phonopy class instance of NaCl 2x2x2."""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phonopy_disp_NaCl.yaml"
force_sets_filename = cwd / "FORCE_SETS_NaCl"
born_filename = cwd / "BORN_NaCl"
return phonopy.load(
yaml_filename,
force_sets_filename=force_sets_filename,
born_filename=born_filename,
is_compact_fc=False,
log_level=1,
produce_fc=True,
)
2022-03-11 13:19:48 +08:00
@pytest.fixture(scope="session")
def ph_si() -> Phonopy:
"""Return Phonopy class instance of Si-prim 2x2x2."""
2023-05-30 18:01:53 +08:00
yaml_filename = cwd / "phonopy_params_Si.yaml"
2022-03-11 13:19:48 +08:00
return phonopy.load(
yaml_filename,
is_compact_fc=False,
log_level=1,
produce_fc=True,
)