From 28bfc2cc75e4ec2917a990ba6da4fadaf7cf41be Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Wed, 19 Jun 2024 20:45:05 +0900 Subject: [PATCH 01/14] Minor update for symfc log --- phono3py/cui/load.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/phono3py/cui/load.py b/phono3py/cui/load.py index 6bde5592..e51ec844 100644 --- a/phono3py/cui/load.py +++ b/phono3py/cui/load.py @@ -442,17 +442,20 @@ def compute_force_constants_from_datasets( fc_calculator=fc_calculator, fc_calculator_options=fc_calculator_options, ) - if log_level and symmetrize_fc: + if log_level and symmetrize_fc and fc_calculator is None: print("fc3 was symmetrized.") if not read_fc["fc2"] and (ph3py.dataset or ph3py.phonon_dataset): if ( ph3py.phonon_supercell_matrix is None - and fc_calculator == "alm" + and fc_calculator in ("alm", "symfc") and ph3py.fc2 is not None ): if log_level: - print("fc2 that was fit simultaneously with fc3 by ALM is used.") + if fc_calculator == "alm": + print("fc2 that was fit simultaneously with fc3 by ALM is used.") + elif fc_calculator == "symfc": + print("fc2 that was fit simultaneously with fc3 by symfc is used.") else: ph3py.produce_fc2( symmetrize_fc2=symmetrize_fc, From 7a83fdfb327a6a1c474fa606aab9c82de707ca3e Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Fri, 21 Jun 2024 13:49:24 +0900 Subject: [PATCH 02/14] Migrate to ruff --- .pre-commit-config.yaml | 29 ++--------- phono3py/api_jointdos.py | 2 +- phono3py/api_phono3py.py | 6 +-- phono3py/conductivity/base.py | 22 +++++++- phono3py/conductivity/direct_solution.py | 12 +++-- phono3py/conductivity/rta.py | 10 ++-- phono3py/conductivity/utils.py | 13 +++-- phono3py/cui/phono3py_argparse.py | 2 +- phono3py/cui/phono3py_script.py | 2 +- phono3py/cui/settings.py | 2 +- phono3py/cui/show_log.py | 3 +- phono3py/cui/triplets_info.py | 2 +- phono3py/file_IO.py | 28 +++++++---- phono3py/interface/phono3py_yaml.py | 10 ++-- phono3py/phonon/grid.py | 1 + phono3py/phonon3/displacement_fc3.py | 14 +++--- phono3py/phonon3/fc3.py | 58 +++++++++++----------- phono3py/phonon3/gruneisen.py | 6 +-- phono3py/phonon3/imag_self_energy.py | 7 ++- phono3py/phonon3/interaction.py | 21 ++++++-- phono3py/phonon3/joint_dos.py | 31 +++++++----- phono3py/phonon3/real_self_energy.py | 14 +++--- phono3py/phonon3/spectral_function.py | 4 +- phono3py/phonon3/triplets.py | 7 +-- pyproject.toml | 23 +++++---- scripts/phono3py-coleigplot | 10 +++- scripts/phono3py-kdeplot | 13 +++-- setup.py | 4 +- test/conductivity/test_kappa_RTA.py | 1 - test/conductivity/test_kappa_RTA_Wigner.py | 1 - test/cui/test_phono3py_load_script.py | 1 + test/other/test_kaccum.py | 1 + test/phonon3/test_joint_dos.py | 2 +- test/phonon3/test_triplets.py | 2 +- test/sscha/test_sscha.py | 5 -- 35 files changed, 207 insertions(+), 162 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eab202d5..c54535af 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,31 +10,12 @@ repos: exclude: ^conda/ - id: check-added-large-files -- repo: https://github.com/pycqa/flake8 - rev: 7.1.0 +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.13 hooks: - - id: flake8 - args: - - "--max-line-length=88" - - "--ignore=E203,W503" - -- repo: https://github.com/psf/black - rev: 24.4.2 - hooks: - - id: black - args: - - --line-length=88 - -- repo: https://github.com/pycqa/pydocstyle - rev: 6.3.0 - hooks: - - id: pydocstyle - -- repo: https://github.com/pycqa/isort - rev: 5.13.2 - hooks: - - id: isort - name: isort (python) + - id: ruff + args: [ "--fix", "--show-fixes" ] + - id: ruff-format - repo: https://github.com/Takishima/cmake-pre-commit-hooks rev: v1.9.6 diff --git a/phono3py/api_jointdos.py b/phono3py/api_jointdos.py index 6b4841eb..a69146a9 100644 --- a/phono3py/api_jointdos.py +++ b/phono3py/api_jointdos.py @@ -40,12 +40,12 @@ from phonopy.units import VaspToTHz from phono3py.file_IO import write_joint_dos +from phono3py.phonon.grid import BZGrid from phono3py.phonon3.imag_self_energy import ( get_freq_points_batches, get_frequency_points, ) from phono3py.phonon3.joint_dos import JointDos -from phono3py.phonon.grid import BZGrid class Phono3pyJointDos: diff --git a/phono3py/api_phono3py.py b/phono3py/api_phono3py.py index d65f883c..24dba4af 100644 --- a/phono3py/api_phono3py.py +++ b/phono3py/api_phono3py.py @@ -72,19 +72,20 @@ from phono3py.conductivity.rta import get_thermal_conductivity_RTA from phono3py.interface.fc_calculator import get_fc3 from phono3py.interface.phono3py_yaml import Phono3pyYaml +from phono3py.phonon.grid import BZGrid from phono3py.phonon3.dataset import get_displacements_and_forces_fc3 from phono3py.phonon3.displacement_fc3 import ( direction_to_displacement, get_third_order_displacements, ) -from phono3py.phonon3.fc3 import cutoff_fc3_by_zero -from phono3py.phonon3.fc3 import get_fc3 as get_phono3py_fc3 from phono3py.phonon3.fc3 import ( + cutoff_fc3_by_zero, set_permutation_symmetry_compact_fc3, set_permutation_symmetry_fc3, set_translational_invariance_compact_fc3, set_translational_invariance_fc3, ) +from phono3py.phonon3.fc3 import get_fc3 as get_phono3py_fc3 from phono3py.phonon3.imag_self_energy import ( get_imag_self_energy, write_imag_self_energy, @@ -95,7 +96,6 @@ write_real_self_energy, ) from phono3py.phonon3.spectral_function import run_spectral_function -from phono3py.phonon.grid import BZGrid from phono3py.version import __version__ diff --git a/phono3py/conductivity/base.py b/phono3py/conductivity/base.py index 05c14912..24478392 100644 --- a/phono3py/conductivity/base.py +++ b/phono3py/conductivity/base.py @@ -45,10 +45,10 @@ from phonopy.units import EV, Angstrom, Kb, THz, THzToEv from phono3py.other.isotope import Isotope +from phono3py.phonon.grid import get_grid_points_by_rotations, get_ir_grid_points from phono3py.phonon3.collision_matrix import CollisionMatrix from phono3py.phonon3.imag_self_energy import ImagSelfEnergy from phono3py.phonon3.interaction import Interaction -from phono3py.phonon.grid import get_grid_points_by_rotations, get_ir_grid_points unit_to_WmK = ( (THz * Angstrom) ** 2 / (Angstrom**3) * EV / THz / (2 * np.pi) @@ -81,6 +81,7 @@ def get_mode_heat_capacities(self): "Use attribute, Conductivity.mode_heat_capacities " "instead of Conductivity.get_mode_heat_capacities().", DeprecationWarning, + stacklevel=2, ) return self.mode_heat_capacities @@ -129,6 +130,7 @@ def get_kappa(self): warnings.warn( "Use attribute, Conductivity.kappa " "instead of Conductivity.get_kappa().", DeprecationWarning, + stacklevel=2, ) return self.kappa @@ -143,6 +145,7 @@ def get_mode_kappa(self): "Use attribute, Conductivity.mode_kappa " "instead of Conductivity.get_mode_kappa().", DeprecationWarning, + stacklevel=2, ) return self.mode_kappa @@ -165,6 +168,7 @@ def get_group_velocities(self): "Use attribute, Conductivity.group_velocities " "instead of Conductivity.get_group_velocities().", DeprecationWarning, + stacklevel=2, ) return self.group_velocities @@ -179,6 +183,7 @@ def get_gv_by_gv(self): "Use attribute, Conductivity.gv_by_gv " "instead of Conductivity.get_gv_by_gv().", DeprecationWarning, + stacklevel=2, ) return self.gv_by_gv @@ -413,6 +418,7 @@ def get_mesh_numbers(self): "Use attribute, Conductivity.mesh_numbers " "instead of Conductivity.get_mesh_numbers().", DeprecationWarning, + stacklevel=2, ) return self.mesh_numbers @@ -440,6 +446,7 @@ def get_frequencies(self): "Use attribute, Conductivity.frequencies " "instead of Conductivity.get_frequencies().", DeprecationWarning, + stacklevel=2, ) return self.frequencies @@ -458,6 +465,7 @@ def get_qpoints(self): "Use attribute, Conductivity.qpoints " "instead of Conductivity.get_qpoints().", DeprecationWarning, + stacklevel=2, ) return self.qpoints @@ -480,6 +488,7 @@ def get_grid_points(self): "Use attribute, Conductivity.grid_points " "instead of Conductivity.get_grid_points().", DeprecationWarning, + stacklevel=2, ) return self.grid_points @@ -494,6 +503,7 @@ def get_grid_weights(self): "Use attribute, Conductivity.grid_weights " "instead of Conductivity.get_grid_weights().", DeprecationWarning, + stacklevel=2, ) return self.grid_weights @@ -513,6 +523,7 @@ def get_temperatures(self): "Use attribute, Conductivity.temperatures " "instead of Conductivity.get_temperatures().", DeprecationWarning, + stacklevel=2, ) return self.temperatures @@ -522,6 +533,7 @@ def set_temperatures(self, temperatures): "Use attribute, Conductivity.temperatures " "instead of Conductivity.set_temperatures().", DeprecationWarning, + stacklevel=2, ) self.temperatures = temperatures @@ -540,6 +552,7 @@ def get_gamma(self): warnings.warn( "Use attribute, Conductivity.gamma " "instead of Conductivity.get_gamma().", DeprecationWarning, + stacklevel=2, ) return self.gamma @@ -548,6 +561,7 @@ def set_gamma(self, gamma): warnings.warn( "Use attribute, Conductivity.gamma " "instead of Conductivity.set_gamma().", DeprecationWarning, + stacklevel=2, ) self.gamma = gamma @@ -567,6 +581,7 @@ def get_gamma_isotope(self): "Use attribute, Conductivity.gamma_isotope " "instead of Conductivity.get_gamma_isotope().", DeprecationWarning, + stacklevel=2, ) return self.gamma_isotope @@ -576,6 +591,7 @@ def set_gamma_isotope(self, gamma_iso): "Use attribute, Conductivity.gamma_isotope " "instead of Conductivity.set_gamma_isotope().", DeprecationWarning, + stacklevel=2, ) self.gamma_isotope = gamma_iso @@ -590,6 +606,7 @@ def get_sigmas(self): "Use attribute, Conductivity.sigmas " "instead of Conductivity.get_sigmas().", DeprecationWarning, + stacklevel=2, ) return self.sigmas @@ -604,6 +621,7 @@ def get_sigma_cutoff_width(self): "Use attribute, Conductivity.sigma_cutoff_width " "instead of Conductivity.get_sigma_cutoff_width().", DeprecationWarning, + stacklevel=2, ) return self.sigma_cutoff_width @@ -618,6 +636,7 @@ def get_grid_point_count(self): "Use attribute, Conductivity.grid_point_count " "instead of Conductivity.get_grid_point_count().", DeprecationWarning, + stacklevel=2, ) return self.grid_point_count @@ -632,6 +651,7 @@ def get_averaged_pp_interaction(self): "Use attribute, Conductivity.averaged_pp_interaction " "instead of Conductivity.get_averaged_pp_interaction().", DeprecationWarning, + stacklevel=2, ) return self.averaged_pp_interaction diff --git a/phono3py/conductivity/direct_solution.py b/phono3py/conductivity/direct_solution.py index b8e027cb..89b31ceb 100644 --- a/phono3py/conductivity/direct_solution.py +++ b/phono3py/conductivity/direct_solution.py @@ -56,9 +56,9 @@ get_conversion_factor_WTE, ) from phono3py.file_IO import read_pp_from_hdf5 +from phono3py.phonon.grid import get_grid_points_by_rotations from phono3py.phonon3.collision_matrix import CollisionMatrix from phono3py.phonon3.interaction import Interaction, all_bands_exist -from phono3py.phonon.grid import get_grid_points_by_rotations class ConductivityLBTEBase(ConductivityBase): @@ -163,6 +163,7 @@ def get_collision_matrix(self): "Use attribute, Conductivity_LBTE.collision_matrix " "instead of Conductivity_LBTE.get_collision_matrix().", DeprecationWarning, + stacklevel=2, ) return self.collision_matrix @@ -172,6 +173,7 @@ def set_collision_matrix(self, collision_matrix): "Use attribute, Conductivity_LBTE.collision_matrix " "instead of Conductivity_LBTE.set_collision_matrix().", DeprecationWarning, + stacklevel=2, ) self.collision_matrix = collision_matrix @@ -517,9 +519,9 @@ def _set_collision_matrix_at_sigmas(self, i_gp): else: i_data = 0 self._gamma[j, k, i_data] = self._collision.imag_self_energy - self._collision_matrix[j, k, i_data] = ( - self._collision.get_collision_matrix() - ) + self._collision_matrix[ + j, k, i_data + ] = self._collision.get_collision_matrix() def _prepare_collision_matrix(self): """Collect pieces and construct collision matrix.""" @@ -1271,6 +1273,7 @@ def get_kappa_RTA(self): "Use attribute, Conductivity_LBTE.kappa_RTA " "instead of Conductivity_LBTE.get_kappa_RTA().", DeprecationWarning, + stacklevel=2, ) return self.kappa_RTA @@ -1285,6 +1288,7 @@ def get_mode_kappa_RTA(self): "Use attribute, Conductivity_LBTE.mode_kappa_RTA " "instead of Conductivity_LBTE.get_mode_kappa_RTA().", DeprecationWarning, + stacklevel=2, ) return self.mode_kappa_RTA diff --git a/phono3py/conductivity/rta.py b/phono3py/conductivity/rta.py index 64ac8bbe..f9f9e346 100644 --- a/phono3py/conductivity/rta.py +++ b/phono3py/conductivity/rta.py @@ -54,9 +54,9 @@ ) from phono3py.file_IO import read_pp_from_hdf5 from phono3py.other.tetrahedron_method import get_tetrahedra_relative_grid_address +from phono3py.phonon.grid import get_grid_points_by_rotations from phono3py.phonon3.imag_self_energy import ImagSelfEnergy, average_by_degeneracy from phono3py.phonon3.interaction import Interaction, all_bands_exist -from phono3py.phonon.grid import get_grid_points_by_rotations class ConductivityRTABase(ConductivityBase): @@ -298,9 +298,9 @@ def _set_gamma_at_sigmas(self, i): self._gamma_N[j, k, i] = g_N self._gamma_U[j, k, i] = g_U if self._is_gamma_detail: - self._gamma_detail_at_q[k] = ( - self._collision.get_detailed_imag_self_energy() - ) + self._gamma_detail_at_q[ + k + ] = self._collision.get_detailed_imag_self_energy() def _set_gamma_at_sigmas_lowmem(self, i): """Calculate gamma without storing ph-ph interaction strength. @@ -921,7 +921,7 @@ def _set_kappa_at_sigmas(self, j, k, i_gp, i_band, g_sum, frequencies): return g = g_sum[i_band] + g_sum[j_band] - for i_pair, (a, b) in enumerate( + for i_pair, _ in enumerate( ([0, 0], [1, 1], [2, 2], [1, 2], [0, 2], [0, 1]) ): old_settings = np.seterr(all="raise") diff --git a/phono3py/conductivity/utils.py b/phono3py/conductivity/utils.py index 62b62801..dcc4c63b 100644 --- a/phono3py/conductivity/utils.py +++ b/phono3py/conductivity/utils.py @@ -34,7 +34,6 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - import sys from typing import TYPE_CHECKING, Optional, Union @@ -367,7 +366,7 @@ def write_gamma_detail( all_triplets = get_all_triplets(gp, interaction.bz_grid) if all_bands_exist(interaction): - for j, sigma in enumerate(sigmas): + for sigma in sigmas: write_gamma_detail_to_hdf5( temperatures, mesh, @@ -384,7 +383,7 @@ def write_gamma_detail( verbose=verbose, ) else: - for j, sigma in enumerate(sigmas): + for sigma in sigmas: for k, bi in enumerate(interaction.get_band_indices()): write_gamma_detail_to_hdf5( temperatures, @@ -871,7 +870,7 @@ def kappa_RTA(br: "ConductivityRTA", log_level): ("#%6s " + " %-10s" * 6) % ("T(K)", "xx", "yy", "zz", "yz", "xz", "xy") ) - for j, (t, k) in enumerate(zip(temperatures, kappa[i])): + for t, k in zip(temperatures, kappa[i]): print(("%7.1f " + " %10.3f" * 6) % ((t,) + tuple(k))) print("") @@ -936,13 +935,13 @@ def kappa_Wigner_RTA(br: "ConductivityWignerRTA", log_level): % (" \t T(K)", "xx", "yy", "zz", "yz", "xz", "xy") ) if kappa_P_RTA is not None: - for j, (t, k) in enumerate(zip(temperatures, kappa_P_RTA[i])): + for t, k in zip(temperatures, kappa_P_RTA[i]): print("K_P\t" + ("%7.1f " + " %10.3f" * 6) % ((t,) + tuple(k))) print(" ") - for j, (t, k) in enumerate(zip(temperatures, kappa_C[i])): + for t, k in zip(temperatures, kappa_C[i]): print("K_C\t" + ("%7.1f " + " %10.3f" * 6) % ((t,) + tuple(k))) print(" ") - for j, (t, k) in enumerate(zip(temperatures, kappa_TOT_RTA[i])): + for t, k in zip(temperatures, kappa_TOT_RTA[i]): print("K_T\t" + ("%7.1f " + " %10.3f" * 6) % ((t,) + tuple(k))) print("") diff --git a/phono3py/cui/phono3py_argparse.py b/phono3py/cui/phono3py_argparse.py index f004226f..78e734e5 100644 --- a/phono3py/cui/phono3py_argparse.py +++ b/phono3py/cui/phono3py_argparse.py @@ -516,7 +516,7 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False): action="store_true", default=False, help="Deactivate summation of partial kappa at q-stars", - ), + ) parser.add_argument( "--nomeshsym", dest="is_nomeshsym", diff --git a/phono3py/cui/phono3py_script.py b/phono3py/cui/phono3py_script.py index 3fc35cc1..4cbacee1 100644 --- a/phono3py/cui/phono3py_script.py +++ b/phono3py/cui/phono3py_script.py @@ -89,9 +89,9 @@ write_phonon_to_hdf5, ) from phono3py.interface.phono3py_yaml import Phono3pyYaml +from phono3py.phonon.grid import get_grid_point_from_address, get_ir_grid_points from phono3py.phonon3.fc3 import show_drift_fc3 from phono3py.phonon3.gruneisen import run_gruneisen_parameters -from phono3py.phonon.grid import get_grid_point_from_address, get_ir_grid_points from phono3py.version import __version__ # import logging diff --git a/phono3py/cui/settings.py b/phono3py/cui/settings.py index 5f35b37f..815fb9a5 100644 --- a/phono3py/cui/settings.py +++ b/phono3py/cui/settings.py @@ -709,7 +709,7 @@ def _parse_conf(self): # specials if conf_key in ("create_forces_fc2", "create_forces_fc3"): - if type(confs[conf_key]) is str: + if isinstance(confs[conf_key], str): fnames = confs[conf_key].split() else: fnames = confs[conf_key] diff --git a/phono3py/cui/show_log.py b/phono3py/cui/show_log.py index 2283e065..2ef4f1ba 100644 --- a/phono3py/cui/show_log.py +++ b/phono3py/cui/show_log.py @@ -48,7 +48,8 @@ def show_general_settings( ): """Show general setting information.""" is_primitive_axes_auto = ( - type(phono3py.primitive_matrix) is str and phono3py.primitive_matrix == "auto" + isinstance(phono3py.primitive_matrix, str) + and phono3py.primitive_matrix == "auto" ) primitive_matrix = phono3py.primitive_matrix supercell_matrix = phono3py.supercell_matrix diff --git a/phono3py/cui/triplets_info.py b/phono3py/cui/triplets_info.py index 50ced6a5..1e85bbc9 100644 --- a/phono3py/cui/triplets_info.py +++ b/phono3py/cui/triplets_info.py @@ -37,8 +37,8 @@ import numpy as np from phono3py.file_IO import write_grid_address_to_hdf5, write_ir_grid_points -from phono3py.phonon3.triplets import get_triplets_at_q from phono3py.phonon.grid import get_ir_grid_points +from phono3py.phonon3.triplets import get_triplets_at_q def write_grid_points( diff --git a/phono3py/file_IO.py b/phono3py/file_IO.py index c5285848..8875fb35 100644 --- a/phono3py/file_IO.py +++ b/phono3py/file_IO.py @@ -57,7 +57,9 @@ def write_disp_fc3_yaml(dataset, supercell, filename="disp_fc3.yaml"): This function should not be called from phono3py script from version 3. """ - warnings.warn("write_disp_fc3_yaml() is deprecated.", DeprecationWarning) + warnings.warn( + "write_disp_fc3_yaml() is deprecated.", DeprecationWarning, stacklevel=2 + ) w = open(filename, "w") w.write("natom: %d\n" % dataset["natom"]) @@ -155,7 +157,9 @@ def write_disp_fc2_yaml(dataset, supercell, filename="disp_fc2.yaml"): This function should not be called from phono3py script from version 3. """ - warnings.warn("write_disp_fc2_yaml() is deprecated.", DeprecationWarning) + warnings.warn( + "write_disp_fc2_yaml() is deprecated.", DeprecationWarning, stacklevel=2 + ) w = open(filename, "w") w.write("natom: %d\n" % dataset["natom"]) @@ -251,7 +255,7 @@ def write_FORCES_FC3(disp_dataset, forces_fc3=None, fp=None, filename="FORCES_FC else: # for forces in forces_fc3[i]: # w.write("%15.10f %15.10f %15.10f\n" % (tuple(forces))) - for j in range(natom): + for _ in range(natom): w.write("%15.10f %15.10f %15.10f\n" % (0, 0, 0)) count += 1 @@ -339,8 +343,8 @@ def write_force_constants_to_hdf5( ): try: import h5py - except ImportError: - raise ModuleNotFoundError("You need to install python-h5py.") + except ImportError as exc: + raise ModuleNotFoundError("You need to install python-h5py.") from exc with h5py.File(filename, "w") as w: w.create_dataset( @@ -1480,7 +1484,9 @@ def parse_disp_fc2_yaml(filename="disp_fc2.yaml", return_cell=False): This function should not be called from phono3py script from version 3. """ - warnings.warn("parse_disp_fc2_yaml() is deprecated.", DeprecationWarning) + warnings.warn( + "parse_disp_fc2_yaml() is deprecated.", DeprecationWarning, stacklevel=2 + ) dataset = _parse_yaml(filename) natom = dataset["natom"] @@ -1507,7 +1513,9 @@ def parse_disp_fc3_yaml(filename="disp_fc3.yaml", return_cell=False): This function should not be called from phono3py script from version 3. """ - warnings.warn("parse_disp_fc3_yaml() is deprecated.", DeprecationWarning) + warnings.warn( + "parse_disp_fc3_yaml() is deprecated.", DeprecationWarning, stacklevel=2 + ) dataset = _parse_yaml(filename) natom = dataset["natom"] @@ -1547,7 +1555,7 @@ def parse_FORCES_FC2(disp_dataset, filename="FORCES_FC2", unit_conversion_factor num_disp = len(disp_dataset["first_atoms"]) forces_fc2 = [] with open(filename, "r") as f2: - for i in range(num_disp): + for _ in range(num_disp): forces = _parse_force_lines(f2, num_atom) if forces is None: return [] @@ -1681,7 +1689,7 @@ def _parse_yaml(file_yaml): So this is obsolete at v2 and later versions. """ - warnings.warn("_parse_yaml() is deprecated.", DeprecationWarning) + warnings.warn("_parse_yaml() is deprecated.", DeprecationWarning, stacklevel=2) import yaml @@ -1720,7 +1728,7 @@ def _write_cell_yaml(w, supercell): These methods are also deprecated. """ - warnings.warn("write_cell_yaml() is deprecated.", DeprecationWarning) + warnings.warn("write_cell_yaml() is deprecated.", DeprecationWarning, stacklevel=2) w.write("lattice:\n") for axis in supercell.get_cell(): diff --git a/phono3py/interface/phono3py_yaml.py b/phono3py/interface/phono3py_yaml.py index 9369e282..2decda01 100644 --- a/phono3py/interface/phono3py_yaml.py +++ b/phono3py/interface/phono3py_yaml.py @@ -152,9 +152,9 @@ def _parse_fc3_dataset(self): dataset = None if "displacement_pairs" in self._yaml: disp = self._yaml["displacement_pairs"][0] - if type(disp) is dict: # type1 + if isinstance(disp, dict): # type1 dataset = self._parse_fc3_dataset_type1(len(self._data.supercell)) - elif type(disp) is list: # type2 + elif isinstance(disp, list): # type2 if "displacement" in disp[0]: dataset = self._parse_force_sets_type2() if "displacement_pair_info" in self._yaml: @@ -507,7 +507,7 @@ def _displacements_yaml_lines_type1_info(dataset): if "duplicates" in dataset and dataset["duplicates"]: lines.append(" duplicated_supercell_ids: " "# 0 means perfect supercell") # Backward compatibility for dict type - if type(dataset["duplicates"]) is dict: + if isinstance(dataset["duplicates"], dict): for disp1_id, j in dataset["duplicates"].items(): lines.append(" - [ %d, %d ]" % (int(disp1_id), j)) else: @@ -580,7 +580,7 @@ def read_phono3py_yaml( ) -> Phono3pyYamlData: """Read phono3py.yaml like file.""" yaml_data = load_yaml(filename) - if type(yaml_data) is str: + if isinstance(yaml_data, str): msg = f'Could not load "{filename}" properly.' raise TypeError(msg) return load_phono3py_yaml( @@ -597,7 +597,7 @@ def load_phono3py_yaml( """Return Phono3pyYamlData instance loading yaml data. Parameters - ----------- + ---------- yaml_data : dict """ diff --git a/phono3py/phonon/grid.py b/phono3py/phonon/grid.py index ea7bc30f..b42112ea 100644 --- a/phono3py/phonon/grid.py +++ b/phono3py/phonon/grid.py @@ -716,6 +716,7 @@ def _run_grg( warnings.warn( "Non primitive cell input. Unable to use GR-grid.", RuntimeWarning, + stacklevel=2, ) return False diff --git a/phono3py/phonon3/displacement_fc3.py b/phono3py/phonon3/displacement_fc3.py index 4f539977..f769c900 100644 --- a/phono3py/phonon3/displacement_fc3.py +++ b/phono3py/phonon3/displacement_fc3.py @@ -350,13 +350,11 @@ def _find_duplicates(direction_dataset): duplucates = [] done = [] - for i, direction1 in enumerate(direction_dataset): + for direction1 in direction_dataset: n1 = direction1["number"] for directions2 in direction1["second_atoms"]: n2 = directions2["number"] - if ( - n2 > n1 and (n2, n1) not in done and (n2, n1) in direction_sets - ): # noqa E129 + if n2 > n1 and (n2, n1) not in done and (n2, n1) in direction_sets: # noqa E129 done.append((n2, n1)) duplucates += _compare( n1, @@ -368,14 +366,14 @@ def _find_duplicates(direction_dataset): ) done = [] - for i, direction1 in enumerate(direction_dataset): + for direction1 in direction_dataset: n1 = direction1["number"] for directions2 in direction1["second_atoms"]: n2 = directions2["number"] if n1 == n2 and n1 not in done: done.append(n1) duplucates += _compare_opposite( - n1, direction_sets[(n1, n1)], pair_idx[(n1, n1)] + direction_sets[(n1, n1)], pair_idx[(n1, n1)] ) return duplucates @@ -393,10 +391,10 @@ def _compare(n1, n2, dset1, dset2, pidx1, pidx2): return [[i, j] for (i, j) in duplucates if i > j] -def _compare_opposite(n1, dset1, pidx1): +def _compare_opposite(dset1, pidx1): flip_sets = np.array(dset1)[:, [3, 4, 5, 0, 1, 2]] duplucates = [] - for i, d1 in enumerate(dset1): + for d1 in dset1: eq_indices = np.where(np.abs(flip_sets + d1).sum(axis=1) == 0)[0] if len(eq_indices) > 0: duplucates += [[pidx1[j], 0] for j in eq_indices] diff --git a/phono3py/phonon3/fc3.py b/phono3py/phonon3/fc3.py index d7204971..817a06ff 100644 --- a/phono3py/phonon3/fc3.py +++ b/phono3py/phonon3/fc3.py @@ -276,12 +276,12 @@ def set_permutation_symmetry_compact_fc3(fc3, primitive): np.array(p2s_map, dtype="int_"), np.array(nsym_list, dtype="int_"), ) - except ImportError: + except ImportError as exc: text = ( "Import error at phono3c.permutation_symmetry_compact_fc3. " "Corresponding python code is not implemented." ) - raise RuntimeError(text) + raise RuntimeError(text) from exc def _copy_permutation_symmetry_fc3_elem(fc3, fc3_elem, a, b, c): @@ -339,29 +339,29 @@ def set_translational_invariance_compact_fc3(fc3, primitive: Primitive): _set_translational_invariance_fc3_per_index(fc3, index=1) _set_translational_invariance_fc3_per_index(fc3, index=2) - except ImportError: + except ImportError as exc: text = ( "Import error at phono3c.tranpose_compact_fc3. " "Corresponding python code is not implemented." ) - raise RuntimeError(text) + raise RuntimeError(text) from exc def _set_translational_invariance_fc3_per_index(fc3, index=0): for i in range(fc3.shape[(1 + index) % 3]): for j in range(fc3.shape[(2 + index) % 3]): - for k, l, m in list(np.ndindex(3, 3, 3)): + for k, ll, m in list(np.ndindex(3, 3, 3)): if index == 0: - fc3[:, i, j, k, l, m] -= ( - np.sum(fc3[:, i, j, k, l, m]) / fc3.shape[0] + fc3[:, i, j, k, ll, m] -= ( + np.sum(fc3[:, i, j, k, ll, m]) / fc3.shape[0] ) elif index == 1: - fc3[j, :, i, k, l, m] -= ( - np.sum(fc3[j, :, i, k, l, m]) / fc3.shape[1] + fc3[j, :, i, k, ll, m] -= ( + np.sum(fc3[j, :, i, k, ll, m]) / fc3.shape[1] ) elif index == 2: - fc3[i, j, :, k, l, m] -= ( - np.sum(fc3[i, j, :, k, l, m]) / fc3.shape[2] + fc3[i, j, :, k, ll, m] -= ( + np.sum(fc3[i, j, :, k, ll, m]) / fc3.shape[2] ) @@ -465,7 +465,7 @@ def _solve_fc3( print("Displacements (in Angstrom):") else: print("One displacement (in Angstrom):") - for i, v in enumerate(displacements_first): + for v in displacements_first: print(" [%7.4f %7.4f %7.4f]" % tuple(v)) sys.stdout.flush() if verbose > 2: @@ -577,19 +577,19 @@ def show_drift_fc3(fc3, primitive=None, name="fc3"): klm1 = [0, 0, 0] klm2 = [0, 0, 0] klm3 = [0, 0, 0] - for i, j, k, l, m in list(np.ndindex((num_atom, num_atom, 3, 3, 3))): - val1 = fc3[:, i, j, k, l, m].sum() - val2 = fc3[i, :, j, k, l, m].sum() - val3 = fc3[i, j, :, k, l, m].sum() + for i, j, k, ll, m in list(np.ndindex((num_atom, num_atom, 3, 3, 3))): + val1 = fc3[:, i, j, k, ll, m].sum() + val2 = fc3[i, :, j, k, ll, m].sum() + val3 = fc3[i, j, :, k, ll, m].sum() if abs(val1) > abs(maxval1): maxval1 = val1 - klm1 = [k, l, m] + klm1 = [k, ll, m] if abs(val2) > abs(maxval2): maxval2 = val2 - klm2 = [k, l, m] + klm2 = [k, ll, m] if abs(val3) > abs(maxval3): maxval3 = val3 - klm3 = [k, l, m] + klm3 = [k, ll, m] else: try: import phono3py._phono3py as phono3c @@ -614,29 +614,29 @@ def show_drift_fc3(fc3, primitive=None, name="fc3"): phono3c.transpose_compact_fc3( fc3, permutations, s2pp_map, p2s_map, nsym_list, 0 ) # dim[0] <--> dim[1] - for i, j, k, l, m in np.ndindex((num_patom, num_satom, 3, 3, 3)): - val1 = fc3[i, :, j, k, l, m].sum() + for i, j, k, ll, m in np.ndindex((num_patom, num_satom, 3, 3, 3)): + val1 = fc3[i, :, j, k, ll, m].sum() if abs(val1) > abs(maxval1): maxval1 = val1 - klm1 = [k, l, m] + klm1 = [k, ll, m] phono3c.transpose_compact_fc3( fc3, permutations, s2pp_map, p2s_map, nsym_list, 0 ) # dim[0] <--> dim[1] - for i, j, k, l, m in np.ndindex((num_patom, num_satom, 3, 3, 3)): - val2 = fc3[i, :, j, k, l, m].sum() - val3 = fc3[i, j, :, k, l, m].sum() + for i, j, k, ll, m in np.ndindex((num_patom, num_satom, 3, 3, 3)): + val2 = fc3[i, :, j, k, ll, m].sum() + val3 = fc3[i, j, :, k, ll, m].sum() if abs(val2) > abs(maxval2): maxval2 = val2 - klm2 = [k, l, m] + klm2 = [k, ll, m] if abs(val3) > abs(maxval3): maxval3 = val3 - klm3 = [k, l, m] - except ImportError: + klm3 = [k, ll, m] + except ImportError as exc: text = ( "Import error at phono3c.tranpose_compact_fc3. " "Corresponding python code is not implemented." ) - raise RuntimeError(text) + raise RuntimeError(text) from exc text = "Max drift of %s: " % name text += "%f (%s%s%s) " % (maxval1, "xyz"[klm1[0]], "xyz"[klm1[1]], "xyz"[klm1[2]]) diff --git a/phono3py/phonon3/gruneisen.py b/phono3py/phonon3/gruneisen.py index bc47a3f9..e001f998 100644 --- a/phono3py/phonon3/gruneisen.py +++ b/phono3py/phonon3/gruneisen.py @@ -270,9 +270,7 @@ def _write_band_yaml(self, filename): ): f.write("- nqpoint: %d\n" % len(path)) f.write(" phonon:\n") - for i, (q, d, g_at_q, freqs_at_q) in enumerate( - zip(path, distances, gs, fs) - ): # noqa E125 + for q, d, g_at_q, freqs_at_q in zip(path, distances, gs, fs): f.write(" - q-position: [ %10.7f, %10.7f, %10.7f ]\n" % tuple(q)) f.write(" distance: %10.7f\n" % d) f.write(" band:\n") @@ -415,7 +413,7 @@ def _get_dPhidu(self): for j in range(3): for k in range(3): for ll in range(3): - for m in range(3): + for _ in range(3): dPhidu[nu, pi, i, j, k, ll] = ( fc3[p2s[nu], pi, :, i, j, :] * Y[:, :, k, ll] ).sum() diff --git a/phono3py/phonon3/imag_self_energy.py b/phono3py/phonon3/imag_self_energy.py index 563ba6a6..6c06a86b 100644 --- a/phono3py/phonon3/imag_self_energy.py +++ b/phono3py/phonon3/imag_self_energy.py @@ -46,9 +46,9 @@ write_gamma_detail_to_hdf5, write_imag_self_energy_at_grid_point, ) +from phono3py.phonon.func import bose_einstein from phono3py.phonon3.interaction import Interaction from phono3py.phonon3.triplets import get_triplets_integration_weights -from phono3py.phonon.func import bose_einstein class ImagSelfEnergy: @@ -170,6 +170,7 @@ def get_imag_self_energy(self): "Use attribute, ImagSelfEnergy.imag_self_energy " "instead of ImagSelfEnergy.get_imag_self_energy().", DeprecationWarning, + stacklevel=2, ) return self.imag_self_energy @@ -200,6 +201,7 @@ def get_detailed_imag_self_energy(self): "Use attribute, ImagSelfEnergy.detailed_imag_self_energy " "instead of ImagSelfEnergy.get_detailed_imag_self_energy().", DeprecationWarning, + stacklevel=2, ) return self.detailed_imag_self_energy @@ -222,6 +224,7 @@ def get_unit_conversion_factor(self): "Use attribute, ImagSelfEnergy.unit_conversion_factor " "instead of ImagSelfEnergy.get_unit_conversion_factor().", DeprecationWarning, + stacklevel=2, ) return self.unit_conversion_factor @@ -268,6 +271,7 @@ def set_frequency_points(self, frequency_points): "Use attribute, ImagSelfEnergy.frequency_points " "instead of ImagSelfEnergy.set_frequency_points().", DeprecationWarning, + stacklevel=2, ) self.frequency_points = frequency_points @@ -289,6 +293,7 @@ def set_temperature(self, temperature): "Use attribute, ImagSelfEnergy.temperature " "instead of ImagSelfEnergy.set_temperature().", DeprecationWarning, + stacklevel=2, ) self.temperature = temperature diff --git a/phono3py/phonon3/interaction.py b/phono3py/phonon3/interaction.py index 575088e6..6461fc0c 100644 --- a/phono3py/phonon3/interaction.py +++ b/phono3py/phonon3/interaction.py @@ -45,15 +45,15 @@ from phonopy.structure.symmetry import Symmetry from phonopy.units import AMU, EV, Angstrom, Hbar, THz, VaspToTHz -from phono3py.phonon3.real_to_reciprocal import RealToReciprocal -from phono3py.phonon3.reciprocal_to_normal import ReciprocalToNormal -from phono3py.phonon3.triplets import get_nosym_triplets_at_q, get_triplets_at_q from phono3py.phonon.grid import ( BZGrid, get_grid_points_by_rotations, get_ir_grid_points, ) from phono3py.phonon.solver import run_phonon_solver_c, run_phonon_solver_py +from phono3py.phonon3.real_to_reciprocal import RealToReciprocal +from phono3py.phonon3.reciprocal_to_normal import ReciprocalToNormal +from phono3py.phonon3.triplets import get_nosym_triplets_at_q, get_triplets_at_q class Interaction: @@ -222,6 +222,7 @@ def get_interaction_strength(self): "Use attribute, Interaction.interaction_strength " "instead of Interaction.get_interaction_strength().", DeprecationWarning, + stacklevel=2, ) return self.interaction_strength @@ -243,6 +244,7 @@ def get_mesh_numbers(self): "Use attribute, Interaction.mesh_numbers " "instead of Interaction.get_mesh_numbers().", DeprecationWarning, + stacklevel=2, ) return self.mesh_numbers @@ -261,6 +263,7 @@ def get_fc3(self): warnings.warn( "Use attribute, Interaction.fc3 " "instead of Interaction.get_fc3().", DeprecationWarning, + stacklevel=2, ) return self.fc3 @@ -275,6 +278,7 @@ def get_dynamical_matrix(self): "Use attribute, Interaction.dynamical_matrix " "instead of Interaction.get_dynamical_matrix().", DeprecationWarning, + stacklevel=2, ) return self.dynamical_matrix @@ -289,6 +293,7 @@ def get_primitive(self): "Use attribute, Interaction.primitive " "instead of Interaction.get_primitive().", DeprecationWarning, + stacklevel=2, ) return self.primitive @@ -338,6 +343,7 @@ def get_band_indices(self): "Use attribute, Interaction.band_indices " "instead of Interaction.get_band_indices().", DeprecationWarning, + stacklevel=2, ) return self.band_indices @@ -373,6 +379,7 @@ def get_nac_q_direction(self): "Use attribute, Interaction.nac_q_direction " "instead of Interaction.get_nac_q_direction().", DeprecationWarning, + stacklevel=2, ) return self.nac_q_direction @@ -382,6 +389,7 @@ def set_nac_q_direction(self, nac_q_direction=None): "Use attribute, Interaction.nac_q_direction " "instead of Interaction.set_nac_q_direction().", DeprecationWarning, + stacklevel=2, ) self.nac_q_direction = nac_q_direction @@ -402,6 +410,7 @@ def get_zero_value_positions(self): "Use attribute, Interaction.zero_value_positions " "instead of Interaction.get_zero_value_positions().", DeprecationWarning, + stacklevel=2, ) return self.zero_value_positions @@ -436,6 +445,7 @@ def get_frequency_factor_to_THz(self): "Use attribute, Interaction.frequency_factor_to_THz ", "instead of Interaction.get_frequency_factor_to_THz().", DeprecationWarning, + stacklevel=2, ) return self.frequency_factor_to_THz @@ -450,6 +460,7 @@ def get_lapack_zheev_uplo(self): "Use attribute, Interaction.lapack_zheev_uplo " "instead of Interaction.get_lapack_zheev_uplo().", DeprecationWarning, + stacklevel=2, ) return self.lapack_zheev_uplo @@ -464,6 +475,7 @@ def get_cutoff_frequency(self): "Use attribute, Interaction.cutoff_frequency " "instead of Interaction.get_cutoff_frequency().", DeprecationWarning, + stacklevel=2, ) return self.cutoff_frequency @@ -520,6 +532,7 @@ def get_averaged_interaction(self): "Use attribute, Interaction.averaged_interaction " "instead of Interaction.get_averaged_interaction().", DeprecationWarning, + stacklevel=2, ) return self.averaged_interaction @@ -540,6 +553,7 @@ def get_unit_conversion_factor(self): "Use attribute, Interaction.unit_conversion_factor " "instead of Interaction.get_unit_conversion_factor().", DeprecationWarning, + stacklevel=2, ) return self.unit_conversion_factor @@ -554,6 +568,7 @@ def get_constant_averaged_interaction(self): "Use attribute, Interaction.constant_averaged_interaction " "instead of Interaction.get_constant_averaged_interaction().", DeprecationWarning, + stacklevel=2, ) return self.constant_averaged_interaction diff --git a/phono3py/phonon3/joint_dos.py b/phono3py/phonon3/joint_dos.py index 66d2e4da..2bb1add0 100644 --- a/phono3py/phonon3/joint_dos.py +++ b/phono3py/phonon3/joint_dos.py @@ -42,14 +42,14 @@ from phonopy.structure.cells import Primitive, Supercell from phonopy.units import VaspToTHz +from phono3py.phonon.func import bose_einstein +from phono3py.phonon.grid import BZGrid, get_grid_point_from_address +from phono3py.phonon.solver import run_phonon_solver_c from phono3py.phonon3.triplets import ( get_nosym_triplets_at_q, get_triplets_at_q, get_triplets_integration_weights, ) -from phono3py.phonon.func import bose_einstein -from phono3py.phonon.grid import BZGrid, get_grid_point_from_address -from phono3py.phonon.solver import run_phonon_solver_c class JointDos: @@ -129,7 +129,7 @@ def joint_dos(self): def get_joint_dos(self): """Return joint-density-of-states.""" - warnings.warn("Use attribute, joint_dos", DeprecationWarning) + warnings.warn("Use attribute, joint_dos", DeprecationWarning, stacklevel=2) return self.joint_dos @property @@ -143,7 +143,9 @@ def frequency_points(self, frequency_points): def get_frequency_points(self): """Return frequency points.""" - warnings.warn("Use attribute, frequency_points", DeprecationWarning) + warnings.warn( + "Use attribute, frequency_points", DeprecationWarning, stacklevel=2 + ) return self.frequency_points def get_phonons(self): @@ -157,7 +159,7 @@ def primitive(self) -> Primitive: def get_primitive(self): """Return primitive cell.""" - warnings.warn("Use attribute, primitive", DeprecationWarning) + warnings.warn("Use attribute, primitive", DeprecationWarning, stacklevel=2) return self.primitive @property @@ -172,7 +174,7 @@ def mesh_numbers(self): def get_mesh_numbers(self): """Return mesh numbers by three integer values.""" - warnings.warn("Use attribute, mesh_numbers", DeprecationWarning) + warnings.warn("Use attribute, mesh_numbers", DeprecationWarning, stacklevel=2) return self.mesh @property @@ -189,7 +191,9 @@ def nac_q_direction(self, nac_q_direction=None): def set_nac_q_direction(self, nac_q_direction=None): """Set q-direction for NAC.""" - warnings.warn("Use attribute, nac_q_direction", DeprecationWarning) + warnings.warn( + "Use attribute, nac_q_direction", DeprecationWarning, stacklevel=2 + ) self.nac_q_direction = nac_q_direction @property @@ -209,6 +213,7 @@ def set_sigma(self, sigma): warnings.warn( "Use attribute, JointDOS.sigma instead of JointDOS.set_sigma()", DeprecationWarning, + stacklevel=2, ) self.sigma = sigma @@ -401,14 +406,16 @@ def _run_occupation(self): def _run_py_with_g_at_temperature(self, jdos, i): g = self._g n = self._occupations - for k, l in list(np.ndindex(g.shape[3:])): + for k, ll in list(np.ndindex(g.shape[3:])): weights = np.where( - np.logical_or(n[:, 0, k] < 0, n[:, 1, l] < 0), 0, self._weights_at_q + np.logical_or(n[:, 0, k] < 0, n[:, 1, ll] < 0), 0, self._weights_at_q ) jdos[i, 1] += np.dot( - (n[:, 0, k] + n[:, 1, l] + 1) * g[0, :, i, k, l], weights + (n[:, 0, k] + n[:, 1, ll] + 1) * g[0, :, i, k, ll], weights + ) + jdos[i, 0] += np.dot( + (n[:, 0, k] - n[:, 1, ll]) * g[1, :, i, k, ll], weights ) - jdos[i, 0] += np.dot((n[:, 0, k] - n[:, 1, l]) * g[1, :, i, k, l], weights) def _init_dynamical_matrix(self): self._dm = get_dynamical_matrix( diff --git a/phono3py/phonon3/real_self_energy.py b/phono3py/phonon3/real_self_energy.py index a49ee932..b39bc039 100644 --- a/phono3py/phonon3/real_self_energy.py +++ b/phono3py/phonon3/real_self_energy.py @@ -44,9 +44,9 @@ write_real_self_energy_at_grid_point, write_real_self_energy_to_hdf5, ) +from phono3py.phonon.func import bose_einstein from phono3py.phonon3.imag_self_energy import get_frequency_points from phono3py.phonon3.interaction import Interaction -from phono3py.phonon.func import bose_einstein class RealSelfEnergy: @@ -247,8 +247,8 @@ def _run_c_with_band_indices(self): ) def _run_py_with_band_indices(self): - for i, (triplet, w, interaction) in enumerate( - zip(self._triplets_at_q, self._weights_at_q, self._pp_strength) + for triplet, w, interaction in zip( + self._triplets_at_q, self._weights_at_q, self._pp_strength ): freqs = self._frequencies[triplet] for j, bi in enumerate(self._band_indices): @@ -286,11 +286,11 @@ def _run_c_with_frequency_points(self): def _run_py_with_frequency_points(self): for k, fpoint in enumerate(self._frequency_points): - for i, (triplet, w, interaction) in enumerate( - zip(self._triplets_at_q, self._weights_at_q, self._pp_strength) + for triplet, w, interaction in zip( + self._triplets_at_q, self._weights_at_q, self._pp_strength ): freqs = self._frequencies[triplet] - for j, bi in enumerate(self._band_indices): + for j, _ in enumerate(self._band_indices): if self._temperature > 0: self._real_self_energies[ k, j @@ -442,7 +442,7 @@ def _half_shift(self): fpoints = [] coef = self._df / np.pi i_zero = (len(self._im_part) - 1) // 2 - for i, im_part_at_i in enumerate(self._im_part): + for i, _ in enumerate(self._im_part): if i < i_zero: continue fpoint = self._all_frequency_points[i] + self._df / 2 diff --git a/phono3py/phonon3/spectral_function.py b/phono3py/phonon3/spectral_function.py index 4b0b9f99..95f4de33 100644 --- a/phono3py/phonon3/spectral_function.py +++ b/phono3py/phonon3/spectral_function.py @@ -214,7 +214,7 @@ def __init__( def run(self): """Calculate spectral function over grid points.""" - for gp_index in self: + for _ in self: pass def __iter__(self): @@ -354,7 +354,7 @@ def _run_spectral_function(self, i, grid_point, sigma_i): if self._log_level: print("* Spectral function") frequencies = self._pp.get_phonons()[0] - for j, temp in enumerate(self._temperatures): + for j, _ in enumerate(self._temperatures): for k, bi in enumerate(self._pp.band_indices): freq = frequencies[grid_point, bi] gammas = self._gammas[sigma_i, j, i, k] diff --git a/phono3py/phonon3/triplets.py b/phono3py/phonon3/triplets.py index 139240a6..aa75bcad 100644 --- a/phono3py/phonon3/triplets.py +++ b/phono3py/phonon3/triplets.py @@ -109,9 +109,10 @@ def get_triplets_at_q( ) triplets_at_q, weights = _get_BZ_triplets_at_q(grid_point, bz_grid, map_triplets) - assert ( - np.prod(bz_grid.D_diag) == weights.sum() - ), "Num grid points %d, sum of weight %d" % (np.prod(bz_grid.D_diag), weights.sum()) + assert np.prod(bz_grid.D_diag) == weights.sum(), ( + "Num grid points %d, sum of weight %d" + % (np.prod(bz_grid.D_diag), weights.sum()) + ) return triplets_at_q, weights, map_triplets, map_q diff --git a/pyproject.toml b/pyproject.toml index df2609e6..1827bc6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,19 @@ [build-system] requires = ["setuptools", "wheel", "numpy"] -#requires = ["setuptools", "wheel", "numpy", "oldest-supported-numpy"] -#build-backend = "setuptools.build_meta" -[tool.flake8] -max-line-length = 88 -extend-ignore = "E203,W503" - -[tool.black] +[tool.ruff] line-length = 88 +select = [ + "F", # Flake8 + "B", # Black + "I", # isort + "E", # pycodestyle-errors + "D", # pydocstyle +] +extend-ignore = [ + "D417", + "D100", +] -[tool.isort] -profile = "black" +[tool.ruff.lint.pydocstyle] +convention = "numpy" diff --git a/scripts/phono3py-coleigplot b/scripts/phono3py-coleigplot index bb60bcd8..22d1894b 100755 --- a/scripts/phono3py-coleigplot +++ b/scripts/phono3py-coleigplot @@ -11,7 +11,7 @@ epsilon = 1.0e-8 def get_options(): - # Arg-parser + """Parse command line options.""" parser = argparse.ArgumentParser(description="Plot collision matrix eigenvalues") parser.add_argument( "--temperature", @@ -33,6 +33,7 @@ def get_options(): def get_t_index(temperatures, args): + """Return temperature index.""" if len(temperatures) > 29: t_index = 30 else: @@ -45,6 +46,7 @@ def get_t_index(temperatures, args): def plot_one(ax, coleigs, temperatures, args): + """Plot collision matrix eigenvalues at one temperature.""" t_index = get_t_index(temperatures, args) coleigs_p = coleigs[t_index].copy() coleigs_n = coleigs[t_index].copy() @@ -56,6 +58,7 @@ def plot_one(ax, coleigs, temperatures, args): def plot_one_file(ax, args): + """Plot collision matrix eigenvalues at one temperature from file.""" filename = args.filenames[0] if os.path.isfile(filename): with h5py.File(filename, "r") as f: @@ -68,6 +71,7 @@ def plot_one_file(ax, args): def plot_more(ax, coleigs, temperatures, args): + """Update plot by collision matrix eigenvalues from one file.""" t_index = get_t_index(temperatures[0], args) y = [np.abs(v[t_index]) for v in coleigs] ax.semilogy(np.transpose(y), ".", markersize=5) @@ -75,6 +79,7 @@ def plot_more(ax, coleigs, temperatures, args): def plot_more_files(ax, args): + """Plot collision matrix eigenvalues from multiple files.""" temperatures = [] coleigs = [] for filename in args.filenames: @@ -89,6 +94,7 @@ def plot_more_files(ax, args): def plot(args: argparse.Namespace): + """Plot collision matrix eigenvalues.""" import matplotlib.pyplot as plt _, ax = plt.subplots() @@ -108,6 +114,7 @@ def plot(args: argparse.Namespace): def write_dat(args: argparse.Namespace): + """Write collision matrix eigenvalues to a file in gnuplot style.""" with open("coleigs.dat", "w") as w: for filename in args.filenames: with h5py.File(filename) as f: @@ -125,6 +132,7 @@ def write_dat(args: argparse.Namespace): def main(args: argparse.Namespace): + """Run phono3py-coleigplot.""" if args.savetxt: write_dat(args) else: diff --git a/scripts/phono3py-kdeplot b/scripts/phono3py-kdeplot index ca284900..184bbc88 100755 --- a/scripts/phono3py-kdeplot +++ b/scripts/phono3py-kdeplot @@ -12,6 +12,7 @@ epsilon = 1.0e-8 def collect_data(gamma, weights, frequencies, cutoff, max_freq): + """Collect data for making input of Gaussian-KDE.""" freqs = [] mode_prop = [] for w, freq, g in zip(weights, frequencies, gamma): @@ -37,8 +38,7 @@ def collect_data(gamma, weights, frequencies, cutoff, max_freq): def run_KDE(x, y, nbins, x_max=None, y_max=None, density_ratio=0.1): - """Running Gaussian-KDE by scipy""" - + """Run Gaussian-KDE by scipy.""" x_min = 0 if x_max is None: _x_max = np.rint(x.max() * 1.1) @@ -95,6 +95,7 @@ def plot( point_size=5, title=None, ): + """Plot lifetime distribution.""" xmax = np.max(x) ymax = np.max(y) x_cut = [] @@ -159,7 +160,7 @@ def plot( def get_options(): - # Arg-parser + """Parse command-line arguments.""" parser = argparse.ArgumentParser( description="Plot property density with gaussian KDE" ) @@ -206,7 +207,7 @@ def get_options(): "Number of bins in which data are assigned, " "i.e., determining resolution of plot" ), - ), + ) parser.add_argument( "--no-points", dest="no_points", action="store_true", help="Do not show points" ) @@ -246,9 +247,7 @@ def get_options(): def main(args): - # - # Matplotlib setting - # + """Run phono3py-kdeplot.""" import matplotlib matplotlib.use("Agg") diff --git a/setup.py b/setup.py index 04f071d8..d08cc8b5 100644 --- a/setup.py +++ b/setup.py @@ -188,12 +188,12 @@ def _get_extensions(build_dir): found_libs[key] = line.split()[3].split(";") if f"{key} flags" in line and len(line.split()) > 3: found_flags[key] = line.split()[3].split(";") - for key, value in found_libs.items(): + for _, value in found_libs.items(): found_extra_link_args += value for element in value: if "libmkl" in element: use_mkl_lapacke = True - for key, value in found_flags.items(): + for _, value in found_flags.items(): found_extra_compile_args += value if use_mkl_lapacke: params["define_macros"].append(("MKL_LAPACKE", None)) diff --git a/test/conductivity/test_kappa_RTA.py b/test/conductivity/test_kappa_RTA.py index 46643819..ea82c728 100644 --- a/test/conductivity/test_kappa_RTA.py +++ b/test/conductivity/test_kappa_RTA.py @@ -111,7 +111,6 @@ def test_kappa_RTA_si_nosym(si_pbesol: Phono3py, si_pbesol_nosym: Phono3py): def test_kappa_RTA_si_nomeshsym(si_pbesol: Phono3py, si_pbesol_nomeshsym: Phono3py): """Test RTA without considering mesh symmetry by Si.""" - if si_pbesol_nomeshsym._make_r0_average: ref_kappa_RTA_si_nomeshsym = [81.147, 81.147, 81.147, 0.000, 0.000, 0.000] else: diff --git a/test/conductivity/test_kappa_RTA_Wigner.py b/test/conductivity/test_kappa_RTA_Wigner.py index 37426406..b8d88190 100644 --- a/test/conductivity/test_kappa_RTA_Wigner.py +++ b/test/conductivity/test_kappa_RTA_Wigner.py @@ -92,7 +92,6 @@ def test_kappa_RTA_si_with_sigma_iso(si_pbesol: Phono3py): def test_kappa_RTA_si_nosym(si_pbesol: Phono3py, si_pbesol_nosym: Phono3py): """Test RTA without considering symmetry by Si.""" - if si_pbesol_nosym._make_r0_average: ref_kappa_P_RTA_si_nosym = [39.396, 39.222, 39.368, -0.096, -0.022, 0.026] ref_kappa_C_si_nosym = [0.009, 0.009, 0.009, 0.000, 0.000, 0.000] diff --git a/test/cui/test_phono3py_load_script.py b/test/cui/test_phono3py_load_script.py index 92f76597..e6987194 100644 --- a/test/cui/test_phono3py_load_script.py +++ b/test/cui/test_phono3py_load_script.py @@ -45,6 +45,7 @@ def __iter__(self): return (getattr(self, field.name) for field in fields(self)) def __contains__(self, item): + """Implement in operator.""" return item in (field.name for field in fields(self)) diff --git a/test/other/test_kaccum.py b/test/other/test_kaccum.py index 503d78af..becd2b13 100644 --- a/test/other/test_kaccum.py +++ b/test/other/test_kaccum.py @@ -298,6 +298,7 @@ def test_GammaDOSsmearing(nacl_pbe: Phono3py): def test_run_prop_dos(si_pbesol: Phono3py): + """Test of run_prop_dos.""" ph3 = si_pbesol ph3.mesh_numbers = [7, 7, 7] ph3.init_phph_interaction() diff --git a/test/phonon3/test_joint_dos.py b/test/phonon3/test_joint_dos.py index cb48cb31..9167f236 100644 --- a/test/phonon3/test_joint_dos.py +++ b/test/phonon3/test_joint_dos.py @@ -5,8 +5,8 @@ from phono3py import Phono3py from phono3py.api_jointdos import Phono3pyJointDos -from phono3py.phonon3.joint_dos import JointDos from phono3py.phonon.grid import BZGrid +from phono3py.phonon3.joint_dos import JointDos si_freq_points = [ 0.0000000, diff --git a/test/phonon3/test_triplets.py b/test/phonon3/test_triplets.py index dceb62a8..ef5ddf5d 100644 --- a/test/phonon3/test_triplets.py +++ b/test/phonon3/test_triplets.py @@ -7,12 +7,12 @@ from phonopy.structure.symmetry import Symmetry from phono3py import Phono3py +from phono3py.phonon.grid import BZGrid, get_grid_point_from_address from phono3py.phonon3.triplets import ( _get_BZ_triplets_at_q, _get_triplets_reciprocal_mesh_at_q, get_triplets_at_q, ) -from phono3py.phonon.grid import BZGrid, get_grid_point_from_address def test_get_triplets_at_q_type1(si_pbesol_111): diff --git a/test/sscha/test_sscha.py b/test/sscha/test_sscha.py index 0d3276d5..a1d80eaf 100644 --- a/test/sscha/test_sscha.py +++ b/test/sscha/test_sscha.py @@ -13,11 +13,6 @@ get_sscha_matrices, ) -try: - ModuleNotFoundError -except NameError: - ModuleNotFoundError = ImportError - si_pbesol_upsilon0_0 = [[3.849187e02, 0, 0], [0, 3.849187e02, 0], [0, 0, 3.849187e02]] si_pbesol_upsilon1_34 = [ [1.886404, -1.549705, -1.126055], From c0dfe172aeac189e0985e0fd01201089e6af8233 Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Fri, 21 Jun 2024 14:20:10 +0900 Subject: [PATCH 03/14] Update README.md --- README.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 87be7617..00c5d0d5 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,20 @@ # phono3py -A simulation package of phonon-phonon interaction related properties. Phono3py -user documentation is found at http://phonopy.github.io/phono3py/. +A simulation package of phonon-phonon interaction related properties mainly +written in python. Phono3py user documentation is found at +http://phonopy.github.io/phono3py/. ## Mailing list for questions Usual phono3py questions should be sent to phonopy mailing list (https://sourceforge.net/p/phonopy/mailman/). +## Dependency + +See `requirements.txt`. Optionally `symfc` and `scipy` are required +for using additional features. + ## Development The development of phono3py is managed on the `develop` branch of github @@ -21,26 +27,19 @@ phono3py repository. - Github issues is the place to discuss about phono3py issues. - Github pull request is the place to request merging source code. -- Python 3.7 is the minimum requirement. -- Formatting is written in `pyproject.toml`. -- Not strictly, but VSCode's `settings.json` may be written like +- Formatting rules are found in `pyproject.toml`. +- Not strictly, but VSCode's `settings.json` may be written like below ```json - "python.linting.flake8Enabled": true, - "python.linting.flake8Args": ["--max-line-length=88", "--ignore=E203,W503"], - "python.linting.enabled": true, - "python.linting.pylintEnabled": false, - "python.linting.mypyEnabled": true, - "python.linting.pycodestyleEnabled": false, - "python.linting.pydocstyleEnabled": true, - "python.formatting.provider": "black", - "python.formatting.blackArgs": ["--line-length=88"], - "python.sortImports.args": ["--profile", "black"], + "ruff.lint.args": [ + "--config=${workspaceFolder}/pyproject.toml", + ], "[python]": { + "editor.defaultFormatter": "charliermarsh.ruff", "editor.codeActionsOnSave": { - "source.organizeImports": true - }, - } + "source.organizeImports": "explicit" + } + }, ``` - Use of pre-commit (https://pre-commit.com/) is encouraged. @@ -57,7 +56,8 @@ stored in `doc` directory. Please see how to write the documentation at ## How to run tests -You need pytest. At home directory of phono3py after setup, +Tests are written using pytest. To run tests, pytest has to be installed. The +tests can be run by ```bash % pytest From b7099c53b69a734427d4e6bfc599382fdc7b200a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 23:02:20 +0000 Subject: [PATCH 04/14] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.1.13 → v0.4.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.13...v0.4.10) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c54535af..5da3a44d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: - id: check-added-large-files - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.13 + rev: v0.4.10 hooks: - id: ruff args: [ "--fix", "--show-fixes" ] From ccb81905c081a9c9d84ed58d256921fe85edd612 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 23:02:36 +0000 Subject: [PATCH 05/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- phono3py/conductivity/direct_solution.py | 6 +++--- phono3py/conductivity/rta.py | 6 +++--- phono3py/interface/calculator.py | 1 - phono3py/phonon3/real_self_energy.py | 16 ++++++++-------- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/phono3py/conductivity/direct_solution.py b/phono3py/conductivity/direct_solution.py index 89b31ceb..0b292431 100644 --- a/phono3py/conductivity/direct_solution.py +++ b/phono3py/conductivity/direct_solution.py @@ -519,9 +519,9 @@ def _set_collision_matrix_at_sigmas(self, i_gp): else: i_data = 0 self._gamma[j, k, i_data] = self._collision.imag_self_energy - self._collision_matrix[ - j, k, i_data - ] = self._collision.get_collision_matrix() + self._collision_matrix[j, k, i_data] = ( + self._collision.get_collision_matrix() + ) def _prepare_collision_matrix(self): """Collect pieces and construct collision matrix.""" diff --git a/phono3py/conductivity/rta.py b/phono3py/conductivity/rta.py index f9f9e346..44a786e8 100644 --- a/phono3py/conductivity/rta.py +++ b/phono3py/conductivity/rta.py @@ -298,9 +298,9 @@ def _set_gamma_at_sigmas(self, i): self._gamma_N[j, k, i] = g_N self._gamma_U[j, k, i] = g_U if self._is_gamma_detail: - self._gamma_detail_at_q[ - k - ] = self._collision.get_detailed_imag_self_energy() + self._gamma_detail_at_q[k] = ( + self._collision.get_detailed_imag_self_energy() + ) def _set_gamma_at_sigmas_lowmem(self, i): """Calculate gamma without storing ph-ph interaction strength. diff --git a/phono3py/interface/calculator.py b/phono3py/interface/calculator.py index 15f0014d..e0b52d51 100644 --- a/phono3py/interface/calculator.py +++ b/phono3py/interface/calculator.py @@ -34,7 +34,6 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - calculator_info = { "abinit": {"option": {"name": "--abinit", "help": "Invoke Abinit mode"}}, # 'aims': {'option': {'name': "--aims", diff --git a/phono3py/phonon3/real_self_energy.py b/phono3py/phonon3/real_self_energy.py index b39bc039..c2c8d95b 100644 --- a/phono3py/phonon3/real_self_energy.py +++ b/phono3py/phonon3/real_self_energy.py @@ -292,16 +292,16 @@ def _run_py_with_frequency_points(self): freqs = self._frequencies[triplet] for j, _ in enumerate(self._band_indices): if self._temperature > 0: - self._real_self_energies[ - k, j - ] += self._real_self_energies_at_bands( - j, fpoint, freqs, interaction, w + self._real_self_energies[k, j] += ( + self._real_self_energies_at_bands( + j, fpoint, freqs, interaction, w + ) ) else: - self._real_self_energies[ - k, j - ] += self._real_self_energies_at_bands_0K( - j, fpoint, freqs, interaction, w + self._real_self_energies[k, j] += ( + self._real_self_energies_at_bands_0K( + j, fpoint, freqs, interaction, w + ) ) self._real_self_energies *= self._unit_conversion From 1550b912f8b5852ed61ec9d19e4b946005faa6fa Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Wed, 26 Jun 2024 22:27:49 +0900 Subject: [PATCH 06/14] Add option for produce_fc3 using pypolymlp --- phono3py/api_phono3py.py | 221 +++++++++++++++---- phono3py/cui/phono3py_argparse.py | 7 + test/api/test_api_phono3py.py | 36 +++ test/conftest.py | 11 + test/phono3py_params_MgO-222rd-444fd.yaml.xz | Bin 0 -> 303504 bytes 5 files changed, 237 insertions(+), 38 deletions(-) create mode 100644 test/phono3py_params_MgO-222rd-444fd.yaml.xz diff --git a/phono3py/api_phono3py.py b/phono3py/api_phono3py.py index 24dba4af..e758b027 100644 --- a/phono3py/api_phono3py.py +++ b/phono3py/api_phono3py.py @@ -40,10 +40,12 @@ from typing import Literal, Optional, Union import numpy as np +from phonopy import Phonopy from phonopy.exception import ForceCalculatorRequiredError from phonopy.harmonic.displacement import ( directions_to_displacement_dataset, get_least_displacements, + get_random_displacements_dataset, ) from phonopy.harmonic.dynamical_matrix import DynamicalMatrix from phonopy.harmonic.force_constants import get_fc2 as get_phonopy_fc2 @@ -54,6 +56,7 @@ symmetrize_force_constants, ) from phonopy.interface.fc_calculator import get_fc2 +from phonopy.interface.pypolymlp import PypolymlpParams from phonopy.structure.atoms import PhonopyAtoms from phonopy.structure.cells import ( Primitive, @@ -288,10 +291,13 @@ def __init__( self._frequency_points = None self._temperatures = None - # Other variables + # Force constants self._fc2 = None self._fc3 = None + # MLP container + self._mlp_phonopy = None + # Setup interaction self._interaction = None self._band_indices = None @@ -984,6 +990,30 @@ def phonon_supercell_energies(self): def phonon_supercell_energies(self, values): self._set_phonon_forces_energies(values, target="supercell_energies") + @property + def mlp_dataset(self) -> Optional[dict]: + """Return displacement-force dataset. + + The supercell matrix is equal to that of usual displacement-force + dataset. Only type 2 format is supported. "displacements", + "forces", and "supercell_energies" should be contained. + + """ + if self._mlp_phonopy is None: + return None + return self._mlp_phonopy.mlp_dataset + + @mlp_dataset.setter + def mlp_dataset(self, mlp_dataset: dict): + if self._mlp_phonopy is None: + self._mlp_phonopy = Phonopy( + self._unitcell, + supercell_matrix=self._supercell_matrix, + symprec=self._symprec, + log_level=self._log_level, + ) + self._mlp_phonopy.mlp_dataset = mlp_dataset + @property def phph_interaction(self): """Return Interaction instance.""" @@ -1166,6 +1196,10 @@ def generate_displacements( cutoff_pair_distance=None, is_plusminus="auto", is_diagonal=True, + number_of_snapshots: Optional[int] = None, + random_seed: Optional[int] = None, + is_random_distance: bool = False, + min_distance: Optional[float] = None, ): """Generate displacement dataset in supercell for fc3. @@ -1211,20 +1245,48 @@ def generate_displacements( vectors of the supercell. With True, direction not along the basis vectors can be chosen when the number of the displacements may be reduced. + number_of_snapshots : int or None, optional + Number of snapshots of supercells with random displacements. Random + displacements are generated displacing all atoms in random + directions with a fixed displacement distance specified by + 'distance' parameter, i.e., all atoms in supercell are displaced + with the same displacement distance in direct space. Default is + None. + random_seed : int or None, optional + Random seed for random displacements generation. Default is None. + is_random_distance : bool, optional + Random direction displacements are generated also with random + amplitudes. The maximum value is defined by `distance` and minimum + value is given by `min_distance`. Default is False. + min_distance : float or None, optional + In random direction displacements generation with random distance + (`is_random_distance=True`), the minimum distance is given by this + value. """ - direction_dataset = get_third_order_displacements( - self._supercell, - self._symmetry, - is_plusminus=is_plusminus, - is_diagonal=is_diagonal, - ) - self._dataset = direction_to_displacement( - direction_dataset, - distance, - self._supercell, - cutoff_distance=cutoff_pair_distance, - ) + if number_of_snapshots is not None and number_of_snapshots > 0: + self._dataset = self._generate_random_displacements( + number_of_snapshots, + len(self._supercell), + distance=distance, + is_plusminus=is_plusminus is True, + random_seed=random_seed, + is_random_distance=is_random_distance, + min_distance=min_distance, + ) + else: + direction_dataset = get_third_order_displacements( + self._supercell, + self._symmetry, + is_plusminus=is_plusminus, + is_diagonal=is_diagonal, + ) + self._dataset = direction_to_displacement( + direction_dataset, + distance, + self._supercell, + cutoff_distance=cutoff_pair_distance, + ) self._supercells_with_displacements = None if self._phonon_supercell_matrix is not None and self._phonon_dataset is None: @@ -1233,7 +1295,14 @@ def generate_displacements( ) def generate_fc2_displacements( - self, distance=0.03, is_plusminus="auto", is_diagonal=False + self, + distance: float = 0.03, + is_plusminus: str = "auto", + is_diagonal: bool = False, + number_of_snapshots: Optional[int] = None, + random_seed: Optional[int] = None, + is_random_distance: bool = False, + min_distance: Optional[float] = None, ): """Generate displacement dataset in phonon supercell for fc2. @@ -1263,6 +1332,23 @@ def generate_fc2_displacements( vectors of the supercell. With True, direction not along the basis vectors can be chosen when the number of the displacements may be reduced. Default is False. + number_of_snapshots : int or None, optional + Number of snapshots of supercells with random displacements. Random + displacements are generated displacing all atoms in random + directions with a fixed displacement distance specified by + 'distance' parameter, i.e., all atoms in supercell are displaced + with the same displacement distance in direct space. Default is + None. + random_seed : int or None, optional + Random seed for random displacements generation. Default is None. + is_random_distance : bool, optional + Random direction displacements are generated also with random + amplitudes. The maximum value is defined by `distance` and minimum + value is given by `min_distance`. Default is False. + min_distance : float or None, optional + In random direction displacements generation with random distance + (`is_random_distance=True`), the minimum distance is given by this + value. """ if self._phonon_supercell_matrix is None: @@ -1273,54 +1359,85 @@ def generate_fc2_displacements( ) raise RuntimeError(msg) - phonon_displacement_directions = get_least_displacements( - self._phonon_supercell_symmetry, - is_plusminus=is_plusminus, - is_diagonal=is_diagonal, - ) - self._phonon_dataset = directions_to_displacement_dataset( - phonon_displacement_directions, distance, self._phonon_supercell - ) + if number_of_snapshots is not None and number_of_snapshots > 0: + self._phonon_dataset = self._generate_random_displacements( + number_of_snapshots, + len(self._phonon_supercell), + distance=distance, + is_plusminus=is_plusminus is True, + random_seed=random_seed, + is_random_distance=is_random_distance, + min_distance=min_distance, + ) + else: + phonon_displacement_directions = get_least_displacements( + self._phonon_supercell_symmetry, + is_plusminus=is_plusminus, + is_diagonal=is_diagonal, + ) + self._phonon_dataset = directions_to_displacement_dataset( + phonon_displacement_directions, distance, self._phonon_supercell + ) self._phonon_supercells_with_displacements = None def produce_fc3( self, - symmetrize_fc3r=False, - is_compact_fc=False, - fc_calculator=None, - fc_calculator_options=None, + symmetrize_fc3r: bool = False, + is_compact_fc: bool = False, + fc_calculator: Optional[str] = None, + fc_calculator_options: Optional[str] = None, + use_pypolymlp: bool = False, + mlp_params: Optional[Union[PypolymlpParams, dict]] = None, ): """Calculate fc3 from displacements and forces. Parameters ---------- symmetrize_fc3r : bool - Only for type 1 displacement_dataset, translational and - permutation symmetries are applied after creating fc3. This - symmetrization is not very sophisticated and can break space - group symmetry, but often useful. If better symmetrization is - expected, it is recommended to use external force constants - calculator such as ALM. Default is False. + Only for type 1 displacement_dataset, translational and permutation + symmetries are applied after creating fc3. This symmetrization is + not very sophisticated and can break space group symmetry, but often + useful. If better symmetrization is expected, it is recommended to + use external force constants calculator such as ALM. Default is + False. is_compact_fc : bool fc3 shape is - False: (supercell, supercell, supecell, 3, 3, 3) - True: (primitive, supercell, supecell, 3, 3, 3) + False: (supercell, supercell, supecell, 3, 3, 3) True: + (primitive, supercell, supecell, 3, 3, 3) where 'supercell' and 'primitive' indicate number of atoms in these cells. Default is False. fc_calculator : str or None Force constants calculator given by str. fc_calculator_options : dict Options for external force constants calculator. + use_pypolymlp : bool + Use MLP of pypolymlp to calculate fc3. Default is False. mlp_dataset + has to be set before calling this method. + mlp_params : PypolymlpParams or dict, optional + Parameters for developing MLP. Default is None. When dict is given, + PypolymlpParams instance is created from the dict. """ - disp_dataset = self._dataset + if use_pypolymlp: + if self._mlp_phonopy is None: + msg = "mlp_dataset has to be set before calling this method." + raise RuntimeError(msg) + if self._dataset is None or "displacements" not in self._dataset: + raise RuntimeError( + "Type 2 displacements are not set. Run generate_displacements." + ) + self._mlp_phonopy.develop_mlp(params=mlp_params) + self._mlp_phonopy.displacements = self._dataset["displacements"] + self._mlp_phonopy.evaluate_mlp() + self._dataset["forces"] = self._mlp_phonopy.forces + self._dataset["supercell_energies"] = self._mlp_phonopy.supercell_energies fc3_calculator, fc3_calculator_options = self._extract_fc2_fc3_calculators( fc_calculator, fc_calculator_options, 3 ) if fc3_calculator is not None: - disps, forces = get_displacements_and_forces_fc3(disp_dataset) + disps, forces = get_displacements_and_forces_fc3(self._dataset) fc2, fc3 = get_fc3( self._supercell, self._primitive, @@ -1333,7 +1450,7 @@ def produce_fc3( log_level=self._log_level, ) else: - if "displacements" in disp_dataset: + if "displacements" in self._dataset: msg = ( "fc_calculator has to be set to produce force " "constans from this dataset." @@ -1342,7 +1459,7 @@ def produce_fc3( fc2, fc3 = get_phono3py_fc3( self._supercell, self._primitive, - disp_dataset, + self._dataset, self._symmetry, is_compact_fc=is_compact_fc, verbose=self._log_level, @@ -2404,3 +2521,31 @@ def _set_phonon_forces_energies( self._phonon_dataset[target] = _values else: raise RuntimeError("Set of FC2 displacements is not available.") + + def _generate_random_displacements( + self, + number_of_snapshots: int, + number_of_atoms: int, + distance: float = 0.03, + is_plusminus: bool = False, + random_seed: Optional[int] = None, + is_random_distance: bool = False, + min_distance: Optional[float] = None, + ): + if random_seed is not None and random_seed >= 0 and random_seed < 2**32: + _random_seed = random_seed + dataset = {"random_seed": _random_seed} + else: + _random_seed = None + dataset = {} + d = get_random_displacements_dataset( + number_of_snapshots, + number_of_atoms, + distance, + random_seed=_random_seed, + is_plusminus=is_plusminus, + is_random_distance=is_random_distance, + min_distance=min_distance, + ) + dataset["displacements"] = d + return dataset diff --git a/phono3py/cui/phono3py_argparse.py b/phono3py/cui/phono3py_argparse.py index 78e734e5..48bf9820 100644 --- a/phono3py/cui/phono3py_argparse.py +++ b/phono3py/cui/phono3py_argparse.py @@ -618,6 +618,13 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False): default=None, help="Conversion factor for ph-ph interaction", ) + parser.add_argument( + "--pypolymlp", + dest="use_pypolymlp", + action="store_true", + default=None, + help="Use pypolymlp and symfc for generating force constants", + ) parser.add_argument( "--qpoints", nargs="+", diff --git a/test/api/test_api_phono3py.py b/test/api/test_api_phono3py.py index cbed29eb..35a1b2fb 100644 --- a/test/api/test_api_phono3py.py +++ b/test/api/test_api_phono3py.py @@ -5,6 +5,8 @@ from pathlib import Path import numpy as np +import pytest +from phonopy.interface.pypolymlp import PypolymlpParams from phono3py import Phono3py @@ -166,3 +168,37 @@ def test_type2_forces_energies_setter_Si(si_111_222_rd: Phono3py): ph3.phonon_forces = ph3_in.phonon_forces + 1 np.testing.assert_allclose(ph3_in.forces + 1, ph3.forces) np.testing.assert_allclose(ph3_in.phonon_forces + 1, ph3.phonon_forces) + + +def test_use_pypolymlp_mgs(mgo_222rd_444rd: Phono3py): + """Test use_pypolymlp in produce_fc3.""" + pytest.importorskip("pypolymlp") + + ph3_in = mgo_222rd_444rd + ph3 = Phono3py( + ph3_in.unitcell, + supercell_matrix=ph3_in.supercell_matrix, + phonon_supercell_matrix=ph3_in.phonon_supercell_matrix, + primitive_matrix=ph3_in.primitive_matrix, + log_level=2, + ) + ph3.mlp_dataset = { + "displacements": ph3_in.displacements[:10], + "forces": ph3_in.forces[:10], + "supercell_energies": ph3_in.supercell_energies[:10], + } + ph3.phonon_dataset = ph3_in.phonon_dataset + ph3.nac_params = ph3_in.nac_params + ph3.displacements = ph3_in.displacements[:100] + + atom_energies = {"Mg": -0.00896717, "O": -0.95743902} + params = PypolymlpParams(gtinv_maxl=(4, 4), atom_energies=atom_energies) + ph3.produce_fc3(use_pypolymlp=True, mlp_params=params, fc_calculator="symfc") + ph3.produce_fc2(fc_calculator="symfc") + + ph3.mesh_numbers = 30 + ph3.init_phph_interaction() + ph3.run_thermal_conductivity(temperatures=[300]) + assert ( + pytest.approx(63.6001137, abs=1e-3) == ph3.thermal_conductivity.kappa[0, 0, 0] + ) diff --git a/test/conftest.py b/test/conftest.py index 5d552de1..91fda478 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -497,6 +497,17 @@ def si_111_222_rd() -> Phono3py: return phono3py.load(yaml_filename, produce_fc=False, log_level=1) +@pytest.fixture(scope="session") +def mgo_222rd_444rd() -> Phono3py: + """Return Phono3py class instance of MgO-2x2x2-4x4x4 RD-RD. + + 4 and 400 supercells for fc2 and fc3, respectively. + + """ + yaml_filename = cwd / "phono3py_params_MgO-222rd-444fd.yaml.xz" + return phono3py.load(yaml_filename, produce_fc=False, log_level=1) + + @pytest.fixture(scope="session") def ph_nacl() -> Phonopy: """Return Phonopy class instance of NaCl 2x2x2.""" diff --git a/test/phono3py_params_MgO-222rd-444fd.yaml.xz b/test/phono3py_params_MgO-222rd-444fd.yaml.xz new file mode 100644 index 0000000000000000000000000000000000000000..59148cb0a79a3ca9d698c982322bf3a7e5adaf6d GIT binary patch literal 303504 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
    3_4`8*u_Nvg&ClptW$Rh4U!Zg)U!Iq1 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

    e;Pu77J^al#)e43URw{$Upb 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�qNEs@*^%s1_D&6+GO? zKNX?#*ddinf_14zCkyYww1d&uV&h9rgGOPu0j;3oFI-)h_wW=>+u6wbN1=o_W4g8a zI+{0%GSQEk9z3|Ew9Ck3SHRW9>!S)B-C3e^5Td^7Y5cf2g1snOFtRE0j3kmGnOC{k z3@PmBC16`wNJ}ePNu&))j#9-qXQP5hJ*|iw*Rgxa^3PAfLDiNjPv}mk9G3oyLxjfj zK!=YQi4I56J0i7=>OZcYZE4~Hrz&SbSm&KJG%Rjx8aD~z8mb$c%=+ZgU=9nzVfmx8 z&N^o!UB6Y5q>G{0oraNw=tieRqV@hI+ELm?Zl^p3INv_eT@zIf+}bqT>IdK^i8wx? zl(f&eqcrIs0n_L{m)3pkg;f)@r-o?(eI7k5Tk!k&6!6NjNi1xzu0DJk2I0}$v$obb z(7ub~*vu}<-0K5gm?PUfpFuU&c4xDV1~F}%{n0e;24Xba@ve?vzJ9lE%#P;FG$oB;`$O$>~bQ&{Dn3>v7HAx)6m@%VwblmH4cyo8+rk0 zi=cM?LAWJ_XW@gux=|H%;TCFk>I?(zoDCEmLnp~w;ik7}qfc6Ak+W$iZzhDgCa;5& zlaFoV>>Zq@>CUM+%F@OomQE0^tC&UnaglF2C}asqNPmH#fl3{D z*q=hi0HavHM_f)7NDKQ_Yd$72vo_wFuIkbYo%J*oDdQ}+ool@PO&K)wD3M?r=~YbxT)xeQ%FY`Nf*$k}FrBl7#TCzeWS`q) zcGUGlpaE@tRd1(olNzk~gUf+@*gp|h@lI}TSsvmgkJwdPSTa+xhe&u?oBxbXmDhn3 zai7ma2|Ek`A&`Au!UON?a2969c^i2T5o36d`r~l;H2m>uHX1 zi$pzZG3&3t4HG0U4kOMl6hr+Ndy67ZIR$>=5CNe;9`JE5$g*4wr;3v=%sikjq6CL# ztA6Cs&cWVbbtAipw^cGe^3ZAeL?RqIZ39@HCd|b`+k7g&GPwbzynk4GK^=9K4Qbg1 zz5nqPd5=xW*8m?Zpff*9Ys1H(7Lc|U2kex+ZZYNF;Iwkj1SEsC7x2Qb8C*FPDlHYS z?P61u=NJc$NthZUfI9-ONaP>&ttgsA=gN~IU%unh?(tc3Zt0nMWj5C=X3D&lIKI6C zLYdD3c&<>Og^n8K+Mvl^I%QqP3hk+gE_*2=ipesi9N5n%>D{U+p5BL z$AW=OwXo}*8FJdTs%c24uWQaeSjujNRmCU5JLNC!$N~Jt3*{FKy}YrARP%cOSQt){ z%Wb$MT`yM#0xTng;d_%F&JObndIGAU=NtXIWW_)jSVpRKq&rofGk03fNh0L0g|2lz z1@DI->74-H)Nlj?6d)+yq!(H$DlG-iumZ==iBYFy@whw{6F&=oz-z#G^S{i3 z5B>-;Yk=6K3(6eqdso(3d9~9MhuEBA?9u0AHcfQbn zYlkF=fZ56=K@;~@Lq!9;vH_Woz#JGNim2nHCHD9p+dz8)6*ztZjAFB+gjPqWmZx|E zO&lH|M@MYxRBC$sbcj#JxoiA&ju4*Bo;}%3`e|IJ$W;VHqgaQ)n#}u1liG$9>eA_) z==PA8!x;1d^Y~H~K256HGZ_N}q@nhqt84Vs%*KONmpj?HlvTiu0d4|jBMdzGbV=^B zEU6G&0NyQ8A|$TNyj9LZHmRUxX0Jw!UJM`}I!Oa?>{UY*MR2@u>Yjbv`qZ`efQv05 zwO{wNTsF{)U0Ya{GVXYSSFMGRa(HXx;qozqRg-Y8tDWhI$Y2ZkFt2Gu|2S^l%gnv# z#!*g$E65Bb-*f7@`-1$|d?82aGr^H;C?NF1?YKVHaUHp?YA-B6kq{P1?t;xV`z=hy z*z{(||9Q_{)x}S@sF}CxGn!dZkFWcWf?yK%IMTDPN|XiN6-wvaNbNq>S5SQ4^} zBpIYK3!IXSnp+~q;tY@df^Uh%dtTe>QR1OxvxJy6)Dx9%28#G4LwxwDl_&E#J zj+Jb`X*$A6;=s(M)Or?L$fE52VO0H$otr1sf)prTe^7%C(7pMfR^NgAYO0K-j5cCO zvP-?;bnBka+5`kO5*TsnV8piWX9%eeWfy@u36Z)D5<jfP2Z z>EI~FJrdOr2j-r`>L3>Wd(B*%Q9NH(<7JEHVLj=ybdD^a6JtkrW-(`lL#g5d>c~sY z2auLqU43BYWOf96n_yqW=LWl;u47H!MpGOy#_4vyKJfNY2L5Yx=aORnfG+{_8}?-HwA`3hqFw9u6HI?ZYsmub(CHmaK7_9_wzu zK^(T4j_I}I0dj7Gqx%&gO#uM}k_MbVW9SqYYZ{f=9Hyi{H=17mel)|j9Nd1Co~RnI zv=Uee0jO@3j3jr(>i5`mLtcu=1|_Ujsg3y$htNY=+u&sY?jKN_HLGeU%`sf*j~v39 zMcbsIN#HyEI>Mac9TP_hU%_(hpaKK>TWf(#?(MP4;aH;i>3s}X6MfzMCVb-P~b`a&(FyBT72p1YJ4v)Wpr3$FxB_~Ac*-)uV2IHuH+rgIdgAuSWpuFv(Z-b;$A-fzrjq5j&n`218V2)blThKEQj0$17gVP;xRMi@Fwe{2#m@J(hlI!cIx#Ce0l{|99X5_3N-PuR3x;gZ>CpboZ zvN%+_vLc3zXP=%DY2nBw!sl>ZdZB5X`3x-$qb!cni)>5QI@LT#D*G*3HRyOvEAi=$ zg4ik#VAmbKgHDe1Y1cPq9;s8&x0|AVnE{n z3HQajLy;tC+e>tj{J_7ILElxD^2Z8{o<0m*?{;GRV&B+;p!Por)Ajz?oWwI78P8Z~ z#Bn#Wuaf^EurNEl&H?1kQaE5dnMaTLFk8=TcbtfCB1J~@7QCI=DD^ z^qK6ZN&a4%(OoHx9*okekm;Wper=&WB#i!%k3(wQf`5nS_d81p_-8m z57Q`%%^xo-ozDNXwf<5n7yZ1EvBzW$lZTLJwsyvwfvVrX7NMKBCNk(*oO_`!Wh?-~ zyaAW3P=nS%?AH)F*$flneTd$|bHNYT)mJ;5U%MM%xKB2HZ!25Vs*AqK;Ju?}RRpS= zSsohU2NTcISc3pQMFLL^+iP!1n`#r245&iDz~QH@3@j&_tRJVr&Y>?jHbx~3375o8 zOSPkdHS#u}UfPwa?5nU9!ka^stdM!d|4$eMgwnt=emA3tpPXkOM4fWglXg%n_59P67@IzQHUqRl9JdET`yCF4^`zEjNI783TQ>~tSx>=qa@ zCRlZHaJd4bd&xZS`9K+m2c$AU`$QJtB7bo!pY&4XUM;#U_f<7fbX>H@Ae)8^UEwo_ zGuUgQ_K&aIZe?^)+5}`os-pXItht{o1%6q z3AcGWoB@m8+Rx)iVKXEj&viXUts!+y zAkP}IsIcfOydwP+aN#Tyjx)u1lZ^=@aWM^mD8}^xWwts=QOsl34 zb+>afSUUhTkxAZ?hbc@eqgZ-uH8q7$lOP%?Yt_?__N<}~R-FdObmrAHG@Xg%$BW!Wo5O{D#9pd&YneVOZ1 z+9?_SyOwIxKaoF68zSQinH`jPq?s3(!ipA)>1iME6ppnm3Q#MNLNC*m0+`9-yv`Uy zr=lLMK|SE1a_B(^lM>Lv{jTAtlrEVV>3FTlWw-$?NNH?SP)~F6hEN2&`$9cdzt_5{ zYK~+S`?C)q8nlca-zM#K)`;CLewAYvzOg7g@i_D$wqnNeL%RkaPzh>fXalgg^|q`4 z_%7|e=oCD{-iK_mlxT1MmUI#tWKM!r8jv;*hn{X6#h+7-xSHtI54Cy<-rA{oUEb-# z6T-{?7-;TDFPvse)bCKqTA8rpy&3cM|o)sciCI5w>VyBeYwv z%roYDfzsw4@qKR*af(dzD^+v)-BGry`zGxad-FlQT!made%~Ex>&{8HdpJ2QZhZj@ z10xJxMtHSbJ59%lO!cPrY8rS(%trUU;g!?07a9XKO~#BPv&W~y4d*@27kX37G{qO? zpM0ED@G58-!x*Lmk8ycfP0?1oQ5_ln8J~HPMG~a4JOmfm8FPc<9^ye zJjO6D5xl@ks^7*t7jeH;WYT0ax&w=}saAH)a4(-KV5;EVq{~IpeMZZU&&BH10dwmn zSzS9l`#Y+3^FM>LQdPDI_0!o+9{MHvFEneRm1j~v_SHOXHLPl!Id#ZTL;huMZ(!%Y?9=WLJV`Pgl0EZ!WL6#5+WIC#{17H|Uu)(=ASs4h=%OC3)@t`dUM(RNi3V#8qaJ0Bf*G5cJr zDp$i{?|fDSg0bqjkBauXSX0`1m#k_2$%Nta%ed@r_E+C)=8su8#gw~*yD9OT!Le%Z zm=#o}wJd}z6evK?ps65JS9U9OXJwD6k;7Km${*NJFBhHtr4g*d&ffky4pxS%rNVrMURk$SptGF4eeFMUCH%n@ zmf>~}^4mNDOk5lnv1#|IHQS+KtXaReb)GbZ|vpDZzHav)c@APBD(}hWh*m0}zq>zmGPnYEn}gcz!n^MLkhYawp_~6Z^S?Q%+dJogJE5>ulW>4zpE-0jGK8{2((z(y zFYi#IJna%I-tbF^+3IrmHM-W6F3exHDJkWTUtEdttedpLZnI2>GnP<{E2HA*!?r?#p8K&)G?R7p} zUNj$-MQNNNh`0ibX8Es30x@DrL-D@u0ZNGq=n#_rmsIgWnYKKvGVGHKgp^f6zOwpl zHuI<*wl+ipczE#dk8smqUPR#kB%A~)F26L;I#RRU2P1FDkMi$#75B|N)ejF37RD_v zG=j;!pQ>n`VdN8_gT~=iB;O+i!?X>-;N^v^a7OnVgdBE zEYz`|((j804D}w3n3$c>bba81Xg!NL-@^UxG2O4r z2v)s;<}8o5Thi6|r{)&Q9vE`hfgXRA%L`>~vTJL2nY~*Ds%v^~k3 z#IV=8KBCE|i{Fw<K0ERKVu7+D=I8z=teGvavA@6w7WeUM=23b^$lF&a1#eyxQ zCnZ3o^4`($3Nso6L*{6Wcs#4Y!=R>p99?KSY9sKcEE{oO*fM()bBa5!z~`?xi#hw< zEdjwn$yF&0WoI@1X*E5=PToLd_+T;+D1S>R_y1*78m_rwOjoK>s1JASB*4tQSDe!6 z_PwV~tqWM7veO}RO)%_z_0_SiK-$C>`tBX5Dqn(A9W>lIUf_@J$@w2qrqsB#_orW* zw4GCsGLg1Sc17gLf-KZlLxcH8I3GL&95}PbDni!(W~0Dx4+1*s4rH=IeB~wN7?6Zi zEH;1=(|I;l*sO0 z=$pXd>dB}Y{_8JLWY4A<&N@~^s9D>s!%pM*p$AA`XzHm81A9kpyS3oUk%0O1SHl$h z4)#a*OEWI?jv1pXcQuMkI4lv9@)~Vn91VBw2c=mo&TfZvA%f$MC&V-8uhdiUXH1cE{!Mvq2v6XTvJI!T}`9LdzJgOAPkE6|(*B!IJ z@r@g^TT|WLig7#UzP!V=wUQ_MQ)JxU$JAqlkO+F`=1+-Ux=U}YBAkEOV`jtvy zII5PxFWD7T>Ru7Wq|IW?(z1Oj^YJ{VOmg8}6#a5kVV;vWS>aX1vzQcokj-Yq8Q=7u zJ1FB;E4&a%5|A;YsVpGZy}+aOZ}&GxwJ`ItO9OZ{Rrfx_&g*QSa!fXHbS=y%;RwQC zc_u35M0<~#IhC!#Zh$qZ!0uz*sTVKYHib`XdOaJCg3W^teDREhk4RO0S)cU;;7+Fy zItb4$z?V_tAI?X7`S0nh&dH$qg&6qyh@^_d4=DGk9R2ToB8A$KT?$7l;Vk^GQx|Sr zhGHVXTo(P<6|YjR=~!@b@Ry;wb|?KOaFIj>4(221EIIW-M*!lVZ1fZKQHB#y@nS?H zSxb4)m}4%wJ?mE5?uSJT?bPZK*@|?vZFkuxW%>hH#pWS=7+cyxiL4DUC8RV7&+{1N z%or5h26Xh<2u9Uhh%eTyM-L`^?S5zHc6)ksG!$?{MYV6_1pNZ*L>MT`AjtU)+%-^j ztyIJ3bqx5B&X7W>I+aQd0IwBr1cb)~k3RHb($ixab!w0PGTw+4TW@H(b4JKa1BsLJLM9#^zh(e3^pUw;^o>?xFCPp0H*r5E{s@^y;U zTvC^`ZClT%kdNCt4a5V>vjZynG^|!uhh!&kYhG#qdV>=X=qq1eN?sVhD~diOG0C}Q z^Y;xsFpCID>R`1M%x>X{YyQ}TsHQQl#>p{xTWNtSH*iCO@2;;X7aK$;=Z|~_zRwtgD zMXQ!T7lit~4MFNK-3wc$xC-M!l1kIuM}jKr9My8hnbMEVk~H8tnEI#VpMIVI4(Rg; zHpwf2;xuQWn-AdeP!4Qg4XtTv87A-PG_o1gI87IeRrxfC$|UyNL>pESIBgk?8VPGw zcN!@Iius!b(iBMFW@W2d^B{03V9g$b((SW*35sUevSswkmmf )rL=N9MSKWBN#w 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 Date: Fri, 28 Jun 2024 15:45:12 +0900 Subject: [PATCH 07/14] Update pypolymlp feature --- phono3py/api_phono3py.py | 243 +++++++++++------- phono3py/cui/create_force_constants.py | 95 ++++++- phono3py/cui/load.py | 237 ++++++++--------- phono3py/cui/phono3py_argparse.py | 26 +- phono3py/cui/phono3py_script.py | 10 +- phono3py/cui/show_log.py | 2 +- pyproject.toml | 4 +- test/api/test_api_phono3py.py | 10 +- test/conftest.py | 3 +- ...> phono3py_params_MgO-222rd-444rd.yaml.xz} | Bin 10 files changed, 399 insertions(+), 231 deletions(-) rename test/{phono3py_params_MgO-222rd-444fd.yaml.xz => phono3py_params_MgO-222rd-444rd.yaml.xz} (100%) diff --git a/phono3py/api_phono3py.py b/phono3py/api_phono3py.py index e758b027..2b14b669 100644 --- a/phono3py/api_phono3py.py +++ b/phono3py/api_phono3py.py @@ -40,7 +40,6 @@ from typing import Literal, Optional, Union import numpy as np -from phonopy import Phonopy from phonopy.exception import ForceCalculatorRequiredError from phonopy.harmonic.displacement import ( directions_to_displacement_dataset, @@ -56,7 +55,13 @@ symmetrize_force_constants, ) from phonopy.interface.fc_calculator import get_fc2 -from phonopy.interface.pypolymlp import PypolymlpParams +from phonopy.interface.pypolymlp import ( + PypolymlpData, + PypolymlpParams, + develop_polymlp, + evalulate_polymlp, + parse_mlp_params, +) from phonopy.structure.atoms import PhonopyAtoms from phonopy.structure.cells import ( Primitive, @@ -295,8 +300,9 @@ def __init__( self._fc2 = None self._fc3 = None - # MLP container - self._mlp_phonopy = None + # MLP + self._mlp = None + self._mlp_dataset = None # Setup interaction self._interaction = None @@ -681,6 +687,35 @@ def phonon_dataset(self, dataset): self._phonon_supercells_with_displacements = None + @property + def mlp_dataset(self) -> Optional[dict]: + """Return displacement-force dataset. + + The supercell matrix is equal to that of usual displacement-force + dataset. Only type 2 format is supported. "displacements", + "forces", and "supercell_energies" should be contained. + + """ + return self._mlp_dataset + + @mlp_dataset.setter + def mlp_dataset(self, mlp_dataset: dict): + if not isinstance(mlp_dataset, dict): + raise TypeError("mlp_dataset has to be a dictionary.") + if "displacements" not in mlp_dataset: + raise RuntimeError("Displacements have to be given.") + if "forces" not in mlp_dataset: + raise RuntimeError("Forces have to be given.") + if "supercell_energy" in mlp_dataset: + raise RuntimeError("Supercell energies have to be given.") + if len(mlp_dataset["displacements"]) != len(mlp_dataset["forces"]): + raise RuntimeError("Length of displacements and forces are different.") + if len(mlp_dataset["displacements"]) != len(mlp_dataset["supercell_energies"]): + raise RuntimeError( + "Length of displacements and supercell_energies are different." + ) + self._mlp_dataset = mlp_dataset + @property def band_indices(self) -> list[np.ndarray]: """Setter and getter of band indices. @@ -811,7 +846,7 @@ def displacements(self): for disp1 in dataset["first_atoms"]: num_scells += len(disp1["second_atoms"]) displacements = np.zeros( - (num_scells, self._supercell.get_number_of_atoms(), 3), + (num_scells, len(self._supercell), 3), dtype="double", order="C", ) @@ -990,30 +1025,6 @@ def phonon_supercell_energies(self): def phonon_supercell_energies(self, values): self._set_phonon_forces_energies(values, target="supercell_energies") - @property - def mlp_dataset(self) -> Optional[dict]: - """Return displacement-force dataset. - - The supercell matrix is equal to that of usual displacement-force - dataset. Only type 2 format is supported. "displacements", - "forces", and "supercell_energies" should be contained. - - """ - if self._mlp_phonopy is None: - return None - return self._mlp_phonopy.mlp_dataset - - @mlp_dataset.setter - def mlp_dataset(self, mlp_dataset: dict): - if self._mlp_phonopy is None: - self._mlp_phonopy = Phonopy( - self._unitcell, - supercell_matrix=self._supercell_matrix, - symprec=self._symprec, - log_level=self._log_level, - ) - self._mlp_phonopy.mlp_dataset = mlp_dataset - @property def phph_interaction(self): """Return Interaction instance.""" @@ -1385,53 +1396,31 @@ def produce_fc3( symmetrize_fc3r: bool = False, is_compact_fc: bool = False, fc_calculator: Optional[str] = None, - fc_calculator_options: Optional[str] = None, - use_pypolymlp: bool = False, - mlp_params: Optional[Union[PypolymlpParams, dict]] = None, + fc_calculator_options: Optional[Union[str, dict]] = None, ): """Calculate fc3 from displacements and forces. Parameters ---------- - symmetrize_fc3r : bool + symmetrize_fc3r : bool, optional Only for type 1 displacement_dataset, translational and permutation symmetries are applied after creating fc3. This symmetrization is not very sophisticated and can break space group symmetry, but often useful. If better symmetrization is expected, it is recommended to use external force constants calculator such as ALM. Default is False. - is_compact_fc : bool + is_compact_fc : bool, optional fc3 shape is False: (supercell, supercell, supecell, 3, 3, 3) True: (primitive, supercell, supecell, 3, 3, 3) where 'supercell' and 'primitive' indicate number of atoms in these cells. Default is False. - fc_calculator : str or None + fc_calculator : str, optional Force constants calculator given by str. - fc_calculator_options : dict + fc_calculator_options : dict or str, optional Options for external force constants calculator. - use_pypolymlp : bool - Use MLP of pypolymlp to calculate fc3. Default is False. mlp_dataset - has to be set before calling this method. - mlp_params : PypolymlpParams or dict, optional - Parameters for developing MLP. Default is None. When dict is given, - PypolymlpParams instance is created from the dict. """ - if use_pypolymlp: - if self._mlp_phonopy is None: - msg = "mlp_dataset has to be set before calling this method." - raise RuntimeError(msg) - if self._dataset is None or "displacements" not in self._dataset: - raise RuntimeError( - "Type 2 displacements are not set. Run generate_displacements." - ) - self._mlp_phonopy.develop_mlp(params=mlp_params) - self._mlp_phonopy.displacements = self._dataset["displacements"] - self._mlp_phonopy.evaluate_mlp() - self._dataset["forces"] = self._mlp_phonopy.forces - self._dataset["supercell_energies"] = self._mlp_phonopy.supercell_energies - fc3_calculator, fc3_calculator_options = self._extract_fc2_fc3_calculators( fc_calculator, fc_calculator_options, 3 ) @@ -2172,6 +2161,65 @@ def save(self, filename="phono3py_params.yaml", settings=None): with open(filename, "w") as w: w.write(str(ph3py_yaml)) + def develop_mlp(self, params: Optional[Union[PypolymlpParams, dict, str]] = None): + """Develop MLP of pypolymlp. + + Parameters + ---------- + params : PypolymlpParams or dict, optional + Parameters for developing MLP. Default is None. When dict is given, + PypolymlpParams instance is created from the dict. + + """ + if self._mlp_dataset is None: + raise RuntimeError("MLP dataset is not set.") + + if params is not None: + _params = parse_mlp_params(params) + + disps = self._mlp_dataset["displacements"] + forces = self._mlp_dataset["forces"] + energies = self._mlp_dataset["supercell_energies"] + n = int(len(disps) * 0.9) + train_data = PypolymlpData( + displacements=disps[:n], forces=forces[:n], supercell_energies=energies[:n] + ) + test_data = PypolymlpData( + displacements=disps[n:], forces=forces[n:], supercell_energies=energies[n:] + ) + self._mlp = develop_polymlp( + self._supercell, + train_data, + test_data, + params=_params, + verbose=self._log_level - 1 > 0, + ) + + def evaluate_mlp(self): + """Evaluate the machine learning potential of pypolymlp. + + This method calculates the supercell energies and forces from the MLP + for the displacements in self._dataset of type 2. The results are stored + in self._dataset. + + The displacements may be generated by the produce_force_constants method + with number_of_snapshots > 0. With MLP, a small distance parameter, such + as 0.001, can be numerically stable for the computation of force + constants. + + """ + if self._mlp is None: + raise RuntimeError("MLP is not developed yet.") + + if self.supercells_with_displacements is None: + raise RuntimeError("Displacements are not set. Run generate_displacements.") + + energies, forces, _ = evalulate_polymlp( + self._mlp, self.supercells_with_displacements + ) + self.supercell_energies = energies + self.forces = forces + ################### # private methods # ################### @@ -2252,32 +2300,44 @@ def _build_phonon_primitive_cell(self): raise RuntimeError def _build_phonon_supercells_with_displacements( - self, supercell: PhonopyAtoms, displacement_dataset + self, supercell: PhonopyAtoms, dataset ): supercells = [] + positions = supercell.positions magmoms = supercell.magnetic_moments masses = supercell.masses numbers = supercell.numbers lattice = supercell.cell - for disp1 in displacement_dataset["first_atoms"]: - disp_cart1 = disp1["displacement"] - positions = supercell.positions - positions[disp1["number"]] += disp_cart1 - supercells.append( - PhonopyAtoms( - numbers=numbers, - masses=masses, - magnetic_moments=magmoms, - positions=positions, - cell=lattice, + if "displacements" in dataset: + for disp in dataset["displacements"]: + supercells.append( + PhonopyAtoms( + numbers=numbers, + masses=masses, + magnetic_moments=magmoms, + positions=positions + disp, + cell=lattice, + ) + ) + else: + for disp1 in dataset["first_atoms"]: + disp_cart1 = disp1["displacement"] + positions = supercell.positions + positions[disp1["number"]] += disp_cart1 + supercells.append( + PhonopyAtoms( + numbers=numbers, + masses=masses, + magnetic_moments=magmoms, + positions=positions, + cell=lattice, + ) ) - ) return supercells def _build_supercells_with_displacements(self): - supercells = [] magmoms = self._supercell.magnetic_moments masses = self._supercell.masses numbers = self._supercell.numbers @@ -2287,28 +2347,29 @@ def _build_supercells_with_displacements(self): self._supercell, self._dataset ) - for disp1 in self._dataset["first_atoms"]: - disp_cart1 = disp1["displacement"] - for disp2 in disp1["second_atoms"]: - if "included" in disp2: - included = disp2["included"] - else: - included = True - if included: - positions = self._supercell.positions - positions[disp1["number"]] += disp_cart1 - positions[disp2["number"]] += disp2["displacement"] - supercells.append( - PhonopyAtoms( - numbers=numbers, - masses=masses, - magnetic_moments=magmoms, - positions=positions, - cell=lattice, + if "first_atoms" in self._dataset: + for disp1 in self._dataset["first_atoms"]: + disp_cart1 = disp1["displacement"] + for disp2 in disp1["second_atoms"]: + if "included" in disp2: + included = disp2["included"] + else: + included = True + if included: + positions = self._supercell.positions + positions[disp1["number"]] += disp_cart1 + positions[disp2["number"]] += disp2["displacement"] + supercells.append( + PhonopyAtoms( + numbers=numbers, + masses=masses, + magnetic_moments=magmoms, + positions=positions, + cell=lattice, + ) ) - ) - else: - supercells.append(None) + else: + supercells.append(None) self._supercells_with_displacements = supercells diff --git a/phono3py/cui/create_force_constants.py b/phono3py/cui/create_force_constants.py index d3bae975..64e75bd8 100644 --- a/phono3py/cui/create_force_constants.py +++ b/phono3py/cui/create_force_constants.py @@ -40,7 +40,8 @@ import os import pathlib import sys -from typing import Optional +from dataclasses import asdict +from typing import Optional, Union import numpy as np from phonopy.cui.phonopy_script import file_exists, print_error @@ -52,6 +53,7 @@ ) from phonopy.interface.calculator import get_default_physical_units from phonopy.interface.fc_calculator import fc_calculator_names +from phonopy.interface.pypolymlp import PypolymlpParams, parse_mlp_params from phono3py import Phono3py from phono3py.cui.show_log import show_phono3py_force_constants_settings @@ -122,6 +124,11 @@ def create_phono3py_force_constants( settings.cutoff_pair_distance, fc_calculator, fc_calculator_options, + settings.use_pypolymlp, + settings.mlp_params, + settings.displacement_distance, + settings.random_displacements, + settings.random_seed, log_level, ) @@ -249,7 +256,7 @@ def parse_forces( # Try to read FORCES_FC* if type-2 and return dataset. # None is returned unless type-2. # can emit FileNotFoundError. - if dataset is None or dataset is not None and not forces_in_dataset(dataset): + if dataset is None or (dataset is not None and not forces_in_dataset(dataset)): _dataset = read_type2_dataset( natom, filename=force_filename, log_level=log_level ) @@ -321,8 +328,10 @@ def forces_in_dataset(dataset: dict) -> bool: ) -def displacements_in_dataset(dataset: dict) -> bool: +def displacements_in_dataset(dataset: Optional[dict]) -> bool: """Return whether displacements in dataset or not.""" + if dataset is None: + return False return "displacements" in dataset or "first_atoms" in dataset @@ -443,6 +452,11 @@ def _create_phono3py_fc3( cutoff_pair_distance: Optional[float], fc_calculator: Optional[str], fc_calculator_options: Optional[str], + use_pypoymplp: bool, + mlp_params: Union[str, dict, PypolymlpParams], + displacement_distance: Optional[float], + number_of_snapshots: Optional[int], + random_seed: Optional[int], log_level: int, ): """Read or calculate fc3. @@ -481,7 +495,18 @@ def _create_phono3py_fc3( # from _get_type2_dataset file_exists(e.filename, log_level) - phono3py.dataset = dataset + if use_pypoymplp: + phono3py.mlp_dataset = dataset + run_pypolymlp_to_compute_forces( + phono3py, + mlp_params=mlp_params, + displacement_distance=displacement_distance, + number_of_snapshots=number_of_snapshots, + random_seed=random_seed, + log_level=log_level, + ) + else: + phono3py.dataset = dataset phono3py.produce_fc3( symmetrize_fc3r=symmetrize_fc3r, is_compact_fc=is_compact_fc, @@ -490,6 +515,68 @@ def _create_phono3py_fc3( ) +def run_pypolymlp_to_compute_forces( + ph3py: Phono3py, + mlp_params: Union[str, dict, PypolymlpParams], + displacement_distance: float, + number_of_snapshots: int, + random_seed: int, + log_level: int, +): + """Run pypolymlp to compute forces.""" + if displacement_distance is None: + _displacement_distance = 0.001 + else: + _displacement_distance = displacement_distance + + if log_level: + print("-" * 29 + " pypolymlp start " + "-" * 30) + print("MLP parameters:") + if mlp_params: + for k, v in asdict(parse_mlp_params(mlp_params)).items(): + if v is not None: + print(f" {k}: {v}") + + if log_level: + if number_of_snapshots: + print("Generate random displacements") + print( + " Twice of number of snapshots will be generated " + "for plus-minus displacements." + ) + else: + print("Generate displacements") + print( + f" displacement distance: {_displacement_distance:.5f}".rstrip("0").rstrip( + "." + ) + ) + ph3py.generate_displacements( + distance=_displacement_distance, + is_plusminus=True, + number_of_snapshots=number_of_snapshots, + random_seed=random_seed, + ) + + if log_level: + print( + " Number of supercells for computing forces: " + f"{ph3py.displacements.shape[0]}", + flush=True, + ) + + if ph3py.mlp_dataset is None: + msg = "mlp_dataset has to be set before calling this method." + raise RuntimeError(msg) + if ph3py.supercells_with_displacements is None: + raise RuntimeError("Displacements are not set. Run generate_displacements.") + ph3py.develop_mlp(params=mlp_params) + ph3py.evaluate_mlp() + + if log_level: + print("-" * 30 + " pypolymlp end " + "-" * 31, flush=True) + + def _create_phono3py_fc2( phono3py: Phono3py, ph3py_yaml: Optional[Phono3pyYaml], diff --git a/phono3py/cui/load.py b/phono3py/cui/load.py index e51ec844..a768a6c6 100644 --- a/phono3py/cui/load.py +++ b/phono3py/cui/load.py @@ -49,10 +49,9 @@ from phono3py import Phono3py from phono3py.cui.create_force_constants import ( - displacements_in_dataset, forces_in_dataset, parse_forces, - read_type2_dataset, + run_pypolymlp_to_compute_forces, ) from phono3py.file_IO import read_fc2_from_hdf5, read_fc3_from_hdf5 from phono3py.interface.phono3py_yaml import Phono3pyYaml @@ -86,6 +85,8 @@ def load( symmetrize_fc: bool = True, is_mesh_symmetry: bool = True, is_compact_fc: bool = False, + use_pypolymlp: bool = False, + mlp_params: Optional[dict] = None, use_grg: bool = False, make_r0_average: bool = True, symprec: float = 1e-5, @@ -236,6 +237,10 @@ def load( True: (primitive, supecell, 3, 3) False: (supercell, supecell, 3, 3) where 'supercell' and 'primitive' indicate number of atoms in these cells. Default is False. + use_pypolymlp : bool, optional + Use pypolymlp for generating force constants. Default is False. + mlp_params : dict, optional + A set of parameters used by machine learning potentials. use_grg : bool, optional Use generalized regular grid when True. Default is False. make_r0_average : bool, optional @@ -337,6 +342,7 @@ def load( forces_fc3_filename=forces_fc3_filename, forces_fc2_filename=forces_fc2_filename, phono3py_yaml_filename=phono3py_yaml, + use_pypolymlp=use_pypolymlp, log_level=log_level, ) @@ -348,6 +354,8 @@ def load( fc_calculator_options=fc_calculator_options, symmetrize_fc=symmetrize_fc, is_compact_fc=is_compact_fc, + use_pypolymlp=use_pypolymlp, + mlp_params=mlp_params, log_level=log_level, ) @@ -370,6 +378,7 @@ def set_dataset_and_force_constants( forces_fc2_filename: Optional[Union[os.PathLike, Sequence]] = None, phono3py_yaml_filename: Optional[os.PathLike] = None, cutoff_pair_distance: Optional[float] = None, + use_pypolymlp: bool = False, log_level: int = 0, ) -> dict: """Set displacements, forces, and create force constants. @@ -387,7 +396,7 @@ def set_dataset_and_force_constants( """ read_fc = {"fc2": False, "fc3": False} - read_fc["fc3"] = _set_dataset_or_fc3( + read_fc["fc3"], dataset = _get_dataset_or_fc3( ph3py, ph3py_yaml=ph3py_yaml, fc3_filename=fc3_filename, @@ -396,20 +405,20 @@ def set_dataset_and_force_constants( cutoff_pair_distance=cutoff_pair_distance, log_level=log_level, ) - read_fc["fc2"] = _set_dataset_phonon_dataset_or_fc2( + if not read_fc["fc3"]: + if use_pypolymlp: + ph3py.mlp_dataset = dataset + else: + ph3py.dataset = dataset + read_fc["fc2"], phonon_dataset = _get_dataset_phonon_dataset_or_fc2( ph3py, ph3py_yaml=ph3py_yaml, fc2_filename=fc2_filename, forces_fc2_filename=forces_fc2_filename, log_level=log_level, ) - - # Cases that dataset is in phono3py.yaml but not forces. - if ph3py.dataset is None: - if ph3py_yaml is not None and ph3py_yaml.dataset is not None: - ph3py.dataset = ph3py_yaml.dataset - if ph3py_yaml is not None and ph3py_yaml.phonon_dataset is not None: - ph3py.phonon_dataset = ph3py_yaml.phonon_dataset + if not read_fc["fc2"]: + ph3py.phonon_dataset = phonon_dataset return read_fc @@ -418,9 +427,14 @@ def compute_force_constants_from_datasets( ph3py: Phono3py, read_fc: dict, fc_calculator: Optional[str] = None, - fc_calculator_options: Optional[dict] = None, + fc_calculator_options: Optional[Union[dict, str]] = None, symmetrize_fc: bool = True, is_compact_fc: bool = True, + use_pypolymlp: bool = False, + mlp_params: Optional[Union[dict, str]] = None, + displacement_distance: Optional[float] = None, + number_of_snapshots: Optional[int] = None, + random_seed: Optional[int] = None, log_level: int = 0, ): """Compute force constants from datasets. @@ -435,15 +449,27 @@ def compute_force_constants_from_datasets( fc2 : bool """ - if not read_fc["fc3"] and ph3py.dataset: - ph3py.produce_fc3( - symmetrize_fc3r=symmetrize_fc, - is_compact_fc=is_compact_fc, - fc_calculator=fc_calculator, - fc_calculator_options=fc_calculator_options, - ) - if log_level and symmetrize_fc and fc_calculator is None: - print("fc3 was symmetrized.") + if not read_fc["fc3"]: + if ph3py.dataset or ph3py.mlp_dataset: + if ph3py.mlp_dataset and use_pypolymlp: + run_pypolymlp_to_compute_forces( + ph3py, + mlp_params=mlp_params, + displacement_distance=displacement_distance, + number_of_snapshots=number_of_snapshots, + random_seed=random_seed, + log_level=log_level, + ) + + ph3py.produce_fc3( + symmetrize_fc3r=symmetrize_fc, + is_compact_fc=is_compact_fc, + fc_calculator=fc_calculator, + fc_calculator_options=fc_calculator_options, + ) + + if log_level and symmetrize_fc and fc_calculator is None: + print("fc3 was symmetrized.") if not read_fc["fc2"] and (ph3py.dataset or ph3py.phonon_dataset): if ( @@ -467,7 +493,7 @@ def compute_force_constants_from_datasets( print("fc2 was symmetrized.") -def _set_dataset_or_fc3( +def _get_dataset_or_fc3( ph3py: Phono3py, ph3py_yaml: Optional[Phono3pyYaml] = None, fc3_filename: Optional[os.PathLike] = None, @@ -475,19 +501,40 @@ def _set_dataset_or_fc3( phono3py_yaml_filename: Optional[os.PathLike] = None, cutoff_pair_distance: Optional[float] = None, log_level: int = 0, -) -> bool: +) -> tuple[bool, dict]: p2s_map = ph3py.primitive.p2s_map read_fc3 = False - if fc3_filename is not None: - fc3 = read_fc3_from_hdf5(filename=fc3_filename, p2s_map=p2s_map) - _check_fc3_shape(ph3py, fc3, filename=fc3_filename) + dataset = None + if fc3_filename is not None or pathlib.Path("fc3.hdf5").exists(): + if fc3_filename is None: + _fc3_filename = "fc3.hdf5" + else: + _fc3_filename = fc3_filename + fc3 = read_fc3_from_hdf5(filename=_fc3_filename, p2s_map=p2s_map) + _check_fc3_shape(ph3py, fc3, filename=_fc3_filename) ph3py.fc3 = fc3 read_fc3 = True if log_level: - print('fc3 was read from "%s".' % fc3_filename) - elif forces_fc3_filename is not None: - force_filename = forces_fc3_filename - _set_dataset_for_fc3( + print(f'fc3 was read from "{_fc3_filename}".') + elif ( + ph3py_yaml is not None + and ph3py_yaml.dataset is not None + and forces_in_dataset(ph3py_yaml.dataset) + ): + dataset = _get_dataset_for_fc3( + ph3py, + ph3py_yaml, + None, + phono3py_yaml_filename, + cutoff_pair_distance, + log_level, + ) + elif forces_fc3_filename is not None or pathlib.Path("FORCES_FC3").exists(): + if forces_fc3_filename is None: + force_filename = "FORCES_FC3" + else: + force_filename = forces_fc3_filename + dataset = _get_dataset_for_fc3( ph3py, ph3py_yaml, force_filename, @@ -495,90 +542,39 @@ def _set_dataset_or_fc3( cutoff_pair_distance, log_level, ) - elif pathlib.Path("fc3.hdf5").exists(): - fc3 = read_fc3_from_hdf5(filename="fc3.hdf5", p2s_map=p2s_map) - _check_fc3_shape(ph3py, fc3) - ph3py.fc3 = fc3 - read_fc3 = True - if log_level: - print('fc3 was read from "fc3.hdf5".') - 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 + if not forces_in_dataset(dataset): + dataset = None + return read_fc3, dataset -def _set_dataset_phonon_dataset_or_fc2( + +def _get_dataset_phonon_dataset_or_fc2( ph3py: Phono3py, ph3py_yaml: Optional[Phono3pyYaml] = None, fc2_filename: Optional[os.PathLike] = None, forces_fc2_filename: Optional[Union[os.PathLike, Sequence]] = None, log_level: int = 0, -) -> bool: +) -> tuple[bool, dict, dict]: phonon_p2s_map = ph3py.phonon_primitive.p2s_map read_fc2 = False - if fc2_filename is not None: - fc2 = read_fc2_from_hdf5(filename=fc2_filename, p2s_map=phonon_p2s_map) - _check_fc2_shape(ph3py, fc2, filename=fc2_filename) - ph3py.fc2 = fc2 - read_fc2 = True - if log_level: - print('fc2 was read from "%s".' % fc2_filename) - elif forces_fc2_filename is not None: - force_filename = forces_fc2_filename - _set_dataset_for_fc2( - ph3py, - ph3py_yaml, - force_filename, - "phonon_fc2", - log_level, - ) - elif pathlib.Path("fc2.hdf5").exists(): - fc2 = read_fc2_from_hdf5(filename="fc2.hdf5", p2s_map=phonon_p2s_map) - _check_fc2_shape(ph3py, fc2) + phonon_dataset = None + if fc2_filename is not None or pathlib.Path("fc2.hdf5").exists(): + if fc2_filename is None: + _fc2_filename = "fc2.hdf5" + else: + _fc2_filename = fc2_filename + fc2 = read_fc2_from_hdf5(filename=_fc2_filename, p2s_map=phonon_p2s_map) + _check_fc2_shape(ph3py, fc2, filename=_fc2_filename) ph3py.fc2 = fc2 read_fc2 = True if log_level: - print('fc2 was read from "fc2.hdf5".') - elif ( - pathlib.Path("FORCES_FC2").exists() - and ph3py.phonon_supercell_matrix is not None - ): - _set_dataset_for_fc2( - ph3py, - ph3py_yaml, - "FORCES_FC2", - "phonon_fc2", - log_level, - ) + print(f'fc2 was read from "{fc2_filename}".') elif ( ph3py_yaml is not None and ph3py_yaml.phonon_dataset is not None and forces_in_dataset(ph3py_yaml.phonon_dataset) ): - _set_dataset_for_fc2( + phonon_dataset = _get_dataset_for_fc2( ph3py, ph3py_yaml, None, @@ -586,41 +582,34 @@ def _set_dataset_phonon_dataset_or_fc2( 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_fc2( - ph3py, - ph3py_yaml, - None, - "fc2", - log_level, - ) - elif ( - pathlib.Path("FORCES_FC3").exists() - and ph3py.phonon_supercell_matrix is not None - ): - # suppose fc3.hdf5 is read but fc2.hdf5 doesn't exist. - _set_dataset_for_fc2( + forces_fc2_filename is not None or pathlib.Path("FORCES_FC2").exists() + ) and ph3py.phonon_supercell_matrix: + if forces_fc2_filename is None: + force_filename = forces_fc2_filename + else: + force_filename = forces_fc2_filename + phonon_dataset = _get_dataset_for_fc2( ph3py, ph3py_yaml, - "FORCES_FC3", - "fc2", + force_filename, + "phonon_fc2", log_level, ) - return read_fc2 + if not forces_in_dataset(phonon_dataset): + phonon_dataset = None + + return read_fc2, phonon_dataset -def _set_dataset_for_fc3( +def _get_dataset_for_fc3( ph3py: Phono3py, ph3py_yaml: Optional[Phono3pyYaml], force_filename, phono3py_yaml_filename, cutoff_pair_distance, log_level, -): - ph3py.dataset = parse_forces( +) -> dict: + dataset = parse_forces( ph3py, ph3py_yaml=ph3py_yaml, cutoff_pair_distance=cutoff_pair_distance, @@ -629,9 +618,10 @@ def _set_dataset_for_fc3( fc_type="fc3", log_level=log_level, ) + return dataset -def _set_dataset_for_fc2( +def _get_dataset_for_fc2( ph3py: Phono3py, ph3py_yaml: Optional[Phono3pyYaml], force_filename, @@ -645,10 +635,7 @@ def _set_dataset_for_fc2( fc_type=fc_type, log_level=log_level, ) - if fc_type == "phonon_fc2": - ph3py.phonon_dataset = dataset - else: - ph3py.dataset = dataset + return dataset def _check_fc2_shape(ph3py: Phono3py, fc2, filename="fc2.hdf5"): diff --git a/phono3py/cui/phono3py_argparse.py b/phono3py/cui/phono3py_argparse.py index 48bf9820..6c51cb8b 100644 --- a/phono3py/cui/phono3py_argparse.py +++ b/phono3py/cui/phono3py_argparse.py @@ -471,6 +471,15 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False): parser.add_argument( "--mesh", nargs="+", dest="mesh_numbers", default=None, help="Mesh numbers" ) + parser.add_argument( + "--mlp-params", + dest="mlp_params", + default=None, + help=( + "Parameters for machine learning potentials as comma separated " + "string with the style of key = values" + ), + ) parser.add_argument( "--mv", "--mass-variances", @@ -622,7 +631,7 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False): "--pypolymlp", dest="use_pypolymlp", action="store_true", - default=None, + default=False, help="Use pypolymlp and symfc for generating force constants", ) parser.add_argument( @@ -647,6 +656,21 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False): default=False, help="Print out smallest information", ) + parser.add_argument( + "--random-seed", + dest="random_seed", + type=int, + default=None, + help="Random seed by a 32 bit unsigned integer", + ) + parser.add_argument( + "--rd", + "--random-displacements", + dest="random_displacements", + type=int, + default=None, + help="Number of supercells with random displacements", + ) parser.add_argument( "--read-collision", dest="read_collision", diff --git a/phono3py/cui/phono3py_script.py b/phono3py/cui/phono3py_script.py index 4cbacee1..2fda8b0c 100644 --- a/phono3py/cui/phono3py_script.py +++ b/phono3py/cui/phono3py_script.py @@ -528,6 +528,7 @@ def store_force_constants( ph3py_yaml=ph3py_yaml, phono3py_yaml_filename=phono3py_yaml_filename, cutoff_pair_distance=settings.cutoff_pair_distance, + use_pypolymlp=settings.use_pypolymlp, log_level=log_level, ) try: @@ -538,6 +539,11 @@ def store_force_constants( fc_calculator_options=fc_calculator_options, symmetrize_fc=settings.fc_symmetry, is_compact_fc=settings.is_compact_fc, + use_pypolymlp=settings.use_pypolymlp, + mlp_params=settings.mlp_params, + displacement_distance=settings.displacement_distance, + number_of_snapshots=settings.random_displacements, + random_seed=settings.random_seed, log_level=log_level, ) except ForceCalculatorRequiredError: @@ -605,8 +611,8 @@ def _show_fc_calculator_not_found(log_level): 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." + "An external force calculator, e.g., symfc (--symfc_ or ALM (--alm), " + "has to be used to compute force constants." ) print_error() sys.exit(1) diff --git a/phono3py/cui/show_log.py b/phono3py/cui/show_log.py index 2ef4f1ba..bc731832 100644 --- a/phono3py/cui/show_log.py +++ b/phono3py/cui/show_log.py @@ -107,7 +107,7 @@ def show_phono3py_cells(phono3py: Phono3py): print_cell(phonon_primitive) print("-" * 21 + " supercell for harmonic phonon " + "-" * 22) print_cell(phonon_supercell, mapping=phonon_primitive.s2p_map) - print("-" * 76) + print("-" * 76, flush=True) def show_phono3py_force_constants_settings(settings: Phono3pySettings): diff --git a/pyproject.toml b/pyproject.toml index 1827bc6e..52340c86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,14 +3,14 @@ requires = ["setuptools", "wheel", "numpy"] [tool.ruff] line-length = 88 -select = [ +lint.select = [ "F", # Flake8 "B", # Black "I", # isort "E", # pycodestyle-errors "D", # pydocstyle ] -extend-ignore = [ +lint.extend-ignore = [ "D417", "D100", ] diff --git a/test/api/test_api_phono3py.py b/test/api/test_api_phono3py.py index 35a1b2fb..23ad9471 100644 --- a/test/api/test_api_phono3py.py +++ b/test/api/test_api_phono3py.py @@ -170,7 +170,7 @@ def test_type2_forces_energies_setter_Si(si_111_222_rd: Phono3py): np.testing.assert_allclose(ph3_in.phonon_forces + 1, ph3.phonon_forces) -def test_use_pypolymlp_mgs(mgo_222rd_444rd: Phono3py): +def test_use_pypolymlp_mgo(mgo_222rd_444rd: Phono3py): """Test use_pypolymlp in produce_fc3.""" pytest.importorskip("pypolymlp") @@ -193,12 +193,16 @@ def test_use_pypolymlp_mgs(mgo_222rd_444rd: Phono3py): atom_energies = {"Mg": -0.00896717, "O": -0.95743902} params = PypolymlpParams(gtinv_maxl=(4, 4), atom_energies=atom_energies) - ph3.produce_fc3(use_pypolymlp=True, mlp_params=params, fc_calculator="symfc") + + ph3.generate_displacements(distance=0.001, is_plusminus=True) + ph3.develop_mlp(params=params) + ph3.evaluate_mlp() + ph3.produce_fc3(fc_calculator="symfc") ph3.produce_fc2(fc_calculator="symfc") ph3.mesh_numbers = 30 ph3.init_phph_interaction() ph3.run_thermal_conductivity(temperatures=[300]) assert ( - pytest.approx(63.6001137, abs=1e-3) == ph3.thermal_conductivity.kappa[0, 0, 0] + pytest.approx(63.0018546, abs=1e-3) == ph3.thermal_conductivity.kappa[0, 0, 0] ) diff --git a/test/conftest.py b/test/conftest.py index 91fda478..61c2408d 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -415,7 +415,6 @@ def nacl_pbe_cutoff_fc3(request) -> Phono3py: count += 1 ph3.dataset = dataset ph3.produce_fc3() - # ph3.produce_fc3(symmetrize_fc3r=True) return ph3 @@ -504,7 +503,7 @@ def mgo_222rd_444rd() -> Phono3py: 4 and 400 supercells for fc2 and fc3, respectively. """ - yaml_filename = cwd / "phono3py_params_MgO-222rd-444fd.yaml.xz" + yaml_filename = cwd / "phono3py_params_MgO-222rd-444rd.yaml.xz" return phono3py.load(yaml_filename, produce_fc=False, log_level=1) diff --git a/test/phono3py_params_MgO-222rd-444fd.yaml.xz b/test/phono3py_params_MgO-222rd-444rd.yaml.xz similarity index 100% rename from test/phono3py_params_MgO-222rd-444fd.yaml.xz rename to test/phono3py_params_MgO-222rd-444rd.yaml.xz From 3d493202c4aff8c38b8307fbb931f828e9eb0a2d Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Fri, 28 Jun 2024 16:09:36 +0900 Subject: [PATCH 08/14] Update pypolymlp feature --- phono3py/api_phono3py.py | 2 ++ phono3py/cui/create_force_constants.py | 36 +++++++++++++++++--------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/phono3py/api_phono3py.py b/phono3py/api_phono3py.py index 2b14b669..4c5635b3 100644 --- a/phono3py/api_phono3py.py +++ b/phono3py/api_phono3py.py @@ -2176,6 +2176,8 @@ def develop_mlp(self, params: Optional[Union[PypolymlpParams, dict, str]] = None if params is not None: _params = parse_mlp_params(params) + else: + _params = params disps = self._mlp_dataset["displacements"] forces = self._mlp_dataset["forces"] diff --git a/phono3py/cui/create_force_constants.py b/phono3py/cui/create_force_constants.py index 64e75bd8..b25f19aa 100644 --- a/phono3py/cui/create_force_constants.py +++ b/phono3py/cui/create_force_constants.py @@ -452,7 +452,7 @@ def _create_phono3py_fc3( cutoff_pair_distance: Optional[float], fc_calculator: Optional[str], fc_calculator_options: Optional[str], - use_pypoymplp: bool, + use_pypolymlp: bool, mlp_params: Union[str, dict, PypolymlpParams], displacement_distance: Optional[float], number_of_snapshots: Optional[int], @@ -495,7 +495,7 @@ def _create_phono3py_fc3( # from _get_type2_dataset file_exists(e.filename, log_level) - if use_pypoymplp: + if use_pypolymlp: phono3py.mlp_dataset = dataset run_pypolymlp_to_compute_forces( phono3py, @@ -524,19 +524,31 @@ def run_pypolymlp_to_compute_forces( log_level: int, ): """Run pypolymlp to compute forces.""" - if displacement_distance is None: - _displacement_distance = 0.001 - else: - _displacement_distance = displacement_distance - if log_level: print("-" * 29 + " pypolymlp start " + "-" * 30) - print("MLP parameters:") + print("Pypolymlp is a generator of polynomial machine learning potentials.") + print("Please cite the paper:") + print("A. Seko, J. Appl. Phys. 133, 011101 (2023).") + print("Pypolymlp is developed at https://github.com/sekocha/pypolymlp.") if mlp_params: + print("Parameters:") for k, v in asdict(parse_mlp_params(mlp_params)).items(): if v is not None: print(f" {k}: {v}") + if log_level > 1: + print("") + if log_level: + print("Developing MLPs by pypolymlp...", flush=True) + + ph3py.develop_mlp(params=mlp_params) + if displacement_distance is None: + _displacement_distance = 0.001 + else: + _displacement_distance = displacement_distance + + if log_level > 1: + print("") if log_level: if number_of_snapshots: print("Generate random displacements") @@ -547,7 +559,7 @@ def run_pypolymlp_to_compute_forces( else: print("Generate displacements") print( - f" displacement distance: {_displacement_distance:.5f}".rstrip("0").rstrip( + f" Displacement distance: {_displacement_distance:.5f}".rstrip("0").rstrip( "." ) ) @@ -561,16 +573,16 @@ def run_pypolymlp_to_compute_forces( if log_level: print( " Number of supercells for computing forces: " - f"{ph3py.displacements.shape[0]}", - flush=True, + f"{ph3py.displacements.shape[0]}" ) + print("Evaluate forces by pypolymlp", flush=True) if ph3py.mlp_dataset is None: msg = "mlp_dataset has to be set before calling this method." raise RuntimeError(msg) if ph3py.supercells_with_displacements is None: raise RuntimeError("Displacements are not set. Run generate_displacements.") - ph3py.develop_mlp(params=mlp_params) + ph3py.evaluate_mlp() if log_level: From a755760c7ce9fc85e632230c461630d7fcf2d301 Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Fri, 28 Jun 2024 19:04:21 +0900 Subject: [PATCH 09/14] Minor update of force constants calculator interface --- phono3py/api_phono3py.py | 55 +++----------------------- phono3py/cui/create_force_constants.py | 16 ++++---- phono3py/cui/load.py | 46 +++++++++++---------- phono3py/interface/fc_calculator.py | 29 +++++++++++++- 4 files changed, 67 insertions(+), 79 deletions(-) diff --git a/phono3py/api_phono3py.py b/phono3py/api_phono3py.py index 4c5635b3..c6190549 100644 --- a/phono3py/api_phono3py.py +++ b/phono3py/api_phono3py.py @@ -1421,19 +1421,15 @@ def produce_fc3( Options for external force constants calculator. """ - fc3_calculator, fc3_calculator_options = self._extract_fc2_fc3_calculators( - fc_calculator, fc_calculator_options, 3 - ) - - if fc3_calculator is not None: + if fc_calculator is not None: disps, forces = get_displacements_and_forces_fc3(self._dataset) fc2, fc3 = get_fc3( self._supercell, self._primitive, disps, forces, - fc_calculator=fc3_calculator, - fc_calculator_options=fc3_calculator_options, + fc_calculator=fc_calculator, + fc_calculator_options=fc_calculator_options, is_compact_fc=is_compact_fc, symmetry=self._symmetry, log_level=self._log_level, @@ -1518,19 +1514,15 @@ def produce_fc2( else: p2s_map = None - fc2_calculator, fc2_calculator_options = self._extract_fc2_fc3_calculators( - fc_calculator, fc_calculator_options, 2 - ) - - if fc2_calculator is not None: + if fc_calculator is not None: disps, forces = get_displacements_and_forces(disp_dataset) self._fc2 = get_fc2( self._phonon_supercell, self._phonon_primitive, disps, forces, - fc_calculator=fc2_calculator, - fc_calculator_options=fc2_calculator_options, + fc_calculator=fc_calculator, + fc_calculator_options=fc_calculator_options, atom_list=p2s_map, symmetry=self._phonon_supercell_symmetry, symprec=self._symprec, @@ -2437,41 +2429,6 @@ def _init_dynamical_matrix(self): print(" But this frequency is forced to be zero.") print("=" * 61) - def _extract_fc2_fc3_calculators(self, fc_calculator, fc_calculator_options, order): - """Extract fc_calculator and fc_calculator_options for fc2 and fc3. - - fc_calculator : str - FC calculator. "|" separates fc2 and fc3. First and last - parts separated correspond to fc2 and fc3 calculators, respectively. - fc_calculator_options : str - FC calculator options. "|" separates fc2 and fc3. First and last - parts separated correspond to fc2 and fc3 options, respectively. - order : int = 2 or 3 - 2 and 3 indicate fc2 and fc3, respectively. - - """ - if fc_calculator is not None: - if "|" in fc_calculator: - _fc_calculator = fc_calculator.split("|")[order - 2] - if _fc_calculator == "": - _fc_calculator = None - else: - _fc_calculator = fc_calculator - else: - _fc_calculator = None - - if fc_calculator_options is not None: - if "|" in fc_calculator_options: - _fc_calculator_options = fc_calculator_options.split("|")[order - 2] - if _fc_calculator_options == "": - _fc_calculator_options = None - else: - _fc_calculator_options = fc_calculator_options - else: - _fc_calculator_options = None - - return _fc_calculator, _fc_calculator_options - def _get_forces_energies( self, target: Literal["forces", "supercell_energies"] ) -> Optional[np.ndarray]: diff --git a/phono3py/cui/create_force_constants.py b/phono3py/cui/create_force_constants.py index b25f19aa..ee40bd8c 100644 --- a/phono3py/cui/create_force_constants.py +++ b/phono3py/cui/create_force_constants.py @@ -66,6 +66,7 @@ write_fc2_to_hdf5, write_fc3_to_hdf5, ) +from phono3py.interface.fc_calculator import extract_fc2_fc3_calculators from phono3py.interface.phono3py_yaml import Phono3pyYaml from phono3py.phonon3.fc3 import ( set_permutation_symmetry_fc3, @@ -510,8 +511,8 @@ def _create_phono3py_fc3( phono3py.produce_fc3( symmetrize_fc3r=symmetrize_fc3r, is_compact_fc=is_compact_fc, - fc_calculator=fc_calculator, - fc_calculator_options=fc_calculator_options, + fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 3), + fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 3), ) @@ -527,8 +528,7 @@ def run_pypolymlp_to_compute_forces( if log_level: print("-" * 29 + " pypolymlp start " + "-" * 30) print("Pypolymlp is a generator of polynomial machine learning potentials.") - print("Please cite the paper:") - print("A. Seko, J. Appl. Phys. 133, 011101 (2023).") + print("Please cite the paper: A. Seko, J. Appl. Phys. 133, 011101 (2023).") print("Pypolymlp is developed at https://github.com/sekocha/pypolymlp.") if mlp_params: print("Parameters:") @@ -620,8 +620,8 @@ def _create_phono3py_fc2( phono3py.produce_fc2( symmetrize_fc2=symmetrize_fc2, is_compact_fc=is_compact_fc, - fc_calculator=fc_calculator, - fc_calculator_options=fc_calculator_options, + fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 2), + fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 2), ) @@ -664,8 +664,8 @@ def _create_phono3py_phonon_fc2( phono3py.produce_fc2( symmetrize_fc2=symmetrize_fc2, is_compact_fc=is_compact_fc, - fc_calculator=fc_calculator, - fc_calculator_options=fc_calculator_options, + fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 2), + fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 2), ) diff --git a/phono3py/cui/load.py b/phono3py/cui/load.py index a768a6c6..238cfa31 100644 --- a/phono3py/cui/load.py +++ b/phono3py/cui/load.py @@ -54,6 +54,7 @@ run_pypolymlp_to_compute_forces, ) from phono3py.file_IO import read_fc2_from_hdf5, read_fc3_from_hdf5 +from phono3py.interface.fc_calculator import extract_fc2_fc3_calculators from phono3py.interface.phono3py_yaml import Phono3pyYaml from phono3py.phonon3.fc3 import show_drift_fc3 @@ -464,33 +465,36 @@ def compute_force_constants_from_datasets( ph3py.produce_fc3( symmetrize_fc3r=symmetrize_fc, is_compact_fc=is_compact_fc, - fc_calculator=fc_calculator, - fc_calculator_options=fc_calculator_options, + fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 3), + fc_calculator_options=extract_fc2_fc3_calculators( + fc_calculator_options, 3 + ), ) if log_level and symmetrize_fc and fc_calculator is None: print("fc3 was symmetrized.") if not read_fc["fc2"] and (ph3py.dataset or ph3py.phonon_dataset): - if ( - ph3py.phonon_supercell_matrix is None - and fc_calculator in ("alm", "symfc") - and ph3py.fc2 is not None - ): - if log_level: - if fc_calculator == "alm": - print("fc2 that was fit simultaneously with fc3 by ALM is used.") - elif fc_calculator == "symfc": - print("fc2 that was fit simultaneously with fc3 by symfc is used.") - else: - ph3py.produce_fc2( - symmetrize_fc2=symmetrize_fc, - is_compact_fc=is_compact_fc, - fc_calculator=fc_calculator, - fc_calculator_options=fc_calculator_options, - ) - if log_level and symmetrize_fc: - print("fc2 was symmetrized.") + # if ( + # ph3py.phonon_supercell_matrix is None + # and fc_calculator in ("alm", "symfc") + # and ph3py.fc2 is not None + # ): + # if log_level: + # if fc_calculator == "alm": + # print("fc2 that was fit simultaneously with fc3 by ALM is used.") + # elif fc_calculator == "symfc": + # print( + # "fc2 that was fit simultaneously with fc3 by symfc is used.") + # else: + ph3py.produce_fc2( + symmetrize_fc2=symmetrize_fc, + is_compact_fc=is_compact_fc, + fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 2), + fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 2), + ) + if log_level and symmetrize_fc and fc_calculator is None: + print("fc2 was symmetrized.") def _get_dataset_or_fc3( diff --git a/phono3py/interface/fc_calculator.py b/phono3py/interface/fc_calculator.py index 62b5bd01..ecdbc2b7 100644 --- a/phono3py/interface/fc_calculator.py +++ b/phono3py/interface/fc_calculator.py @@ -36,7 +36,7 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, Union import numpy as np from phonopy.structure.atoms import PhonopyAtoms @@ -118,8 +118,35 @@ def get_fc3( orders=[2, 3], is_compact_fc=is_compact_fc, symmetry=symmetry, + options=fc_calculator_options, log_level=log_level, ) else: msg = "Force constants calculator of %s was not found ." % fc_calculator raise RuntimeError(msg) + + +def extract_fc2_fc3_calculators(fc_calculator: Optional[Union[str, dict]], order: int): + """Extract fc_calculator and fc_calculator_options for fc2 and fc3. + + fc_calculator : str + FC calculator. "|" separates fc2 and fc3. First and last + parts separated correspond to fc2 and fc3 calculators, respectively. + order : int = 2 or 3 + 2 and 3 indicate fc2 and fc3, respectively. + + """ + if isinstance(fc_calculator, dict) or fc_calculator is None: + return fc_calculator + elif isinstance(fc_calculator, str): + if "|" in fc_calculator: + _fc_calculator = fc_calculator.split("|")[order - 2] + if _fc_calculator == "": + return None + return _fc_calculator + else: + if fc_calculator.strip() == "": + return None + return fc_calculator + else: + raise RuntimeError("fc_calculator should be str or dict.") From 9eb95a7482f31f05d021fc86b391d31feddce51f Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Fri, 28 Jun 2024 20:21:19 +0900 Subject: [PATCH 10/14] Loosen test tolerance --- test/api/test_api_phono3py.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api/test_api_phono3py.py b/test/api/test_api_phono3py.py index 23ad9471..beb63677 100644 --- a/test/api/test_api_phono3py.py +++ b/test/api/test_api_phono3py.py @@ -204,5 +204,5 @@ def test_use_pypolymlp_mgo(mgo_222rd_444rd: Phono3py): ph3.init_phph_interaction() ph3.run_thermal_conductivity(temperatures=[300]) assert ( - pytest.approx(63.0018546, abs=1e-3) == ph3.thermal_conductivity.kappa[0, 0, 0] + pytest.approx(63.0018546, abs=1e-1) == ph3.thermal_conductivity.kappa[0, 0, 0] ) From e57e1c56bfd7f41f102d4cd1f60ebe553357813f Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Sat, 29 Jun 2024 16:33:15 +0900 Subject: [PATCH 11/14] Update pypolymlp feature --- phono3py/api_phono3py.py | 218 ++++++++++++++++++------- phono3py/cui/create_force_constants.py | 154 +++++++++-------- phono3py/cui/load.py | 54 +++--- phono3py/cui/phono3py_script.py | 9 +- phono3py/interface/phono3py_yaml.py | 2 +- 5 files changed, 272 insertions(+), 165 deletions(-) diff --git a/phono3py/api_phono3py.py b/phono3py/api_phono3py.py index c6190549..42b83762 100644 --- a/phono3py/api_phono3py.py +++ b/phono3py/api_phono3py.py @@ -303,6 +303,8 @@ def __init__( # MLP self._mlp = None self._mlp_dataset = None + self._phonon_mlp = None + self._phonon_mlp_dataset = None # Setup interaction self._interaction = None @@ -700,22 +702,25 @@ def mlp_dataset(self) -> Optional[dict]: @mlp_dataset.setter def mlp_dataset(self, mlp_dataset: dict): - if not isinstance(mlp_dataset, dict): - raise TypeError("mlp_dataset has to be a dictionary.") - if "displacements" not in mlp_dataset: - raise RuntimeError("Displacements have to be given.") - if "forces" not in mlp_dataset: - raise RuntimeError("Forces have to be given.") - if "supercell_energy" in mlp_dataset: - raise RuntimeError("Supercell energies have to be given.") - if len(mlp_dataset["displacements"]) != len(mlp_dataset["forces"]): - raise RuntimeError("Length of displacements and forces are different.") - if len(mlp_dataset["displacements"]) != len(mlp_dataset["supercell_energies"]): - raise RuntimeError( - "Length of displacements and supercell_energies are different." - ) + self._check_mlp_dataset(mlp_dataset) self._mlp_dataset = mlp_dataset + @property + def phonon_mlp_dataset(self) -> Optional[dict]: + """Return phonon displacement-force dataset. + + The phonon supercell matrix is equal to that of usual displacement-force + dataset. Only type 2 format is supported. "displacements", "forces", and + "supercell_energies" should be contained. + + """ + return self._phonon_mlp_dataset + + @phonon_mlp_dataset.setter + def phonon_mlp_dataset(self, mlp_dataset: dict): + self._check_mlp_dataset(mlp_dataset) + self._phonon_mlp_dataset = mlp_dataset + @property def band_indices(self) -> list[np.ndarray]: """Setter and getter of band indices. @@ -950,18 +955,18 @@ def phonon_displacements(self): shape=(supercells, natom, 3), dtype='double', order='C' """ - if self._phonon_supercell_matrix is None: - raise RuntimeError("phonon_supercell_matrix is not set.") - - dataset = self._phonon_dataset - if "first_atoms" in dataset: - num_scells = len(dataset["first_atoms"]) + if self._phonon_dataset is None: + raise RuntimeError("phonon_dataset is not set.") + if "first_atoms" in self._phonon_dataset: + num_scells = len(self._phonon_dataset["first_atoms"]) natom = len(self._phonon_supercell) displacements = np.zeros((num_scells, natom, 3), dtype="double", order="C") - for i, disp1 in enumerate(dataset["first_atoms"]): + for i, disp1 in enumerate(self._phonon_dataset["first_atoms"]): displacements[i, disp1["number"]] = disp1["displacement"] - elif "forces" in dataset or "displacements" in dataset: - displacements = dataset["displacements"] + elif ( + "forces" in self._phonon_dataset or "displacements" in self._phonon_dataset + ): + displacements = self._phonon_dataset["displacements"] else: raise RuntimeError("displacement dataset has wrong format.") @@ -1045,6 +1050,16 @@ def grid(self): """ return self._bz_grid + @property + def mlp(self): + """Return MLP instance.""" + return self._mlp + + @property + def phonon_mlp(self): + """Return MLP instance for fc2.""" + return self._phonon_mlp + def init_phph_interaction( self, nac_q_direction=None, @@ -1214,48 +1229,56 @@ def generate_displacements( ): """Generate displacement dataset in supercell for fc3. - This systematically generates single and pair atomic displacements - in supercells to calculate fc3 considering crystal symmetry. - When this method is called, existing cache of supercells with - displacements for fc3 are removed. - - For fc3, two atoms are displaced for each configuration - considering crystal symmetry. The first displacement is chosen - in the perfect supercell, and the second displacement in the - displaced supercell. The first displacements are taken along - the basis vectors of the supercell. This is because the - symmetry is expected to be less broken by the introduced first - displacement, and as the result, the number of second - displacements may become smaller than the case that the first - atom is displaced not along the basis vectors. + Systematic displacements + ------------------------ + + Unless number_of_snapshots is specified, this method systematically + generates single and pair atomic displacements in supercells to + calculate fc3 considering crystal symmetry. + + For fc3, two atoms are displaced for each configuration considering + crystal symmetry. The first displacement is chosen in the perfect + supercell, and the second displacement in the displaced supercell. The + first displacements are taken along the basis vectors of the supercell. + This is because the symmetry is expected to be less broken by the + introduced first displacement, and as the result, the number of second + displacements may become smaller than the case that the first atom is + displaced not along the basis vectors. + + Random displacements + -------------------- + Unless number_of_snapshots is specified, displacements are generated + randomly. There are several options how the random displacements are + generated. Note ---- - When phonon_supercell_matrix is not given, fc2 is also - computed from the same set of the displacements for fc3 and - respective supercell forces. When phonon_supercell_matrix is - set, the displacements in phonon_supercell are generated unless - those already exist. + When phonon_supercell_matrix is not given, fc2 is also computed from the + same set of the displacements for fc3 and respective supercell forces. + When phonon_supercell_matrix is set, the displacements in + phonon_supercell are generated unless those already exist. If a specific + set of displacements for fc2 is expected, generate_fc2_displacements + should be called. Parameters ---------- distance : float, optional Constant displacement Euclidean distance. Default is 0.03. cutoff_pair_distance : float, optional - This is used as a cutoff Euclidean distance to determine if - each pair of displacements is considered to calculate fc3 or not. - Default is None, which means cutoff is not used. + This is used as a cutoff Euclidean distance to determine if each + pair of displacements is considered to calculate fc3 or not. Default + is None, which means cutoff is not used. is_plusminus : True, False, or 'auto', optional With True, atomis are displaced in both positive and negative - directions. With False, only one direction. With 'auto', - mostly equivalent to is_plusminus=True, but only one direction - is chosen when the displacements in both directions are - symmetrically equivalent. Default is 'auto'. + directions. With False, only one direction. With 'auto', mostly + equivalent to is_plusminus=True, but only one direction is chosen + when the displacements in both directions are symmetrically + equivalent. Default is 'auto'. is_diagonal : Bool, optional With False, the second displacements are made along the basis vectors of the supercell. With True, direction not along the basis - vectors can be chosen when the number of the displacements - may be reduced. + vectors can be chosen when the number of the displacements may be + reduced. number_of_snapshots : int or None, optional Number of snapshots of supercells with random displacements. Random displacements are generated displacing all atoms in random @@ -1362,14 +1385,6 @@ def generate_fc2_displacements( value. """ - if self._phonon_supercell_matrix is None: - msg = ( - "phonon_supercell_matrix is not set. " - "This method is used to generate displacements to " - "calculate phonon_fc2." - ) - raise RuntimeError(msg) - if number_of_snapshots is not None and number_of_snapshots > 0: self._phonon_dataset = self._generate_random_displacements( number_of_snapshots, @@ -2214,6 +2229,75 @@ def evaluate_mlp(self): self.supercell_energies = energies self.forces = forces + def develop_phonon_mlp( + self, params: Optional[Union[PypolymlpParams, dict, str]] = None + ): + """Develop MLP of pypolymlp for fc2. + + Parameters + ---------- + params : PypolymlpParams or dict, optional + Parameters for developing MLP. Default is None. When dict is given, + PypolymlpParams instance is created from the dict. + + """ + if self._phonon_mlp_dataset is None: + raise RuntimeError("MLP dataset is not set.") + + if params is not None: + _params = parse_mlp_params(params) + else: + _params = params + + disps = self._phonon_mlp_dataset["displacements"] + forces = self._phonon_mlp_dataset["forces"] + energies = self._phonon_mlp_dataset["supercell_energies"] + n = int(len(disps) * 0.9) + train_data = PypolymlpData( + displacements=disps[:n], forces=forces[:n], supercell_energies=energies[:n] + ) + test_data = PypolymlpData( + displacements=disps[n:], forces=forces[n:], supercell_energies=energies[n:] + ) + self._phonon_mlp = develop_polymlp( + self._phonon_supercell, + train_data, + test_data, + params=_params, + verbose=self._log_level - 1 > 0, + ) + + def evaluate_phonon_mlp(self): + """Evaluate the machine learning potential of pypolymlp. + + This method calculates the supercell energies and forces from the MLP + for the displacements in self._dataset of type 2. The results are stored + in self._dataset. + + The displacements may be generated by the produce_force_constants method + with number_of_snapshots > 0. With MLP, a small distance parameter, such + as 0.001, can be numerically stable for the computation of force + constants. + + """ + if self._mlp is None and self._phonon_mlp is None: + raise RuntimeError("MLP is not developed yet.") + + if self.phonon_supercells_with_displacements is None: + raise RuntimeError( + "Displacements are not set. Run generate_fc2_displacements." + ) + + if self._phonon_mlp is None: + mlp = self._mlp + else: + mlp = self._phonon_mlp + energies, forces, _ = evalulate_polymlp( + mlp, self.phonon_supercells_with_displacements + ) + self.phonon_supercell_energies = energies + self.phonon_forces = forces + ################### # private methods # ################### @@ -2569,3 +2653,19 @@ def _generate_random_displacements( ) dataset["displacements"] = d return dataset + + def _check_mlp_dataset(self, mlp_dataset: dict): + if not isinstance(mlp_dataset, dict): + raise TypeError("mlp_dataset has to be a dictionary.") + if "displacements" not in mlp_dataset: + raise RuntimeError("Displacements have to be given.") + if "forces" not in mlp_dataset: + raise RuntimeError("Forces have to be given.") + if "supercell_energy" in mlp_dataset: + raise RuntimeError("Supercell energies have to be given.") + if len(mlp_dataset["displacements"]) != len(mlp_dataset["forces"]): + raise RuntimeError("Length of displacements and forces are different.") + if len(mlp_dataset["displacements"]) != len(mlp_dataset["supercell_energies"]): + raise RuntimeError( + "Length of displacements and supercell_energies are different." + ) diff --git a/phono3py/cui/create_force_constants.py b/phono3py/cui/create_force_constants.py index ee40bd8c..9f6f778a 100644 --- a/phono3py/cui/create_force_constants.py +++ b/phono3py/cui/create_force_constants.py @@ -167,29 +167,19 @@ def create_phono3py_force_constants( _read_phono3py_fc2(phono3py, symmetrize_fc2, input_filename, log_level) else: if phono3py.phonon_supercell_matrix is None: - if fc_calculator == "alm" and phono3py.fc2 is not None: - if log_level: - print("fc2 that was fit simultaneously with fc3 " "by ALM is used.") - else: - _create_phono3py_fc2( - phono3py, - ph3py_yaml, - symmetrize_fc2, - settings.is_compact_fc, - fc_calculator, - fc_calculator_options, - log_level, - ) + force_filename = "FORCES_FC3" else: - _create_phono3py_phonon_fc2( - phono3py, - ph3py_yaml, - symmetrize_fc2, - settings.is_compact_fc, - fc_calculator, - fc_calculator_options, - log_level, - ) + force_filename = "FORCES_FC2" + _create_phono3py_fc2( + phono3py, + ph3py_yaml, + force_filename, + symmetrize_fc2, + settings.is_compact_fc, + fc_calculator, + fc_calculator_options, + log_level, + ) if output_filename is None: filename = "fc2.hdf5" else: @@ -500,7 +490,7 @@ def _create_phono3py_fc3( phono3py.mlp_dataset = dataset run_pypolymlp_to_compute_forces( phono3py, - mlp_params=mlp_params, + mlp_params, displacement_distance=displacement_distance, number_of_snapshots=number_of_snapshots, random_seed=random_seed, @@ -519,10 +509,10 @@ def _create_phono3py_fc3( def run_pypolymlp_to_compute_forces( ph3py: Phono3py, mlp_params: Union[str, dict, PypolymlpParams], - displacement_distance: float, - number_of_snapshots: int, - random_seed: int, - log_level: int, + displacement_distance: Optional[float] = None, + number_of_snapshots: Optional[int] = None, + random_seed: Optional[int] = None, + log_level: int = 0, ): """Run pypolymlp to compute forces.""" if log_level: @@ -542,13 +532,14 @@ def run_pypolymlp_to_compute_forces( ph3py.develop_mlp(params=mlp_params) + if log_level: + print("-" * 30 + " pypolymlp end " + "-" * 31, flush=True) + if displacement_distance is None: _displacement_distance = 0.001 else: _displacement_distance = displacement_distance - if log_level > 1: - print("") if log_level: if number_of_snapshots: print("Generate random displacements") @@ -572,10 +563,10 @@ def run_pypolymlp_to_compute_forces( if log_level: print( - " Number of supercells for computing forces: " - f"{ph3py.displacements.shape[0]}" + f"Evaluate forces in {ph3py.displacements.shape[0]} supercells " + "by pypolymlp", + flush=True, ) - print("Evaluate forces by pypolymlp", flush=True) if ph3py.mlp_dataset is None: msg = "mlp_dataset has to be set before calling this method." @@ -585,26 +576,85 @@ def run_pypolymlp_to_compute_forces( ph3py.evaluate_mlp() + +def run_pypolymlp_to_compute_phonon_forces( + ph3py: Phono3py, + mlp_params: Optional[Union[str, dict, PypolymlpParams]] = None, + displacement_distance: Optional[float] = None, + number_of_snapshots: Optional[int] = None, + random_seed: Optional[int] = None, + log_level: int = 0, +): + """Run pypolymlp to compute phonon forces.""" + if ph3py.phonon_mlp_dataset is not None: + if log_level: + print("-" * 29 + " pypolymlp start " + "-" * 30) + print("Pypolymlp is a generator of polynomial machine learning potentials.") + print("Please cite the paper: A. Seko, J. Appl. Phys. 133, 011101 (2023).") + print("Pypolymlp is developed at https://github.com/sekocha/pypolymlp.") + if mlp_params: + print("Parameters:") + for k, v in asdict(parse_mlp_params(mlp_params)).items(): + if v is not None: + print(f" {k}: {v}") + if log_level > 1: + print("") + if log_level: + print("Developing MLPs by pypolymlp...", flush=True) + + ph3py.develop_phonon_mlp(params=mlp_params) + + if log_level: + print("-" * 30 + " pypolymlp end " + "-" * 31, flush=True) + + if displacement_distance is None: + _displacement_distance = 0.001 + else: + _displacement_distance = displacement_distance if log_level: - print("-" * 30 + " pypolymlp end " + "-" * 31, flush=True) + print("Generate random displacements for fc2") + print( + f" Displacement distance: {_displacement_distance:.5f}".rstrip("0").rstrip( + "." + ) + ) + ph3py.generate_fc2_displacements( + distance=_displacement_distance, + is_plusminus=True, + number_of_snapshots=number_of_snapshots, + random_seed=random_seed, + ) + if log_level: + print( + f"Evaluate forces in {ph3py.phonon_displacements.shape[0]} " + "supercells by pypolymlp", + flush=True, + ) + ph3py.evaluate_phonon_mlp() def _create_phono3py_fc2( phono3py: Phono3py, ph3py_yaml: Optional[Phono3pyYaml], + force_filename, symmetrize_fc2, is_compact_fc, fc_calculator, fc_calculator_options, log_level, ): + """Read forces and produce fc2. + + force_filename is either "FORCES_FC2" or "FORCES_FC3". + + """ _ph3py_yaml = _get_default_ph3py_yaml(ph3py_yaml) try: dataset = parse_forces( phono3py, ph3py_yaml=_ph3py_yaml, - force_filename="FORCES_FC3", + force_filename=force_filename, fc_type="fc2", log_level=log_level, ) @@ -633,42 +683,6 @@ def _get_default_ph3py_yaml(ph3py_yaml: Optional[Phono3pyYaml]): return _ph3py_yaml -def _create_phono3py_phonon_fc2( - phono3py: Phono3py, - ph3py_yaml: Optional[Phono3pyYaml], - symmetrize_fc2: bool, - is_compact_fc: bool, - fc_calculator: Optional[str], - fc_calculator_options: Optional[str], - log_level: int, -): - _ph3py_yaml = _get_default_ph3py_yaml(ph3py_yaml) - - try: - dataset = parse_forces( - phono3py, - ph3py_yaml=_ph3py_yaml, - force_filename="FORCES_FC2", - fc_type="phonon_fc2", - log_level=log_level, - ) - except RuntimeError as e: - if log_level: - print(str(e)) - print_error() - sys.exit(1) - except FileNotFoundError as e: - file_exists(e.filename, log_level) - - phono3py.phonon_dataset = dataset - phono3py.produce_fc2( - symmetrize_fc2=symmetrize_fc2, - is_compact_fc=is_compact_fc, - fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 2), - fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 2), - ) - - def _convert_unit_in_dataset( dataset: dict, distance_to_A: Optional[float] = None, diff --git a/phono3py/cui/load.py b/phono3py/cui/load.py index 238cfa31..14730c85 100644 --- a/phono3py/cui/load.py +++ b/phono3py/cui/load.py @@ -450,47 +450,33 @@ def compute_force_constants_from_datasets( fc2 : bool """ - if not read_fc["fc3"]: - if ph3py.dataset or ph3py.mlp_dataset: - if ph3py.mlp_dataset and use_pypolymlp: - run_pypolymlp_to_compute_forces( - ph3py, - mlp_params=mlp_params, - displacement_distance=displacement_distance, - number_of_snapshots=number_of_snapshots, - random_seed=random_seed, - log_level=log_level, - ) - - ph3py.produce_fc3( - symmetrize_fc3r=symmetrize_fc, - is_compact_fc=is_compact_fc, - fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 3), - fc_calculator_options=extract_fc2_fc3_calculators( - fc_calculator_options, 3 - ), + fc3_calculator = extract_fc2_fc3_calculators(fc_calculator, 3) + fc2_calculator = extract_fc2_fc3_calculators(fc_calculator, 2) + if not read_fc["fc3"] and (ph3py.dataset or ph3py.mlp_dataset): + if ph3py.mlp_dataset and use_pypolymlp: + run_pypolymlp_to_compute_forces( + ph3py, + mlp_params=mlp_params, + displacement_distance=displacement_distance, + number_of_snapshots=number_of_snapshots, + random_seed=random_seed, + log_level=log_level, ) + ph3py.produce_fc3( + symmetrize_fc3r=symmetrize_fc, + is_compact_fc=is_compact_fc, + fc_calculator=fc3_calculator, + fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 3), + ) - if log_level and symmetrize_fc and fc_calculator is None: - print("fc3 was symmetrized.") + if log_level and symmetrize_fc and fc_calculator is None: + print("fc3 was symmetrized.") if not read_fc["fc2"] and (ph3py.dataset or ph3py.phonon_dataset): - # if ( - # ph3py.phonon_supercell_matrix is None - # and fc_calculator in ("alm", "symfc") - # and ph3py.fc2 is not None - # ): - # if log_level: - # if fc_calculator == "alm": - # print("fc2 that was fit simultaneously with fc3 by ALM is used.") - # elif fc_calculator == "symfc": - # print( - # "fc2 that was fit simultaneously with fc3 by symfc is used.") - # else: ph3py.produce_fc2( symmetrize_fc2=symmetrize_fc, is_compact_fc=is_compact_fc, - fc_calculator=extract_fc2_fc3_calculators(fc_calculator, 2), + fc_calculator=fc2_calculator, fc_calculator_options=extract_fc2_fc3_calculators(fc_calculator_options, 2), ) if log_level and symmetrize_fc and fc_calculator is None: diff --git a/phono3py/cui/phono3py_script.py b/phono3py/cui/phono3py_script.py index 2fda8b0c..a1fc34be 100644 --- a/phono3py/cui/phono3py_script.py +++ b/phono3py/cui/phono3py_script.py @@ -160,11 +160,18 @@ def finalize_phono3py( yaml_filename = filename _physical_units = get_default_physical_units(phono3py.calculator) + + write_force_sets = phono3py.mlp is not None + _write_displacements = write_displacements or phono3py.mlp is not None + ph3py_yaml = Phono3pyYaml( configuration=confs_dict, calculator=phono3py.calculator, physical_units=_physical_units, - settings={"force_sets": False, "displacements": write_displacements}, + settings={ + "force_sets": write_force_sets, + "displacements": _write_displacements, + }, ) ph3py_yaml.set_phonon_info(phono3py) with open(yaml_filename, "w") as w: diff --git a/phono3py/interface/phono3py_yaml.py b/phono3py/interface/phono3py_yaml.py index 2decda01..caf9c493 100644 --- a/phono3py/interface/phono3py_yaml.py +++ b/phono3py/interface/phono3py_yaml.py @@ -326,7 +326,7 @@ def _displacements_yaml_lines(self, with_forces: bool = False) -> list: """ lines = [] - if self._data.phonon_supercell_matrix is not None: + if self._data.phonon_dataset is not None: lines += self._displacements_yaml_lines_2types( self._data.phonon_dataset, with_forces=with_forces, From 4f95be3e830c29b904c649b2fd3746d0614b7c03 Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Sat, 29 Jun 2024 16:47:11 +0900 Subject: [PATCH 12/14] Update phonopy version dependency --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index b7fdc84d..146789f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ numpy >= 1.17.0 PyYAML >= 5.3 matplotlib >= 2.2.2 h5py >= 3.0 -phonopy >=2.24,<2.25 +phonopy >=2.25,<2.26 diff --git a/setup.py b/setup.py index d08cc8b5..1784f761 100644 --- a/setup.py +++ b/setup.py @@ -326,7 +326,7 @@ def main(build_dir): "matplotlib>=2.2.2", "h5py>=3.0", "spglib>=2.0", - "phonopy>=2.24,<2.25", + "phonopy>=2.25,<2.26", ], provides=["phono3py"], scripts=scripts_phono3py, From a981a04858f756fd90a3f4034e6de4b26f7f1980 Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Sat, 29 Jun 2024 20:00:53 +0900 Subject: [PATCH 13/14] Command options for generating random directional displacements --- doc/changelog.md | 5 ++ doc/command-options.md | 90 ++++++++++++++++------------- phono3py/cui/create_supercells.py | 10 ++++ phono3py/cui/phono3py_argparse.py | 8 +++ phono3py/cui/settings.py | 17 ++++++ phono3py/interface/phono3py_yaml.py | 1 + 6 files changed, 90 insertions(+), 41 deletions(-) diff --git a/doc/changelog.md b/doc/changelog.md index 52267e72..9fba0f68 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -2,6 +2,11 @@ # Change Log +## Jun-29-2024: Version 3.2.0 + +- `--rd` and `--rd-fc2` options for generating random directional displacements. +- Experimental implementation for using pypolymlp. + ## Jun-19-2024: Version 3.1.2 - Treatment of numpy 2.0. diff --git a/doc/command-options.md b/doc/command-options.md index 1c564020..9851d73e 100644 --- a/doc/command-options.md +++ b/doc/command-options.md @@ -181,7 +181,7 @@ created from `FORCES_FC2` and `phono3py_disp.yaml` instead of `FORCES_FC3` and ### `--dim` (`DIM`) Supercell dimension is specified. See the detail at -http://phonopy.github.io/phonopy/setting-tags.html#dim. When a proper +. When a proper `phono3py_disp.yaml` exists in the current directory, this is unnecessary to be specified. @@ -233,7 +233,7 @@ that created in the usual phono3py run without `--dim-fc2` option. Transformation matrix from a non-primitive cell to the primitive cell. See phonopy `PRIMITIVE_AXES` tag (`--pa` option) at -http://phonopy.github.io/phonopy/setting-tags.html#primitive-axis. When a proper +. When a proper `phono3py_disp.yaml` exists in the current directory, this is unnecessary to be specified. @@ -261,10 +261,17 @@ e.g., `--pa="F"` if the input unit cell has F-centring. (amplitude_option)= +### `--rd` (`RANDOM_DISPLACEMENTS`), `--rd-fc2` (`RANDOM_DISPLACEMENTS_FC2`) and `--random-seed` (`RANDOM_SEED`) + +Random directional displacements are generated for fc3 and fc2 supercells by +`--rd` and `--rd-fc2`, respectively. `--amplitude` and `--random-seed` options +may be used together. These are used in the equivalent way to [`--rd` of +phonopy](https://phonopy.github.io/phonopy/setting-tags.html#random-displacements). + ### `--amplitude` (`DISPLACEMENT_DISTANCE`) Atomic displacement distance is specified. This value may be increased for the -weak interaction systems and descreased when the force calculator is numerically +weak interaction systems and decreased when the force calculator is numerically very accurate. The default value depends on calculator. See @@ -279,7 +286,7 @@ The default value depends on calculator. See When creating force constants from `FORCES_FC3` and/or `FORCES_FC2`, force constants that use smaller data size are created. The shape of the data array is `(num_patom, num_satom)` for fc2 and `(num_patom, num_satom, num_satom)` for -fc3, where `num_patom` and `num_satom` are the numbers of atoms in primtive cell +fc3, where `num_patom` and `num_satom` are the numbers of atoms in primitive cell and supercell. In the full size force constants case, `num_patom` is replaced by `num_satom`. Therefore if the supercell dimension is large, this reduction of data size becomes large. If the input crystal structure has centring @@ -298,7 +305,7 @@ imperfect symmetrization scheme that phono3py employs. ### `--sym-fc` (`FC_SYMMETRY = .TRUE.`) Second- and third-order force constants are symmetrized. The index exchange of -real space force constantsand translational invariance symmetry are applied in a +real space force constants and translational invariance symmetry are applied in a simple way. This symmetrization just removes drift force constants evenly from all elements and then applies averaging index-exchange equivalent elements. Therefore the different symmetries are not simultaneously enforced. For better @@ -336,7 +343,7 @@ or computed with less numerical accuracy. More details are found at This invokes ALM as the force constants calculator for fc2 and fc3. See the detail at -[phonopy documentaton](https://phonopy.github.io/phonopy/setting-tags.html#alm). +[phonopy documentation](https://phonopy.github.io/phonopy/setting-tags.html#alm). This option is useful for fitting random displacement dataset or MD data to force constants. Phono3py doesn't provide command-line interface to generate random displacements. Instead simply @@ -359,7 +366,7 @@ as written ### `--gp` (`GRID_POINTS`) Grid points are specified by their unique indices, e.g., for selecting the -q-points where imaginary parts of self energees are calculated. For thermal +q-points where imaginary parts of self energies are calculated. For thermal conductivity calculation, this can be used to distribute its calculation over q-points (see {ref}`workload_distribution`). @@ -382,7 +389,7 @@ This is used to specify grid points like `--gp` option but in their addresses represented by integer numbers. For example with `--mesh="16 16 16"`, a q-point of (0.5, 0.5, 0.5) is given by `--ga="8 8 8"`. The values have to be integers. If you want to specify the point on a path, -`--ga="0 0 0 1 1 1 2 2 2 3 3 3 ..."`, where each three values are recogninzed as +`--ga="0 0 0 1 1 1 2 2 2 3 3 3 ..."`, where each three values are recognized as a grid point. The grid points given by `--ga` option are translated to grid point indices as given by `--gp` option, and the values given by `--ga` option will not be shown in log files. @@ -394,7 +401,7 @@ will not be shown in log files. Band indices are specified. The calculated values at indices separated by space are averaged, and those separated by comma are separately calculated. The output file name will be, e.g., `gammas-mxxx-gxx(-sx)-bx.dat` where `bxbx...` shows the -band indices where the values are calcualted and summed and averaged over those +band indices where the values are calculated and summed and averaged over those bands. ```bash @@ -489,7 +496,7 @@ $$ \delta(\omega-\omega_{\lambda'}-\omega_{\lambda''}) \right. + (n_{\lambda'}-n_{\lambda''}) \left[\delta(\omega+\omega_{\lambda'}-\omega_{\lambda''}) -- \left. \delta(\omega-\omega_{\lambda'}+\omega_{\lambda''}) ++ \left. \delta(\omega-\omega_{\lambda'}+\omega_{\lambda''}) \right]\right\}. $$ @@ -524,16 +531,17 @@ equivalent to that of `--br`. More detail is documented at ### `--wigner` -Run calculation of lattice thermal conductivity tensor computing the coherences (wave-like) contribution -to the thermal conductivity, obtained solving the Wigner transport equation equation. -This option can be combined with `--lbte` or `--br`; in the former case the populations -conductivity (particle-like, equivalent to the conductivity obtained solving the LBTE) is computed exactly, -in the latter case the populations conductivity is -computed in the relaxation-time approximation (RTA). -The coherences contribution to the conductivity is always computed exactly. -The coherences conductivity is usually non-negligible compared to the particle-like conductivity in materials -with ultralow or glass-like conductivity. -More details can be found at {ref}`wigner_solution`. +Run calculation of lattice thermal conductivity tensor computing the coherences +(wave-like) contribution to the thermal conductivity, obtained solving the +Wigner transport equation equation. This option can be combined with `--lbte` or +`--br`; in the former case the populations conductivity (particle-like, +equivalent to the conductivity obtained solving the LBTE) is computed exactly, +in the latter case the populations conductivity is computed in the +relaxation-time approximation (RTA). The coherences contribution to the +conductivity is always computed exactly. The coherences conductivity is usually +non-negligible compared to the particle-like conductivity in materials with +ultralow or glass-like conductivity. More details can be found at +{ref}`wigner_solution`. ## Scattering @@ -718,7 +726,7 @@ $$ \bigl|\Phi_{-\lambda\lambda_1\lambda_2}\bigl|^2 (n_{\lambda_1}-n_{\lambda_2}) \left[\delta(\omega+\omega_{\lambda_1}-\omega_{\lambda_2}) - - \delta(\omega-\omega_{\lambda_1}+\omega_{\lambda_2}) + + \delta(\omega-\omega_{\lambda_1}+\omega_{\lambda_2}) \right] \end{align*} $$ @@ -732,7 +740,7 @@ $$ \bigl|\Phi_{-\lambda\lambda_1\lambda_2}\bigl|^2 (n_{\lambda_1}+ n_{\lambda_2}+1) \left[ \delta(\omega-\omega_{\lambda_1}-\omega_{\lambda_2}) - - \delta(\omega + \omega_{\lambda_1} + \omega_{\lambda_2}) \right] + + \delta(\omega + \omega_{\lambda_1} + \omega_{\lambda_2}) \right] \end{align*}, $$ @@ -758,7 +766,7 @@ Specific temperatures are specified by `--ts`. Temperatures at equal interval are specified by `--tmax`, `--tmin`, `--tstep`. See phonopy's document for the same tags at -http://phonopy.github.io/phonopy/setting-tags.html#tprop-tmin-tmax-tstep. +. ```bash % phono3py --fc3 --fc2 --dim="2 2 2" -v --mesh="11 11 11" -c POSCAR-unitcell --br --tmin=100 --tmax=1000 --tstep=50 @@ -779,7 +787,7 @@ file. This is used with `--nac` to specify reciprocal-space direction at $\mathbf{q}\rightarrow \mathbf{0}$. See the detail at -http://phonopy.github.io/phonopy/setting-tags.html#q-direction. +. (self_energy_options)= @@ -800,11 +808,11 @@ $$ \bigl|\Phi_{-\lambda\lambda_1\lambda_2}\bigl|^2 & \left\{(n_{\lambda_1}+ n_{\lambda_2}+1) \left[ \delta(\omega-\omega_{\lambda_1}-\omega_{\lambda_2}) - - \delta(\omega+\omega_{\lambda_1}+\omega_{\lambda_2}) \right] \right. + + \delta(\omega+\omega_{\lambda_1}+\omega_{\lambda_2}) \right] \right. \\ & + (n_{\lambda_1}-n_{\lambda_2}) \left[\delta(\omega+\omega_{\lambda_1}-\omega_{\lambda_2}) - - \left. \delta(\omega-\omega_{\lambda_1}+\omega_{\lambda_2}) + + \left. \delta(\omega-\omega_{\lambda_1}+\omega_{\lambda_2}) \right]\right\}, \end{align*} $$ @@ -819,14 +827,14 @@ $$ \left\{ \left[ \frac{(n_{\lambda_1}+ n_{\lambda_2}+1)}{ (\omega-\omega_{\lambda_1}-\omega_{\lambda_2})_\mathrm{p}} - - \frac{(n_{\lambda_1}+ n_{\lambda_2}+1)}{ + + \frac{(n_{\lambda_1}+ n_{\lambda_2}+1)}{ (\omega+\omega_{\lambda_1}+\omega_{\lambda_2})_\mathrm{p}} \right] \right. \\ & + \left[ \frac{(n_{\lambda_1}-n_{\lambda_2})}{(\omega + \omega_{\lambda_1} - \omega_{\lambda_2})_\mathrm{p}} - - \left. \frac{(n_{\lambda_1}-n_{\lambda_2})}{(\omega - + + \left. \frac{(n_{\lambda_1}-n_{\lambda_2})}{(\omega - \omega_{\lambda_1} + \omega_{\lambda_2})_\mathrm{p}} \right]\right\}, \end{align*} @@ -1186,7 +1194,7 @@ different CPU architectures. {ref}`--pa ` and ### `--write-pp` (`WRITE_PP = .TRUE.`) and `--read-pp` (`READ_PP = .TRUE.`) -Phonon-phonon (ph-ph) intraction strengths are written to and read from +Phonon-phonon (ph-ph) interaction strengths are written to and read from `pp-mxxx-gx.hdf5`. This works only in the calculation of lattice thermal conductivity, i.e., usable only with `--br` or `--lbte`. The stored data are different with and without specifying `--full-pp` option. In the former case, @@ -1212,7 +1220,7 @@ Most of phono3py HDF5 output file is compressed by default with the `gzip` compression filter. To avoid compression, `--hdf5-compression=None` has to be set. Other filters (`lzf` or integer values of 0 to 9) may be used, see h5py documentation -(http://docs.h5py.org/en/stable/high/dataset.html#filter-pipeline). +(). (output_filename_option)= @@ -1226,12 +1234,12 @@ Using this option, output file names are slightly modified. For example, with This rule is applied to -- `fc3.hdf5` -- `fc2.hdf5` -- `kappa-xxx.hdf5` -- `phonon-xxx.hdf5` -- `pp-xxx.hdf5` -- `gamma_detail-xxx.hdf5` (write only) ++ `fc3.hdf5` ++ `fc2.hdf5` ++ `kappa-xxx.hdf5` ++ `phonon-xxx.hdf5` ++ `pp-xxx.hdf5` ++ `gamma_detail-xxx.hdf5` (write only) (input_filename_option)= @@ -1245,11 +1253,11 @@ specifying `-i iso --fc3`, a file name `fc3.iso.hdf5` is read instead of This rule is applied to -- `fc3.hdf5` -- `fc2.hdf5` -- `kappa-xxx.hdf5` -- `phonon-xxx.hdf5` -- `pp-xxx.hdf5` ++ `fc3.hdf5` ++ `fc2.hdf5` ++ `kappa-xxx.hdf5` ++ `phonon-xxx.hdf5` ++ `pp-xxx.hdf5` ### `--io` (command option only) diff --git a/phono3py/cui/create_supercells.py b/phono3py/cui/create_supercells.py index 3d2e3e84..a09f3dcf 100644 --- a/phono3py/cui/create_supercells.py +++ b/phono3py/cui/create_supercells.py @@ -77,8 +77,18 @@ def create_phono3py_supercells( cutoff_pair_distance=settings.cutoff_pair_distance, is_plusminus=settings.is_plusminus_displacement, is_diagonal=settings.is_diagonal_displacement, + number_of_snapshots=settings.random_displacements, + random_seed=settings.random_seed, ) + if settings.random_displacements_fc2: + phono3py.generate_fc2_displacements( + distance=distance, + is_plusminus=settings.is_plusminus_displacement, + number_of_snapshots=settings.random_displacements_fc2, + random_seed=settings.random_seed, + ) + if log_level: print("") print('Unit cell was read from "%s".' % optional_structure_info[0]) diff --git a/phono3py/cui/phono3py_argparse.py b/phono3py/cui/phono3py_argparse.py index 6c51cb8b..0c31dde6 100644 --- a/phono3py/cui/phono3py_argparse.py +++ b/phono3py/cui/phono3py_argparse.py @@ -671,6 +671,14 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False): default=None, help="Number of supercells with random displacements", ) + parser.add_argument( + "--rd-fc2", + "--random-displacements-fc2", + dest="random_displacements_fc2", + type=int, + default=None, + help="Number of phonon supercells with random displacements", + ) parser.add_argument( "--read-collision", dest="read_collision", diff --git a/phono3py/cui/settings.py b/phono3py/cui/settings.py index 815fb9a5..9e5ebe40 100644 --- a/phono3py/cui/settings.py +++ b/phono3py/cui/settings.py @@ -89,6 +89,7 @@ class Phono3pySettings(Settings): "pinv_solver": 0, "pinv_method": 0, "pp_conversion_factor": None, + "random_displacements_fc2": None, "scattering_event_class": None, # scattering event class 1 or 2 "sigma_cutoff_width": None, "solve_collective_phonon": False, @@ -276,6 +277,10 @@ def set_pp_conversion_factor(self, val): """Set pp_conversion_factor.""" self._v["pp_conversion_factor"] = val + def set_random_displacements_fc2(self, val): + """Set random_displacements_fc2.""" + self._v["random_displacements_fc2"] = val + def set_read_collision(self, val): """Set read_collision.""" self._v["read_collision"] = val @@ -553,6 +558,11 @@ def _read_options(self): if pp_conv_factor is not None: self._confs["pp_conversion_factor"] = pp_conv_factor + if "random_displacements_fc2" in self._args: + rd_fc2 = self._args.random_displacements_fc2 + if rd_fc2 is not None: + self._confs["random_displacements_fc2"] = rd_fc2 + if "read_fc2" in self._args: if self._args.read_fc2: self._confs["read_fc2"] = ".true." @@ -695,6 +705,7 @@ def _parse_conf(self): "pinv_method", "pinv_solver", "num_points_in_batch", + "random_displacements_fc2", "scattering_event_class", ): self.set_parameter(conf_key, int(confs[conf_key])) @@ -943,6 +954,12 @@ def _set_settings(self): if "pp_conversion_factor" in params: self._settings.set_pp_conversion_factor(params["pp_conversion_factor"]) + # Random displacements for fc2 + if "random_displacements_fc2" in params: + self._settings.set_random_displacements_fc2( + params["random_displacements_fc2"] + ) + # Calculate real_self_energys if "real_self_energy" in params: self._settings.set_is_real_self_energy(params["real_self_energy"]) diff --git a/phono3py/interface/phono3py_yaml.py b/phono3py/interface/phono3py_yaml.py index caf9c493..36fdff8e 100644 --- a/phono3py/interface/phono3py_yaml.py +++ b/phono3py/interface/phono3py_yaml.py @@ -332,6 +332,7 @@ def _displacements_yaml_lines(self, with_forces: bool = False) -> list: with_forces=with_forces, key_prefix="phonon_", ) + lines.append("") lines += self._displacements_yaml_lines_2types( self._data.dataset, with_forces=with_forces ) From eadc4abccfd7cfa607a365aee25e49764b5d289b Mon Sep 17 00:00:00 2001 From: Atsushi Togo Date: Sat, 29 Jun 2024 21:46:33 +0900 Subject: [PATCH 14/14] Set version 3.2.0 --- doc/conf.py | 4 ++-- phono3py/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index ad68534b..ef0f8f99 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -58,9 +58,9 @@ # built documents. # # The short X.Y version. -version = "3.1" +version = "3.2" # The full version, including alpha/beta/rc tags. -release = "3.1.2" +release = "3.2.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/phono3py/version.py b/phono3py/version.py index e0ebba7a..a490a3d8 100644 --- a/phono3py/version.py +++ b/phono3py/version.py @@ -34,4 +34,4 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -__version__ = "3.1.2" +__version__ = "3.2.0"