mirror of https://github.com/phonopy/phono3py.git
Merge branch 'develop'
This commit is contained in:
commit
fd6c461894
|
@ -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" ]
|
||||
|
|
|
@ -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];
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -60,7 +60,7 @@ copyright = "2015, Atsushi Togo"
|
|||
# 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.
|
||||
|
|
|
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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).
|
||||
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -304,7 +304,7 @@ class Interaction:
|
|||
|
||||
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.
|
||||
|
@ -414,7 +414,7 @@ class Interaction:
|
|||
)
|
||||
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
|
||||
|
@ -538,7 +538,7 @@ class Interaction:
|
|||
|
||||
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)
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue