Skip to content

Commit

Permalink
Merge branch 'develop' into rc
Browse files Browse the repository at this point in the history
  • Loading branch information
atztogo committed Sep 24, 2024
2 parents f75ebf3 + f411c03 commit 73ddc4e
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 24 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ repos:
exclude: ^example/AlN-LDA/

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.6.5
rev: v0.6.7
hooks:
- id: ruff
args: [ "--fix", "--show-fixes" ]
Expand Down
22 changes: 10 additions & 12 deletions c/real_to_reciprocal.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ void r2r_real_to_reciprocal(lapack_complex_double *fc3_reciprocal,
const AtomTriplets *atom_triplets,
const long openmp_per_triplets) {
long i, j, num_band, num_patom, num_satom, adrs_vec;
lapack_complex_double *pre_phase_factors, *phase_factor0, *phase_factor1,
*phase_factor2;
lapack_complex_double *pre_phase_factors, *phase_factors, *phase_factor0,
*phase_factor1, *phase_factor2;

num_patom = atom_triplets->multi_dims[1];
num_satom = atom_triplets->multi_dims[0];
Expand All @@ -92,12 +92,11 @@ void r2r_real_to_reciprocal(lapack_complex_double *fc3_reciprocal,
pre_phase_factors[i] = get_pre_phase_factor(i, q_vecs, atom_triplets);
}

phase_factor0 = (lapack_complex_double *)malloc(
sizeof(lapack_complex_double) * num_patom * num_satom);
phase_factor1 = (lapack_complex_double *)malloc(
sizeof(lapack_complex_double) * num_patom * num_satom);
phase_factor2 = (lapack_complex_double *)malloc(
sizeof(lapack_complex_double) * num_patom * num_satom);
phase_factors = (lapack_complex_double *)malloc(
sizeof(lapack_complex_double) * 3 * num_patom * num_satom);
phase_factor0 = phase_factors;
phase_factor1 = phase_factors + num_patom * num_satom;
phase_factor2 = phase_factors + 2 * num_patom * num_satom;
for (i = 0; i < num_patom; i++) {
for (j = 0; j < num_satom; j++) {
adrs_vec = j * atom_triplets->multi_dims[1] + i;
Expand Down Expand Up @@ -132,11 +131,10 @@ void r2r_real_to_reciprocal(lapack_complex_double *fc3_reciprocal,

free(pre_phase_factors);
pre_phase_factors = NULL;
free(phase_factor0);
free(phase_factors);
phase_factors = NULL;
phase_factor0 = NULL;
phase_factor1 = NULL;
free(phase_factor1);
phase_factor1 = NULL;
free(phase_factor2);
phase_factor2 = NULL;
}

Expand Down
4 changes: 4 additions & 0 deletions doc/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

# Change Log

## Sep-24-2024: Version 3.5.2

- Fix a memory leak.

## Sep-19-2024: Version 3.5.1

- A small fix.
Expand Down
2 changes: 1 addition & 1 deletion doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
# The short X.Y version.
version = "3.5"
# The full version, including alpha/beta/rc tags.
release = "3.5.1"
release = "3.5.2"

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
60 changes: 54 additions & 6 deletions doc/pypolymlp.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ The training process involves using a dataset consisting of supercell
displacements, forces, and energies. The trained MLPs are then employed to
compute forces for supercells with specific displacements.

For more details on the methodology, refer to <u>A. Togo and A. Seko, J. Chem. Phys.
**160**, 211001 (2024)</u> [[doi](https://doi.org/10.1063/5.0211296)].
For further details on combining phono3py calculations with pypolymlp, refer to
<u>A. Togo and A. Seko, J. Chem. Phys. **160**, 211001 (2024)</u>
[[doi](https://doi.org/10.1063/5.0211296)]
[[arxiv](https://arxiv.org/abs/2401.17531)].

An example of its usage can be found in the `example/NaCl-pypolymlp` directory
in the distribution from GitHub or PyPI.

## Requirement
## Requirements

- [pypolymlp](https://github.com/sekocha/pypolymlp)
- [symfc](https://github.com/symfc/symfc)
Expand All @@ -36,7 +38,8 @@ in the distribution from GitHub or PyPI.
supercells. The dataset must be stored in a phono3py-yaml-like file, e.g.,
`phono3py_params.yaml`. Use {ref}`--cf3 <cf3_option>` and {ref}`--sp
<sp_option>` option simultaneously.
4. Develop MLPs. At this step `phono3py.pmlp` is saved.
4. Develop MLPs. By default, 90 and 10 percents of the dataset are used for the
training and test, respectively. At this step `phono3py.pmlp` is saved.
5. Generate displacements in supercells either systematic or random displacements.
6. Evaluate MLPs for forces of the supercells generated in step 5.
7. Calculate force constants from displacement-force dataset from steps 5 and 6.
Expand Down Expand Up @@ -227,7 +230,7 @@ displacement distance of 0.001 Angstrom. The forces for these supercells are
then evaluated using pypolymlp. Both the generated displacements and the
corresponding forces are stored in the `phono3py_mlp_eval_dataset` file.

### Steps 4-6: Force constants calculation (random displacements in step 5)
### Steps 4-7: Force constants calculation (random displacements in step 5)

After developing MLPs, random displacements are generated by specifying
{ref}`--rd <random_displacements_option>` option. To compute force constants
Expand All @@ -244,7 +247,7 @@ Having `phono3py_params.yaml`, phono3py is executed with `--pypolymlp` option,
| |_) | | | | (_) | | | | (_) |__) | |_) | |_| |
| .__/|_| |_|\___/|_| |_|\___/____/| .__/ \__, |
|_| |_| |___/
3.5.0-dev22+g575c4107
3.5.0
-------------------------[time 2024-09-19 15:33:23]-------------------------
Compiled with OpenMP support (max 10 threads).
Expand Down Expand Up @@ -327,3 +330,48 @@ displacements are generated. These displacements are then inverted, resulting in
an additional 200 supercells. In total, 400 supercells are created. The forces
for these supercells are then evaluated. Finally, the force constants are
calculated using symfc.

## Convergence with respect to dataset size

In general, increasing the amount of data improves the accuracy of representing
force constants. Therefore, it is recommended to check the convergence of the
target property with respect to the number of supercells in the training
dataset. Lattice thermal conductivity may be a convenient property to monitor
when assessing convergence.

## Parameters for developing MLPs

A few parameters can be specified using the `--mlp-params` option for the
development of MLPs. The parameters are provided as a string, e.g.,

```bash
% phono3py-load phono3py_params.yaml --pypolymlp --mlp-params="ntrain=80, ntest=20"
```

Parameters are separated by commas for configuration. A brief explanation of the
available parameters can be found in the docstring of `PypolymlpParams` that is
found by

```python
In [1]: from phonopy.interface.pypolymlp import PypolymlpParams

In [2]: help(PypolymlpParams)
```

`ntrain` and `ntest` are implemented in phono3py, while the remaining parameters
are directly passed to pypolymlp. Optimizing pypolymlp parameters can be
difficult, both in terms of achieving accuracy and managing the computational
resources required. The current default parameters are likely suitable for
systems up to ternary compounds. For binary systems, the calculations can
generally be run on standard laptop computers, but for ternary systems, around
40 GB of memory or more may be necessary.

For parameter adjustments, it is recommended to consult the
[pypolymlp](https://github.com/sekocha/pypolymlp) documentation and review the
relevant research papers.

### `ntrain` and `ntest`

This method provides a straightforward dataset split: the first `ntrain`
supercells from the list are used for training, while the last `ntest`
supercells are reserved for testing.
20 changes: 20 additions & 0 deletions phono3py/file_IO.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,26 @@ def read_fc2_from_hdf5(filename="fc2.hdf5", p2s_map=None):
)


def write_datasets_to_hdf5(
dataset: dict,
phonon_dataset: dict = None,
filename: str = "datasets.hdf5",
compression: str = "gzip",
):
"""Write dataset and phonon_dataset in datasets.hdf5."""

def _write_dataset(w, dataset: dict, group_name: str):
dataset_w = w.create_group(group_name)
for key in dataset:
dataset_w.create_dataset(key, data=dataset[key], compression=compression)

with h5py.File(filename, "w") as w:
w.create_dataset("version", data=np.bytes_(__version__))
_write_dataset(w, dataset, "dataset")
if phonon_dataset:
_write_dataset(w, phonon_dataset, "phonon_dataset")


def write_grid_address_to_hdf5(
grid_address,
mesh,
Expand Down
6 changes: 3 additions & 3 deletions phono3py/phonon3/interaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ def primitive_symmetry(self) -> Symmetry:

def get_triplets_at_q(
self,
) -> tuple(np.ndarray, np.ndarray, np.ndarray, np.ndarray):
) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
"""Return grid point triplets information.
triplets_at_q is in BZ-grid.
Expand Down Expand Up @@ -414,7 +414,7 @@ def get_zero_value_positions(self):
)
return self.zero_value_positions

def get_phonons(self) -> tuple(np.ndarray, np.ndarray, np.ndarray):
def get_phonons(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
"""Return phonons on grid.
Returns
Expand Down Expand Up @@ -538,7 +538,7 @@ def get_averaged_interaction(self):

def get_primitive_and_supercell_correspondence(
self,
) -> tuple(np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray):
) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
"""Return atomic pair information."""
return (self._svecs, self._multi, self._p2s, self._s2p, self._masses)

Expand Down
2 changes: 1 addition & 1 deletion phono3py/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

__version__ = "3.5.1"
__version__ = "3.5.2"

0 comments on commit 73ddc4e

Please sign in to comment.