Merge pull request #233 from phonopy/release-3.1.0

Set version v3.1.0
This commit is contained in:
Atsushi Togo 2024-06-07 11:54:42 +09:00 committed by GitHub
commit 6de7b822b4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 102 additions and 71 deletions

View File

@ -2,6 +2,10 @@
# Change Log
## Jun-7-2024: Version 3.1.0
- Change to write forces in phono3py-yaml as default.
## Jun-7-2024: Version 3.0.4
- Bug fix when handling different supercell size of fc2 than that of fc3.

View File

@ -60,7 +60,7 @@ copyright = "2015, Atsushi Togo"
# The short X.Y version.
version = "3.0"
# The full version, including alpha/beta/rc tags.
release = "3.0.4"
release = "3.1.0"
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -44,6 +44,7 @@ from phonopy.harmonic.displacement import (
directions_to_displacement_dataset,
get_least_displacements,
)
from phonopy.harmonic.dynamical_matrix import DynamicalMatrix
from phonopy.harmonic.force_constants import get_fc2 as get_phonopy_fc2
from phonopy.harmonic.force_constants import (
set_permutation_symmetry,
@ -179,7 +180,7 @@ class Phono3py:
Supercell matrix used for fc2. In phono3py, supercell matrix for fc3
and fc2 can be different to support longer range interaction of fc2
than that of fc3. Unless setting this, supercell_matrix is used.
This is only valide when unitcell or unitcell_filename is given.
This is only valid when unitcell or unitcell_filename is given.
Default is None.
cutoff_frequency : float, optional
Phonon frequency below this value is ignored when the cutoff is
@ -297,7 +298,7 @@ class Phono3py:
self._set_band_indices()
@property
def version(self):
def version(self) -> str:
"""Return phono3py release version number.
str
@ -317,7 +318,7 @@ class Phono3py:
return self._calculator
@property
def fc3(self):
def fc3(self) -> Optional[np.ndarray]:
"""Setter and getter of third order force constants (fc3).
ndarray
@ -334,7 +335,7 @@ class Phono3py:
self._fc3 = fc3
@property
def fc2(self):
def fc2(self) -> Optional[np.ndarray]:
"""Setter and getter of second order force constants (fc2).
ndarray
@ -351,12 +352,12 @@ class Phono3py:
self._fc2 = fc2
@property
def force_constants(self):
def force_constants(self) -> Optional[np.ndarray]:
"""Return fc2. This is same as the getter attribute `fc2`."""
return self.fc2
@property
def sigmas(self):
def sigmas(self) -> list:
"""Setter and getter of smearing widths.
list
@ -386,7 +387,7 @@ class Phono3py:
self._sigmas.append(None)
@property
def sigma_cutoff(self):
def sigma_cutoff(self) -> Optional[float]:
"""Setter and getter of Smearing cutoff width.
This is given as a multiple of the standard deviation.
@ -403,7 +404,7 @@ class Phono3py:
self._sigma_cutoff = sigma_cutoff
@property
def nac_params(self):
def nac_params(self) -> Optional[dict]:
"""Setter and getter of parameters for non-analytical term correction.
dict
@ -427,7 +428,7 @@ class Phono3py:
self._init_dynamical_matrix()
@property
def dynamical_matrix(self):
def dynamical_matrix(self) -> Optional[DynamicalMatrix]:
"""Return DynamicalMatrix instance.
This is not dynamical matrices but the instance of DynamicalMatrix
@ -522,7 +523,7 @@ class Phono3py:
return self._phonon_supercell_symmetry
@property
def supercell_matrix(self):
def supercell_matrix(self) -> np.ndarray:
"""Return transformation matrix to supercell cell from unit cell.
ndarray
@ -533,7 +534,7 @@ class Phono3py:
return self._supercell_matrix
@property
def phonon_supercell_matrix(self):
def phonon_supercell_matrix(self) -> Optional[np.ndarray]:
"""Return transformation matrix to phonon supercell from unit cell.
ndarray
@ -544,7 +545,7 @@ class Phono3py:
return self._phonon_supercell_matrix
@property
def primitive_matrix(self):
def primitive_matrix(self) -> np.ndarray:
"""Return transformation matrix to primitive cell from unit cell.
ndarray
@ -555,7 +556,7 @@ class Phono3py:
return self._primitive_matrix
@property
def unit_conversion_factor(self):
def unit_conversion_factor(self) -> float:
"""Return phonon frequency unit conversion factor.
float
@ -567,7 +568,7 @@ class Phono3py:
return self._frequency_factor_to_THz
@property
def dataset(self):
def dataset(self) -> Optional[dict]:
"""Setter and getter of displacement-force dataset.
dict
@ -629,7 +630,7 @@ class Phono3py:
self._phonon_supercells_with_displacements = None
@property
def phonon_dataset(self):
def phonon_dataset(self) -> Optional[dict]:
"""Setter and getter of displacement-force dataset for fc2.
dict
@ -674,10 +675,10 @@ class Phono3py:
self._phonon_supercells_with_displacements = None
@property
def band_indices(self):
def band_indices(self) -> list[np.ndarray]:
"""Setter and getter of band indices.
array_like
list[np.ndarray]
List of band indices specified to select specific bands
to computer ph-ph interaction related properties.
@ -693,11 +694,11 @@ class Phono3py:
num_band = len(self._primitive) * 3
self._band_indices = [np.arange(num_band, dtype="int_")]
else:
self._band_indices = band_indices
self._band_indices = [np.array(bi, dtype="int_") for bi in band_indices]
self._band_indices_flatten = np.hstack(self._band_indices).astype("int_")
@property
def masses(self):
def masses(self) -> np.ndarray:
"""Setter and getter of atomic masses of primitive cell."""
return self._primitive.masses
@ -719,7 +720,7 @@ class Phono3py:
self._phonon_supercell.masses = s_masses
@property
def supercells_with_displacements(self):
def supercells_with_displacements(self) -> list[PhonopyAtoms]:
"""Return supercells with displacements.
list of PhonopyAtoms
@ -2038,7 +2039,7 @@ class Phono3py:
the settings expected to be updated from the following
default settings are needed to be set in the dictionary.
The possible parameters and their default settings are:
{'force_sets': False,
{'force_sets': True,
'displacements': True,
'force_constants': False,
'born_effective_charge': True,

View File

@ -34,8 +34,11 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from __future__ import annotations
import copy
import os
import pathlib
import sys
from typing import Optional
@ -247,7 +250,7 @@ def parse_forces(
# None is returned unless type-2.
# can emit FileNotFoundError.
if dataset is None or dataset is not None and not forces_in_dataset(dataset):
_dataset = _get_type2_dataset(
_dataset = read_type2_dataset(
natom, filename=force_filename, log_level=log_level
)
# Do not overwrite dataset when _dataset is None.
@ -311,13 +314,18 @@ def parse_forces(
return dataset
def forces_in_dataset(dataset):
def forces_in_dataset(dataset: dict) -> bool:
"""Return whether forces in dataset or not."""
return "forces" in dataset or (
"first_atoms" in dataset and "forces" in dataset["first_atoms"][0]
)
def displacements_in_dataset(dataset: dict) -> bool:
"""Return whether displacements in dataset or not."""
return "displacements" in dataset or "first_atoms" in dataset
def get_fc_calculator_params(settings):
"""Return fc_calculator and fc_calculator_params from settings."""
fc_calculator = None
@ -338,7 +346,7 @@ def get_fc_calculator_params(settings):
return fc_calculator, fc_calculator_options
def _read_phono3py_fc3(phono3py, symmetrize_fc3r, input_filename, log_level):
def _read_phono3py_fc3(phono3py: Phono3py, symmetrize_fc3r, input_filename, log_level):
if input_filename is None:
filename = "fc3.hdf5"
else:
@ -357,7 +365,7 @@ def _read_phono3py_fc3(phono3py, symmetrize_fc3r, input_filename, log_level):
if log_level:
print_error()
sys.exit(1)
num_atom = phono3py.supercell.get_number_of_atoms()
num_atom = len(phono3py.supercell)
if fc3.shape[1] != num_atom:
print("Matrix shape of fc3 doesn't agree with supercell size.")
if log_level:
@ -407,8 +415,9 @@ def _read_phono3py_fc2(phono3py, symmetrize_fc2, input_filename, log_level):
phono3py.fc2 = phonon_fc2
def _get_type2_dataset(natom, filename="FORCES_FC3", log_level=0):
if not os.path.isfile(filename):
def read_type2_dataset(natom, filename="FORCES_FC3", log_level=0) -> Optional[dict]:
"""Read type-2 FORCES_FC3."""
if not pathlib.Path(filename).exists():
return None
with open(filename, "r") as f:

View File

@ -48,7 +48,12 @@ from phonopy.structure.atoms import PhonopyAtoms
from phonopy.structure.cells import determinant
from phono3py import Phono3py
from phono3py.cui.create_force_constants import forces_in_dataset, parse_forces
from phono3py.cui.create_force_constants import (
displacements_in_dataset,
forces_in_dataset,
parse_forces,
read_type2_dataset,
)
from phono3py.file_IO import read_fc2_from_hdf5, read_fc3_from_hdf5
from phono3py.interface.phono3py_yaml import Phono3pyYaml
from phono3py.phonon3.fc3 import show_drift_fc3
@ -494,28 +499,31 @@ def _set_dataset_or_fc3(
read_fc3 = True
if log_level:
print('fc3 was read from "fc3.hdf5".')
elif pathlib.Path("FORCES_FC3").exists():
_set_dataset_for_fc3(
ph3py,
ph3py_yaml,
"FORCES_FC3",
phono3py_yaml_filename,
cutoff_pair_distance,
log_level,
)
elif (
ph3py_yaml is not None
and ph3py_yaml.dataset is not None
and forces_in_dataset(ph3py_yaml.dataset)
):
_set_dataset_for_fc3(
ph3py,
ph3py_yaml,
None,
phono3py_yaml_filename,
cutoff_pair_distance,
log_level,
)
elif dataset := read_type2_dataset(
len(ph3py.supercell), "FORCES_FC3", log_level=log_level
): # := Assignment Expressions (Python>=3.8)
ph3py.dataset = dataset
elif ph3py_yaml is not None and ph3py_yaml.dataset is not None:
if pathlib.Path("FORCES_FC3").exists() and displacements_in_dataset(
ph3py_yaml.dataset
):
_set_dataset_for_fc3(
ph3py,
ph3py_yaml,
"FORCES_FC3",
phono3py_yaml_filename,
cutoff_pair_distance,
log_level,
)
if forces_in_dataset(ph3py_yaml.dataset):
_set_dataset_for_fc3(
ph3py,
ph3py_yaml,
None,
phono3py_yaml_filename,
cutoff_pair_distance,
log_level,
)
return read_fc3

View File

@ -541,14 +541,7 @@ def store_force_constants(
log_level=log_level,
)
except ForceCalculatorRequiredError:
if log_level:
print("")
print(
"Built-in force constants calculator doesn't support the "
"dispalcements-forces dataset. "
"An external force calculator, e.g., ALM (--alm), has to be used "
"to compute force constants."
)
_show_fc_calculator_not_found(log_level)
if log_level:
if phono3py.fc3 is None:
@ -592,15 +585,31 @@ def store_force_constants(
if log_level:
print('fc2 was written into "fc2.hdf5".')
else:
create_phono3py_force_constants(
phono3py,
settings,
ph3py_yaml=ph3py_yaml,
phono3py_yaml_filename=phono3py_yaml_filename,
input_filename=input_filename,
output_filename=output_filename,
log_level=log_level,
try:
create_phono3py_force_constants(
phono3py,
settings,
ph3py_yaml=ph3py_yaml,
phono3py_yaml_filename=phono3py_yaml_filename,
input_filename=input_filename,
output_filename=output_filename,
log_level=log_level,
)
except ForceCalculatorRequiredError:
_show_fc_calculator_not_found(log_level)
def _show_fc_calculator_not_found(log_level):
if log_level:
print("")
print(
"Built-in force constants calculator doesn't support the "
"dispalcements-forces dataset. "
"An external force calculator, e.g., ALM (--alm), has to be used "
"to compute force constants."
)
print_error()
sys.exit(1)
def run_gruneisen_then_exit(phono3py, settings, output_filename, log_level):

View File

@ -265,7 +265,7 @@ class Phono3pyYamlDumper(PhonopyYamlDumperBase):
"""Phono3pyYaml dumper."""
_default_dumper_settings = {
"force_sets": False,
"force_sets": True,
"displacements": True,
"force_constants": False,
"born_effective_charge": True,

View File

@ -34,4 +34,4 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
__version__ = "3.0.4"
__version__ = "3.1.0"

View File

@ -2,4 +2,4 @@ numpy >= 1.17.0
PyYAML >= 5.3
matplotlib >= 2.2.2
h5py >= 3.0
phonopy >=2.23,<2.24
phonopy >=2.24,<2.25

View File

@ -326,7 +326,7 @@ def main(build_dir):
"matplotlib>=2.2.2",
"h5py>=3.0",
"spglib>=2.0",
"phonopy>=2.23,<2.24",
"phonopy>=2.24,<2.25",
],
provides=["phono3py"],
scripts=scripts_phono3py,