Add self._fc3_nonzero_elems in API

This commit is contained in:
Atsushi Togo 2025-06-03 18:09:34 +09:00
parent 6a1a1a984a
commit 03a26d1b6d
2 changed files with 54 additions and 34 deletions

View File

@ -249,10 +249,10 @@ class Phono3py:
)
else:
self._phonon_supercell_matrix = None
self._supercell = None
self._primitive = None
self._phonon_supercell = None
self._phonon_primitive = None
self._supercell: Supercell
self._primitive: Primitive
self._phonon_supercell: Supercell
self._phonon_primitive: Primitive
self._build_supercell()
self._build_primitive_cell()
self._build_phonon_supercell()
@ -267,9 +267,9 @@ class Phono3py:
self._bz_grid = None
# Set supercell, primitive, and phonon supercell symmetries
self._symmetry = None
self._primitive_symmetry = None
self._phonon_supercell_symmetry = None
self._symmetry: Symmetry
self._primitive_symmetry: Symmetry
self._phonon_supercell_symmetry: Symmetry
self._search_symmetry()
self._search_primitive_symmetry()
self._search_phonon_supercell_symmetry()
@ -298,6 +298,7 @@ class Phono3py:
# Force constants
self._fc2 = None
self._fc3 = None
self._fc3_nonzero_elems = None # available only symfc
# MLP
self._mlp = None
@ -1518,8 +1519,21 @@ class Phono3py:
if self._fc2 is None:
symmetrize_force_constants(fc2)
# Set fc2 and fc3
self._fc3 = fc3
self._fc3_nonzero_elems = None
if fc_calculator == "symfc":
fc_cutoff = fc_solver.fc_solver.basis_set[3].fc_cutoff
if fc_cutoff is not None:
fc3_nonzero_elems = fc_cutoff.nonzero_atomic_indices_fc3()
N = len(self._supercell)
assert len(fc3_nonzero_elems) == N**3
fc3_nonzero_elems = fc3_nonzero_elems.reshape((N, N, N))
if is_compact_fc:
self._fc3_nonzero_elems = np.array(
fc3_nonzero_elems[self._primitive.p2s_map, :, :], dtype="byte"
)
else:
self._fc3_nonzero_elems = np.array(fc3_nonzero_elems, dtype="byte")
# fc2 as obtained above will not be set when "|" in fc-calculator setting.
if fc_calculator is not None and "|" in fc_calculator:
@ -2355,7 +2369,9 @@ class Phono3py:
# private methods #
###################
def _search_symmetry(self):
self._symmetry = Symmetry(self._supercell, self._symprec, self._is_symmetry)
self._symmetry = Symmetry(
self._supercell, symprec=self._symprec, is_symmetry=self._is_symmetry
)
def _search_primitive_symmetry(self):
self._primitive_symmetry = Symmetry(
@ -2363,7 +2379,7 @@ class Phono3py:
)
if len(self._symmetry.pointgroup_operations) != len(
self._primitive_symmetry.pointgroup_operations
): # noqa E129
):
print(
"Warning: point group symmetries of supercell and primitive"
"cell are different."
@ -2374,12 +2390,14 @@ class Phono3py:
self._phonon_supercell_symmetry = self._symmetry
else:
self._phonon_supercell_symmetry = Symmetry(
self._phonon_supercell, self._symprec, self._is_symmetry
self._phonon_supercell,
symprec=self._symprec,
is_symmetry=self._is_symmetry,
)
def _build_supercell(self):
self._supercell = get_supercell(
self._unitcell, self._supercell_matrix, self._symprec
self._unitcell, self._supercell_matrix, symprec=self._symprec
)
def _build_primitive_cell(self):
@ -2411,7 +2429,7 @@ class Phono3py:
self._phonon_supercell = self._supercell
else:
self._phonon_supercell = get_supercell(
self._unitcell, self._phonon_supercell_matrix, self._symprec
self._unitcell, self._phonon_supercell_matrix, symprec=self._symprec
)
def _build_phonon_primitive_cell(self):
@ -2504,7 +2522,9 @@ class Phono3py:
self._supercells_with_displacements = supercells
def _get_primitive_cell(self, supercell, supercell_matrix, primitive_matrix):
def _get_primitive_cell(
self, supercell, supercell_matrix, primitive_matrix
) -> Primitive:
inv_supercell_matrix = np.linalg.inv(supercell_matrix)
if primitive_matrix is None:
t_mat = inv_supercell_matrix

View File

@ -36,7 +36,7 @@
from __future__ import annotations
from collections.abc import Sequence
from typing import Literal, Optional, Union
from typing import Literal, Optional
import numpy as np
from phonopy.harmonic.dynamical_matrix import DynamicalMatrix, get_dynamical_matrix
@ -93,18 +93,18 @@ class Interaction:
primitive: Primitive,
bz_grid: BZGrid,
primitive_symmetry: Symmetry,
fc3: Optional[np.ndarray] = None,
band_indices: Optional[Union[np.ndarray, Sequence]] = None,
constant_averaged_interaction: Optional[float] = None,
frequency_factor_to_THz: Optional[float] = None,
frequency_scale_factor: Optional[float] = None,
unit_conversion: Optional[float] = None,
fc3: np.ndarray | None = None,
band_indices: np.ndarray | Sequence | None = None,
constant_averaged_interaction: float | None = None,
frequency_factor_to_THz: float | None = None,
frequency_scale_factor: float | None = None,
unit_conversion: float | None = None,
is_mesh_symmetry: bool = True,
symmetrize_fc3q: bool = False,
make_r0_average: bool = False,
cutoff_frequency: Optional[float] = None,
cutoff_frequency: float | None = None,
lapack_zheev_uplo: Literal["L", "U"] = "L",
openmp_per_triplets: Optional[bool] = None,
openmp_per_triplets: bool | None = None,
):
"""Init method."""
self._primitive = primitive
@ -209,7 +209,7 @@ class Interaction:
)
@property
def interaction_strength(self) -> Optional[np.ndarray]:
def interaction_strength(self) -> np.ndarray | None:
"""Return ph-ph interaction strength.
Returns
@ -244,7 +244,7 @@ class Interaction:
return self._fc3
@property
def dynamical_matrix(self) -> Optional[DynamicalMatrix]:
def dynamical_matrix(self) -> DynamicalMatrix | None:
"""Return DynamicalMatrix class instance."""
return self._dm
@ -273,10 +273,10 @@ class Interaction:
def get_triplets_at_q(
self,
) -> tuple[
Optional[np.ndarray],
Optional[np.ndarray],
Optional[np.ndarray],
Optional[np.ndarray],
np.ndarray | None,
np.ndarray | None,
np.ndarray | None,
np.ndarray | None,
]:
"""Return grid point triplets information.
@ -311,12 +311,12 @@ class Interaction:
return self._band_indices
@property
def nac_params(self) -> Optional[dict]:
def nac_params(self) -> dict | None:
"""Return NAC params."""
return self._nac_params
@property
def nac_q_direction(self) -> Optional[np.ndarray]:
def nac_q_direction(self) -> np.ndarray | None:
"""Return q-direction used for NAC at q->0.
Direction of q-vector watching from Gamma point used for
@ -337,7 +337,7 @@ class Interaction:
self._nac_q_direction = np.array(nac_q_direction, copy=True, dtype="double")
@property
def zero_value_positions(self) -> Optional[np.ndarray]:
def zero_value_positions(self) -> np.ndarray | None:
"""Return zero ph-ph interaction elements information.
Returns
@ -349,7 +349,7 @@ class Interaction:
def get_phonons(
self,
) -> tuple[Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray]]:
) -> tuple[np.ndarray | None, np.ndarray | None, np.ndarray | None]:
"""Return phonons on grid.
Returns
@ -385,7 +385,7 @@ class Interaction:
return self._cutoff_frequency
@property
def openmp_per_triplets(self) -> Optional[bool]:
def openmp_per_triplets(self) -> bool | None:
"""Return whether OpenMP distribution over triplets or bands."""
return self._openmp_per_triplets