Merge branch 'develop' into publish-gh-pages

This commit is contained in:
Atsushi Togo 2023-12-25 22:43:56 +09:00
commit 8287ddb6f8
42 changed files with 4268 additions and 2934 deletions

View File

@ -0,0 +1,51 @@
name: Pytest with mkl and --v2 option
on:
pull_request:
branches: [ develop ]
push:
branches-ignore:
- publish-gh-pages
- master
- rc
jobs:
build-linux:
runs-on: ubuntu-latest
defaults:
run:
shell: bash -l {0}
strategy:
matrix:
python-version: ["3.11"]
steps:
- uses: actions/checkout@v3
# Use conda-incubator/setup-miniconda for precise control of conda infrastructure
- uses: conda-incubator/setup-miniconda@v2
with:
miniforge-version: latest
- name: Install dependent packages
run: |
conda activate test
conda install --yes python=${{ matrix.python-version }}
#conda install --yes matplotlib-base pyyaml "libblas=*=*openblas" openblas h5py scipy pytest codecov pytest-cov spglib alm cmake c-compiler
conda install --yes matplotlib-base pyyaml "libblas=*=*mkl" mkl-include h5py scipy pytest codecov pytest-cov spglib alm cmake c-compiler
- name: Install phonopy develop branch
run: |
conda activate test
git clone --depth 1 https://github.com/phonopy/phonopy.git
cd phonopy
pip install -e . -vvv
cd ..
- name: Install phono3py
run: |
conda activate test
pip install -e . -vvv
- name: Run pytest
run: |
pytest --v2 -v --cov=./ --cov-report=xml test
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
verbose: true

View File

@ -19,7 +19,7 @@ repos:
- "--ignore=E203,W503"
- repo: https://github.com/psf/black
rev: 23.10.1
rev: 23.12.0
hooks:
- id: black
args:
@ -31,13 +31,13 @@ repos:
- id: pydocstyle
- repo: https://github.com/pycqa/isort
rev: 5.12.0
rev: 5.13.2
hooks:
- id: isort
name: isort (python)
- repo: https://github.com/Takishima/cmake-pre-commit-hooks
rev: v1.9.4
rev: v1.9.5
hooks:
- id: clang-format
args:

View File

@ -275,6 +275,7 @@ static PyObject *py_get_interaction(PyObject *self, PyObject *args) {
PyArrayObject *py_p2s_map;
PyArrayObject *py_s2p_map;
PyArrayObject *py_band_indices;
PyArrayObject *py_all_shortest;
double cutoff_frequency;
long symmetrize_fc3_q;
long make_r0_average;
@ -293,6 +294,7 @@ static PyObject *py_get_interaction(PyObject *self, PyObject *args) {
double(*svecs)[3];
long(*multi)[2];
double *masses;
char *all_shortest;
long *p2s;
long *s2p;
long *band_indices;
@ -300,12 +302,12 @@ static PyObject *py_get_interaction(PyObject *self, PyObject *args) {
long i;
long is_compact_fc3;
if (!PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOlldl", &py_fc3_normal_squared,
if (!PyArg_ParseTuple(args, "OOOOOOOOOOOOOOOllOdl", &py_fc3_normal_squared,
&py_g_zero, &py_frequencies, &py_eigenvectors,
&py_triplets, &py_bz_grid_addresses, &py_D_diag,
&py_Q, &py_fc3, &py_svecs, &py_multi, &py_masses,
&py_p2s_map, &py_s2p_map, &py_band_indices,
&symmetrize_fc3_q, &make_r0_average,
&symmetrize_fc3_q, &make_r0_average, &py_all_shortest,
&cutoff_frequency, &openmp_per_triplets)) {
return NULL;
}
@ -336,12 +338,13 @@ static PyObject *py_get_interaction(PyObject *self, PyObject *args) {
p2s = (long *)PyArray_DATA(py_p2s_map);
s2p = (long *)PyArray_DATA(py_s2p_map);
band_indices = (long *)PyArray_DATA(py_band_indices);
all_shortest = (char *)PyArray_DATA(py_all_shortest);
ph3py_get_interaction(fc3_normal_squared, g_zero, freqs, eigvecs, triplets,
num_triplets, bz_grid_addresses, D_diag, Q, fc3,
is_compact_fc3, svecs, multi_dims, multi, masses, p2s,
s2p, band_indices, symmetrize_fc3_q, make_r0_average,
cutoff_frequency, openmp_per_triplets);
all_shortest, cutoff_frequency, openmp_per_triplets);
free(fc3_normal_squared);
fc3_normal_squared = NULL;
@ -370,6 +373,7 @@ static PyObject *py_get_pp_collision(PyObject *self, PyObject *args) {
PyArrayObject *py_s2p_map;
PyArrayObject *py_band_indices;
PyArrayObject *py_temperatures;
PyArrayObject *py_all_shortest;
double cutoff_frequency;
long is_NU;
long symmetrize_fc3_q;
@ -396,18 +400,19 @@ static PyObject *py_get_pp_collision(PyObject *self, PyObject *args) {
long *s2p;
Larray *band_indices;
Darray *temperatures;
char *all_shortest;
long multi_dims[2];
long i;
long is_compact_fc3;
if (!PyArg_ParseTuple(
args, "OOOOOOOOlOOOOOOOOOOllldl", &py_gamma,
args, "OOOOOOOOlOOOOOOOOOOlllOdl", &py_gamma,
&py_relative_grid_address, &py_frequencies, &py_eigenvectors,
&py_triplets, &py_triplet_weights, &py_bz_grid_addresses,
&py_bz_map, &bz_grid_type, &py_D_diag, &py_Q, &py_fc3, &py_svecs,
&py_multi, &py_masses, &py_p2s_map, &py_s2p_map, &py_band_indices,
&py_temperatures, &is_NU, &symmetrize_fc3_q, &make_r0_average,
&cutoff_frequency, &openmp_per_triplets)) {
&py_all_shortest, &cutoff_frequency, &openmp_per_triplets)) {
return NULL;
}
@ -439,13 +444,14 @@ static PyObject *py_get_pp_collision(PyObject *self, PyObject *args) {
s2p = (long *)PyArray_DATA(py_s2p_map);
band_indices = convert_to_larray(py_band_indices);
temperatures = convert_to_darray(py_temperatures);
all_shortest = (char *)PyArray_DATA(py_all_shortest);
ph3py_get_pp_collision(
gamma, relative_grid_address, frequencies, eigenvectors, triplets,
num_triplets, triplet_weights, bz_grid_addresses, bz_map, bz_grid_type,
D_diag, Q, fc3, is_compact_fc3, svecs, multi_dims, multi, masses, p2s,
s2p, band_indices, temperatures, is_NU, symmetrize_fc3_q,
make_r0_average, cutoff_frequency, openmp_per_triplets);
make_r0_average, all_shortest, cutoff_frequency, openmp_per_triplets);
free(band_indices);
band_indices = NULL;
@ -473,6 +479,7 @@ static PyObject *py_get_pp_collision_with_sigma(PyObject *self,
PyArrayObject *py_s2p_map;
PyArrayObject *py_band_indices;
PyArrayObject *py_temperatures;
PyArrayObject *py_all_shortest;
long is_NU;
long symmetrize_fc3_q;
double sigma;
@ -498,17 +505,19 @@ static PyObject *py_get_pp_collision_with_sigma(PyObject *self,
long *s2p;
Larray *band_indices;
Darray *temperatures;
char *all_shortest;
long multi_dims[2];
long i;
long is_compact_fc3;
if (!PyArg_ParseTuple(
args, "OddOOOOOOOOOOOOOOOllldl", &py_gamma, &sigma, &sigma_cutoff,
args, "OddOOOOOOOOOOOOOOOlllOdl", &py_gamma, &sigma, &sigma_cutoff,
&py_frequencies, &py_eigenvectors, &py_triplets,
&py_triplet_weights, &py_bz_grid_addresses, &py_D_diag, &py_Q,
&py_fc3, &py_svecs, &py_multi, &py_masses, &py_p2s_map, &py_s2p_map,
&py_band_indices, &py_temperatures, &is_NU, &symmetrize_fc3_q,
&make_r0_average, &cutoff_frequency, &openmp_per_triplets)) {
&make_r0_average, &py_all_shortest, &cutoff_frequency,
&openmp_per_triplets)) {
return NULL;
}
@ -537,13 +546,14 @@ static PyObject *py_get_pp_collision_with_sigma(PyObject *self,
s2p = (long *)PyArray_DATA(py_s2p_map);
band_indices = convert_to_larray(py_band_indices);
temperatures = convert_to_darray(py_temperatures);
all_shortest = (char *)PyArray_DATA(py_all_shortest);
ph3py_get_pp_collision_with_sigma(
gamma, sigma, sigma_cutoff, frequencies, eigenvectors, triplets,
num_triplets, triplet_weights, bz_grid_addresses, D_diag, Q, fc3,
is_compact_fc3, svecs, multi_dims, multi, masses, p2s, s2p,
band_indices, temperatures, is_NU, symmetrize_fc3_q, make_r0_average,
cutoff_frequency, openmp_per_triplets);
all_shortest, cutoff_frequency, openmp_per_triplets);
free(band_indices);
band_indices = NULL;

View File

@ -46,42 +46,37 @@
static const long index_exchange[6][3] = {{0, 1, 2}, {2, 0, 1}, {1, 2, 0},
{2, 1, 0}, {0, 2, 1}, {1, 0, 2}};
static void real_to_normal(
double *fc3_normal_squared, const long (*g_pos)[4], const long num_g_pos,
const double *freqs0, const double *freqs1, const double *freqs2,
const lapack_complex_double *eigvecs0,
const lapack_complex_double *eigvecs1,
const lapack_complex_double *eigvecs2, const double *fc3,
const long is_compact_fc3, const double q_vecs[3][3], /* q0, q1, q2 */
const double (*svecs)[3], const long multi_dims[2],
const long (*multiplicity)[2], const double *masses, const long *p2s_map,
const long *s2p_map, const long *band_indices, const long num_band,
const double cutoff_frequency, const long triplet_index,
const long num_triplets, const long make_r0_average,
const long openmp_at_bands);
static void real_to_normal(double *fc3_normal_squared, const long (*g_pos)[4],
const long num_g_pos, const double *freqs0,
const double *freqs1, const double *freqs2,
const lapack_complex_double *eigvecs0,
const lapack_complex_double *eigvecs1,
const lapack_complex_double *eigvecs2,
const double *fc3, const long is_compact_fc3,
const double q_vecs[3][3], /* q0, q1, q2 */
const AtomTriplets *atom_triplets,
const double *masses, const long *band_indices,
const long num_band, const double cutoff_frequency,
const long triplet_index, const long num_triplets,
const long openmp_at_bands);
static void real_to_normal_sym_q(
double *fc3_normal_squared, const long (*g_pos)[4], const long num_g_pos,
double *const freqs[3], lapack_complex_double *const eigvecs[3],
const double *fc3, const long is_compact_fc3,
const double q_vecs[3][3], /* q0, q1, q2 */
const double (*svecs)[3], const long multi_dims[2],
const long (*multiplicity)[2], const double *masses, const long *p2s_map,
const long *s2p_map, const long *band_indices, const long num_band0,
const long num_band, const double cutoff_frequency,
const long triplet_index, const long num_triplets,
const long make_r0_average, const long openmp_at_bands);
const AtomTriplets *atom_triplets, const double *masses,
const long *band_indices, const long num_band0, const long num_band,
const double cutoff_frequency, const long triplet_index,
const long num_triplets, const long openmp_at_bands);
/* fc3_normal_squared[num_triplets, num_band0, num_band, num_band] */
void itr_get_interaction(
Darray *fc3_normal_squared, const char *g_zero, const Darray *frequencies,
const lapack_complex_double *eigenvectors, const long (*triplets)[3],
const long num_triplets, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long make_r0_average,
const long openmp_per_triplets) {
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets) {
long(*g_pos)[4];
long i;
long num_band, num_band0, num_band_prod, num_g_pos;
@ -94,7 +89,7 @@ void itr_get_interaction(
#ifdef _OPENMP
#pragma omp parallel for schedule(guided) private( \
num_g_pos, g_pos) if (openmp_per_triplets)
num_g_pos, g_pos) if (openmp_per_triplets)
#endif
for (i = 0; i < num_triplets; i++) {
g_pos = (long(*)[4])malloc(sizeof(long[4]) * num_band_prod);
@ -104,9 +99,8 @@ void itr_get_interaction(
itr_get_interaction_at_triplet(
fc3_normal_squared->data + i * num_band_prod, num_band0, num_band,
g_pos, num_g_pos, frequencies->data, eigenvectors, triplets[i],
bzgrid, fc3, is_compact_fc3, svecs, multi_dims, multiplicity,
masses, p2s_map, s2p_map, band_indices, symmetrize_fc3_q,
cutoff_frequency, i, num_triplets, make_r0_average,
bzgrid, fc3, is_compact_fc3, atom_triplets, masses, band_indices,
symmetrize_fc3_q, cutoff_frequency, i, num_triplets,
1 - openmp_per_triplets);
free(g_pos);
@ -119,13 +113,12 @@ void itr_get_interaction_at_triplet(
const long (*g_pos)[4], const long num_g_pos, const double *frequencies,
const lapack_complex_double *eigenvectors, const long triplet[3],
const ConstBZGrid *bzgrid, const double *fc3, const long is_compact_fc3,
const double (*svecs)[3], const long multi_dims[2],
const long (*multiplicity)[2], const double *masses, const long *p2s_map,
const long *s2p_map, const long *band_indices, const long symmetrize_fc3_q,
const AtomTriplets *atom_triplets, const double *masses,
const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency,
const long triplet_index, /* only for print */
const long num_triplets, /* only for print */
const long make_r0_average, const long openmp_at_bands) {
const long openmp_at_bands) {
long j, k;
double *freqs[3];
lapack_complex_double *eigvecs[3];
@ -155,9 +148,8 @@ void itr_get_interaction_at_triplet(
real_to_normal_sym_q(
fc3_normal_squared, g_pos, num_g_pos, freqs, eigvecs, fc3,
is_compact_fc3, q_vecs, /* q0, q1, q2 */
svecs, multi_dims, multiplicity, masses, p2s_map, s2p_map,
band_indices, num_band0, num_band, cutoff_frequency, triplet_index,
num_triplets, make_r0_average, openmp_at_bands);
atom_triplets, masses, band_indices, num_band0, num_band,
cutoff_frequency, triplet_index, num_triplets, openmp_at_bands);
for (j = 0; j < 3; j++) {
free(freqs[j]);
freqs[j] = NULL;
@ -173,26 +165,25 @@ void itr_get_interaction_at_triplet(
eigenvectors + triplet[1] * num_band * num_band,
eigenvectors + triplet[2] * num_band * num_band, fc3,
is_compact_fc3, q_vecs, /* q0, q1, q2 */
svecs, multi_dims, multiplicity, masses, p2s_map,
s2p_map, band_indices, num_band, cutoff_frequency,
triplet_index, num_triplets, make_r0_average,
atom_triplets, masses, band_indices, num_band,
cutoff_frequency, triplet_index, num_triplets,
openmp_at_bands);
}
}
static void real_to_normal(
double *fc3_normal_squared, const long (*g_pos)[4], const long num_g_pos,
const double *freqs0, const double *freqs1, const double *freqs2,
const lapack_complex_double *eigvecs0,
const lapack_complex_double *eigvecs1,
const lapack_complex_double *eigvecs2, const double *fc3,
const long is_compact_fc3, const double q_vecs[3][3], /* q0, q1, q2 */
const double (*svecs)[3], const long multi_dims[2],
const long (*multiplicity)[2], const double *masses, const long *p2s_map,
const long *s2p_map, const long *band_indices, const long num_band,
const double cutoff_frequency, const long triplet_index,
const long num_triplets, const long make_r0_average,
const long openmp_at_bands) {
static void real_to_normal(double *fc3_normal_squared, const long (*g_pos)[4],
const long num_g_pos, const double *freqs0,
const double *freqs1, const double *freqs2,
const lapack_complex_double *eigvecs0,
const lapack_complex_double *eigvecs1,
const lapack_complex_double *eigvecs2,
const double *fc3, const long is_compact_fc3,
const double q_vecs[3][3], /* q0, q1, q2 */
const AtomTriplets *atom_triplets,
const double *masses, const long *band_indices,
const long num_band, const double cutoff_frequency,
const long triplet_index, const long num_triplets,
const long openmp_at_bands) {
lapack_complex_double *fc3_reciprocal;
lapack_complex_double comp_zero;
long i;
@ -203,16 +194,8 @@ static void real_to_normal(
for (i = 0; i < num_band * num_band * num_band; i++) {
fc3_reciprocal[i] = comp_zero;
}
r2r_real_to_reciprocal(fc3_reciprocal, q_vecs, fc3, is_compact_fc3, svecs,
multi_dims, multiplicity, p2s_map, s2p_map,
make_r0_average, openmp_at_bands);
if (make_r0_average) {
for (i = 0; i < num_band * num_band * num_band; i++) {
fc3_reciprocal[i] = lapack_make_complex_double(
lapack_complex_double_real(fc3_reciprocal[i]) / 3,
lapack_complex_double_imag(fc3_reciprocal[i]) / 3);
}
}
r2r_real_to_reciprocal(fc3_reciprocal, q_vecs, fc3, is_compact_fc3,
atom_triplets, openmp_at_bands);
#ifdef MEASURE_R2N
if (openmp_at_bands && num_triplets > 0) {
@ -234,12 +217,10 @@ static void real_to_normal_sym_q(
double *const freqs[3], lapack_complex_double *const eigvecs[3],
const double *fc3, const long is_compact_fc3,
const double q_vecs[3][3], /* q0, q1, q2 */
const double (*svecs)[3], const long multi_dims[2],
const long (*multiplicity)[2], const double *masses, const long *p2s_map,
const long *s2p_map, const long *band_indices, const long num_band0,
const long num_band, const double cutoff_frequency,
const long triplet_index, const long num_triplets,
const long make_r0_average, const long openmp_at_bands) {
const AtomTriplets *atom_triplets, const double *masses,
const long *band_indices, const long num_band0, const long num_band,
const double cutoff_frequency, const long triplet_index,
const long num_triplets, const long openmp_at_bands) {
long i, j, k, l;
long band_ex[3];
double q_vecs_ex[3][3];
@ -264,9 +245,8 @@ static void real_to_normal_sym_q(
freqs[index_exchange[i][2]], eigvecs[index_exchange[i][0]],
eigvecs[index_exchange[i][1]], eigvecs[index_exchange[i][2]], fc3,
is_compact_fc3, q_vecs_ex, /* q0, q1, q2 */
svecs, multi_dims, multiplicity, masses, p2s_map, s2p_map,
band_indices, num_band, cutoff_frequency, triplet_index,
num_triplets, make_r0_average, openmp_at_bands);
atom_triplets, masses, band_indices, num_band, cutoff_frequency,
triplet_index, num_triplets, openmp_at_bands);
for (j = 0; j < num_band0; j++) {
for (k = 0; k < num_band; k++) {
for (l = 0; l < num_band; l++) {

View File

@ -38,28 +38,25 @@
#include "bzgrid.h"
#include "lapack_wrapper.h"
#include "phonoc_array.h"
#include "real_to_reciprocal.h"
void itr_get_interaction(
Darray *fc3_normal_squared, const char *g_zero, const Darray *frequencies,
const lapack_complex_double *eigenvectors, const long (*triplets)[3],
const long num_triplets, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long make_r0_average,
const long openmp_per_triplets);
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets);
void itr_get_interaction_at_triplet(
double *fc3_normal_squared, const long num_band0, const long num_band,
const long (*g_pos)[4], const long num_g_pos, const double *frequencies,
const lapack_complex_double *eigenvectors, const long triplet[3],
const ConstBZGrid *bzgrid, const double *fc3, const long is_compact_fc3,
const double (*svecs)[3], const long multi_dims[2],
const long (*multiplicity)[2], const double *masses, const long *p2s_map,
const long *s2p_map, const long *band_indices, const long symmetrize_fc3_q,
const AtomTriplets *atom_triplets, const double *masses,
const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency,
const long triplet_index, /* only for print */
const long num_triplets, /* only for print */
const long make_r0_average, const long openmp_at_bands);
const long openmp_at_bands);
#endif

View File

@ -49,6 +49,7 @@
#include "phonoc_array.h"
#include "pp_collision.h"
#include "real_self_energy.h"
#include "real_to_reciprocal.h"
#include "tetrahedron_method.h"
#include "triplet.h"
#include "triplet_iw.h"
@ -66,9 +67,10 @@ long ph3py_get_interaction(
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const long *band_indices, const long symmetrize_fc3_q,
const long make_r0_average, const double cutoff_frequency,
const long openmp_per_triplets) {
const long make_r0_average, const char *all_shortest,
const double cutoff_frequency, const long openmp_per_triplets) {
ConstBZGrid *bzgrid;
AtomTriplets *atom_triplets;
long i, j;
if ((bzgrid = (ConstBZGrid *)malloc(sizeof(ConstBZGrid))) == NULL) {
@ -85,12 +87,30 @@ long ph3py_get_interaction(
}
}
if ((atom_triplets = (AtomTriplets *)malloc(sizeof(AtomTriplets))) ==
NULL) {
warning_print("Memory could not be allocated.");
return 0;
}
atom_triplets->svecs = svecs;
atom_triplets->multi_dims[0] = multi_dims[0];
atom_triplets->multi_dims[1] = multi_dims[1];
atom_triplets->multiplicity = multiplicity;
atom_triplets->p2s_map = p2s_map;
atom_triplets->s2p_map = s2p_map;
atom_triplets->make_r0_average = make_r0_average;
atom_triplets->all_shortest = all_shortest;
itr_get_interaction(fc3_normal_squared, g_zero, frequencies,
(lapack_complex_double *)eigenvectors, triplets,
num_triplets, bzgrid, fc3, is_compact_fc3, svecs,
multi_dims, multiplicity, masses, p2s_map, s2p_map,
band_indices, symmetrize_fc3_q, cutoff_frequency,
make_r0_average, openmp_per_triplets);
num_triplets, bzgrid, fc3, is_compact_fc3,
atom_triplets, masses, band_indices, symmetrize_fc3_q,
cutoff_frequency, openmp_per_triplets);
free(atom_triplets);
atom_triplets = NULL;
free(bzgrid);
bzgrid = NULL;
@ -109,9 +129,11 @@ long ph3py_get_pp_collision(
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const Larray *band_indices, const Darray *temperatures, const long is_NU,
const long symmetrize_fc3_q, const double make_r0_average,
const double cutoff_frequency, const long openmp_per_triplets) {
const long symmetrize_fc3_q, const long make_r0_average,
const char *all_shortest, const double cutoff_frequency,
const long openmp_per_triplets) {
ConstBZGrid *bzgrid;
AtomTriplets *atom_triplets;
long i, j;
if ((bzgrid = (ConstBZGrid *)malloc(sizeof(ConstBZGrid))) == NULL) {
@ -130,13 +152,30 @@ long ph3py_get_pp_collision(
}
}
if ((atom_triplets = (AtomTriplets *)malloc(sizeof(AtomTriplets))) ==
NULL) {
warning_print("Memory could not be allocated.");
return 0;
}
atom_triplets->svecs = svecs;
atom_triplets->multi_dims[0] = multi_dims[0];
atom_triplets->multi_dims[1] = multi_dims[1];
atom_triplets->multiplicity = multiplicity;
atom_triplets->p2s_map = p2s_map;
atom_triplets->s2p_map = s2p_map;
atom_triplets->make_r0_average = make_r0_average;
atom_triplets->all_shortest = all_shortest;
ppc_get_pp_collision(imag_self_energy, relative_grid_address, frequencies,
(lapack_complex_double *)eigenvectors, triplets,
num_triplets, triplet_weights, bzgrid, fc3,
is_compact_fc3, svecs, multi_dims, multiplicity,
masses, p2s_map, s2p_map, band_indices, temperatures,
is_NU, symmetrize_fc3_q, cutoff_frequency,
make_r0_average, openmp_per_triplets);
is_compact_fc3, atom_triplets, masses, band_indices,
temperatures, is_NU, symmetrize_fc3_q,
cutoff_frequency, openmp_per_triplets);
free(atom_triplets);
atom_triplets = NULL;
free(bzgrid);
bzgrid = NULL;
@ -154,9 +193,11 @@ long ph3py_get_pp_collision_with_sigma(
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const Larray *band_indices, const Darray *temperatures, const long is_NU,
const long symmetrize_fc3_q, const double make_r0_average,
const double cutoff_frequency, const long openmp_per_triplets) {
const long symmetrize_fc3_q, const long make_r0_average,
const char *all_shortest, const double cutoff_frequency,
const long openmp_per_triplets) {
ConstBZGrid *bzgrid;
AtomTriplets *atom_triplets;
long i, j;
if ((bzgrid = (ConstBZGrid *)malloc(sizeof(ConstBZGrid))) == NULL) {
@ -173,14 +214,31 @@ long ph3py_get_pp_collision_with_sigma(
}
}
if ((atom_triplets = (AtomTriplets *)malloc(sizeof(AtomTriplets))) ==
NULL) {
warning_print("Memory could not be allocated.");
return 0;
}
atom_triplets->svecs = svecs;
atom_triplets->multi_dims[0] = multi_dims[0];
atom_triplets->multi_dims[1] = multi_dims[1];
atom_triplets->multiplicity = multiplicity;
atom_triplets->p2s_map = p2s_map;
atom_triplets->s2p_map = s2p_map;
atom_triplets->make_r0_average = make_r0_average;
atom_triplets->all_shortest = all_shortest;
ppc_get_pp_collision_with_sigma(
imag_self_energy, sigma, sigma_cutoff, frequencies,
(lapack_complex_double *)eigenvectors, triplets, num_triplets,
triplet_weights, bzgrid, fc3, is_compact_fc3, svecs, multi_dims,
multiplicity, masses, p2s_map, s2p_map, band_indices, temperatures,
is_NU, symmetrize_fc3_q, cutoff_frequency, make_r0_average,
triplet_weights, bzgrid, fc3, is_compact_fc3, atom_triplets, masses,
band_indices, temperatures, is_NU, symmetrize_fc3_q, cutoff_frequency,
openmp_per_triplets);
free(atom_triplets);
atom_triplets = NULL;
free(bzgrid);
bzgrid = NULL;
@ -600,7 +658,7 @@ void ph3py_expand_collision_matrix(double *collision_matrix,
j * num_column * num_column);
#ifdef _OPENMP
#pragma omp parallel for private(ir_gp, adrs_shift_plus, colmat_copy, l, gp_r, \
m, n, p)
m, n, p)
#endif
for (k = 0; k < num_ir_gp; k++) {
ir_gp = ir_grid_points[k];

View File

@ -51,7 +51,8 @@ long ph3py_get_interaction(
const long multi_dims[2], const long (*multi)[2], const double *masses,
const long *p2s_map, const long *s2p_map, const long *band_indices,
const long symmetrize_fc3_q, const long make_r0_average,
const double cutoff_frequency, const long openmp_per_triplets);
const char *all_shortest, const double cutoff_frequency,
const long openmp_per_triplets);
long ph3py_get_pp_collision(
double *imag_self_energy,
const long relative_grid_address[24][4][3], /* thm */
@ -64,8 +65,8 @@ long ph3py_get_pp_collision(
const long multi_dims[2], const long (*multi)[2], const double *masses,
const long *p2s_map, const long *s2p_map, const Larray *band_indices,
const Darray *temperatures, const long is_NU, const long symmetrize_fc3_q,
const double make_r0_average, const double cutoff_frequency,
const long openmp_per_triplets);
const long make_r0_average, const char *all_shortest,
const double cutoff_frequency, const long openmp_per_triplets);
long ph3py_get_pp_collision_with_sigma(
double *imag_self_energy, const double sigma, const double sigma_cutoff,
const double *frequencies, const _lapack_complex_double *eigenvectors,
@ -76,8 +77,8 @@ long ph3py_get_pp_collision_with_sigma(
const long multi_dims[2], const long (*multi)[2], const double *masses,
const long *p2s_map, const long *s2p_map, const Larray *band_indices,
const Darray *temperatures, const long is_NU, const long symmetrize_fc3_q,
const double make_r0_average, const double cutoff_frequency,
const long openmp_per_triplets);
const long make_r0_average, const char *all_shortest,
const double cutoff_frequency, const long openmp_per_triplets);
void ph3py_get_imag_self_energy_at_bands_with_g(
double *imag_self_energy, const Darray *fc3_normal_squared,
const double *frequencies, const long (*triplets)[3],

View File

@ -42,6 +42,7 @@
#include "lapack_wrapper.h"
#include "phonoc_array.h"
#include "phonoc_utils.h"
#include "real_to_reciprocal.h"
#include "triplet.h"
#include "triplet_iw.h"
@ -51,12 +52,9 @@ static void get_collision(
const char *g_zero, const double *frequencies,
const lapack_complex_double *eigenvectors, const long triplet[3],
const long triplet_weight, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long make_r0_average,
const long openmp_per_triplets);
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets);
static void finalize_ise(double *imag_self_energy, const double *ise,
const long (*bz_grid_address)[3],
const long (*triplets)[3], const long num_triplets,
@ -69,12 +67,10 @@ void ppc_get_pp_collision(
const double *frequencies, const lapack_complex_double *eigenvectors,
const long (*triplets)[3], const long num_triplets,
const long *triplet_weights, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const Larray *band_indices, const Darray *temperatures, const long is_NU,
const long symmetrize_fc3_q, const double cutoff_frequency,
const long make_r0_average, const long openmp_per_triplets) {
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const Larray *band_indices,
const Darray *temperatures, const long is_NU, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets) {
long i;
long num_band, num_band0, num_band_prod, num_temps;
double *ise, *freqs_at_gp, *g;
@ -87,7 +83,7 @@ void ppc_get_pp_collision(
g_zero = NULL;
num_band0 = band_indices->dims[0];
num_band = multi_dims[1] * 3;
num_band = atom_triplets->multi_dims[1] * 3;
num_band_prod = num_band0 * num_band * num_band;
num_temps = temperatures->dims[0];
ise =
@ -103,7 +99,7 @@ void ppc_get_pp_collision(
#ifdef _OPENMP
#pragma omp parallel for schedule(guided) private( \
g, g_zero) if (openmp_per_triplets)
g, g_zero) if (openmp_per_triplets)
#endif
for (i = 0; i < num_triplets; i++) {
g = (double *)malloc(sizeof(double) * 2 * num_band_prod);
@ -118,9 +114,8 @@ void ppc_get_pp_collision(
get_collision(ise + i * num_temps * num_band0, num_band0, num_band,
num_temps, temperatures->data, g, g_zero, frequencies,
eigenvectors, triplets[i], triplet_weights[i], bzgrid,
fc3, is_compact_fc3, svecs, multi_dims, multiplicity,
masses, p2s_map, s2p_map, band_indices->data,
symmetrize_fc3_q, cutoff_frequency, make_r0_average,
fc3, is_compact_fc3, atom_triplets, masses,
band_indices->data, symmetrize_fc3_q, cutoff_frequency,
openmp_per_triplets);
free(g_zero);
@ -143,12 +138,10 @@ void ppc_get_pp_collision_with_sigma(
const double *frequencies, const lapack_complex_double *eigenvectors,
const long (*triplets)[3], const long num_triplets,
const long *triplet_weights, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const Larray *band_indices, const Darray *temperatures, const long is_NU,
const long symmetrize_fc3_q, const double cutoff_frequency,
const long make_r0_average, const long openmp_per_triplets) {
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const Larray *band_indices,
const Darray *temperatures, const long is_NU, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets) {
long i;
long num_band, num_band0, num_band_prod, num_temps;
long const_adrs_shift;
@ -162,7 +155,7 @@ void ppc_get_pp_collision_with_sigma(
g_zero = NULL;
num_band0 = band_indices->dims[0];
num_band = multi_dims[1] * 3;
num_band = atom_triplets->multi_dims[1] * 3;
num_band_prod = num_band0 * num_band * num_band;
num_temps = temperatures->dims[0];
const_adrs_shift = num_band_prod;
@ -179,7 +172,7 @@ void ppc_get_pp_collision_with_sigma(
#ifdef _OPENMP
#pragma omp parallel for schedule(guided) private( \
g, g_zero) if (openmp_per_triplets)
g, g_zero) if (openmp_per_triplets)
#endif
for (i = 0; i < num_triplets; i++) {
g = (double *)malloc(sizeof(double) * 2 * num_band_prod);
@ -191,9 +184,8 @@ void ppc_get_pp_collision_with_sigma(
get_collision(ise + i * num_temps * num_band0, num_band0, num_band,
num_temps, temperatures->data, g, g_zero, frequencies,
eigenvectors, triplets[i], triplet_weights[i], bzgrid,
fc3, is_compact_fc3, svecs, multi_dims, multiplicity,
masses, p2s_map, s2p_map, band_indices->data,
symmetrize_fc3_q, cutoff_frequency, make_r0_average,
fc3, is_compact_fc3, atom_triplets, masses,
band_indices->data, symmetrize_fc3_q, cutoff_frequency,
openmp_per_triplets);
free(g_zero);
@ -217,12 +209,9 @@ static void get_collision(
const char *g_zero, const double *frequencies,
const lapack_complex_double *eigenvectors, const long triplet[3],
const long triplet_weight, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long make_r0_average,
const long openmp_per_triplets) {
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const long *band_indices, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets) {
long i;
long num_band_prod, num_g_pos;
double *fc3_normal_squared;
@ -243,9 +232,9 @@ static void get_collision(
itr_get_interaction_at_triplet(
fc3_normal_squared, num_band0, num_band, g_pos, num_g_pos, frequencies,
eigenvectors, triplet, bzgrid, fc3, is_compact_fc3, svecs, multi_dims,
multiplicity, masses, p2s_map, s2p_map, band_indices, symmetrize_fc3_q,
cutoff_frequency, 0, 0, make_r0_average, 1 - openmp_per_triplets);
eigenvectors, triplet, bzgrid, fc3, is_compact_fc3, atom_triplets,
masses, band_indices, symmetrize_fc3_q, cutoff_frequency, 0, 0,
1 - openmp_per_triplets);
ise_imag_self_energy_at_triplet(
ise, num_band0, num_band, fc3_normal_squared, frequencies, triplet,

View File

@ -38,6 +38,7 @@
#include "bzgrid.h"
#include "lapack_wrapper.h"
#include "phonoc_array.h"
#include "real_to_reciprocal.h"
void ppc_get_pp_collision(
double *imag_self_energy,
@ -45,22 +46,18 @@ void ppc_get_pp_collision(
const double *frequencies, const lapack_complex_double *eigenvectors,
const long (*triplets)[3], const long num_triplets,
const long *triplet_weights, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const Larray *band_indices, const Darray *temperatures, const long is_NU,
const long symmetrize_fc3_q, const double cutoff_frequency,
const long make_r0_average, const long openmp_per_triplets);
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const Larray *band_indices,
const Darray *temperatures, const long is_NU, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets);
void ppc_get_pp_collision_with_sigma(
double *imag_self_energy, const double sigma, const double sigma_cutoff,
const double *frequencies, const lapack_complex_double *eigenvectors,
const long (*triplets)[3], const long num_triplets,
const long *triplet_weights, const ConstBZGrid *bzgrid, const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const double *masses, const long *p2s_map, const long *s2p_map,
const Larray *band_indices, const Darray *temperatures, const long is_NU,
const long symmetrize_fc3_q, const double cutoff_frequency,
const long make_r0_average, const long openmp_per_triplets);
const long is_compact_fc3, const AtomTriplets *atom_triplets,
const double *masses, const Larray *band_indices,
const Darray *temperatures, const long is_NU, const long symmetrize_fc3_q,
const double cutoff_frequency, const long openmp_per_triplets);
#endif

View File

@ -43,161 +43,194 @@
#include "phonoc_array.h"
#include "phonoc_const.h"
static void real_to_reciprocal(
lapack_complex_double *fc3_reciprocal, const double q_vecs[3][3],
const double *fc3, const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const long *p2s_map, const long *s2p_map, const long make_r0_average,
const long openmp_at_bands);
static void real_to_reciprocal_elements(
lapack_complex_double *fc3_rec_elem, const double q1[3], const double q2[3],
const double *fc3, const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2], const long *p2s,
const long *s2p, const long pi0, const long pi1, const long pi2);
static void real_to_reciprocal_legacy(lapack_complex_double *fc3_reciprocal,
const double q_vecs[3][3],
const double *fc3,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long openmp_at_bands);
static void real_to_reciprocal_r0_average(lapack_complex_double *fc3_reciprocal,
const double q_vecs[3][3],
const double *fc3,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long openmp_at_bands);
static void real_to_reciprocal_elements(lapack_complex_double *fc3_rec_elem,
const double q1[3], const double q2[3],
const double *fc3,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long pi0, const long pi1,
const long pi2, const long leg_index);
static lapack_complex_double get_phase_factor(const double q[3],
const double (*svecs)[3],
const long multi[2]);
static lapack_complex_double get_pre_phase_factor(const long i_patom,
const double q_vecs[3][3],
const double (*svecs)[3],
const long multi_dims[2],
const long (*multiplicity)[2],
const long *p2s_map);
static lapack_complex_double get_pre_phase_factor(
const long i_patom, const double q_vecs[3][3],
const AtomTriplets *atom_triplets);
static lapack_complex_double sum_lapack_complex_double(lapack_complex_double a,
lapack_complex_double b);
/* fc3_reciprocal[num_patom, num_patom, num_patom, 3, 3, 3] */
void r2r_real_to_reciprocal(lapack_complex_double *fc3_reciprocal,
const double q_vecs[3][3], const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2],
const long (*multiplicity)[2], const long *p2s_map,
const long *s2p_map, const long make_r0_average,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long openmp_at_bands) {
real_to_reciprocal(fc3_reciprocal, q_vecs, fc3, is_compact_fc3, svecs,
multi_dims, multiplicity, p2s_map, s2p_map,
make_r0_average, openmp_at_bands);
long i, num_band;
if (atom_triplets->make_r0_average) {
real_to_reciprocal_r0_average(fc3_reciprocal, q_vecs, fc3,
is_compact_fc3, atom_triplets,
openmp_at_bands);
num_band = atom_triplets->multi_dims[1] * 3;
for (i = 0; i < num_band * num_band * num_band; i++) {
fc3_reciprocal[i] = lapack_make_complex_double(
lapack_complex_double_real(fc3_reciprocal[i]) / 3,
lapack_complex_double_imag(fc3_reciprocal[i]) / 3);
}
} else {
real_to_reciprocal_legacy(fc3_reciprocal, q_vecs, fc3, is_compact_fc3,
atom_triplets, openmp_at_bands);
}
}
static void real_to_reciprocal(
lapack_complex_double *fc3_reciprocal, const double q_vecs[3][3],
const double *fc3, const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2],
const long *p2s_map, const long *s2p_map, const long make_r0_average,
const long openmp_at_bands) {
long i, j, k, l, m, n, jk, ik, ji;
static void real_to_reciprocal_legacy(lapack_complex_double *fc3_reciprocal,
const double q_vecs[3][3],
const double *fc3,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long openmp_at_bands) {
long i, j, k, l, m, n, ijk;
long num_patom, num_band;
lapack_complex_double pre_phase_factor, fc3_rec_elem[27], fc3_rec;
num_patom = multi_dims[1];
num_patom = atom_triplets->multi_dims[1];
num_band = num_patom * 3;
for (i = 0; i < num_patom; i++) {
pre_phase_factor = get_pre_phase_factor(i, q_vecs, svecs, multi_dims,
multiplicity, p2s_map);
#ifdef _OPENMP
#pragma omp parallel for private(j, k, l, m, n, fc3_rec_elem, \
fc3_rec) if (openmp_at_bands)
#pragma omp parallel for private(i, j, k, l, m, n, fc3_rec_elem, fc3_rec, \
pre_phase_factor) if (openmp_at_bands)
#endif
for (jk = 0; jk < num_patom * num_patom; jk++) {
j = jk / num_patom;
k = jk % num_patom;
real_to_reciprocal_elements(
fc3_rec_elem, q_vecs[1], q_vecs[2], fc3, is_compact_fc3, svecs,
multi_dims, multiplicity, p2s_map, s2p_map, i, j, k);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[l * 9 + m * 3 + n], pre_phase_factor);
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band *
num_band +
(j * 3 + m) * num_band + k * 3 +
n],
fc3_rec);
}
}
}
}
}
for (ijk = 0; ijk < num_patom * num_patom * num_patom; ijk++) {
i = ijk / (num_patom * num_patom);
j = (ijk - (i * num_patom * num_patom)) / num_patom;
k = ijk % num_patom;
if (make_r0_average) {
for (j = 0; j < num_patom; j++) {
pre_phase_factor = get_pre_phase_factor(
j, q_vecs, svecs, multi_dims, multiplicity, p2s_map);
#ifdef _OPENMP
#pragma omp parallel for private(i, k, l, m, n, fc3_rec_elem, \
fc3_rec) if (openmp_at_bands)
#endif
for (ik = 0; ik < num_patom * num_patom; ik++) {
i = ik / num_patom;
k = ik % num_patom;
real_to_reciprocal_elements(
fc3_rec_elem, q_vecs[0], q_vecs[2], fc3, is_compact_fc3,
svecs, multi_dims, multiplicity, p2s_map, s2p_map, j, i, k);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[m * 9 + l * 3 + n],
pre_phase_factor);
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band *
num_band +
(j * 3 + m) * num_band +
k * 3 + n],
fc3_rec);
}
}
}
}
}
pre_phase_factor = get_pre_phase_factor(i, q_vecs, atom_triplets);
for (k = 0; k < num_patom; k++) {
pre_phase_factor = get_pre_phase_factor(
k, q_vecs, svecs, multi_dims, multiplicity, p2s_map);
#ifdef _OPENMP
#pragma omp parallel for private(j, i, l, m, n, fc3_rec_elem, \
fc3_rec) if (openmp_at_bands)
#endif
for (ji = 0; ji < num_patom * num_patom; ji++) {
j = ji / num_patom;
i = ji % num_patom;
real_to_reciprocal_elements(
fc3_rec_elem, q_vecs[1], q_vecs[0], fc3, is_compact_fc3,
svecs, multi_dims, multiplicity, p2s_map, s2p_map, k, j, i);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[n * 9 + m * 3 + l],
pre_phase_factor);
real_to_reciprocal_elements(fc3_rec_elem, q_vecs[1], q_vecs[2], fc3,
is_compact_fc3, atom_triplets, i, j, k, 0);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[l * 9 + m * 3 + n], pre_phase_factor);
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band *
num_band +
(j * 3 + m) * num_band +
k * 3 + n],
fc3_rec);
}
}
(j * 3 + m) * num_band + k * 3 + n],
fc3_rec);
}
}
}
}
}
static void real_to_reciprocal_elements(
lapack_complex_double *fc3_rec_elem, const double q1[3], const double q2[3],
const double *fc3, const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2], const long (*multiplicity)[2], const long *p2s,
const long *s2p, const long pi0, const long pi1, const long pi2) {
// Summations are performed with respect to three different lattice reference
// point for the index of real space fc3 when make_r0_average=True. For cubic
// case, these three are roughly equivalent but small difference comes from the
// q-points in triplets used for summation implemented in
// real_to_reciprocal_elements().
// --sym-fc3q makes them almost equivalent.
static void real_to_reciprocal_r0_average(lapack_complex_double *fc3_reciprocal,
const double q_vecs[3][3],
const double *fc3,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long openmp_at_bands) {
long i, j, k, l, m, n, ijk;
long num_patom, num_band;
lapack_complex_double pre_phase_factor, fc3_rec_elem[27], fc3_rec;
num_patom = atom_triplets->multi_dims[1];
num_band = num_patom * 3;
#ifdef _OPENMP
#pragma omp parallel for private(i, j, k, l, m, n, fc3_rec_elem, fc3_rec, \
pre_phase_factor) if (openmp_at_bands)
#endif
for (ijk = 0; ijk < num_patom * num_patom * num_patom; ijk++) {
i = ijk / (num_patom * num_patom);
j = (ijk - (i * num_patom * num_patom)) / num_patom;
k = ijk % num_patom;
pre_phase_factor = get_pre_phase_factor(i, q_vecs, atom_triplets);
real_to_reciprocal_elements(fc3_rec_elem, q_vecs[1], q_vecs[2], fc3,
is_compact_fc3, atom_triplets, i, j, k, 1);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[l * 9 + m * 3 + n], pre_phase_factor);
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n],
fc3_rec);
}
}
}
// fc3_rec is stored in a way swapping jm <-> il.
pre_phase_factor = get_pre_phase_factor(j, q_vecs, atom_triplets);
real_to_reciprocal_elements(fc3_rec_elem, q_vecs[0], q_vecs[2], fc3,
is_compact_fc3, atom_triplets, j, i, k, 2);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[m * 9 + l * 3 + n], pre_phase_factor);
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n],
fc3_rec);
}
}
}
// fc3_rec is stored in a way swapping kn <-> il.
pre_phase_factor = get_pre_phase_factor(k, q_vecs, atom_triplets);
real_to_reciprocal_elements(fc3_rec_elem, q_vecs[1], q_vecs[0], fc3,
is_compact_fc3, atom_triplets, k, j, i, 3);
for (l = 0; l < 3; l++) {
for (m = 0; m < 3; m++) {
for (n = 0; n < 3; n++) {
fc3_rec = phonoc_complex_prod(
fc3_rec_elem[n * 9 + m * 3 + l], pre_phase_factor);
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n] =
sum_lapack_complex_double(
fc3_reciprocal[(i * 3 + l) * num_band * num_band +
(j * 3 + m) * num_band + k * 3 + n],
fc3_rec);
}
}
}
}
}
static void real_to_reciprocal_elements(lapack_complex_double *fc3_rec_elem,
const double q1[3], const double q2[3],
const double *fc3,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long pi0, const long pi1,
const long pi2, const long leg_index) {
long i, j, k, l;
long num_satom, adrs_shift, adrs_vec1, adrs_vec2;
lapack_complex_double phase_factor, phase_factor1, phase_factor2;
@ -208,36 +241,60 @@ static void real_to_reciprocal_elements(
fc3_rec_imag[i] = 0;
}
num_satom = multi_dims[0];
num_satom = atom_triplets->multi_dims[0];
if (is_compact_fc3) {
i = pi0;
} else {
i = p2s[pi0];
i = atom_triplets->p2s_map[pi0];
}
for (j = 0; j < num_satom; j++) {
if (s2p[j] != p2s[pi1]) {
if (atom_triplets->s2p_map[j] != atom_triplets->p2s_map[pi1]) {
continue;
}
adrs_vec1 = j * multi_dims[1] + pi0;
phase_factor1 = get_phase_factor(q1, svecs, multiplicity[adrs_vec1]);
adrs_vec1 = j * atom_triplets->multi_dims[1] + pi0;
phase_factor1 = get_phase_factor(
q1, atom_triplets->svecs, atom_triplets->multiplicity[adrs_vec1]);
for (k = 0; k < num_satom; k++) {
if (s2p[k] != p2s[pi2]) {
if (atom_triplets->s2p_map[k] != atom_triplets->p2s_map[pi2]) {
continue;
}
adrs_vec2 = k * multi_dims[1] + pi0;
if (leg_index > 1) {
if (atom_triplets->all_shortest[pi0 * num_satom * num_satom +
j * num_satom + k]) {
continue;
}
}
adrs_vec2 = k * atom_triplets->multi_dims[1] + pi0;
phase_factor2 =
get_phase_factor(q2, svecs, multiplicity[adrs_vec2]);
get_phase_factor(q2, atom_triplets->svecs,
atom_triplets->multiplicity[adrs_vec2]);
adrs_shift =
i * 27 * num_satom * num_satom + j * 27 * num_satom + k * 27;
phase_factor = phonoc_complex_prod(phase_factor1, phase_factor2);
for (l = 0; l < 27; l++) {
fc3_rec_real[l] += lapack_complex_double_real(phase_factor) *
fc3[adrs_shift + l];
fc3_rec_imag[l] += lapack_complex_double_imag(phase_factor) *
fc3[adrs_shift + l];
if ((leg_index == 1) &&
(atom_triplets->all_shortest[pi0 * num_satom * num_satom +
j * num_satom + k])) {
for (l = 0; l < 27; l++) {
fc3_rec_real[l] +=
lapack_complex_double_real(phase_factor) *
fc3[adrs_shift + l] * 3;
fc3_rec_imag[l] +=
lapack_complex_double_imag(phase_factor) *
fc3[adrs_shift + l] * 3;
}
} else {
for (l = 0; l < 27; l++) {
fc3_rec_real[l] +=
lapack_complex_double_real(phase_factor) *
fc3[adrs_shift + l];
fc3_rec_imag[l] +=
lapack_complex_double_imag(phase_factor) *
fc3[adrs_shift + l];
}
}
}
}
@ -248,33 +305,26 @@ static void real_to_reciprocal_elements(
}
}
static lapack_complex_double get_pre_phase_factor(const long i_patom,
const double q_vecs[3][3],
const double (*svecs)[3],
const long multi_dims[2],
const long (*multiplicity)[2],
const long *p2s_map) {
long i, j, svecs_adrs;
double pre_phase, sum_real, sum_imag;
// This function doesn't need to think about position +
// lattice-translation because q+q'+q''=G.
static lapack_complex_double get_pre_phase_factor(
const long i_patom, const double q_vecs[3][3],
const AtomTriplets *atom_triplets) {
long j, svecs_adrs;
double pre_phase;
lapack_complex_double pre_phase_factor;
svecs_adrs = p2s_map[i_patom] * multi_dims[1];
sum_real = 0;
sum_imag = 0;
for (i = 0; i < multiplicity[svecs_adrs][0]; i++) {
pre_phase = 0;
for (j = 0; j < 3; j++) {
pre_phase += svecs[multiplicity[svecs_adrs][1] + i][j] *
(q_vecs[0][j] + q_vecs[1][j] + q_vecs[2][j]);
}
pre_phase *= M_2PI;
sum_real += cos(pre_phase);
sum_imag += sin(pre_phase);
svecs_adrs = atom_triplets->p2s_map[i_patom] * atom_triplets->multi_dims[1];
pre_phase = 0;
for (j = 0; j < 3; j++) {
pre_phase +=
atom_triplets
->svecs[atom_triplets->multiplicity[svecs_adrs][1]][j] *
(q_vecs[0][j] + q_vecs[1][j] + q_vecs[2][j]);
}
sum_real /= multiplicity[svecs_adrs][0];
sum_imag /= multiplicity[svecs_adrs][0];
pre_phase_factor = lapack_make_complex_double(sum_real, sum_imag);
pre_phase *= M_2PI;
pre_phase_factor =
lapack_make_complex_double(cos(pre_phase), sin(pre_phase));
return pre_phase_factor;
}

View File

@ -38,11 +38,19 @@
#include "lapack_wrapper.h"
#include "phonoc_array.h"
typedef struct {
const double (*svecs)[3];
long multi_dims[2];
const long (*multiplicity)[2];
const long *p2s_map;
const long *s2p_map;
long make_r0_average;
const char *all_shortest;
} AtomTriplets;
void r2r_real_to_reciprocal(lapack_complex_double *fc3_reciprocal,
const double q_vecs[3][3], const double *fc3,
const long is_compact_fc3, const double (*svecs)[3],
const long multi_dims[2],
const long (*multiplicity)[2], const long *p2s_map,
const long *s2p_map, const long make_r0_average,
const long is_compact_fc3,
const AtomTriplets *atom_triplets,
const long openmp_at_bands);
#endif

View File

@ -2,6 +2,17 @@
# Change Log
## Dec-25-2023: Version 2.9.0
- Pre-release of version 3.0.
- `--v3` option enables phono3py version 3 behaviour. In phono3py-v3, it is
planned to replace $\sum_{l'l''}\Phi_{\alpha\beta\gamma}(0\kappa, l'\kappa',
l''\kappa'') \cdots$ in Eq.(41) of
<https://journals.jps.jp/doi/10.7566/JPSJ.92.012001> by
$[\sum_{l'l''}\Phi_{\alpha\beta\gamma}(0\kappa, l'\kappa', l''\kappa'') \cdots + \sum_{ll''}\Phi_{\alpha\beta\gamma}(l\kappa, 0\kappa', l''\kappa'') \cdots + \sum_{ll'}\Phi_{\alpha\beta\gamma}(l\kappa, l'\kappa', 0\kappa'') \cdots] / 3$
for better treatment of lattice sum in supercell although this requires more
computational demand. In phono3py-v3, `--v2` option will be prepared.
## Dec-4-2023: Version 2.8.0
- Maintenance release

View File

@ -57,9 +57,9 @@ copyright = "2015, Atsushi Togo"
# built documents.
#
# The short X.Y version.
version = "2.8"
version = "2.9"
# The full version, including alpha/beta/rc tags.
release = "2.8.0"
release = "2.9.0"
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -33,8 +33,6 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
import warnings
import numpy as np
from phonopy.units import VaspToTHz
@ -53,7 +51,6 @@ class Phono3pyIsotope:
sigmas=None,
frequency_factor_to_THz=VaspToTHz,
use_grg=False,
store_dense_gp_map=True,
symprec=1e-5,
cutoff_frequency=None,
lapack_zheev_uplo="L",
@ -66,13 +63,6 @@ class Phono3pyIsotope:
else:
self._sigmas = sigmas
if not store_dense_gp_map:
warnings.warn(
"Phono3pyIsotope init parameter of store_dense_gp_map is deprecated. "
"This will be always set True.",
DeprecationWarning,
)
self._iso = Isotope(
mesh,
primitive,
@ -80,7 +70,6 @@ class Phono3pyIsotope:
band_indices=band_indices,
frequency_factor_to_THz=frequency_factor_to_THz,
use_grg=use_grg,
store_dense_gp_map=store_dense_gp_map,
symprec=symprec,
cutoff_frequency=cutoff_frequency,
lapack_zheev_uplo=lapack_zheev_uplo,

View File

@ -33,8 +33,6 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
import warnings
import numpy as np
from phonopy.structure.cells import Primitive, Supercell
from phonopy.structure.symmetry import Symmetry
@ -72,7 +70,6 @@ class Phono3pyJointDos:
SNF_coordinates="reciprocal",
is_mesh_symmetry=True,
is_symmetry=True,
store_dense_gp_map=True,
symprec=1e-5,
output_filename=None,
log_level=0,
@ -94,14 +91,6 @@ class Phono3pyJointDos:
self._is_mesh_symmetry = is_mesh_symmetry
self._is_symmetry = is_symmetry
if not store_dense_gp_map:
warnings.warn(
"Phono3pyJointDos init parameter of store_dense_gp_map is deprecated. "
"This will be set always True.",
DeprecationWarning,
)
self._store_dense_gp_map = store_dense_gp_map
self._use_grg = use_grg
self._SNF_coordinates = SNF_coordinates
self._symprec = symprec
@ -165,7 +154,7 @@ class Phono3pyJointDos:
use_grg=self._use_grg,
force_SNF=False,
SNF_coordinates=self._SNF_coordinates,
store_dense_gp_map=self._store_dense_gp_map,
store_dense_gp_map=True,
)
def initialize(self, mesh_numbers):
@ -180,7 +169,6 @@ class Phono3pyJointDos:
frequency_factor_to_THz=self._frequency_factor_to_THz,
frequency_scale_factor=self._frequency_scale_factor,
is_mesh_symmetry=self._is_mesh_symmetry,
store_dense_gp_map=self._store_dense_gp_map,
symprec=self._symprec,
filename=self._filename,
log_level=self._log_level,

View File

@ -34,7 +34,8 @@
# POSSIBILITY OF SUCH DAMAGE.
import warnings
from typing import Optional
from collections.abc import Sequence
from typing import Optional, Union
import numpy as np
from phonopy.exception import ForceCalculatorRequiredError
@ -152,13 +153,10 @@ class Phono3py:
is_mesh_symmetry=True,
use_grg=False,
SNF_coordinates="reciprocal",
symmetrize_fc3q=None,
store_dense_gp_map=True,
store_dense_svecs=True,
make_r0_average: bool = False,
symprec=1e-5,
calculator: Optional[str] = None,
log_level=0,
lapack_zheev_uplo=None,
):
"""Init method.
@ -212,14 +210,11 @@ class Phono3py:
`reciprocal` or `direct`. Space of coordinates to generate grid
generating matrix either in direct or reciprocal space. The default
is `reciprocal`.
symmetrize_fc3q : Deprecated.
See Phono3py.init_phph_interaction().
store_dense_gp_map : bool, optional, Deprecated.
Use dense format of BZ grid system. Default is True.
store_dense_svecs : bool, optional, Deprecated.
Shortest vectors are stored in the dense array format. This is
expected to be always True. Setting False is for rough compatibility
with v1.x. Default is True.
make_r0_average : bool, optional
fc3 transformation from real to reciprocal space is done
around three atoms and averaged when True. Default is False, i.e.,
only around the first atom. Setting False is for rough compatibility
with v2.x. Default is True.
symprec : float, optional
Tolerance used to find crystal symmetry. Default is 1e-5.
calculator : str, optional.
@ -227,8 +222,6 @@ class Phono3py:
of physical units. Default is None, which is equivalent to "vasp".
log_level : int, optional
Verbosity control. Default is 0. This can be 0, 1, or 2.
lapack_zheev_uplo : Deprecated.
See Phono3py.init_phph_interaction().
"""
self._symprec = symprec
@ -238,21 +231,7 @@ class Phono3py:
self._use_grg = use_grg
self._SNF_coordinates = SNF_coordinates
if not store_dense_gp_map:
warnings.warn(
"Phono3py init parameter of store_dense_gp_map is deprecated. "
"This will be set always True.",
DeprecationWarning,
)
self._store_dense_gp_map = store_dense_gp_map
if not store_dense_svecs:
warnings.warn(
"Phono3py init parameter of store_dense_svecs is deprecated. "
"This will be set always True.",
DeprecationWarning,
)
self._store_dense_svecs = store_dense_svecs
self._make_r0_average = make_r0_average
self._cutoff_frequency = cutoff_frequency
self._calculator: Optional[str] = calculator
@ -360,26 +339,6 @@ class Phono3py:
)
self.sigma_cutoff = sigma_cutoff
if symmetrize_fc3q is not None:
warnings.warn(
"Phono3py init parameter of symmetrize_fc3q is deprecated. "
"Set this at Phono3py.init_phph_interaction().",
DeprecationWarning,
)
self._symmetrize_fc3q = symmetrize_fc3q
else:
self._symmetrize_fc3q = None
if lapack_zheev_uplo is not None:
warnings.warn(
"Phono3py init parameter of lapack_zheev_uplo is deprecated. "
"Set this at Phono3py.init_phph_interaction().",
DeprecationWarning,
)
self._lapack_zheev_uplo = lapack_zheev_uplo
else:
self._lapack_zheev_uplo = None
@property
def version(self):
"""Return phono3py release version number.
@ -1041,7 +1000,7 @@ class Phono3py:
return self._bz_grid.D_diag
@mesh_numbers.setter
def mesh_numbers(self, mesh_numbers):
def mesh_numbers(self, mesh_numbers: Union[int, float, Sequence, np.ndarray]):
self._set_mesh_numbers(mesh_numbers)
@property
@ -1330,8 +1289,7 @@ class Phono3py:
nac_q_direction=None,
constant_averaged_interaction=None,
frequency_scale_factor=None,
symmetrize_fc3q=False,
make_r0_average=False,
symmetrize_fc3q: bool = False,
lapack_zheev_uplo="L",
openmp_per_triplets=None,
):
@ -1366,10 +1324,6 @@ class Phono3py:
symmetrize_fc3q : bool, optional
fc3 in phonon space is symmetrized by permutation symmetry.
Default is False.
make_r0_average : bool, optional
fc3 transformation from real to reciprocal space is done
around three atoms and averaged when True. Default is False, i.e.,
only around the first atom.
lapack_zheev_uplo : str, optional
'L' or 'U'. Default is 'L'. This is passed to LAPACK zheev
used for phonon solver.
@ -1388,16 +1342,6 @@ class Phono3py:
msg = "Phono3py.fc2 of instance is not found."
raise RuntimeError(msg)
if self._symmetrize_fc3q is None:
_symmetrize_fc3q = symmetrize_fc3q
else:
_symmetrize_fc3q = self._symmetrize_fc3q
if self._lapack_zheev_uplo is None:
_lapack_zheev_uplo = lapack_zheev_uplo
else:
_lapack_zheev_uplo = self._lapack_zheev_uplo
self._interaction = Interaction(
self._primitive,
self._bz_grid,
@ -1409,9 +1353,9 @@ class Phono3py:
frequency_scale_factor=frequency_scale_factor,
cutoff_frequency=self._cutoff_frequency,
is_mesh_symmetry=self._is_mesh_symmetry,
symmetrize_fc3q=_symmetrize_fc3q,
make_r0_average=make_r0_average,
lapack_zheev_uplo=_lapack_zheev_uplo,
symmetrize_fc3q=symmetrize_fc3q,
make_r0_average=self._make_r0_average,
lapack_zheev_uplo=lapack_zheev_uplo,
openmp_per_triplets=openmp_per_triplets,
)
self._interaction.nac_q_direction = nac_q_direction
@ -2544,9 +2488,7 @@ class Phono3py:
else:
t_mat = np.dot(inv_supercell_matrix, primitive_matrix)
return get_primitive(
supercell, t_mat, self._symprec, store_dense_svecs=self._store_dense_svecs
)
return get_primitive(supercell, t_mat, self._symprec, store_dense_svecs=True)
def _determine_primitive_matrix(self, primitive_matrix):
pmat = get_primitive_matrix(primitive_matrix, symprec=self._symprec)
@ -2555,7 +2497,10 @@ class Phono3py:
else:
return pmat
def _set_mesh_numbers(self, mesh):
def _set_mesh_numbers(
self,
mesh: Union[int, float, Sequence, np.ndarray],
):
# initialization related to mesh
self._interaction = None
@ -2567,7 +2512,7 @@ class Phono3py:
use_grg=self._use_grg,
force_SNF=False,
SNF_coordinates=self._SNF_coordinates,
store_dense_gp_map=self._store_dense_gp_map,
store_dense_gp_map=True,
)
def _init_dynamical_matrix(self):

View File

@ -504,9 +504,7 @@ class ConductivityLBTEBase(ConductivityBase):
self._collision.run_interaction(is_full_pp=self._is_full_pp)
if self._is_full_pp and j == 0:
self._averaged_pp_interaction[
i_gp
] = self._pp.get_averaged_interaction()
self._averaged_pp_interaction[i_gp] = self._pp.averaged_interaction
for k, t in enumerate(self._temperatures):
self._collision.temperature = t

View File

@ -115,7 +115,7 @@ class ConductivityRTABase(ConductivityBase):
log_level=log_level,
)
self._use_const_ave_pp = self._pp.get_constant_averaged_interaction()
self._use_const_ave_pp = self._pp.constant_averaged_interaction
self._read_pp = read_pp
self._store_pp = store_pp
self._pp_filename = pp_filename
@ -262,10 +262,10 @@ class ConductivityRTABase(ConductivityBase):
if self._log_level:
print(
"Constant ph-ph interaction of %6.3e is used."
% self._pp.get_constant_averaged_interaction()
% self._pp.constant_averaged_interaction
)
self._collision.run_interaction()
self._averaged_pp_interaction[i] = self._pp.get_averaged_interaction()
self._averaged_pp_interaction[i] = self._pp.averaged_interaction
elif j != 0 and (self._is_full_pp or self._sigma_cutoff is None):
if self._log_level:
print("Existing ph-ph interaction is used.")
@ -274,9 +274,7 @@ class ConductivityRTABase(ConductivityBase):
print("Calculating ph-ph interaction...")
self._collision.run_interaction(is_full_pp=self._is_full_pp)
if self._is_full_pp:
self._averaged_pp_interaction[
i
] = self._pp.get_averaged_interaction()
self._averaged_pp_interaction[i] = self._pp.averaged_interaction
# Number of triplets depends on q-point.
# So this is allocated each time.
@ -304,7 +302,7 @@ class ConductivityRTABase(ConductivityBase):
k
] = self._collision.get_detailed_imag_self_energy()
def _set_gamma_at_sigmas_lowmem(self, i, make_r0_average=False):
def _set_gamma_at_sigmas_lowmem(self, i):
"""Calculate gamma without storing ph-ph interaction strength.
`svecs` and `multi` below must not be simply replaced by
@ -386,6 +384,7 @@ class ConductivityRTABase(ConductivityBase):
self._is_N_U * 1,
self._pp.symmetrize_fc3q * 1,
self._pp.make_r0_average * 1,
self._pp.all_shortest,
self._pp.cutoff_frequency,
openmp_per_triplets * 1,
)
@ -416,11 +415,12 @@ class ConductivityRTABase(ConductivityBase):
self._is_N_U * 1,
self._pp.symmetrize_fc3q * 1,
self._pp.make_r0_average * 1,
self._pp.all_shortest,
self._pp.cutoff_frequency,
openmp_per_triplets * 1,
)
col_unit_conv = self._collision.unit_conversion_factor
pp_unit_conv = self._pp.get_unit_conversion_factor()
pp_unit_conv = self._pp.unit_conversion_factor
if self._is_N_U:
col = collisions.sum(axis=0)
col_N = collisions[0]

View File

@ -42,6 +42,7 @@ import numpy as np
import phonopy.cui.load_helper as load_helper
from phonopy.harmonic.force_constants import show_drift_force_constants
from phonopy.interface.calculator import get_default_physical_units
from phonopy.structure.atoms import PhonopyAtoms
from phonopy.structure.cells import determinant
from phono3py import Phono3py
@ -52,35 +53,36 @@ from phono3py.phonon3.fc3 import show_drift_fc3
def load(
phono3py_yaml=None, # phono3py.yaml-like must be the first argument.
supercell_matrix=None,
primitive_matrix=None,
phonon_supercell_matrix=None,
is_nac=True,
calculator=None,
unitcell=None,
supercell=None,
nac_params=None,
unitcell_filename=None,
supercell_filename=None,
born_filename=None,
forces_fc3_filename: Optional[Union[os.PathLike, Sequence]] = None,
forces_fc2_filename: Optional[Union[os.PathLike, Sequence]] = None,
fc3_filename=None,
fc2_filename=None,
fc_calculator=None,
fc_calculator_options=None,
factor=None,
produce_fc=True,
is_symmetry=True,
symmetrize_fc=True,
is_mesh_symmetry=True,
is_compact_fc=False,
use_grg=False,
store_dense_gp_map=True,
store_dense_svecs=True,
symprec=1e-5,
log_level=0,
phono3py_yaml: Optional[
Union[str, bytes, os.PathLike]
] = None, # phono3py.yaml-like must be the first argument.
supercell_matrix: Optional[Union[Sequence, np.ndarray]] = None,
primitive_matrix: Optional[Union[Sequence, np.ndarray]] = None,
phonon_supercell_matrix: Optional[Union[Sequence, np.ndarray]] = None,
is_nac: bool = True,
calculator: Optional[str] = None,
unitcell: Optional[PhonopyAtoms] = None,
supercell: Optional[PhonopyAtoms] = None,
nac_params: Optional[dict] = None,
unitcell_filename: Optional[Union[str, bytes, os.PathLike]] = None,
supercell_filename: Optional[Union[str, bytes, os.PathLike]] = None,
born_filename: Optional[Union[str, bytes, os.PathLike]] = None,
forces_fc3_filename: Optional[Union[str, bytes, os.PathLike]] = None,
forces_fc2_filename: Optional[Union[str, bytes, os.PathLike]] = None,
fc3_filename: Optional[Union[str, bytes, os.PathLike]] = None,
fc2_filename: Optional[Union[str, bytes, os.PathLike]] = None,
fc_calculator: Optional[str] = None,
fc_calculator_options: Optional[str] = None,
factor: Optional[float] = None,
produce_fc: bool = True,
is_symmetry: bool = True,
symmetrize_fc: bool = True,
is_mesh_symmetry: bool = True,
is_compact_fc: bool = False,
use_grg: bool = False,
make_r0_average: bool = True,
symprec: float = 1e-5,
log_level: int = 0,
) -> Phono3py:
"""Create Phono3py instance from parameters and/or input files.
@ -229,12 +231,11 @@ def load(
cells. Default is False.
use_grg : bool, optional
Use generalized regular grid when True. Default is False.
store_dense_gp_map : bool, optional, Deprecated
Use new format of BZ grid system. Default is True.
store_dense_svecs : bool, optional, Deprecated
Shortest vectors are stored in the dense array format. This is expected
to be always True. Setting False is for rough compatibility with v1.x.
Default is True.
make_r0_average : bool, optional
fc3 transformation from real to reciprocal space is done
around three atoms and averaged when True. Default is False, i.e.,
only around the first atom. Setting False is for rough compatibility
with v2.x. Default is True.
symprec : float, optional
Tolerance used to find crystal symmetry. Default is 1e-5.
log_level : int, optional
@ -305,8 +306,7 @@ def load(
is_symmetry=is_symmetry,
is_mesh_symmetry=is_mesh_symmetry,
use_grg=use_grg,
store_dense_gp_map=store_dense_gp_map,
store_dense_svecs=store_dense_svecs,
make_r0_average=make_r0_average,
calculator=calculator,
log_level=log_level,
)

View File

@ -251,13 +251,13 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False):
default=None,
help="Supercell dimension for extra fc2",
)
parser.add_argument(
"--emulate-v2",
dest="emulate_v2",
action="store_true",
default=False,
help="Emulate v1.x grid system and shortest vectors.",
)
# parser.add_argument(
# "--emulate-v2",
# dest="emulate_v2",
# action="store_true",
# default=False,
# help="Emulate v2.x behaviour.",
# )
parser.add_argument(
"--factor",
dest="frequency_conversion_factor",
@ -281,7 +281,7 @@ def get_parser(fc_symmetry=False, is_nac=False, load_phono3py_yaml=False):
help="Read third order force constants",
)
parser.add_argument(
"--fc3-r0-average",
"--v3",
dest="is_fc3_r0_average",
action="store_true",
default=False,

View File

@ -741,6 +741,7 @@ def init_phono3py(
is_symmetry=settings.is_symmetry,
is_mesh_symmetry=settings.is_mesh_symmetry,
use_grg=settings.use_grg,
make_r0_average=settings.is_fc3_r0_average,
symprec=symprec,
calculator=interface_mode,
log_level=log_level,
@ -1036,7 +1037,6 @@ def init_phph_interaction(
constant_averaged_interaction=ave_pp,
frequency_scale_factor=updated_settings["frequency_scale_factor"],
symmetrize_fc3q=settings.is_symmetrize_fc3_q,
make_r0_average=settings.is_fc3_r0_average,
lapack_zheev_uplo=settings.lapack_zheev_uplo,
)
@ -1446,7 +1446,7 @@ def main(**argparse_control):
is_reducible_collision_matrix=settings.is_reducible_collision_matrix, # noqa E501
is_kappa_star=settings.is_kappa_star,
gv_delta_q=settings.group_velocity_delta_q,
is_full_pp=settings.is_full_pp,
is_full_pp=(settings.is_full_pp or settings.is_symmetrize_fc3_q),
pinv_cutoff=settings.pinv_cutoff,
pinv_solver=settings.pinv_solver,
pinv_method=settings.pinv_method,

View File

@ -832,7 +832,7 @@ class Phono3pyConfParser(ConfParser):
if "cutoff_pair_distance" in params:
self._settings.set_cutoff_pair_distance(params["cutoff_pair_distance"])
# Emulate v1.x grid system and shortest vectors.
# Emulate v2.x behaviour
if "emulate_v2" in params:
self._settings.set_emulate_v2(params["emulate_v2"])

View File

@ -100,7 +100,6 @@ class Isotope:
bz_grid=None,
frequency_factor_to_THz=VaspToTHz,
use_grg=False,
store_dense_gp_map=True,
symprec=1e-5,
cutoff_frequency=None,
lapack_zheev_uplo="L",
@ -146,7 +145,7 @@ class Isotope:
lattice=self._primitive.cell,
symmetry_dataset=primitive_symmetry.dataset,
use_grg=use_grg,
store_dense_gp_map=store_dense_gp_map,
store_dense_gp_map=True,
)
def set_grid_point(self, grid_point):

View File

@ -36,8 +36,10 @@
import numpy as np
from phonopy.structure.tetrahedron_method import TetrahedronMethod
from phono3py.phonon.grid import BZGrid
def get_unique_grid_points(grid_points, bz_grid):
def get_unique_grid_points(grid_points, bz_grid: BZGrid):
"""Collect grid points on tetrahedron vertices around input grid points.
Find grid points of 24 tetrahedra around each grid point and
@ -88,7 +90,7 @@ def get_unique_grid_points(grid_points, bz_grid):
def get_integration_weights(
sampling_points,
grid_values,
bz_grid,
bz_grid: BZGrid,
grid_points=None,
bzgp2irgp_map=None,
function="I",

View File

@ -37,7 +37,8 @@ import sys
import numpy as np
from phonopy.harmonic.dynamical_matrix import get_dynamical_matrix
from phonopy.structure.cells import sparse_to_dense_svecs
from phonopy.structure.atoms import PhonopyAtoms
from phonopy.structure.cells import Primitive
from phonopy.structure.grid_points import get_qpoints
from phonopy.units import VaspToTHz
@ -126,8 +127,8 @@ class Gruneisen:
self,
fc2,
fc3,
supercell,
primitive,
supercell: PhonopyAtoms,
primitive: Primitive,
nac_params=None,
nac_q_direction=None,
ion_clamped=False,
@ -151,12 +152,7 @@ class Gruneisen:
)
self._nac_q_direction = nac_q_direction
svecs, multi = self._pcell.get_smallest_vectors()
if self._pcell.store_dense_svecs:
self._svecs = svecs
self._multi = multi
else:
self._svecs, self._multi = sparse_to_dense_svecs(svecs, multi)
self._svecs, self._multi = self._pcell.get_smallest_vectors()
if self._ion_clamped:
num_atom_prim = len(self._pcell)

View File

@ -32,16 +32,15 @@
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from __future__ import annotations
import warnings
from collections.abc import Sequence
from typing import Literal, Optional, Union
import numpy as np
from phonopy.harmonic.dynamical_matrix import get_dynamical_matrix
from phonopy.structure.cells import (
Primitive,
compute_all_sg_permutations,
sparse_to_dense_svecs,
)
from phonopy.harmonic.dynamical_matrix import DynamicalMatrix, get_dynamical_matrix
from phonopy.structure.cells import Primitive, compute_all_sg_permutations
from phonopy.structure.symmetry import Symmetry
from phonopy.units import AMU, EV, Angstrom, Hbar, THz, VaspToTHz
@ -94,18 +93,18 @@ class Interaction:
primitive: Primitive,
bz_grid: BZGrid,
primitive_symmetry: Symmetry,
fc3=None,
band_indices=None,
constant_averaged_interaction=None,
frequency_factor_to_THz=VaspToTHz,
frequency_scale_factor=None,
unit_conversion=None,
is_mesh_symmetry=True,
symmetrize_fc3q=False,
make_r0_average=False,
cutoff_frequency=None,
lapack_zheev_uplo="L",
openmp_per_triplets=None,
fc3: Optional[np.ndarray] = None,
band_indices: Optional[Union[np.ndarray, Sequence]] = None,
constant_averaged_interaction: Optional[float] = None,
frequency_factor_to_THz: float = VaspToTHz,
frequency_scale_factor: Optional[float] = None,
unit_conversion: Optional[float] = None,
is_mesh_symmetry: bool = True,
symmetrize_fc3q: bool = False,
make_r0_average: bool = False,
cutoff_frequency: Optional[float] = None,
lapack_zheev_uplo: Literal["L", "U"] = "L",
openmp_per_triplets: Optional[bool] = None,
):
"""Init method."""
self._primitive = primitive
@ -168,18 +167,19 @@ class Interaction:
self._band_index_count = 0
svecs, multi = self._primitive.get_smallest_vectors()
if self._primitive.store_dense_svecs:
self._svecs = svecs
self._multi = multi
else:
self._svecs, self._multi = sparse_to_dense_svecs(svecs, multi)
self._svecs, self._multi = self._primitive.get_smallest_vectors()
self._masses = np.array(self._primitive.masses, dtype="double")
self._p2s = np.array(self._primitive.p2s_map, dtype="int_")
self._s2p = np.array(self._primitive.s2p_map, dtype="int_")
n_satom, n_patom, _ = self._multi.shape
self._all_shortest = np.zeros(
(n_patom, n_satom, n_satom), dtype="byte", order="C"
)
self._get_all_shortest()
def run(self, lang="C", g_zero=None):
def run(
self, lang: Literal["C", "Python"] = "C", g_zero: Optional[np.ndarray] = None
):
"""Run ph-ph interaction calculation."""
if (self._phonon_done == 0).any():
self.run_phonon_solver()
@ -203,7 +203,7 @@ class Interaction:
)
@property
def interaction_strength(self):
def interaction_strength(self) -> np.ndarray:
"""Return ph-ph interaction strength.
Returns
@ -225,7 +225,7 @@ class Interaction:
return self.interaction_strength
@property
def mesh_numbers(self):
def mesh_numbers(self) -> np.ndarray:
"""Return mesh numbers.
Returns
@ -246,12 +246,12 @@ class Interaction:
return self.mesh_numbers
@property
def is_mesh_symmetry(self):
def is_mesh_symmetry(self) -> bool:
"""Whether symmetry of grid is utilized or not."""
return self._is_mesh_symmetry
@property
def fc3(self):
def fc3(self) -> np.ndarray:
"""Return fc3."""
return self._fc3
@ -264,7 +264,7 @@ class Interaction:
return self.fc3
@property
def dynamical_matrix(self):
def dynamical_matrix(self) -> Optional[DynamicalMatrix]:
"""Return DynamicalMatrix class instance."""
return self._dm
@ -278,7 +278,7 @@ class Interaction:
return self.dynamical_matrix
@property
def primitive(self):
def primitive(self) -> Primitive:
"""Return Primitive class instance."""
return self._primitive
@ -292,11 +292,13 @@ class Interaction:
return self.primitive
@property
def primitive_symmetry(self):
def primitive_symmetry(self) -> Symmetry:
"""Return Symmetry class instance of primitive cell."""
return self._primitive_symmetry
def get_triplets_at_q(self):
def get_triplets_at_q(
self,
) -> tuple(np.ndarray, np.ndarray, np.ndarray, np.ndarray):
"""Return grid point triplets information.
triplets_at_q is in BZ-grid.
@ -313,12 +315,12 @@ class Interaction:
)
@property
def bz_grid(self):
def bz_grid(self) -> BZGrid:
"""Return BZGrid class instance."""
return self._bz_grid
@property
def band_indices(self):
def band_indices(self) -> np.ndarray:
"""Return band indices.
Returns
@ -339,12 +341,12 @@ class Interaction:
return self.band_indices
@property
def nac_params(self):
def nac_params(self) -> dict:
"""Return NAC params."""
return self._nac_params
@property
def nac_q_direction(self):
def nac_q_direction(self) -> Optional[np.ndarray]:
"""Return q-direction used for NAC at q->0.
Direction of q-vector watching from Gamma point used for
@ -383,7 +385,7 @@ class Interaction:
self.nac_q_direction = nac_q_direction
@property
def zero_value_positions(self):
def zero_value_positions(self) -> Optional[np.ndarray]:
"""Return zero ph-ph interaction elements information.
Returns
@ -402,7 +404,7 @@ class Interaction:
)
return self.zero_value_positions
def get_phonons(self):
def get_phonons(self) -> tuple(np.ndarray, np.ndarray, np.ndarray):
"""Return phonons on grid.
Returns
@ -423,7 +425,7 @@ class Interaction:
return self._frequencies, self._eigenvectors, self._phonon_done
@property
def frequency_factor_to_THz(self):
def frequency_factor_to_THz(self) -> float:
"""Return phonon frequency conversion factor to THz."""
return self._frequency_factor_to_THz
@ -437,7 +439,7 @@ class Interaction:
return self.frequency_factor_to_THz
@property
def lapack_zheev_uplo(self):
def lapack_zheev_uplo(self) -> Literal["L", "U"]:
"""Return U or L for lapack zheev solver."""
return self._lapack_zheev_uplo
@ -451,7 +453,7 @@ class Interaction:
return self.lapack_zheev_uplo
@property
def cutoff_frequency(self):
def cutoff_frequency(self) -> float:
"""Return cutoff phonon frequency to judge imaginary phonon."""
return self._cutoff_frequency
@ -465,17 +467,17 @@ class Interaction:
return self.cutoff_frequency
@property
def openmp_per_triplets(self):
def openmp_per_triplets(self) -> bool:
"""Return whether OpenMP distribution over triplets or bands."""
return self._openmp_per_triplets
@property
def symmetrize_fc3q(self):
def symmetrize_fc3q(self) -> bool:
"""Return boolean of symmetrize_fc3q."""
return self._symmetrize_fc3q
@property
def make_r0_average(self):
def make_r0_average(self) -> bool:
"""Return boolean of make_r0_average.
This flag is used to activate averaging of fc3 transformation
@ -486,7 +488,20 @@ class Interaction:
"""
return self._make_r0_average
def get_averaged_interaction(self):
@property
def all_shortest(self) -> np.ndarray:
"""Return boolean of make_r0_average.
This flag is used to activate averaging of fc3 transformation
from real space to reciprocal space around three atoms. With False,
it is done at the first atom. With True, it is done at three atoms
and averaged.
"""
return self._all_shortest
@property
def averaged_interaction(self) -> np.ndarray:
"""Return sum over phonon triplets of interaction strength.
See Eq.(21) of PRB 91, 094306 (2015)
@ -498,18 +513,49 @@ class Interaction:
v_sum = np.dot(w, v.sum(axis=2).sum(axis=2))
return v_sum / np.prod(v.shape[2:])
def get_primitive_and_supercell_correspondence(self):
def get_averaged_interaction(self):
"""Return sum over phonon triplets of interaction strength."""
warnings.warn(
"Use attribute, Interaction.averaged_interaction "
"instead of Interaction.get_averaged_interaction().",
DeprecationWarning,
)
return self.averaged_interaction
def get_primitive_and_supercell_correspondence(
self,
) -> 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)
def get_unit_conversion_factor(self):
@property
def unit_conversion_factor(self) -> float:
"""Return unit conversion factor."""
return self._unit_conversion
def get_constant_averaged_interaction(self):
def get_unit_conversion_factor(self):
"""Return unit conversion factor."""
warnings.warn(
"Use attribute, Interaction.unit_conversion_factor "
"instead of Interaction.get_unit_conversion_factor().",
DeprecationWarning,
)
return self.unit_conversion_factor
@property
def constant_averaged_interaction(self) -> float:
"""Return constant averaged interaction."""
return self._constant_averaged_interaction
def get_constant_averaged_interaction(self):
"""Return constant averaged interaction."""
warnings.warn(
"Use attribute, Interaction.constant_averaged_interaction "
"instead of Interaction.get_constant_averaged_interaction().",
DeprecationWarning,
)
return self.constant_averaged_interaction
def set_interaction_strength(self, pp_strength, g_zero=None):
"""Set interaction strength."""
self._interaction_strength = pp_strength
@ -868,7 +914,7 @@ class Interaction:
else:
self._band_indices = np.array(band_indices, dtype="int_")
def _run_c(self, g_zero, make_r0_average=False):
def _run_c(self, g_zero):
import phono3py._phono3py as phono3c
num_band = len(self._primitive) * 3
@ -907,6 +953,7 @@ class Interaction:
self._band_indices,
self._symmetrize_fc3q * 1,
self._make_r0_average * 1,
self._all_shortest,
self._cutoff_frequency,
openmp_per_triplets * 1,
)
@ -984,6 +1031,43 @@ class Interaction:
self._eigenvectors_at_gamma = self._eigenvectors[gp_Gamma].copy()
self._phonon_done[gp_Gamma] = 0
def _get_all_shortest(self):
"""Return array indicating distances among three atoms are all shortest.
multi.shape = (n_satom, n_patom)
svecs : distance with respect to primitive cell basis
perms.shape = (n_pure_trans, n_satom)
"""
svecs = self._svecs
multi = self._multi
n_satom, n_patom, _ = multi.shape
perms = self._primitive.atomic_permutations
s2pp_map = [self._primitive.p2p_map[i] for i in self._s2p]
lattice = self._primitive.cell
for i_patom, j_atom in np.ndindex((n_patom, n_satom)):
if multi[j_atom, i_patom, 0] > 1:
continue
j_patom = s2pp_map[j_atom]
i_perm = np.where(perms[:, j_atom] == self._p2s[j_patom])[0]
assert len(i_perm) == 1
for k_atom in range(n_satom):
if multi[k_atom, i_patom, 0] > 1:
continue
k_atom_mapped = perms[i_perm[0], k_atom]
if multi[k_atom_mapped, j_patom, 0] > 1:
continue
vec_jk = (
svecs[multi[k_atom, i_patom, 1]] - svecs[multi[j_atom, i_patom, 1]]
)
d_jk = np.linalg.norm(vec_jk @ lattice)
d_jk_mapped = np.linalg.norm(
svecs[multi[k_atom_mapped, j_patom, 1]] @ lattice
)
if abs(d_jk_mapped - d_jk) < self._symprec:
self._all_shortest[i_patom, j_atom, k_atom] = 1
def all_bands_exist(interaction: Interaction):
"""Return if all bands are selected or not."""

View File

@ -68,7 +68,6 @@ class JointDos:
frequency_factor_to_THz=VaspToTHz,
frequency_scale_factor=1.0,
is_mesh_symmetry=True,
store_dense_gp_map=False,
symprec=1e-5,
filename=None,
log_level=False,
@ -93,7 +92,6 @@ class JointDos:
self._frequency_factor_to_THz = frequency_factor_to_THz
self._frequency_scale_factor = frequency_scale_factor
self._is_mesh_symmetry = is_mesh_symmetry
self._store_dense_gp_map = store_dense_gp_map
self._symprec = symprec
self._filename = filename
self._log_level = log_level

View File

@ -34,7 +34,6 @@
# POSSIBILITY OF SUCH DAMAGE.
import numpy as np
from phonopy.structure.cells import sparse_to_dense_svecs
class RealToReciprocal:
@ -50,12 +49,7 @@ class RealToReciprocal:
self._p2s_map = primitive.p2s_map
self._s2p_map = primitive.s2p_map
# Reduce supercell atom index to primitive index
svecs, multi = self._primitive.get_smallest_vectors()
if self._primitive.store_dense_svecs:
self._svecs = svecs
self._multi = multi
else:
self._svecs, self._multi = sparse_to_dense_svecs(svecs, multi)
self._svecs, self._multi = self._primitive.get_smallest_vectors()
self._fc3_reciprocal = None
def run(self, triplet):

View File

@ -70,8 +70,6 @@ def get_triplets_at_q(
Inversion symemtry is added if it doesn't exist. Default is True.
swappable : bool, optional
q1 and q2 among (q0, q1, q2) can be swapped. Deafult is True.
store_dense_gp_map : bool, optional
See the detail in the docstring of ``_relocate_BZ_grid_address``.
Returns
-------
@ -343,7 +341,10 @@ def _get_BZ_triplets_at_q(bz_grid_index, bz_grid: BZGrid, map_triplets):
def _set_triplets_integration_weights_c(
g, g_zero, pp: Union["Interaction", "JointDos"], frequency_points
g: np.ndarray,
g_zero: np.ndarray,
pp: Union["Interaction", "JointDos"],
frequency_points,
):
import phono3py._phono3py as phono3c

View File

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

View File

@ -3,15 +3,13 @@ import numpy as np
from phono3py.api_phono3py import Phono3py
si_pbesol_kappa_LBTE = [111.117, 111.117, 111.117, 0, 0, 0]
si_pbesol_kappa_LBTE_redcol = [63.019, 63.019, 63.019, 0, 0, 0]
aln_lda_kappa_LBTE = [2.313066e02, 2.313066e02, 2.483627e02, 0, 0, 0]
aln_lda_kappa_LBTE_with_sigma = [2.500303e02, 2.500303e02, 2.694047e02, 0, 0, 0]
aln_lda_kappa_LBTE_with_r0_ave = [2.342499e02, 2.342499e02, 2.540009e02, 0, 0, 0]
def test_kappa_LBTE(si_pbesol: Phono3py):
"""Test for symmetry reduced collision matrix."""
if si_pbesol._make_r0_average:
ref_kappa = [110.896, 110.896, 110.896, 0, 0, 0]
else:
ref_kappa = [111.149, 111.149, 111.149, 0, 0, 0]
si_pbesol.mesh_numbers = [9, 9, 9]
si_pbesol.init_phph_interaction()
si_pbesol.run_thermal_conductivity(
@ -21,11 +19,16 @@ def test_kappa_LBTE(si_pbesol: Phono3py):
],
)
kappa = si_pbesol.thermal_conductivity.kappa.ravel()
np.testing.assert_allclose(si_pbesol_kappa_LBTE, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa, kappa, atol=0.3)
def test_kappa_LBTE_full_colmat(si_pbesol: Phono3py):
"""Test for full collision matrix."""
if si_pbesol._make_r0_average:
ref_kappa = [62.497, 62.497, 62.497, 0, 0, 0]
else:
ref_kappa = [62.777, 62.777, 62.777, 0, 0, 0]
si_pbesol.mesh_numbers = [5, 5, 5]
si_pbesol.init_phph_interaction()
si_pbesol.run_thermal_conductivity(
@ -36,11 +39,16 @@ def test_kappa_LBTE_full_colmat(si_pbesol: Phono3py):
is_reducible_collision_matrix=True,
)
kappa = si_pbesol.thermal_conductivity.kappa.ravel()
np.testing.assert_allclose(si_pbesol_kappa_LBTE_redcol, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa, kappa, atol=0.3)
def test_kappa_LBTE_aln(aln_lda: Phono3py):
"""Test direct solution by AlN."""
if aln_lda._make_r0_average:
ref_kappa = [234.141, 234.141, 254.006, 0, 0, 0]
else:
ref_kappa = [231.191, 231.191, 248.367, 0, 0, 0]
aln_lda.mesh_numbers = [7, 7, 5]
aln_lda.init_phph_interaction()
aln_lda.run_thermal_conductivity(
@ -51,26 +59,15 @@ def test_kappa_LBTE_aln(aln_lda: Phono3py):
)
kappa = aln_lda.thermal_conductivity.kappa.ravel()
# print(", ".join([f"{k:e}" for k in kappa]))
np.testing.assert_allclose(aln_lda_kappa_LBTE, kappa, atol=0.5)
def test_kappa_LBTE_aln_with_r0_ave(aln_lda: Phono3py):
"""Test direct solution by AlN."""
aln_lda.mesh_numbers = [7, 7, 5]
aln_lda.init_phph_interaction(make_r0_average=True)
aln_lda.run_thermal_conductivity(
is_LBTE=True,
temperatures=[
300,
],
)
kappa = aln_lda.thermal_conductivity.kappa.ravel()
# print(", ".join([f"{k:e}" for k in kappa]))
np.testing.assert_allclose(aln_lda_kappa_LBTE_with_r0_ave, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa, kappa, atol=0.3)
def test_kappa_LBTE_aln_with_sigma(aln_lda: Phono3py):
"""Test direct solution by AlN."""
if aln_lda._make_r0_average:
ref_kappa = [254.111, 254.111, 271.406, 0, 0, 0]
else:
ref_kappa = [250.030, 250.030, 269.405, 0, 0, 0]
aln_lda.sigmas = [
0.1,
]
@ -88,4 +85,4 @@ def test_kappa_LBTE_aln_with_sigma(aln_lda: Phono3py):
aln_lda.sigmas = None
aln_lda.sigma_cutoff = None
# print(", ".join([f"{k:e}" for k in kappa]))
np.testing.assert_allclose(aln_lda_kappa_LBTE_with_sigma, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa, kappa, atol=0.3)

View File

@ -1,19 +1,19 @@
"""Tests for direct solution of LBTE."""
import numpy as np
import pytest
from phono3py.api_phono3py import Phono3py
si_pbesol_kappa_P_LBTE = [111.123, 111.123, 111.123, 0, 0, 0] # old value 111.117
si_pbesol_kappa_C = [0.167, 0.167, 0.167, 0.000, 0.000, 0.000]
si_pbesol_kappa_P_LBTE_redcol = [62.783, 62.783, 62.783, 0, 0, 0] # old value 63.019
si_pbesol_kappa_C_redcol = (
-1
) # coherences conductivity is not implemented for is_reducible_collision_matrix=True,
def test_kappa_LBTE(si_pbesol: Phono3py):
"""Test for symmetry reduced collision matrix."""
if si_pbesol._make_r0_average:
ref_kappa_P_LBTE = [110.896, 110.896, 110.896, 0, 0, 0]
ref_kappa_C = [0.166, 0.166, 0.166, 0.000, 0.000, 0.000]
else:
ref_kappa_P_LBTE = [111.149, 111.149, 111.149, 0, 0, 0]
ref_kappa_C = [0.166, 0.166, 0.166, 0.000, 0.000, 0.000]
si_pbesol.mesh_numbers = [9, 9, 9]
si_pbesol.init_phph_interaction()
si_pbesol.run_thermal_conductivity(
@ -26,14 +26,20 @@ def test_kappa_LBTE(si_pbesol: Phono3py):
# kappa = si_pbesol.thermal_conductivity.kappa.ravel()
kappa_P = si_pbesol.thermal_conductivity.kappa_P_exact.ravel()
kappa_C = si_pbesol.thermal_conductivity.kappa_C.ravel()
np.testing.assert_allclose(si_pbesol_kappa_P_LBTE, kappa_P, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_LBTE, kappa_P, atol=0.5)
np.testing.assert_allclose(ref_kappa_C, kappa_C, atol=0.02)
'''
#coherences conductivity is not implemented for is_reducible_collision_matrix=True,
@pytest.mark.skip(
reason=(
"coherences conductivity is not implemented for "
"is_reducible_collision_matrix=True"
)
)
def test_kappa_LBTE_full_colmat(si_pbesol: Phono3py):
"""Test for full collision matrix."""
si_pbesol_kappa_P_LBTE_redcol = [62.783, 62.783, 62.783, 0, 0, 0]
si_pbesol_kappa_C_redcol = -1
si_pbesol.mesh_numbers = [5, 5, 5]
si_pbesol.init_phph_interaction()
si_pbesol.run_thermal_conductivity(
@ -47,4 +53,3 @@ def test_kappa_LBTE_full_colmat(si_pbesol: Phono3py):
kappa_C = si_pbesol.thermal_conductivity.kappa_C.ravel()
np.testing.assert_allclose(si_pbesol_kappa_P_LBTE_redcol, kappa_P, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C_redcol, kappa_C, atol=0.02)
'''

View File

@ -1,131 +1,132 @@
"""Test for Conductivity_RTA.py."""
import itertools
import numpy as np
import pytest
from phono3py import Phono3py
si_pbesol_kappa_RTA = [107.991, 107.991, 107.991, 0, 0, 0]
si_pbesol_kappa_RTA_with_sigmas = [109.6985, 109.6985, 109.6985, 0, 0, 0]
si_pbesol_kappa_RTA_iso = [96.92419, 96.92419, 96.92419, 0, 0, 0]
si_pbesol_kappa_RTA_with_sigmas_iso = [96.03248, 96.03248, 96.03248, 0, 0, 0]
si_pbesol_kappa_RTA_si_nosym = [
38.242347,
38.700219,
39.198018,
0.3216,
0.207731,
0.283,
]
si_pbesol_kappa_RTA_si_nomeshsym = [81.31304, 81.31304, 81.31304, 0, 0, 0]
si_pbesol_kappa_RTA_grg = [93.99526, 93.99526, 93.99526, 0, 0, 0]
si_pbesol_kappa_RTA_grg_iso = [104.281556, 104.281556, 104.281556, 0, 0, 0]
si_pbesol_kappa_RTA_grg_sigma_iso = [107.2834, 107.2834, 107.2834, 0, 0, 0]
nacl_pbe_kappa_RTA = [7.72798252, 7.72798252, 7.72798252, 0, 0, 0]
nacl_pbe_kappa_RTA_with_sigma = [7.71913708, 7.71913708, 7.71913708, 0, 0, 0]
aln_lda_kappa_RTA = [203.304059, 203.304059, 213.003125, 0, 0, 0]
aln_lda_kappa_RTA_r0_ave = [2.06489355e02, 2.06489355e02, 2.19821864e02, 0, 0, 0]
aln_lda_kappa_RTA_with_sigmas = [213.820000, 213.820000, 224.800121, 0, 0, 0]
aln_lda_kappa_RTA_with_sigmas_r0_ave = [
2.17597885e02,
2.17597885e02,
2.30098660e02,
0,
0,
0,
]
@pytest.mark.parametrize("openmp_per_triplets", [True, False])
@pytest.mark.parametrize(
"openmp_per_triplets,is_full_pp,is_compact_fc",
itertools.product([False, True], [False, True], [False, True]),
)
def test_kappa_RTA_si(
si_pbesol: Phono3py,
si_pbesol_compact_fc: Phono3py,
openmp_per_triplets: bool,
is_full_pp: bool,
is_compact_fc: bool,
):
"""Test RTA by Si."""
if is_compact_fc:
ph3 = si_pbesol_compact_fc
else:
ph3 = si_pbesol
if ph3._make_r0_average:
if is_compact_fc:
ref_kappa_RTA = [107.794, 107.794, 107.794, 0, 0, 0]
else:
ref_kappa_RTA = [107.694, 107.694, 107.694, 0, 0, 0]
else:
if is_compact_fc:
ref_kappa_RTA = [107.956, 107.956, 107.956, 0, 0, 0]
else:
ref_kappa_RTA = [107.844, 107.844, 107.844, 0, 0, 0]
kappa = _get_kappa(
si_pbesol,
ph3,
[9, 9, 9],
is_full_pp=is_full_pp,
openmp_per_triplets=openmp_per_triplets,
).ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA, kappa, atol=0.5)
@pytest.mark.parametrize("openmp_per_triplets", [True, False])
def test_kappa_RTA_si_full_pp(si_pbesol: Phono3py, openmp_per_triplets: bool):
"""Test RTA with full-pp by Si."""
kappa = _get_kappa(
si_pbesol, [9, 9, 9], is_full_pp=True, openmp_per_triplets=openmp_per_triplets
).ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA, kappa, atol=0.5)
def test_kappa_RTA_si_iso(si_pbesol: Phono3py):
"""Test RTA with isotope scattering by Si."""
if si_pbesol._make_r0_average:
ref_kappa_RTA_iso = [97.296, 97.296, 97.296, 0, 0, 0]
else:
ref_kappa_RTA_iso = [97.346, 97.346, 97.346, 0, 0, 0]
kappa = _get_kappa(si_pbesol, [9, 9, 9], is_isotope=True).ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA_iso, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_iso, kappa, atol=0.5)
@pytest.mark.parametrize("openmp_per_triplets", [True, False])
def test_kappa_RTA_si_with_sigma(si_pbesol: Phono3py, openmp_per_triplets: bool):
@pytest.mark.parametrize(
"openmp_per_triplets,is_full_pp", itertools.product([False, True], [False, True])
)
def test_kappa_RTA_si_with_sigma(
si_pbesol: Phono3py, openmp_per_triplets: bool, is_full_pp: bool
):
"""Test RTA with smearing method by Si."""
if si_pbesol._make_r0_average:
ref_kappa_RTA_with_sigmas = [109.999, 109.999, 109.999, 0, 0, 0]
else:
ref_kappa_RTA_with_sigmas = [109.699, 109.699, 109.699, 0, 0, 0]
si_pbesol.sigmas = [
0.1,
]
kappa = _get_kappa(
si_pbesol, [9, 9, 9], openmp_per_triplets=openmp_per_triplets
si_pbesol,
[9, 9, 9],
is_full_pp=is_full_pp,
openmp_per_triplets=openmp_per_triplets,
).ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA_with_sigmas, kappa, atol=0.5)
si_pbesol.sigmas = None
def test_kappa_RTA_si_with_sigma_full_pp(si_pbesol: Phono3py):
"""Test RTA with smearing method and full-pp by Si."""
si_pbesol.sigmas = [
0.1,
]
kappa = _get_kappa(si_pbesol, [9, 9, 9], is_full_pp=True).ravel()
print(kappa)
np.testing.assert_allclose(si_pbesol_kappa_RTA_with_sigmas, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_with_sigmas, kappa, atol=0.5)
si_pbesol.sigmas = None
def test_kappa_RTA_si_with_sigma_iso(si_pbesol: Phono3py):
"""Test RTA with smearing method and isotope scattering by Si."""
if si_pbesol._make_r0_average:
ref_kappa_RTA_with_sigmas_iso = [96.368, 96.368, 96.368, 0, 0, 0]
else:
ref_kappa_RTA_with_sigmas_iso = [96.032, 96.032, 96.032, 0, 0, 0]
si_pbesol.sigmas = [
0.1,
]
kappa = _get_kappa(si_pbesol, [9, 9, 9], is_isotope=True).ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA_with_sigmas_iso, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_with_sigmas_iso, kappa, atol=0.5)
si_pbesol.sigmas = None
def test_kappa_RTA_si_compact_fc(si_pbesol_compact_fc: Phono3py):
"""Test RTA with compact-fc by Si."""
kappa = _get_kappa(si_pbesol_compact_fc, [9, 9, 9]).ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA, kappa, atol=0.5)
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_RTA_si_nosym = [38.315, 38.616, 39.093, 0.221, 0.166, 0.284]
else:
ref_kappa_RTA_si_nosym = [38.342, 38.650, 39.105, 0.224, 0.170, 0.288]
si_pbesol_nosym.fc2 = si_pbesol.fc2
si_pbesol_nosym.fc3 = si_pbesol.fc3
kappa = _get_kappa(si_pbesol_nosym, [4, 4, 4]).reshape(-1, 3).sum(axis=1)
kappa_ref = np.reshape(si_pbesol_kappa_RTA_si_nosym, (-1, 3)).sum(axis=1)
kappa_ref = np.reshape(ref_kappa_RTA_si_nosym, (-1, 3)).sum(axis=1)
np.testing.assert_allclose(kappa_ref / 3, kappa / 3, atol=0.5)
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:
ref_kappa_RTA_si_nomeshsym = [81.263, 81.263, 81.263, 0.000, 0.000, 0.000]
si_pbesol_nomeshsym.fc2 = si_pbesol.fc2
si_pbesol_nomeshsym.fc3 = si_pbesol.fc3
kappa = _get_kappa(si_pbesol_nomeshsym, [7, 7, 7]).ravel()
kappa_ref = si_pbesol_kappa_RTA_si_nomeshsym
np.testing.assert_allclose(kappa_ref, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_si_nomeshsym, kappa, atol=0.5)
def test_kappa_RTA_si_grg(si_pbesol_grg: Phono3py):
"""Test RTA by Si with GR-grid."""
if si_pbesol_grg._make_r0_average:
ref_kappa_RTA_grg = [94.293, 94.293, 94.293, 0, 0, 0]
else:
ref_kappa_RTA_grg = [94.306, 94.306, 94.306, 0, 0, 0]
mesh = 20
ph3 = si_pbesol_grg
ph3.mesh_numbers = mesh
@ -150,11 +151,16 @@ def test_kappa_RTA_si_grg(si_pbesol_grg: Phono3py):
Q = ph3.grid.Q
np.testing.assert_equal(np.dot(P, np.dot(A, Q)), np.diag(D_diag))
np.testing.assert_allclose(si_pbesol_kappa_RTA_grg, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_grg, kappa, atol=0.5)
def test_kappa_RTA_si_grg_iso(si_pbesol_grg: Phono3py):
"""Test RTA with isotope scattering by Si with GR-grid.."""
if si_pbesol_grg._make_r0_average:
ref_kappa_RTA_grg_iso = [104.290, 104.290, 104.290, 0, 0, 0]
else:
ref_kappa_RTA_grg_iso = [104.425, 104.425, 104.425, 0, 0, 0]
mesh = 30
ph3 = si_pbesol_grg
ph3.mesh_numbers = mesh
@ -166,12 +172,16 @@ def test_kappa_RTA_si_grg_iso(si_pbesol_grg: Phono3py):
is_isotope=True,
)
kappa = ph3.thermal_conductivity.kappa.ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA_grg_iso, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_grg_iso, kappa, atol=0.5)
np.testing.assert_equal(ph3.grid.grid_matrix, [[-6, 6, 6], [6, -6, 6], [6, 6, -6]])
def test_kappa_RTA_si_grg_sigma_iso(si_pbesol_grg: Phono3py):
"""Test RTA with isotope scattering by Si with GR-grid.."""
if si_pbesol_grg._make_r0_average:
ref_kappa_RTA_grg_sigma_iso = [107.264, 107.264, 107.264, 0, 0, 0]
else:
ref_kappa_RTA_grg_sigma_iso = [107.283, 107.283, 107.283, 0, 0, 0]
mesh = 30
ph3 = si_pbesol_grg
ph3.sigmas = [
@ -186,7 +196,7 @@ def test_kappa_RTA_si_grg_sigma_iso(si_pbesol_grg: Phono3py):
is_isotope=True,
)
kappa = ph3.thermal_conductivity.kappa.ravel()
np.testing.assert_allclose(si_pbesol_kappa_RTA_grg_sigma_iso, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_grg_sigma_iso, kappa, atol=0.5)
ph3.sigmas = None
@ -204,182 +214,119 @@ def test_kappa_RTA_si_N_U(si_pbesol):
is_N_U=is_N_U,
)
gN, gU = ph3.thermal_conductivity.get_gamma_N_U()
# for line in gN.reshape(-1, 6):
# print("[", ",".join([f"{val:.8f}" for val in line]), "],")
# for line in gU.reshape(-1, 6):
# print("[", ",".join([f"{val:.8f}" for val in line]), "],")
gN_ref = [
0.00000000,
0.00000000,
0.00000000,
0.07402084,
0.07402084,
0.07402084,
0.00078535,
0.00078535,
0.00917995,
0.02178049,
0.04470075,
0.04470075,
0.00173337,
0.00173337,
0.01240191,
0.00198981,
0.03165195,
0.03165195,
0.00224713,
0.00224713,
0.00860026,
0.03083611,
0.03083611,
0.02142118,
0.00277534,
0.00330170,
0.02727451,
0.00356415,
0.01847744,
0.01320643,
0.00155072,
0.00365611,
0.01641919,
0.00650083,
0.02576069,
0.01161589,
0.00411969,
0.00411969,
0.00168211,
0.00168211,
0.01560092,
0.01560092,
0.00620091,
0.00620091,
0.03764912,
0.03764912,
0.02668523,
0.02668523,
]
gU_ref = [
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00015178,
0.00015178,
0.00076936,
0.00727539,
0.00113112,
0.00113112,
0.00022696,
0.00022696,
0.00072558,
0.00000108,
0.00021968,
0.00021968,
0.00079397,
0.00079397,
0.00111068,
0.00424761,
0.00424761,
0.00697760,
0.00221593,
0.00259510,
0.01996296,
0.00498962,
0.01258375,
0.00513825,
0.00148802,
0.00161955,
0.01589219,
0.00646134,
0.00577275,
0.00849711,
0.00313208,
0.00313208,
0.00036610,
0.00036610,
0.01135335,
0.01135335,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
]
if si_pbesol._make_r0_average:
gN_ref = [
[0.00000000, 0.00000000, 0.00000000, 0.07898606, 0.07898606, 0.07898606],
[0.00079647, 0.00079647, 0.00913611, 0.01911102, 0.04553001, 0.04553001],
[0.00173868, 0.00173868, 0.01404937, 0.00201732, 0.03354033, 0.03354033],
[0.00223616, 0.00223616, 0.01039331, 0.02860916, 0.02860916, 0.01987485],
[0.00291788, 0.00356241, 0.02858543, 0.00367742, 0.02065990, 0.01533763],
[0.00146333, 0.00343175, 0.01596851, 0.00626596, 0.02431620, 0.01091592],
[0.00396766, 0.00396766, 0.00159161, 0.00159161, 0.01479018, 0.01479018],
[0.00682740, 0.00682740, 0.03983399, 0.03983399, 0.02728522, 0.02728522],
]
gU_ref = [
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
[0.00015184, 0.00015184, 0.00075965, 0.00736940, 0.00114177, 0.00114177],
[0.00022400, 0.00022400, 0.00072237, 0.00000112, 0.00022016, 0.00022016],
[0.00079188, 0.00079188, 0.00106579, 0.00418717, 0.00418717, 0.00712761],
[0.00219252, 0.00262840, 0.01927670, 0.00491388, 0.01254730, 0.00519414],
[0.00146999, 0.00168024, 0.01596274, 0.00641979, 0.00597353, 0.00859841],
[0.00307881, 0.00307881, 0.00036554, 0.00036554, 0.01176737, 0.01176737],
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
]
else:
gN_ref = [
[0.00000000, 0.00000000, 0.00000000, 0.07832198, 0.07832198, 0.07832198],
[0.00079578, 0.00079578, 0.00909025, 0.01917012, 0.04557656, 0.04557656],
[0.00176235, 0.00176235, 0.01414436, 0.00204092, 0.03361112, 0.03361112],
[0.00221919, 0.00221919, 0.01020133, 0.02889554, 0.02889554, 0.01995543],
[0.00292189, 0.00356099, 0.02855954, 0.00370530, 0.02071850, 0.01533334],
[0.00147656, 0.00342335, 0.01589430, 0.00630792, 0.02427768, 0.01099287],
[0.00400675, 0.00400675, 0.00162186, 0.00162186, 0.01478489, 0.01478489],
[0.00676576, 0.00676576, 0.03984290, 0.03984290, 0.02715102, 0.02715102],
]
gU_ref = [
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
[0.00015178, 0.00015178, 0.00076936, 0.00727539, 0.00113112, 0.00113112],
[0.00022696, 0.00022696, 0.00072558, 0.00000108, 0.00021968, 0.00021968],
[0.00079397, 0.00079397, 0.00111068, 0.00424761, 0.00424761, 0.00697760],
[0.00219456, 0.00261878, 0.01928629, 0.00490046, 0.01249235, 0.00517685],
[0.00149539, 0.00161230, 0.01594274, 0.00653088, 0.00593572, 0.00849890],
[0.00311169, 0.00311169, 0.00036610, 0.00036610, 0.01171667, 0.01171667],
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
]
# print(np.sum(gN), np.sum(gU))
np.testing.assert_allclose(
np.sum([gN_ref, gU_ref], axis=0), gN.ravel() + gU.ravel(), atol=1e-2
)
np.testing.assert_allclose(gN_ref, gN.ravel(), atol=1e-2)
np.testing.assert_allclose(gU_ref, gU.ravel(), atol=1e-2)
np.testing.assert_allclose(np.sum(gN_ref, axis=1), gN[0, 0].sum(axis=1), atol=0.05)
np.testing.assert_allclose(np.sum(gU_ref, axis=1), gU[0, 0].sum(axis=1), atol=0.05)
def test_kappa_RTA_nacl(nacl_pbe: Phono3py):
"""Test RTA by NaCl."""
if nacl_pbe._make_r0_average:
ref_kappa_RTA = [7.881, 7.881, 7.881, 0, 0, 0]
else:
ref_kappa_RTA = [7.741, 7.741, 7.741, 0, 0, 0]
kappa = _get_kappa(nacl_pbe, [9, 9, 9]).ravel()
np.testing.assert_allclose(nacl_pbe_kappa_RTA, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA, kappa, atol=0.5)
def test_kappa_RTA_nacl_with_sigma(nacl_pbe: Phono3py):
"""Test RTA with smearing method by NaCl."""
if nacl_pbe._make_r0_average:
ref_kappa_RTA_with_sigma = [7.895, 7.895, 7.895, 0, 0, 0]
else:
ref_kappa_RTA_with_sigma = [7.719, 7.719, 7.719, 0, 0, 0]
nacl_pbe.sigmas = [
0.1,
]
nacl_pbe.sigma_cutoff = 3
kappa = _get_kappa(nacl_pbe, [9, 9, 9]).ravel()
np.testing.assert_allclose(nacl_pbe_kappa_RTA_with_sigma, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_with_sigma, kappa, atol=0.5)
nacl_pbe.sigmas = None
nacl_pbe.sigma_cutoff = None
def test_kappa_RTA_aln(aln_lda: Phono3py):
"""Test RTA by AlN."""
if aln_lda._make_r0_average:
ref_kappa_RTA = [206.379, 206.379, 219.786, 0, 0, 0]
else:
ref_kappa_RTA = [203.278, 203.278, 212.965, 0, 0, 0]
kappa = _get_kappa(aln_lda, [7, 7, 5]).ravel()
np.testing.assert_allclose(aln_lda_kappa_RTA, kappa, atol=0.5)
def test_kappa_RTA_aln_with_r0_ave(aln_lda: Phono3py):
"""Test RTA by AlN."""
kappa = _get_kappa(aln_lda, [7, 7, 5], make_r0_average=True).ravel()
np.testing.assert_allclose(aln_lda_kappa_RTA_r0_ave, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA, kappa, atol=0.5)
def test_kappa_RTA_aln_with_sigma(aln_lda: Phono3py):
"""Test RTA with smearing method by AlN."""
if aln_lda._make_r0_average:
ref_kappa_RTA_with_sigmas = [217.598, 217.598, 230.099, 0, 0, 0]
else:
ref_kappa_RTA_with_sigmas = [213.820, 213.820, 224.800, 0, 0, 0]
aln_lda.sigmas = [
0.1,
]
aln_lda.sigma_cutoff = 3
kappa = _get_kappa(aln_lda, [7, 7, 5]).ravel()
np.testing.assert_allclose(aln_lda_kappa_RTA_with_sigmas, kappa, atol=0.5)
aln_lda.sigmas = None
aln_lda.sigma_cutoff = None
def test_kappa_RTA_aln_with_sigma_and_r0_ave(aln_lda: Phono3py):
"""Test RTA with smearing method by AlN."""
aln_lda.sigmas = [
0.1,
]
aln_lda.sigma_cutoff = 3
kappa = _get_kappa(aln_lda, [7, 7, 5], make_r0_average=True).ravel()
np.testing.assert_allclose(aln_lda_kappa_RTA_with_sigmas_r0_ave, kappa, atol=0.5)
np.testing.assert_allclose(ref_kappa_RTA_with_sigmas, kappa, atol=0.5)
aln_lda.sigmas = None
aln_lda.sigma_cutoff = None
def _get_kappa(
ph3,
ph3: Phono3py,
mesh,
is_isotope=False,
is_full_pp=False,
openmp_per_triplets=None,
make_r0_average=False,
):
ph3.mesh_numbers = mesh
ph3.init_phph_interaction(
make_r0_average=make_r0_average, openmp_per_triplets=openmp_per_triplets
)
ph3.init_phph_interaction(openmp_per_triplets=openmp_per_triplets)
ph3.run_thermal_conductivity(
temperatures=[
300,

View File

@ -1,127 +1,132 @@
"""Test for Conductivity_RTA.py."""
import itertools
import numpy as np
import pytest
# first list is k_P, second list is k_C
si_pbesol_kappa_P_RTA = [108.723, 108.723, 108.723, 0.000, 0.000, 0.000]
si_pbesol_kappa_C = [0.167, 0.167, 0.167, 0.000, 0.000, 0.000]
si_pbesol_kappa_P_RTA_iso = [98.008, 98.008, 98.008, 0.000, 0.000, 0.000]
si_pbesol_kappa_C_iso = [0.177, 0.177, 0.177, 0.000, 0.000, 0.000]
si_pbesol_kappa_P_RTA_with_sigmas = [110.534, 110.534, 110.534, 0, 0, 0]
si_pbesol_kappa_C_with_sigmas = [0.163, 0.163, 0.163, 0.000, 0.000, 0.000]
si_pbesol_kappa_P_RTA_with_sigmas_iso = [97.268, 97.268, 97.268, 0, 0, 0]
si_pbesol_kappa_C_with_sigmas_iso = [0.179, 0.179, 0.179, 0.000, 0.000, 0.000]
si_pbesol_kappa_P_RTA_si_nosym = [39.325, 39.323, 39.496, -0.004, 0.020, 0.018]
si_pbesol_kappa_C_si_nosym = [0.009, 0.009, 0.009, 0.000, 0.000, 0.000]
si_pbesol_kappa_P_RTA_si_nomeshsym = [39.411, 39.411, 39.411, 0, 0, 0]
si_pbesol_kappa_C_si_nomeshsym = [0.009, 0.009, 0.009, 0.000, 0.000, 0.000]
nacl_pbe_kappa_P_RTA = [7.753, 7.753, 7.753, 0.000, 0.000, 0.000]
nacl_pbe_kappa_C = [0.081, 0.081, 0.081, 0.000, 0.000, 0.000]
nacl_pbe_kappa_RTA_with_sigma = [7.742, 7.742, 7.742, 0, 0, 0] # old value 7.71913708
nacl_pbe_kappa_C_with_sigma = [0.081, 0.081, 0.081, 0.000, 0.000, 0.000]
aln_lda_kappa_P_RTA = [203.304, 203.304, 213.003, 0, 0, 0]
aln_lda_kappa_C = [0.084, 0.084, 0.037, 0, 0, 0]
aln_lda_kappa_P_RTA_with_sigmas = [213.820000, 213.820000, 224.800000, 0, 0, 0]
aln_lda_kappa_C_with_sigmas = [0.084, 0.084, 0.036, 0, 0, 0]
from phono3py import Phono3py
def test_kappa_RTA_si(si_pbesol):
@pytest.mark.parametrize(
"is_full_pp,is_compact_fc", itertools.product([False, True], [False, True])
)
def test_kappa_RTA_si(
si_pbesol: Phono3py, si_pbesol_compact_fc: Phono3py, is_full_pp: bool, is_compact_fc
):
"""Test RTA by Si."""
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9])
np.testing.assert_allclose(si_pbesol_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C, kappa_C, atol=0.02)
if is_compact_fc:
ph3 = si_pbesol_compact_fc
else:
ph3 = si_pbesol
if ph3._make_r0_average:
if is_compact_fc:
ref_kappa_P_RTA = [108.428, 108.428, 108.428, 0.000, 0.000, 0.000]
ref_kappa_C = [0.167, 0.167, 0.167, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA = [108.527, 108.527, 108.527, 0.000, 0.000, 0.000]
ref_kappa_C = [0.166, 0.166, 0.166, 0.000, 0.000, 0.000]
else:
if is_compact_fc:
ref_kappa_P_RTA = [108.573, 108.573, 108.573, 0.000, 0.000, 0.000]
ref_kappa_C = [0.166, 0.166, 0.166, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA = [108.684, 108.684, 108.684, 0.000, 0.000, 0.000]
ref_kappa_C = [0.166, 0.166, 0.166, 0.000, 0.000, 0.000]
kappa_P_RTA, kappa_C = _get_kappa_RTA(ph3, [9, 9, 9], is_full_pp=is_full_pp)
np.testing.assert_allclose(ref_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C, kappa_C, atol=0.02)
def test_kappa_RTA_si_full_pp(si_pbesol):
"""Test RTA with full-pp by Si."""
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9], is_full_pp=True)
np.testing.assert_allclose(si_pbesol_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C, kappa_C, atol=0.02)
def test_kappa_RTA_si_iso(si_pbesol):
def test_kappa_RTA_si_iso(si_pbesol: Phono3py):
"""Test RTA with isotope scattering by Si."""
if si_pbesol._make_r0_average:
ref_kappa_P_RTA_iso = [98.026, 98.026, 98.026, 0.000, 0.000, 0.000]
ref_kappa_C_iso = [0.177, 0.177, 0.177, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA_iso = [98.072, 98.072, 98.072, 0.000, 0.000, 0.000]
ref_kappa_C_iso = [0.177, 0.177, 0.177, 0.000, 0.000, 0.000]
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9], is_isotope=True)
np.testing.assert_allclose(si_pbesol_kappa_P_RTA_iso, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C_iso, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_RTA_iso, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C_iso, kappa_C, atol=0.02)
def test_kappa_RTA_si_with_sigma(si_pbesol):
@pytest.mark.parametrize("is_full_pp", [False, True])
def test_kappa_RTA_si_with_sigma(si_pbesol: Phono3py, is_full_pp: bool):
"""Test RTA with smearing method by Si."""
if si_pbesol._make_r0_average:
ref_kappa_P_RTA_with_sigmas = [110.857, 110.857, 110.857, 0, 0, 0]
ref_kappa_C_with_sigmas = [0.163, 0.163, 0.163, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA_with_sigmas = [110.534, 110.534, 110.534, 0, 0, 0]
ref_kappa_C_with_sigmas = [0.162, 0.162, 0.162, 0.000, 0.000, 0.000]
si_pbesol.sigmas = [
0.1,
]
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9])
np.testing.assert_allclose(si_pbesol_kappa_P_RTA_with_sigmas, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C_with_sigmas, kappa_C, atol=0.02)
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9], is_full_pp=is_full_pp)
np.testing.assert_allclose(ref_kappa_P_RTA_with_sigmas, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C_with_sigmas, kappa_C, atol=0.02)
si_pbesol.sigmas = None
def test_kappa_RTA_si_with_sigma_full_pp(si_pbesol):
"""Test RTA with smearing method and full-pp by Si."""
si_pbesol.sigmas = [
0.1,
]
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9], is_full_pp=True)
np.testing.assert_allclose(si_pbesol_kappa_P_RTA_with_sigmas, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C_with_sigmas, kappa_C, atol=0.02)
si_pbesol.sigmas = None
def test_kappa_RTA_si_with_sigma_iso(si_pbesol):
def test_kappa_RTA_si_with_sigma_iso(si_pbesol: Phono3py):
"""Test RTA with smearing method and isotope scattering by Si."""
if si_pbesol._make_r0_average:
ref_kappa_P_RTA_with_sigmas_iso = [97.203, 97.203, 97.203, 0, 0, 0]
ref_kappa_C_with_sigmas_iso = [0.176, 0.176, 0.176, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA_with_sigmas_iso = [96.847, 96.847, 96.847, 0, 0, 0]
ref_kappa_C_with_sigmas_iso = [0.176, 0.176, 0.176, 0.000, 0.000, 0.000]
si_pbesol.sigmas = [
0.1,
]
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol, [9, 9, 9], is_isotope=True)
np.testing.assert_allclose(
si_pbesol_kappa_P_RTA_with_sigmas_iso, kappa_P_RTA, atol=0.5
)
np.testing.assert_allclose(si_pbesol_kappa_C_with_sigmas_iso, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_RTA_with_sigmas_iso, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C_with_sigmas_iso, kappa_C, atol=0.02)
si_pbesol.sigmas = None
def test_kappa_RTA_si_compact_fc(si_pbesol_compact_fc):
"""Test RTA with compact-fc by Si."""
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol_compact_fc, [9, 9, 9])
np.testing.assert_allclose(si_pbesol_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(si_pbesol_kappa_C, kappa_C, atol=0.02)
def test_kappa_RTA_si_nosym(si_pbesol, si_pbesol_nosym):
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]
else:
ref_kappa_P_RTA_si_nosym = [39.430, 39.259, 39.381, -0.096, -0.019, 0.028]
ref_kappa_C_si_nosym = [0.009, 0.009, 0.009, 0.000, 0.000, 0.000]
si_pbesol_nosym.fc2 = si_pbesol.fc2
si_pbesol_nosym.fc3 = si_pbesol.fc3
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol_nosym, [4, 4, 4])
kappa_P_RTA_r = kappa_P_RTA.reshape(-1, 3).sum(axis=1)
kappa_C_r = kappa_C.reshape(-1, 3).sum(axis=1)
kappa_P_ref = np.reshape(si_pbesol_kappa_P_RTA_si_nosym, (-1, 3)).sum(axis=1)
kappa_C_ref = np.reshape(si_pbesol_kappa_C_si_nosym, (-1, 3)).sum(axis=1)
kappa_P_ref = np.reshape(ref_kappa_P_RTA_si_nosym, (-1, 3)).sum(axis=1)
kappa_C_ref = np.reshape(ref_kappa_C_si_nosym, (-1, 3)).sum(axis=1)
np.testing.assert_allclose(kappa_P_ref / 3, kappa_P_RTA_r / 3, atol=0.8)
np.testing.assert_allclose(kappa_C_ref / 3, kappa_C_r / 3, atol=0.02)
def test_kappa_RTA_si_nomeshsym(si_pbesol, si_pbesol_nomeshsym):
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_P_RTA_si_nomeshsym = [39.321, 39.321, 39.321, 0, 0, 0]
ref_kappa_C_si_nomeshsym = [0.009, 0.009, 0.009, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA_si_nomeshsym = [39.332, 39.332, 39.332, 0, 0, 0]
ref_kappa_C_si_nomeshsym = [0.009, 0.009, 0.009, 0.000, 0.000, 0.000]
si_pbesol_nomeshsym.fc2 = si_pbesol.fc2
si_pbesol_nomeshsym.fc3 = si_pbesol.fc3
kappa_P_RTA, kappa_C = _get_kappa_RTA(si_pbesol_nomeshsym, [4, 4, 4])
np.testing.assert_allclose(
si_pbesol_kappa_P_RTA_si_nomeshsym, kappa_P_RTA, atol=1.0
)
np.testing.assert_allclose(si_pbesol_kappa_C_si_nomeshsym, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_RTA_si_nomeshsym, kappa_P_RTA, atol=1.0)
np.testing.assert_allclose(ref_kappa_C_si_nomeshsym, kappa_C, atol=0.02)
def test_kappa_RTA_si_N_U(si_pbesol):
def test_kappa_RTA_si_N_U(si_pbesol: Phono3py):
"""Test RTA with N and U scatterings by Si."""
ph3 = si_pbesol
mesh = [4, 4, 4]
@ -137,156 +142,124 @@ def test_kappa_RTA_si_N_U(si_pbesol):
)
gN, gU = ph3.thermal_conductivity.get_gamma_N_U()
gN_ref = [
0.00000000,
0.00000000,
0.00000000,
0.07402084,
0.07402084,
0.07402084,
0.00078535,
0.00078535,
0.00917995,
0.02178049,
0.04470075,
0.04470075,
0.00173337,
0.00173337,
0.01240191,
0.00198981,
0.03165195,
0.03165195,
0.00224713,
0.00224713,
0.00860026,
0.03083611,
0.03083611,
0.02142118,
0.00277534,
0.00330170,
0.02727451,
0.00356415,
0.01847744,
0.01320643,
0.00155072,
0.00365611,
0.01641919,
0.00650083,
0.02576069,
0.01161589,
0.00411969,
0.00411969,
0.00168211,
0.00168211,
0.01560092,
0.01560092,
0.00620091,
0.00620091,
0.03764912,
0.03764912,
0.02668523,
0.02668523,
]
gU_ref = [
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00015178,
0.00015178,
0.00076936,
0.00727539,
0.00113112,
0.00113112,
0.00022696,
0.00022696,
0.00072558,
0.00000108,
0.00021968,
0.00021968,
0.00079397,
0.00079397,
0.00111068,
0.00424761,
0.00424761,
0.00697760,
0.00221593,
0.00259510,
0.01996296,
0.00498962,
0.01258375,
0.00513825,
0.00148802,
0.00161955,
0.01589219,
0.00646134,
0.00577275,
0.00849711,
0.00313208,
0.00313208,
0.00036610,
0.00036610,
0.01135335,
0.01135335,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
]
# for line in gU.reshape(-1, 6):
# print("[", ",".join([f"{val:.8f}" for val in line]), "],")
if si_pbesol._make_r0_average:
gN_ref = [
[0.0, 0.0, 0.0, 0.07898606, 0.07898606, 0.07898606],
[0.00079647, 0.00079647, 0.00913611, 0.01911102, 0.04553001, 0.04553001],
[0.00173868, 0.00173868, 0.01404937, 0.00201732, 0.03354033, 0.03354033],
[0.00223616, 0.00223616, 0.01039331, 0.02860916, 0.02860916, 0.01987485],
[0.00291788, 0.00356241, 0.02858543, 0.00367742, 0.0206599, 0.01533763],
[0.00146333, 0.00343175, 0.01596851, 0.00626596, 0.0243162, 0.01091592],
[0.00396766, 0.00396766, 0.00159161, 0.00159161, 0.01479018, 0.01479018],
[0.0068274, 0.0068274, 0.03983399, 0.03983399, 0.02728522, 0.02728522],
]
gU_ref = [
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
[0.00015184, 0.00015184, 0.00075965, 0.00736940, 0.00114177, 0.00114177],
[0.00022400, 0.00022400, 0.00072237, 0.00000112, 0.00022016, 0.00022016],
[0.00079188, 0.00079188, 0.00106579, 0.00418717, 0.00418717, 0.00712761],
[0.00219252, 0.00262840, 0.01927670, 0.00491388, 0.01254730, 0.00519414],
[0.00146999, 0.00168024, 0.01596274, 0.00641979, 0.00597353, 0.00859841],
[0.00307881, 0.00307881, 0.00036554, 0.00036554, 0.01176737, 0.01176737],
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
]
else:
gN_ref = [
[0.0, 0.0, 0.0, 0.07832198, 0.07832198, 0.07832198],
[0.00079578, 0.00079578, 0.00909025, 0.01917012, 0.04557656, 0.04557656],
[0.00176235, 0.00176235, 0.01414436, 0.00204092, 0.03361112, 0.03361112],
[0.00221919, 0.00221919, 0.01020133, 0.02889554, 0.02889554, 0.01995543],
[0.00292189, 0.00356099, 0.02855954, 0.0037053, 0.0207185, 0.01533334],
[0.00147656, 0.00342335, 0.0158943, 0.00630792, 0.02427768, 0.01099287],
[0.00400675, 0.00400675, 0.00162186, 0.00162186, 0.01478489, 0.01478489],
[0.00676576, 0.00676576, 0.0398429, 0.0398429, 0.02715102, 0.02715102],
]
gU_ref = [
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
[0.00015178, 0.00015178, 0.00076936, 0.00727539, 0.00113112, 0.00113112],
[0.00022696, 0.00022696, 0.00072558, 0.00000108, 0.00021968, 0.00021968],
[0.00079397, 0.00079397, 0.00111068, 0.00424761, 0.00424761, 0.00697760],
[0.00219456, 0.00261878, 0.01928629, 0.00490046, 0.01249235, 0.00517685],
[0.00149539, 0.00161230, 0.01594274, 0.00653088, 0.00593572, 0.00849890],
[0.00311169, 0.00311169, 0.00036610, 0.00036610, 0.01171667, 0.01171667],
[0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000],
]
# print(np.sum(gN), np.sum(gU))
np.testing.assert_allclose(
np.sum([gN_ref, gU_ref], axis=0), gN.ravel() + gU.ravel(), atol=1e-2
)
np.testing.assert_allclose(gN_ref, gN.ravel(), atol=1e-2)
np.testing.assert_allclose(gU_ref, gU.ravel(), atol=1e-2)
np.testing.assert_allclose(np.sum(gN_ref, axis=1), gN[0, 0].sum(axis=1), atol=0.05)
np.testing.assert_allclose(np.sum(gU_ref, axis=1), gU[0, 0].sum(axis=1), atol=0.05)
def test_kappa_RTA_nacl(nacl_pbe):
def test_kappa_RTA_nacl(nacl_pbe: Phono3py):
"""Test RTA by NaCl."""
if nacl_pbe._make_r0_average:
ref_kappa_P_RTA = [7.907, 7.907, 7.907, 0.000, 0.000, 0.000]
ref_kappa_C = [0.080, 0.080, 0.080, 0.000, 0.000, 0.000]
else:
ref_kappa_P_RTA = [7.766, 7.766, 7.766, 0.000, 0.000, 0.000]
ref_kappa_C = [0.080, 0.080, 0.080, 0.000, 0.000, 0.000]
kappa_P_RTA, kappa_C = _get_kappa_RTA(nacl_pbe, [9, 9, 9])
np.testing.assert_allclose(nacl_pbe_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(nacl_pbe_kappa_C, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C, kappa_C, atol=0.02)
def test_kappa_RTA_nacl_with_sigma(nacl_pbe):
def test_kappa_RTA_nacl_with_sigma(nacl_pbe: Phono3py):
"""Test RTA with smearing method by NaCl."""
if nacl_pbe._make_r0_average:
ref_kappa_RTA_with_sigma = [7.918, 7.918, 7.918, 0, 0, 0]
ref_kappa_C_with_sigma = [0.081, 0.081, 0.081, 0.000, 0.000, 0.000]
else:
ref_kappa_RTA_with_sigma = [7.742, 7.742, 7.742, 0, 0, 0]
ref_kappa_C_with_sigma = [0.081, 0.081, 0.081, 0.000, 0.000, 0.000]
nacl_pbe.sigmas = [
0.1,
]
nacl_pbe.sigma_cutoff = 3
kappa_P_RTA, kappa_C = _get_kappa_RTA(nacl_pbe, [9, 9, 9])
np.testing.assert_allclose(nacl_pbe_kappa_RTA_with_sigma, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(nacl_pbe_kappa_C_with_sigma, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_RTA_with_sigma, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C_with_sigma, kappa_C, atol=0.02)
nacl_pbe.sigmas = None
nacl_pbe.sigma_cutoff = None
def test_kappa_RTA_aln(aln_lda):
def test_kappa_RTA_aln(aln_lda: Phono3py):
"""Test RTA by AlN."""
if aln_lda._make_r0_average:
ref_kappa_P_RTA = [206.379, 206.379, 219.786, 0, 0, 0]
ref_kappa_C = [0.083, 0.083, 0.037, 0, 0, 0]
else:
ref_kappa_P_RTA = [203.278, 203.278, 212.965, 0, 0, 0]
ref_kappa_C = [0.083, 0.083, 0.037, 0, 0, 0]
kappa_P_RTA, kappa_C = _get_kappa_RTA(aln_lda, [7, 7, 5])
np.testing.assert_allclose(aln_lda_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(aln_lda_kappa_C, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_RTA, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C, kappa_C, atol=0.02)
def test_kappa_RTA_aln_with_sigma(aln_lda):
def test_kappa_RTA_aln_with_sigma(aln_lda: Phono3py):
"""Test RTA with smearing method by AlN."""
if aln_lda._make_r0_average:
ref_kappa_P_RTA_with_sigmas = [217.598, 217.598, 230.099, 0, 0, 0]
ref_kappa_C_with_sigmas = [0.084, 0.084, 0.036, 0, 0, 0]
else:
ref_kappa_P_RTA_with_sigmas = [213.820, 213.820, 224.800, 0, 0, 0]
ref_kappa_C_with_sigmas = [0.084, 0.084, 0.036, 0, 0, 0]
aln_lda.sigmas = [
0.1,
]
aln_lda.sigma_cutoff = 3
kappa_P_RTA, kappa_C = _get_kappa_RTA(aln_lda, [7, 7, 5])
np.testing.assert_allclose(aln_lda_kappa_P_RTA_with_sigmas, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(aln_lda_kappa_C_with_sigmas, kappa_C, atol=0.02)
np.testing.assert_allclose(ref_kappa_P_RTA_with_sigmas, kappa_P_RTA, atol=0.5)
np.testing.assert_allclose(ref_kappa_C_with_sigmas, kappa_C, atol=0.02)
aln_lda.sigmas = None
aln_lda.sigma_cutoff = None
def _get_kappa_RTA(ph3, mesh, is_isotope=False, is_full_pp=False):
def _get_kappa_RTA(ph3: Phono3py, mesh, is_isotope=False, is_full_pp=False):
ph3.mesh_numbers = mesh
ph3.init_phph_interaction()
ph3.run_thermal_conductivity(

View File

@ -12,16 +12,15 @@ import phono3py
from phono3py import Phono3py
cwd = Path(__file__).parent
store_dense_gp_map = True
def pytest_addoption(parser):
"""Activate v1 emulation with --v1 option."""
"""Activate v2 emulation with --v2 option."""
parser.addoption(
"--v1",
action="store_false",
default=True,
help="Run with phono3py v1.x emulation.",
"--v2",
action="store_true",
default=False,
help="Run with phono3py v2.x emulation.",
)
@ -59,12 +58,11 @@ def si_pbesol(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -80,13 +78,12 @@ def si_pbesol_grg(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
use_grg=True,
make_r0_average=not enable_v2,
log_level=1,
)
@ -101,14 +98,13 @@ def si_pbesol_nosym(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
is_symmetry=False,
produce_fc=False,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -123,14 +119,13 @@ def si_pbesol_nomeshsym(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
is_mesh_symmetry=False,
produce_fc=False,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -145,13 +140,12 @@ def si_pbesol_compact_fc(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_si_pbesol.yaml"
forces_fc3_filename = cwd / "FORCES_FC3_si_pbesol"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
forces_fc3_filename=forces_fc3_filename,
is_compact_fc=True,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -165,11 +159,10 @@ def si_pbesol_111(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_Si111.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -186,12 +179,11 @@ def si_pbesol_111_alm(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si111.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="alm",
make_r0_average=not enable_v2,
log_level=1,
)
@ -218,11 +210,10 @@ def si_pbesol_111_222_fd(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -239,12 +230,11 @@ def si_pbesol_111_222_alm(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="alm",
make_r0_average=not enable_v2,
log_level=1,
)
@ -261,12 +251,11 @@ def si_pbesol_111_222_alm_fd(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="alm|",
make_r0_average=not enable_v2,
log_level=1,
)
@ -283,12 +272,11 @@ def si_pbesol_111_222_fd_alm(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="|alm",
make_r0_average=not enable_v2,
log_level=1,
)
@ -306,13 +294,12 @@ def si_pbesol_111_222_alm_cutoff(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="alm",
fc_calculator_options="cutoff = 3",
make_r0_average=not enable_v2,
log_level=1,
)
@ -330,13 +317,12 @@ def si_pbesol_111_222_alm_cutoff_fc2(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="alm",
fc_calculator_options="cutoff = 3|",
make_r0_average=not enable_v2,
log_level=1,
)
@ -354,13 +340,12 @@ def si_pbesol_111_222_alm_cutoff_fc3(request) -> Phono3py:
pytest.importorskip("alm")
yaml_filename = cwd / "phono3py_params_Si-111-222.yaml"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
fc_calculator="alm",
fc_calculator_options="|cutoff = 3",
make_r0_average=not enable_v2,
log_level=1,
)
@ -374,11 +359,10 @@ def nacl_pbe(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)
@ -392,12 +376,11 @@ def nacl_pbe_compact_fc(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
is_compact_fc=True,
make_r0_average=not enable_v2,
log_level=1,
)
@ -410,12 +393,11 @@ def nacl_pbe_cutoff_fc3(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
ph3 = phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
produce_fc=False,
make_r0_average=not enable_v2,
log_level=1,
)
forces = ph3.forces
@ -444,12 +426,11 @@ def nacl_pbe_cutoff_fc3_all_forces(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
ph3 = phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
produce_fc=False,
make_r0_average=not enable_v2,
log_level=1,
)
forces = ph3.forces
@ -469,12 +450,11 @@ def nacl_pbe_cutoff_fc3_compact_fc(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_NaCl222.yaml.xz"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
ph3 = phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
produce_fc=False,
make_r0_average=not enable_v2,
log_level=1,
)
forces = ph3.forces
@ -493,11 +473,10 @@ def aln_lda(request) -> Phono3py:
"""
yaml_filename = cwd / "phono3py_params_AlN332.yaml.xz"
enable_v2 = request.config.getoption("--v1")
enable_v2 = request.config.getoption("--v2")
return phono3py.load(
yaml_filename,
store_dense_gp_map=enable_v2,
store_dense_svecs=enable_v2,
make_r0_average=not enable_v2,
log_level=1,
)

View File

@ -5,199 +5,6 @@ from phono3py import Phono3py
from phono3py.other.kaccum import GammaDOSsmearing, KappaDOS, get_mfp
from phono3py.phonon.grid import get_ir_grid_points
kappados_si = [
-0.0000002,
0.0000000,
0.0000000,
1.6966400,
2.1977566,
5.1814323,
3.3932803,
25.8022392,
15.5096766,
5.0899206,
56.6994259,
19.4995156,
6.7865608,
68.7759426,
3.2465477,
8.4832011,
72.8398965,
1.6583881,
10.1798413,
74.8143686,
0.7945952,
11.8764816,
77.2489625,
5.4385183,
13.5731219,
80.9162245,
0.5998735,
15.2697621,
81.4303646,
0.0000000,
]
mfpdos_si = [
0.0000000,
0.0000000,
0.0000000,
806.8089241,
33.7703552,
0.0225548,
1613.6178483,
45.0137786,
0.0103479,
2420.4267724,
53.3456168,
0.0106724,
3227.2356966,
62.4915811,
0.0107850,
4034.0446207,
69.8839011,
0.0075919,
4840.8535449,
74.8662085,
0.0049228,
5647.6624690,
78.2273252,
0.0035758,
6454.4713932,
80.5493065,
0.0020836,
7261.2803173,
81.4303646,
0.0000000,
]
gammados_si = [
-0.0000002,
0.0000000,
0.0000000,
1.6966400,
0.0000063,
0.0000149,
3.3932803,
0.0004133,
0.0012312,
5.0899206,
0.0071709,
0.0057356,
6.7865608,
0.0099381,
0.0006492,
8.4832011,
0.0133390,
0.0049604,
10.1798413,
0.0394030,
0.0198106,
11.8764816,
0.0495160,
0.0044113,
13.5731219,
0.0560223,
0.0050103,
15.2697621,
0.1300596,
0.0000000,
]
kappados_nacl = [
-0.0000002,
0.0000000,
0.0000000,
0.8051732,
0.0366488,
0.1820668,
1.6103466,
0.7748514,
1.5172957,
2.4155199,
2.0165794,
2.0077744,
3.2206933,
4.6670801,
2.8357892,
4.0258667,
6.6123781,
32.8560281,
4.8310401,
7.7105916,
0.6136893,
5.6362134,
7.9112790,
0.2391300,
6.4413868,
8.0272187,
0.0604842,
7.2465602,
8.0430831,
0.0000000,
]
mfpdos_nacl = [
0.0000000,
0.0000000,
0.0000000,
117.4892903,
3.1983595,
0.0266514,
234.9785806,
5.7974129,
0.0153383,
352.4678709,
7.2012603,
0.0075057,
469.9571612,
7.5964440,
0.0017477,
587.4464515,
7.7823291,
0.0013915,
704.9357418,
7.9195460,
0.0009363,
822.4250321,
8.0024702,
0.0004844,
939.9143223,
8.0375053,
0.0001382,
1057.4036126,
8.0430831,
0.0000000,
]
gammados_nacl = [
-0.0000002,
0.0000000,
0.0000000,
0.8051732,
0.0000822,
0.0004081,
1.6103466,
0.0018975,
0.0053389,
2.4155199,
0.0114668,
0.0182495,
3.2206933,
0.0353621,
0.0329440,
4.0258667,
0.0604996,
0.1138884,
4.8310401,
0.1038315,
0.0716216,
5.6362134,
0.1481243,
0.0468421,
6.4413868,
0.1982823,
0.0662494,
7.2465602,
0.2429551,
0.0000000,
]
def test_kappados_si(si_pbesol: Phono3py):
"""Test KappaDOS class with Si.
@ -207,6 +14,81 @@ def test_kappados_si(si_pbesol: Phono3py):
* kappa vs mean free path
"""
if si_pbesol._make_r0_average:
kappados_si = [
[-0.0000002, 0.0000000, 0.0000000],
[1.6966400, 2.1916229, 5.1669722],
[3.3932803, 25.7283368, 15.5208121],
[5.0899206, 56.6273812, 19.4749436],
[6.7865608, 68.6447676, 3.2126609],
[8.4832011, 72.6556224, 1.6322844],
[10.1798413, 74.6095011, 0.7885669],
[11.8764816, 77.0212439, 5.3742100],
[13.5731219, 80.7020498, 0.6098605],
[15.2697621, 81.2167777, 0.0000000],
]
gammados_si = [
[-0.0000002, 0.0000000, 0.0000000],
[1.6966400, 0.0000009, 0.0000022],
[3.3932803, 0.0000344, 0.0000772],
[5.0899206, 0.0003875, 0.0002461],
[6.7865608, 0.0005180, 0.0000450],
[8.4832011, 0.0007156, 0.0002556],
[10.1798413, 0.0017878, 0.0008881],
[11.8764816, 0.0023096, 0.0001782],
[13.5731219, 0.0026589, 0.0003556],
[15.2697621, 0.0077743, 0.0000000],
]
mfpdos_si = [
[0.0000000, 0.0000000, 0.0000000],
[806.8089241, 33.7286816, 0.0222694],
[1613.6178483, 44.9685295, 0.0104179],
[2420.4267724, 53.3416745, 0.0106935],
[3227.2356966, 62.5115915, 0.0108348],
[4034.0446207, 69.8830824, 0.0075011],
[4840.8535449, 74.7736977, 0.0048188],
[5647.6624690, 78.0965121, 0.0035467],
[6454.4713932, 80.3863740, 0.0020324],
[7261.2803173, 81.2167777, 0.0000000],
]
else:
kappados_si = [
[-0.0000002, 0.0000000, 0.0000000],
[1.6966400, 2.1929621, 5.1701294],
[3.3932803, 25.7483415, 15.5091053],
[5.0899206, 56.6694055, 19.5050829],
[6.7865608, 68.7310303, 3.2377297],
[8.4832011, 72.7739143, 1.6408582],
[10.1798413, 74.7329367, 0.7889027],
[11.8764816, 77.1441825, 5.3645613],
[13.5731219, 80.8235276, 0.6098150],
[15.2697621, 81.3384416, 0.0000000],
]
gammados_si = [
[-0.0000002, 0.0000000, 0.0000000],
[1.6966400, 0.0000009, 0.0000022],
[3.3932803, 0.0000346, 0.0000776],
[5.0899206, 0.0003887, 0.0002460],
[6.7865608, 0.0005188, 0.0000447],
[8.4832011, 0.0007153, 0.0002547],
[10.1798413, 0.0017871, 0.0008887],
[11.8764816, 0.0023084, 0.0001784],
[13.5731219, 0.0026578, 0.0003562],
[15.2697621, 0.0077689, 0.0000000],
]
mfpdos_si = [
[0.0000000, 0.0000000, 0.0000000],
[806.8089241, 33.7483611, 0.0223642],
[1613.6178483, 44.9984189, 0.0104116],
[2420.4267724, 53.3597126, 0.0106858],
[3227.2356966, 62.5301968, 0.0108511],
[4034.0446207, 69.9297685, 0.0075505],
[4840.8535449, 74.8603881, 0.0048576],
[5647.6624690, 78.1954706, 0.0035546],
[6454.4713932, 80.4941074, 0.0020465],
[7261.2803173, 81.3384416, 0.0000000],
]
ph3 = si_pbesol
ph3.mesh_numbers = [7, 7, 7]
ph3.init_phph_interaction()
@ -220,25 +102,27 @@ def test_kappados_si(si_pbesol: Phono3py):
freq_points, kdos = _calculate_kappados(
ph3, tc.mode_kappa[0], freq_points=freq_points_in
)
for f, (jval, ival) in zip(freq_points, kdos):
print("%.7f, %.7f, %.7f," % (f, jval, ival))
# for f, (jval, ival) in zip(freq_points, kdos):
# print("[%.7f, %.7f, %.7f]," % (f, jval, ival))
np.testing.assert_allclose(
kappados_si, np.vstack((freq_points, kdos.T)).T.ravel(), rtol=0, atol=0.5
kappados_si, np.vstack((freq_points, kdos.T)).T, rtol=0, atol=0.5
)
freq_points, kdos = _calculate_kappados(
ph3, tc.gamma[0, :, :, :, None], freq_points=freq_points_in
)
# for f, (jval, ival) in zip(freq_points, kdos):
# print("[%.7f, %.7f, %.7f]," % (f, jval, ival))
np.testing.assert_allclose(
gammados_si, np.vstack((freq_points, kdos.T)).T.ravel(), rtol=0, atol=0.5
gammados_si, np.vstack((freq_points, kdos.T)).T, rtol=0, atol=1e-4
)
mfp_points_in = np.array(mfpdos_si).reshape(-1, 3)[:, 0]
mfp_points, mfpdos = _calculate_mfpdos(ph3, mfp_points_in)
# for f, (jval, ival) in zip(freq_points, mfpdos):
# print("%.7f, %.7f, %.7f," % (f, jval, ival))
# for f, (jval, ival) in zip(mfp_points, mfpdos):
# print("[%.7f, %.7f, %.7f]," % (f, jval, ival))
np.testing.assert_allclose(
mfpdos_si, np.vstack((mfp_points, mfpdos.T)).T.ravel(), rtol=0, atol=0.5
mfpdos_si, np.vstack((mfp_points, mfpdos.T)).T, rtol=0, atol=0.5
)
@ -250,6 +134,81 @@ def test_kappados_nacl(nacl_pbe: Phono3py):
* kappa vs mean free path
"""
if nacl_pbe._make_r0_average:
kappados_nacl = [
[-0.0000002, 0.0000000, 0.0000000],
[0.8051732, 0.0399444, 0.1984390],
[1.6103466, 0.8500862, 1.6651565],
[2.4155199, 2.1611612, 2.0462826],
[3.2206933, 4.8252014, 2.7906917],
[4.0258667, 6.7455774, 32.0221250],
[4.8310401, 7.8342086, 0.6232244],
[5.6362134, 8.0342122, 0.2370738],
[6.4413868, 8.1491279, 0.0600325],
[7.2465602, 8.1649079, 0.0000000],
]
gammados_nacl = [
[-0.0000002, 0.0000000, 0.0000000],
[0.8051732, 0.0000106, 0.0000528],
[1.6103466, 0.0002046, 0.0004709],
[2.4155199, 0.0009472, 0.0012819],
[3.2206933, 0.0022622, 0.0016645],
[4.0258667, 0.0034103, 0.0054783],
[4.8310401, 0.0061284, 0.0029336],
[5.6362134, 0.0080135, 0.0019550],
[6.4413868, 0.0106651, 0.0046371],
[7.2465602, 0.0151994, 0.0000000],
]
mfpdos_nacl = [
[0.0000000, 0.0000000, 0.0000000],
[117.4892903, 3.1996975, 0.0260716],
[234.9785806, 5.7553155, 0.0153949],
[352.4678709, 7.1540040, 0.0077163],
[469.9571612, 7.5793413, 0.0018178],
[587.4464515, 7.7799946, 0.0015717],
[704.9357418, 7.9439439, 0.0012052],
[822.4250321, 8.0613451, 0.0007915],
[939.9143223, 8.1309598, 0.0004040],
[1057.4036126, 8.1601561, 0.0001157],
]
else:
kappados_nacl = [
[-0.0000002, 0.0000000, 0.0000000],
[0.8051732, 0.0367419, 0.1825292],
[1.6103466, 0.7836072, 1.5469421],
[2.4155199, 2.0449081, 2.0062821],
[3.2206933, 4.6731679, 2.7888186],
[4.0258667, 6.6041834, 32.7256000],
[4.8310401, 7.6993258, 0.6289821],
[5.6362134, 7.8997102, 0.2365916],
[6.4413868, 8.0146450, 0.0603293],
[7.2465602, 8.0305633, 0.0000000],
]
gammados_nacl = [
[-0.0000002, 0.0000000, 0.0000000],
[0.8051732, 0.0000106, 0.0000524],
[1.6103466, 0.0002041, 0.0004715],
[2.4155199, 0.0009495, 0.0012874],
[3.2206933, 0.0022743, 0.0016787],
[4.0258667, 0.0034299, 0.0053880],
[4.8310401, 0.0061710, 0.0029085],
[5.6362134, 0.0080493, 0.0019511],
[6.4413868, 0.0106809, 0.0045989],
[7.2465602, 0.0151809, 0.0000000],
]
mfpdos_nacl = [
[0.0000000, 0.0000000, 0.0000000],
[117.4892903, 3.2044884, 0.0265249],
[234.9785806, 5.8068154, 0.0153182],
[352.4678709, 7.1822717, 0.0071674],
[469.9571612, 7.5691736, 0.0017935],
[587.4464515, 7.7601125, 0.0014313],
[704.9357418, 7.9015132, 0.0009674],
[822.4250321, 7.9875088, 0.0005054],
[939.9143223, 8.0243816, 0.0001485],
[1057.4036126, 8.0305631, 0.0000001],
]
ph3 = nacl_pbe
ph3.mesh_numbers = [7, 7, 7]
ph3.init_phph_interaction()
@ -264,24 +223,26 @@ def test_kappados_nacl(nacl_pbe: Phono3py):
ph3, tc.mode_kappa[0], freq_points=freq_points_in
)
# for f, (jval, ival) in zip(freq_points, kdos):
# print("%.7f, %.7f, %.7f," % (f, jval, ival))
# print("[%.7f, %.7f, %.7f]," % (f, jval, ival))
np.testing.assert_allclose(
kappados_nacl, np.vstack((freq_points, kdos.T)).T.ravel(), rtol=0, atol=0.5
kappados_nacl, np.vstack((freq_points, kdos.T)).T, rtol=0, atol=0.5
)
freq_points, kdos = _calculate_kappados(
ph3, tc.gamma[0, :, :, :, None], freq_points=freq_points_in
)
for f, (jval, ival) in zip(freq_points, kdos):
print("[%.7f, %.7f, %.7f]," % (f, jval, ival))
np.testing.assert_allclose(
gammados_nacl, np.vstack((freq_points, kdos.T)).T.ravel(), rtol=0, atol=0.5
gammados_nacl, np.vstack((freq_points, kdos.T)).T, rtol=0, atol=1e-4
)
mfp_points_in = np.array(mfpdos_nacl).reshape(-1, 3)[:, 0]
mfp_points, mfpdos = _calculate_mfpdos(ph3, mfp_points_in)
# for f, (jval, ival) in zip(freq_points, mfpdos):
# print("%.7f, %.7f, %.7f," % (f, jval, ival))
# for f, (jval, ival) in zip(mfp_points, mfpdos):
# print("[%.7f, %.7f, %.7f]," % (f, jval, ival))
np.testing.assert_allclose(
mfpdos_nacl, np.vstack((mfp_points, mfpdos.T)).T.ravel(), rtol=0, atol=0.5
mfpdos_nacl, np.vstack((mfp_points, mfpdos.T)).T, rtol=0, atol=0.5
)
@ -300,17 +261,18 @@ def test_GammaDOSsmearing(nacl_pbe: Phono3py):
phonon_states, ir_frequencies, ir_weights, num_sampling_points=10
)
fpoints, gdos_vals = gdos.get_gdos()
gdos_ref = [
[-1.4312845953710325e-07, 0.001748289450006],
[0.8213328685698041, 0.04545825822129761],
[1.6426658802680678, 0.2533557541451728],
[2.463998891966331, 0.9005575010964907],
[3.285331903664595, 1.6202936411038107],
[4.106664915362859, 1.9916061367478763],
[4.9279979270611225, 2.5977728237205513],
[5.749330938759386, 0.4504707799027985],
[6.57066395045765, 0.2936475034684396],
[7.391996962155914, 0.02869983288053483],
[-1.30357573e-07, 1.74828946e-03],
[8.21332876e-01, 4.54582590e-02],
[1.64266588e00, 2.53356134e-01],
[2.46399889e00, 9.00558131e-01],
[3.28533190e00, 1.62029335e00],
[4.10666490e00, 1.99160666e00],
[4.92799791e00, 2.59777233e00],
[5.74933092e00, 4.50470780e-01],
[6.57066392e00, 2.93647488e-01],
[7.39199693e00, 2.86997789e-02],
]
np.testing.assert_allclose(

File diff suppressed because it is too large Load Diff

View File

@ -1,191 +1,201 @@
"""Test Interaction class."""
from __future__ import annotations
from collections.abc import Sequence
from typing import Literal, Optional, Union
import numpy as np
import pytest
from phonopy.structure.cells import get_smallest_vectors
from phono3py import Phono3py
from phono3py.phonon3.interaction import Interaction
itr_RTA_Si = [
4.522052e-08,
4.896362e-08,
4.614211e-08,
4.744361e-08,
4.832248e-08,
4.698535e-08,
4.597876e-08,
4.645423e-08,
4.659572e-08,
4.730222e-08,
]
itr_RTA_AlN = [
7.456796e-08,
7.242121e-08,
7.068141e-08,
7.059521e-08,
7.289497e-08,
7.127172e-08,
7.082734e-08,
7.394367e-08,
7.084351e-08,
7.083299e-08,
7.085792e-08,
7.124150e-08,
7.048386e-08,
7.062840e-08,
7.036795e-08,
7.043995e-08,
7.366440e-08,
7.136803e-08,
6.988469e-08,
6.989518e-08,
7.179516e-08,
7.038043e-08,
7.011416e-08,
7.278196e-08,
6.999028e-08,
7.009615e-08,
7.018236e-08,
7.025054e-08,
6.977425e-08,
6.993095e-08,
6.962119e-08,
6.964423e-08,
7.121739e-08,
6.939940e-08,
6.834705e-08,
6.847351e-08,
6.977063e-08,
6.872065e-08,
6.863218e-08,
7.055696e-08,
6.836064e-08,
6.854052e-08,
6.864199e-08,
6.849059e-08,
6.826958e-08,
6.837379e-08,
6.808307e-08,
6.804480e-08,
6.961289e-08,
6.816170e-08,
6.730028e-08,
6.746055e-08,
6.851460e-08,
6.764892e-08,
6.754060e-08,
6.913662e-08,
6.729303e-08,
6.736722e-08,
6.734663e-08,
6.743441e-08,
6.713107e-08,
6.710084e-08,
6.698233e-08,
6.694871e-08,
]
itr_RTA_AlN_r0_ave = [
7.451662e-08,
7.248965e-08,
7.068341e-08,
7.038257e-08,
7.291756e-08,
7.130737e-08,
7.073777e-08,
7.391677e-08,
7.086006e-08,
7.077947e-08,
7.084617e-08,
7.128499e-08,
7.036749e-08,
7.057057e-08,
7.032233e-08,
7.041152e-08,
7.366076e-08,
7.149180e-08,
6.992398e-08,
6.972641e-08,
7.187472e-08,
7.046525e-08,
7.006265e-08,
7.280888e-08,
7.005107e-08,
7.008412e-08,
7.019342e-08,
7.034898e-08,
6.969589e-08,
6.990595e-08,
6.961230e-08,
6.966506e-08,
7.121203e-08,
6.954065e-08,
6.839930e-08,
6.831861e-08,
6.986872e-08,
6.882433e-08,
6.859035e-08,
7.059587e-08,
6.844120e-08,
6.854220e-08,
6.865246e-08,
6.861039e-08,
6.819986e-08,
6.835737e-08,
6.808818e-08,
6.808952e-08,
6.954409e-08,
6.824539e-08,
6.732596e-08,
6.726087e-08,
6.854755e-08,
6.770693e-08,
6.745257e-08,
6.910600e-08,
6.733516e-08,
6.731725e-08,
6.731323e-08,
6.749548e-08,
6.700802e-08,
6.703569e-08,
6.694826e-08,
6.694365e-08,
]
@pytest.mark.parametrize("lang", ["C", "Py"])
def test_interaction_RTA_si(si_pbesol, lang):
@pytest.mark.parametrize("lang", ["C", "Python"])
def test_interaction_RTA_si(si_pbesol: Phono3py, lang: Literal["C", "Python"]):
"""Test interaction_strength of Si."""
if si_pbesol._make_r0_average:
ref_itr_RTA_Si = [
4.522052e-08,
4.896362e-08,
4.614211e-08,
4.744361e-08,
4.832248e-08,
4.698535e-08,
4.597876e-08,
4.645423e-08,
4.659572e-08,
4.730222e-08,
]
else:
ref_itr_RTA_Si = [
4.522052e-08,
4.896362e-08,
4.614211e-08,
4.744361e-08,
4.832248e-08,
4.698535e-08,
4.597876e-08,
4.645423e-08,
4.659572e-08,
4.730222e-08,
]
itr = _get_irt(si_pbesol, [4, 4, 4])
itr.set_grid_point(1)
itr.run(lang=lang)
# _show(itr)
# (10, 6, 6, 6)
np.testing.assert_allclose(
itr.interaction_strength.sum(axis=(1, 2, 3)), itr_RTA_Si, rtol=0, atol=1e-10
itr.interaction_strength.sum(axis=(1, 2, 3)), ref_itr_RTA_Si, rtol=0, atol=1e-10
)
def test_interaction_RTA_AlN(aln_lda):
def test_interaction_RTA_AlN(aln_lda: Phono3py):
"""Test interaction_strength of AlN."""
if aln_lda._make_r0_average:
ref_itr_RTA_AlN = [
7.456796e-08,
7.242121e-08,
7.068141e-08,
7.059521e-08,
7.289497e-08,
7.127172e-08,
7.082734e-08,
7.394367e-08,
7.084351e-08,
7.083299e-08,
7.085792e-08,
7.124150e-08,
7.048386e-08,
7.062840e-08,
7.036795e-08,
7.043995e-08,
7.366440e-08,
7.136803e-08,
6.988469e-08,
6.989518e-08,
7.179516e-08,
7.038043e-08,
7.011416e-08,
7.278196e-08,
6.999028e-08,
7.009615e-08,
7.018236e-08,
7.025054e-08,
6.977425e-08,
6.993095e-08,
6.962119e-08,
6.964423e-08,
7.121739e-08,
6.939940e-08,
6.834705e-08,
6.847351e-08,
6.977063e-08,
6.872065e-08,
6.863218e-08,
7.055696e-08,
6.836064e-08,
6.854052e-08,
6.864199e-08,
6.849059e-08,
6.826958e-08,
6.837379e-08,
6.808307e-08,
6.804480e-08,
6.961289e-08,
6.816170e-08,
6.730028e-08,
6.746055e-08,
6.851460e-08,
6.764892e-08,
6.754060e-08,
6.913662e-08,
6.729303e-08,
6.736722e-08,
6.734663e-08,
6.743441e-08,
6.713107e-08,
6.710084e-08,
6.698233e-08,
6.694871e-08,
]
else:
ref_itr_RTA_AlN = [
7.456796e-08,
7.242121e-08,
7.068141e-08,
7.059521e-08,
7.289497e-08,
7.127172e-08,
7.082734e-08,
7.394367e-08,
7.084351e-08,
7.083299e-08,
7.085792e-08,
7.124150e-08,
7.048386e-08,
7.062840e-08,
7.036795e-08,
7.043995e-08,
7.366440e-08,
7.136803e-08,
6.988469e-08,
6.989518e-08,
7.179516e-08,
7.038043e-08,
7.011416e-08,
7.278196e-08,
6.999028e-08,
7.009615e-08,
7.018236e-08,
7.025054e-08,
6.977425e-08,
6.993095e-08,
6.962119e-08,
6.964423e-08,
7.121739e-08,
6.939940e-08,
6.834705e-08,
6.847351e-08,
6.977063e-08,
6.872065e-08,
6.863218e-08,
7.055696e-08,
6.836064e-08,
6.854052e-08,
6.864199e-08,
6.849059e-08,
6.826958e-08,
6.837379e-08,
6.808307e-08,
6.804480e-08,
6.961289e-08,
6.816170e-08,
6.730028e-08,
6.746055e-08,
6.851460e-08,
6.764892e-08,
6.754060e-08,
6.913662e-08,
6.729303e-08,
6.736722e-08,
6.734663e-08,
6.743441e-08,
6.713107e-08,
6.710084e-08,
6.698233e-08,
6.694871e-08,
]
itr = _get_irt(aln_lda, [7, 7, 7])
itr.set_grid_point(1)
itr.run()
# _show(itr)
np.testing.assert_allclose(
itr.interaction_strength.sum(axis=(1, 2, 3)), itr_RTA_AlN, rtol=0, atol=1e-10
)
def test_interaction_RTA_AlN_r0_ave(aln_lda):
"""Test interaction_strength of AlN."""
itr = _get_irt(aln_lda, [7, 7, 7], make_r0_average=True)
itr.set_grid_point(1)
itr.run()
# _show(itr)
_show(itr)
np.testing.assert_allclose(
itr.interaction_strength.sum(axis=(1, 2, 3)),
itr_RTA_AlN_r0_ave,
ref_itr_RTA_AlN,
rtol=0,
atol=1e-10,
)
@ -271,7 +281,7 @@ def test_interaction_run_phonon_solver_at_gamma_NaCl(nacl_pbe: Phono3py):
)
def test_phonon_solver_expand_RTA_si(si_pbesol):
def test_phonon_solver_expand_RTA_si(si_pbesol: Phono3py):
"""Test phonon solver with eigenvector rotation of Si.
Eigenvectors can be different but frequencies must be almost the same.
@ -286,19 +296,53 @@ def test_phonon_solver_expand_RTA_si(si_pbesol):
np.testing.assert_allclose(freqs, freqs_expanded, rtol=0, atol=1e-6)
def test_get_all_shortest(aln_lda: Phono3py):
"""Test Interaction._get_all_shortest."""
ph3 = aln_lda
ph3.mesh_numbers = 30
itr = Interaction(
ph3.primitive,
ph3.grid,
ph3.primitive_symmetry,
cutoff_frequency=1e-5,
)
s_svecs, s_multi = get_smallest_vectors(
ph3.supercell.cell,
ph3.supercell.scaled_positions,
ph3.supercell.scaled_positions,
store_dense_svecs=True,
)
s_lattice = ph3.supercell.cell
p_lattice = itr.primitive.cell
shortests = itr._all_shortest
svecs, multi, _, _, _ = itr.get_primitive_and_supercell_correspondence()
n_satom, n_patom, _ = multi.shape
for i, j, k in np.ndindex((n_patom, n_satom, n_satom)):
is_found = 0
if multi[j, i, 0] == 1 and multi[k, i, 0] == 1 and s_multi[j, k, 0] == 1:
d_jk_shortest = np.linalg.norm(s_svecs[s_multi[j, k, 1]] @ s_lattice)
vec_ij = svecs[multi[j, i, 1]]
vec_ik = svecs[multi[k, i, 1]]
vec_jk = vec_ik - vec_ij
d_jk = np.linalg.norm(vec_jk @ p_lattice)
if abs(d_jk - d_jk_shortest) < ph3.symmetry.tolerance:
is_found = 1
assert shortests[i, j, k] == is_found
def _get_irt(
ph3: Phono3py,
mesh,
nac_params=None,
solve_dynamical_matrices=True,
make_r0_average=False,
mesh: Union[int, float, Sequence, np.ndarray],
nac_params: Optional[dict] = None,
solve_dynamical_matrices: bool = True,
make_r0_average: bool = False,
):
ph3.mesh_numbers = mesh
itr = Interaction(
ph3.primitive,
ph3.grid,
ph3.primitive_symmetry,
ph3.fc3,
fc3=ph3.fc3,
make_r0_average=make_r0_average,
cutoff_frequency=1e-4,
)
@ -320,7 +364,7 @@ def _get_irt(
return itr
def _show(itr):
def _show(itr: Interaction):
itr_vals = itr.interaction_strength.sum(axis=(1, 2, 3))
for i, v in enumerate(itr_vals):
print("%e, " % v, end="")

View File

@ -205,14 +205,8 @@ nacl_jdos_gamma_at_300K = [
]
@pytest.mark.parametrize("gp,store_dense_gp_map", [(105, True)])
def test_jdos_si(si_pbesol: Phono3py, gp: int, store_dense_gp_map: bool):
"""Test joint-DOS by Si.
store_dense_gp_map=False : 103
store_dense_gp_map=True : 105
"""
def test_jdos_si(si_pbesol: Phono3py):
"""Test joint-DOS by Si."""
si_pbesol.mesh_numbers = [9, 9, 9]
jdos = Phono3pyJointDos(
si_pbesol.phonon_supercell,
@ -220,10 +214,9 @@ def test_jdos_si(si_pbesol: Phono3py, gp: int, store_dense_gp_map: bool):
si_pbesol.fc2,
mesh=si_pbesol.mesh_numbers,
num_frequency_points=10,
store_dense_gp_map=store_dense_gp_map,
log_level=1,
)
jdos.run([gp])
jdos.run([105])
# print(", ".join(["%.7f" % fp for fp in jdos.frequency_points]))
np.testing.assert_allclose(si_freq_points, jdos.frequency_points, atol=1e-5)
@ -233,8 +226,7 @@ def test_jdos_si(si_pbesol: Phono3py, gp: int, store_dense_gp_map: bool):
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(105, True)])
def test_jdso_si_nomeshsym(si_pbesol: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdso_si_nomeshsym(si_pbesol: Phono3py):
"""Test joint-DOS without considering mesh symmetry by Si."""
si_pbesol.mesh_numbers = [9, 9, 9]
jdos = Phono3pyJointDos(
@ -244,10 +236,9 @@ def test_jdso_si_nomeshsym(si_pbesol: Phono3py, gp: int, store_dense_gp_map: boo
mesh=si_pbesol.mesh_numbers,
num_frequency_points=10,
is_mesh_symmetry=False,
store_dense_gp_map=store_dense_gp_map,
log_level=1,
)
jdos.run([gp])
jdos.run([105])
# print(", ".join(["%.7f" % fp for fp in jdos.frequency_points]))
np.testing.assert_allclose(si_freq_points, jdos.frequency_points, atol=1e-5)
# print(", ".join(["%.7f" % jd for jd in jdos.joint_dos.ravel()]))
@ -256,8 +247,7 @@ def test_jdso_si_nomeshsym(si_pbesol: Phono3py, gp: int, store_dense_gp_map: boo
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(105, True)])
def test_jdos_nacl(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdos_nacl(nacl_pbe: Phono3py):
"""Test joint-DOS by NaCl."""
nacl_pbe.mesh_numbers = [9, 9, 9]
jdos = Phono3pyJointDos(
@ -267,10 +257,9 @@ def test_jdos_nacl(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
mesh=nacl_pbe.mesh_numbers,
nac_params=nacl_pbe.nac_params,
num_frequency_points=10,
store_dense_gp_map=store_dense_gp_map,
log_level=1,
)
jdos.run([gp])
jdos.run([105])
# print(", ".join(["%.7f" % fp for fp in jdos.frequency_points]))
np.testing.assert_allclose(nacl_freq_points, jdos.frequency_points, atol=1e-5)
# print(", ".join(["%.7f" % jd for jd in jdos.joint_dos.ravel()]))
@ -279,8 +268,7 @@ def test_jdos_nacl(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(0, True)])
def test_jdos_nacl_gamma(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdos_nacl_gamma(nacl_pbe: Phono3py):
"""Test joint-DOS at Gamma-point by NaCl."""
nacl_pbe.mesh_numbers = [9, 9, 9]
jdos = Phono3pyJointDos(
@ -291,10 +279,9 @@ def test_jdos_nacl_gamma(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
nac_params=nacl_pbe.nac_params,
nac_q_direction=[1, 0, 0],
num_frequency_points=10,
store_dense_gp_map=store_dense_gp_map,
log_level=1,
)
jdos.run([gp])
jdos.run([0])
# print(", ".join(["%.7f" % fp for fp in jdos.frequency_points]))
np.testing.assert_allclose(nacl_freq_points_gamma, jdos.frequency_points, atol=1e-5)
# print(", ".join(["%.7f" % jd for jd in jdos.joint_dos.ravel()]))
@ -303,8 +290,7 @@ def test_jdos_nacl_gamma(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(105, True)])
def test_jdos_nacl_at_300K(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdos_nacl_at_300K(nacl_pbe: Phono3py):
"""Test joint-DOS at 300K by NaCl."""
nacl_pbe.mesh_numbers = [9, 9, 9]
jdos = Phono3pyJointDos(
@ -317,10 +303,9 @@ def test_jdos_nacl_at_300K(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool
temperatures=[
300,
],
store_dense_gp_map=store_dense_gp_map,
log_level=1,
)
jdos.run([gp])
jdos.run([105])
# print(", ".join(["%.7f" % fp for fp in jdos.frequency_points]))
np.testing.assert_allclose(
nacl_freq_points_at_300K, jdos.frequency_points, atol=1e-5
@ -363,29 +348,22 @@ def test_jdos_nacl_nac_gamma_at_300K_npoints(nacl_pbe: Phono3py):
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(0, False), (0, True)])
def test_jdos_nac_direction_phonon_NaCl(
nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool
):
def test_jdos_nac_direction_phonon_NaCl(nacl_pbe: Phono3py):
"""Test JDOS of NaCl with nac_q_direction."""
jdos = _get_jdos(
nacl_pbe,
[7, 7, 7],
nac_params=nacl_pbe.nac_params,
store_dense_gp_map=store_dense_gp_map,
)
jdos.nac_q_direction = [1, 0, 0]
jdos.set_grid_point(gp)
jdos.set_grid_point(0)
frequencies, _, _ = jdos.get_phonons()
np.testing.assert_allclose(
frequencies[0], [0, 0, 0, 4.59488262, 4.59488262, 7.41183870], rtol=0, atol=1e-6
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(0, False), (0, True)])
def test_jdos_nac_direction_phonon_NaCl_second_error(
nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool
):
def test_jdos_nac_direction_phonon_NaCl_second_error(nacl_pbe: Phono3py):
"""Test JDOS of NaCl with nac_q_direction.
Second setting non-gamma grid point must raise exception.
@ -395,18 +373,14 @@ def test_jdos_nac_direction_phonon_NaCl_second_error(
nacl_pbe,
[7, 7, 7],
nac_params=nacl_pbe.nac_params,
store_dense_gp_map=store_dense_gp_map,
)
jdos.nac_q_direction = [1, 0, 0]
jdos.set_grid_point(gp)
jdos.set_grid_point(0)
with pytest.raises(RuntimeError):
jdos.set_grid_point(1)
@pytest.mark.parametrize("gp1,gp2,store_dense_gp_map", [(0, 1, False), (0, 1, True)])
def test_jdos_nac_direction_phonon_NaCl_second_no_error(
nacl_pbe: Phono3py, gp1: int, gp2: int, store_dense_gp_map: bool
):
def test_jdos_nac_direction_phonon_NaCl_second_no_error(nacl_pbe: Phono3py):
"""Test JDOS of NaCl with nac_q_direction.
Second setting non-gamma grid point should not raise exception because
@ -418,28 +392,25 @@ def test_jdos_nac_direction_phonon_NaCl_second_no_error(
nacl_pbe,
[7, 7, 7],
nac_params=nacl_pbe.nac_params,
store_dense_gp_map=store_dense_gp_map,
)
jdos.nac_q_direction = [1, 0, 0]
jdos.set_grid_point(gp1)
jdos.set_grid_point(0)
jdos.nac_q_direction = None
jdos.set_grid_point(gp2)
jdos.set_grid_point(1)
frequencies, _, _ = jdos.get_phonons()
np.testing.assert_allclose(
frequencies[0], [0, 0, 0, 4.59488262, 4.59488262, 4.59488262], rtol=0, atol=1e-6
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(103, False), (105, True)])
def test_jdos_nac_NaCl_300K_C(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdos_nac_NaCl_300K_C(nacl_pbe: Phono3py):
"""Test running JDOS of NaCl in C mode."""
jdos = _get_jdos(
nacl_pbe,
[9, 9, 9],
nac_params=nacl_pbe.nac_params,
store_dense_gp_map=store_dense_gp_map,
)
jdos.set_grid_point(gp)
jdos.set_grid_point(105)
jdos.frequency_points = nacl_freq_points_at_300K
jdos.temperature = 300
jdos.run_phonon_solver()
@ -450,16 +421,14 @@ def test_jdos_nac_NaCl_300K_C(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: b
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(103, False), (105, True)])
def test_jdos_nac_NaCl_300K_Py(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdos_nac_NaCl_300K_Py(nacl_pbe: Phono3py):
"""Test running JDOS of NaCl in Py (JDOS) mode."""
jdos = _get_jdos(
nacl_pbe,
[9, 9, 9],
nac_params=nacl_pbe.nac_params,
store_dense_gp_map=store_dense_gp_map,
)
jdos.set_grid_point(gp)
jdos.set_grid_point(105)
jdos.frequency_points = nacl_freq_points_at_300K
jdos.temperature = 300
jdos.run_phonon_solver()
@ -470,16 +439,14 @@ def test_jdos_nac_NaCl_300K_Py(nacl_pbe: Phono3py, gp: int, store_dense_gp_map:
)
@pytest.mark.parametrize("gp,store_dense_gp_map", [(103, False), (105, True)])
def test_jdos_nac_NaCl_300K_PyPy(nacl_pbe: Phono3py, gp: int, store_dense_gp_map: bool):
def test_jdos_nac_NaCl_300K_PyPy(nacl_pbe: Phono3py):
"""Test running JDOS of NaCl in Py (JDOS) and Py (tetrahedron) mode."""
jdos = _get_jdos(
nacl_pbe,
[9, 9, 9],
nac_params=nacl_pbe.nac_params,
store_dense_gp_map=store_dense_gp_map,
)
jdos.set_grid_point(gp)
jdos.set_grid_point(105)
jdos.frequency_points = nacl_freq_points_at_300K
jdos.temperature = 300
jdos.run_phonon_solver()
@ -490,12 +457,12 @@ def test_jdos_nac_NaCl_300K_PyPy(nacl_pbe: Phono3py, gp: int, store_dense_gp_map
)
def _get_jdos(ph3: Phono3py, mesh, nac_params=None, store_dense_gp_map=False):
def _get_jdos(ph3: Phono3py, mesh, nac_params=None):
bz_grid = BZGrid(
mesh,
lattice=ph3.primitive.cell,
symmetry_dataset=ph3.primitive_symmetry.dataset,
store_dense_gp_map=store_dense_gp_map,
store_dense_gp_map=True,
)
jdos = JointDos(
ph3.primitive,
@ -503,7 +470,6 @@ def _get_jdos(ph3: Phono3py, mesh, nac_params=None, store_dense_gp_map=False):
bz_grid,
ph3.fc2,
nac_params=nac_params,
store_dense_gp_map=store_dense_gp_map,
cutoff_frequency=1e-4,
)
return jdos

View File

@ -4,252 +4,51 @@ import numpy as np
from phono3py import Phono3py
from phono3py.phonon3.real_self_energy import ImagToReal
si_pbesol_Delta = [
[-0.0057666, -0.0057666, -0.01639729, -0.14809965, -0.15091765, -0.15091765],
[-0.02078728, -0.02102094, -0.06573269, -0.11432603, -0.1366966, -0.14371315],
]
si_pbesol_Delta_fps = [
[
-0.00576660,
-0.00594616,
-0.00840087,
-0.00960344,
-0.00576660,
-0.00594616,
-0.00840087,
-0.00960344,
-0.01493508,
-0.01639729,
-0.01997820,
-0.02070427,
-0.15511645,
-0.14747203,
-0.14809966,
-0.14230763,
-0.15674925,
-0.15684992,
-0.15983868,
-0.15091767,
-0.15674925,
-0.15684992,
-0.15983868,
-0.15091767,
],
[
-0.01990306,
-0.02077094,
-0.01798066,
-0.01935581,
-0.02158076,
-0.02190634,
-0.02195633,
-0.01882258,
-0.05740055,
-0.05240406,
-0.06252644,
-0.05651015,
-0.13072273,
-0.11929265,
-0.13472599,
-0.13105120,
-0.15191900,
-0.14202698,
-0.14371246,
-0.14168892,
-0.14760248,
-0.13907618,
-0.14275290,
-0.14100562,
],
]
# imag-self-energy Si-PBEsol 50x50x50 gp=5, bi=4, 101 points, 300K
im_part = [
[0.0000000, 0.0000000, -0.0000000, -0.1750223, 0.1534611, -0.1794583],
[0.3069222, 0.0180686, 0.3069222, -0.1692049, 0.4603833, -0.1636592],
[0.6138444, 0.0158916, 0.6138444, -0.1621245, 0.7673055, -0.1625514],
[0.9207667, 0.0238034, 0.9207667, -0.1556618, 1.0742278, -0.1484696],
[1.2276889, 0.0131519, 1.2276889, -0.1515719, 1.3811500, -0.1525501],
[1.5346111, 0.0124129, 1.5346111, -0.1541357, 1.6880722, -0.1566124],
[1.8415333, 0.0165506, 1.8415333, -0.1556995, 1.9949944, -0.1567434],
[2.1484555, 0.0196960, 2.1484555, -0.1556492, 2.3019166, -0.1563791],
[2.4553778, 0.0225276, 2.4553778, -0.1553117, 2.6088389, -0.1562531],
[2.7623000, 0.0269193, 2.7623000, -0.1536529, 2.9157611, -0.1520174],
[3.0692222, 0.0247502, 3.0692222, -0.1530976, 3.2226833, -0.1545476],
[3.3761444, 0.0253261, 3.3761444, -0.1565178, 3.5296055, -0.1617560],
[3.6830666, 0.0360216, 3.6830666, -0.1586552, 3.8365277, -0.1618262],
[3.9899888, 0.0510642, 3.9899888, -0.1523272, 4.1434499, -0.1463620],
[4.2969111, 0.0494221, 4.2969111, -0.1428688, 4.4503722, -0.1388442],
[4.6038333, 0.0474328, 4.6038333, -0.1361604, 4.7572944, -0.1307086],
[4.9107555, 0.0370451, 4.9107555, -0.1345154, 5.0642166, -0.1359581],
[5.2176777, 0.0375397, 5.2176777, -0.1361887, 5.3711388, -0.1356714],
[5.5245999, 0.0345936, 5.5245999, -0.1377925, 5.6780610, -0.1390885],
[5.8315222, 0.0327132, 5.8315222, -0.1425343, 5.9849833, -0.1472336],
[6.1384444, 0.0374592, 6.1384444, -0.1489307, 6.2919055, -0.1562694],
[6.4453666, 0.0555985, 6.4453666, -0.1481088, 6.5988277, -0.1452657],
[6.7522888, 0.0586765, 6.7522888, -0.1409779, 6.9057499, -0.1375563],
[7.0592110, 0.0560470, 7.0592110, -0.1371741, 7.2126721, -0.1365273],
[7.3661333, 0.0550400, 7.3661333, -0.1372613, 7.5195944, -0.1387434],
[7.6730555, 0.0565263, 7.6730555, -0.1399341, 7.8265166, -0.1440837],
[7.9799777, 0.0624044, 7.9799777, -0.1457614, 8.1334388, -0.1582010],
[8.2868999, 0.1009214, 8.2868999, -0.1369623, 8.4403610, -0.1261905],
[8.5938221, 0.1090238, 8.5938221, -0.1087372, 8.7472832, -0.0870371],
[8.9007444, 0.0807253, 8.9007444, -0.0903838, 9.0542055, -0.0835210],
[9.2076666, 0.0658383, 9.2076666, -0.0875470, 9.3611277, -0.0853012],
[9.5145888, 0.0592222, 9.5145888, -0.0867791, 9.6680499, -0.0838069],
[9.8215110, 0.0521071, 9.8215110, -0.0853895, 9.9749721, -0.0820186],
[10.1284332, 0.0419588, 10.1284332, -0.0862870, 10.2818943, -0.0860513],
[10.4353554, 0.0364097, 10.4353554, -0.0892629, 10.5888165, -0.0892228],
[10.7422777, 0.0316193, 10.7422777, -0.0922975, 10.8957388, -0.0926032],
[11.0491999, 0.0274798, 11.0491999, -0.0955924, 11.2026610, -0.0960711],
[11.3561221, 0.0233126, 11.3561221, -0.0994131, 11.5095832, -0.1004271],
[11.6630443, 0.0193464, 11.6630443, -0.1043388, 11.8165054, -0.1065527],
[11.9699665, 0.0174292, 11.9699665, -0.1099907, 12.1234276, -0.1125414],
[12.2768888, 0.0164239, 12.2768888, -0.1157951, 12.4303499, -0.1188108],
[12.5838110, 0.0165308, 12.5838110, -0.1218120, 12.7372721, -0.1253937],
[12.8907332, 0.0184723, 12.8907332, -0.1275275, 13.0441943, -0.1309579],
[13.1976554, 0.0211215, 13.1976554, -0.1325454, 13.3511165, -0.1358727],
[13.5045776, 0.0244407, 13.5045776, -0.1369047, 13.6580387, -0.1400194],
[13.8114999, 0.0282908, 13.8114999, -0.1404205, 13.9649610, -0.1429165],
[14.1184221, 0.0313175, 14.1184221, -0.1435582, 14.2718832, -0.1462968],
[14.4253443, 0.0348581, 14.4253443, -0.1467576, 14.5788054, -0.1495649],
[14.7322665, 0.0386150, 14.7322665, -0.1500845, 14.8857276, -0.1533339],
[15.0391887, 0.0424503, 15.0391887, -0.1550110, 15.1926498, -0.1625259],
[15.3461109, 0.0605747, 15.3461109, -0.1550584, 15.4995720, -0.1547951],
[15.6530332, 0.0727408, 15.6530332, -0.1443151, 15.8064943, -0.1346934],
[15.9599554, 0.0625829, 15.9599554, -0.1346277, 16.1134165, -0.1305515],
[16.2668776, 0.0547742, 16.2668776, -0.1324223, 16.4203387, -0.1301107],
[16.5737998, 0.0459500, 16.5737998, -0.1348752, 16.7272609, -0.1365713],
[16.8807220, 0.0432888, 16.8807220, -0.1397155, 17.0341831, -0.1410867],
[17.1876443, 0.0398939, 17.1876443, -0.1450244, 17.3411054, -0.1471968],
[17.4945665, 0.0351088, 17.4945665, -0.1540409, 17.6480276, -0.1617873],
[17.8014887, 0.0424833, 17.8014887, -0.1635035, 17.9549498, -0.1699703],
[18.1084109, 0.0556675, 18.1084109, -0.1649880, 18.2618720, -0.1626782],
[18.4153331, 0.0532241, 18.4153331, -0.1631579, 18.5687942, -0.1618524],
[18.7222554, 0.0458460, 18.7222554, -0.1672846, 18.8757165, -0.1709147],
[19.0291776, 0.0443150, 19.0291776, -0.1758322, 19.1826387, -0.1808661],
[19.3360998, 0.0454289, 19.3360998, -0.1853104, 19.4895609, -0.1911626],
[19.6430220, 0.0483353, 19.6430220, -0.1952856, 19.7964831, -0.2019949],
[19.9499442, 0.0534799, 19.9499442, -0.2053378, 20.1034053, -0.2123304],
[20.2568665, 0.0599861, 20.2568665, -0.2151359, 20.4103276, -0.2225551],
[20.5637887, 0.0685856, 20.5637887, -0.2240731, 20.7172498, -0.2305568],
[20.8707109, 0.0755373, 20.8707109, -0.2331629, 21.0241720, -0.2419628],
[21.1776331, 0.0906438, 21.1776331, -0.2384003, 21.3310942, -0.2380604],
[21.4845553, 0.0827018, 21.4845553, -0.2476712, 21.6380164, -0.2593767],
[21.7914775, 0.0907297, 21.7914775, -0.2660044, 21.9449386, -0.2793854],
[22.0983998, 0.1025946, 22.0983998, -0.2859215, 22.2518609, -0.3026711],
[22.4053220, 0.1210133, 22.4053220, -0.3084041, 22.5587831, -0.3297156],
[22.7122442, 0.1517773, 22.7122442, -0.3307280, 22.8657053, -0.3535969],
[23.0191664, 0.1918115, 23.0191664, -0.3505455, 23.1726275, -0.3769971],
[23.3260886, 0.2484881, 23.3260886, -0.3659809, 23.4795497, -0.3980745],
[23.6330109, 0.3449959, 23.6330109, -0.3587633, 23.7864720, -0.3785512],
[23.9399331, 0.4932745, 23.9399331, -0.2683146, 24.0933942, -0.1740930],
[24.2468553, 0.4000672, 24.2468553, -0.1714061, 24.4003164, -0.1388929],
[24.5537775, 0.3476085, 24.5537775, -0.1478397, 24.7072386, -0.1341295],
[24.8606997, 0.3031722, 24.8606997, -0.1588841, 25.0141608, -0.1796324],
[25.1676220, 0.3332258, 25.1676220, -0.1716723, 25.3210831, -0.1741573],
[25.4745442, 0.3514490, 25.4745442, -0.1621265, 25.6280053, -0.1553650],
[25.7814664, 0.3514801, 25.7814664, -0.1503569, 25.9349275, -0.1458311],
[26.0883886, 0.3490583, 26.0883886, -0.1437619, 26.2418497, -0.1387991],
[26.3953108, 0.3346525, 26.3953108, -0.1471754, 26.5487719, -0.1497006],
[26.7022331, 0.3145614, 26.7022331, -0.1719482, 26.8556942, -0.1898755],
[27.0091553, 0.2913173, 27.0091553, -0.2370443, 27.1626164, -0.2939869],
[27.3160775, 0.2707732, 27.3160775, -0.4139632, 27.4695386, -0.6910918],
[27.6229997, 0.9436577, 27.6229997, -0.3688420, 27.7764608, -0.2026185],
[27.9299219, 0.9147269, 27.9299219, -0.1095194, 28.0833830, -0.0365244],
[28.2368441, 0.9515446, 28.2368441, 0.0642006, 28.3903052, 0.1596622],
[28.5437664, 0.9296466, 28.5437664, 0.2357042, 28.6972275, 0.3228099],
[28.8506886, 0.9383991, 28.8506886, 0.4390380, 29.0041497, 0.6142345],
[29.1576108, 0.7465231, 29.1576108, 0.6502426, 29.3110719, 0.8357126],
[29.4645330, 0.3472854, 29.4645330, 0.6927159, 29.6179941, 0.6873352],
[29.7714552, 0.2258269, 29.7714552, 0.6147208, 29.9249163, 0.6117702],
[30.0783775, 0.1397870, 30.0783775, 0.5578788, 30.2318386, 0.5591731],
[30.3852997, 0.0468188, 30.3852997, 0.4941608, 30.5387608, 0.4706733],
[30.6922219, 0.0000000, 30.6922219, 0.4173657, 30.8456830, 0.3821416],
]
delta_nacl_nac = [
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
-0.43835832,
-0.43835832,
-0.27175512,
0.00000000,
0.00000000,
0.00000000,
-0.24732785,
-0.24732785,
-0.15332798,
0.00000000,
0.00000000,
0.00000000,
-0.45125778,
-0.45125778,
-0.27975198,
0.00000000,
0.00000000,
0.00000000,
-0.80781739,
-0.80781739,
-0.50079699,
0.00000000,
0.00000000,
0.00000000,
-0.36217245,
-0.36217245,
-0.22452456,
0.00000000,
0.00000000,
0.00000000,
0.54848940,
0.54848940,
0.34002959,
0.00000000,
0.00000000,
0.00000000,
0.29335952,
0.29335952,
0.18186480,
0.00000000,
0.00000000,
0.00000000,
0.16329650,
0.16329650,
0.10123375,
0.00000000,
0.00000000,
0.00000000,
0.11208511,
0.11208511,
0.06948585,
]
freq_points_nacl_nac = [
0.0,
1.63223063,
3.26446125,
4.89669188,
6.5289225,
8.16115313,
9.79338375,
11.42561438,
13.057845,
14.69007563,
]
def test_real_self_energy_with_band_indices(si_pbesol):
def test_real_self_energy_with_band_indices(si_pbesol: Phono3py):
"""Real part of self energy spectrum of Si.
* at frequencies of band indices.
"""
if si_pbesol._make_r0_average:
ref_Delta = [
[
-0.0057326,
-0.0057326,
-0.01633157,
-0.14797815,
-0.15086179,
-0.15086179,
],
[
-0.02080177,
-0.02104276,
-0.06575259,
-0.11439863,
-0.13666415,
-0.14372152,
],
]
else:
ref_Delta = [
[
-0.0057666,
-0.0057666,
-0.01639729,
-0.14809965,
-0.15091765,
-0.15091765,
],
[
-0.02078728,
-0.02102094,
-0.06573269,
-0.11432603,
-0.1366966,
-0.14371315,
],
]
si_pbesol.mesh_numbers = [9, 9, 9]
si_pbesol.init_phph_interaction()
_, delta = si_pbesol.run_real_self_energy(
@ -260,7 +59,8 @@ def test_real_self_energy_with_band_indices(si_pbesol):
write_hdf5=False,
frequency_points_at_bands=True,
)
np.testing.assert_allclose(si_pbesol_Delta, delta[0, 0, :], atol=0.01)
# print(delta[0, 0, :])
np.testing.assert_allclose(ref_Delta, delta[0, 0, :], atol=0.01)
def test_real_self_energy_with_frequency_points(si_pbesol: Phono3py):
@ -269,6 +69,117 @@ def test_real_self_energy_with_frequency_points(si_pbesol: Phono3py):
* specified frquency points
"""
if si_pbesol._make_r0_average:
ref_Delta_fps = [
[
-0.00573260,
-0.00589756,
-0.00839449,
-0.00966402,
-0.00573260,
-0.00589756,
-0.00839449,
-0.00966402,
-0.01486569,
-0.01633157,
-0.01993995,
-0.02073417,
-0.15512961,
-0.14758526,
-0.14797816,
-0.14222444,
-0.15683457,
-0.15691468,
-0.15974324,
-0.15086181,
-0.15683457,
-0.15691468,
-0.15974324,
-0.15086181,
],
[
-0.01990876,
-0.02077841,
-0.01798683,
-0.01933049,
-0.02158770,
-0.02193100,
-0.02186381,
-0.01877096,
-0.05743552,
-0.05244391,
-0.06241623,
-0.05643933,
-0.13068294,
-0.11925247,
-0.13470590,
-0.13105466,
-0.15192994,
-0.14204618,
-0.14364976,
-0.14173656,
-0.14762541,
-0.13904288,
-0.14284911,
-0.14112034,
],
]
else:
ref_Delta_fps = [
[
-0.00576660,
-0.00594616,
-0.00840087,
-0.00960344,
-0.00576660,
-0.00594616,
-0.00840087,
-0.00960344,
-0.01493508,
-0.01639729,
-0.01997820,
-0.02070427,
-0.15511645,
-0.14747203,
-0.14809966,
-0.14230763,
-0.15674925,
-0.15684992,
-0.15983868,
-0.15091767,
-0.15674925,
-0.15684992,
-0.15983868,
-0.15091767,
],
[
-0.01990306,
-0.02077094,
-0.01798066,
-0.01935581,
-0.02158076,
-0.02190634,
-0.02195633,
-0.01882258,
-0.05740055,
-0.05240406,
-0.06252644,
-0.05651015,
-0.13072273,
-0.11929265,
-0.13472599,
-0.13105120,
-0.15191900,
-0.14202698,
-0.14371246,
-0.14168892,
-0.14760248,
-0.13907618,
-0.14275290,
-0.14100562,
],
]
si_pbesol.mesh_numbers = [9, 9, 9]
si_pbesol.init_phph_interaction()
frequency_points = [1.469947, 3.085309, 14.997187, 15.129080]
@ -282,18 +193,14 @@ def test_real_self_energy_with_frequency_points(si_pbesol: Phono3py):
frequency_points_at_bands=False,
)
np.testing.assert_allclose(frequency_points, fps, atol=1e-5)
np.testing.assert_allclose(
si_pbesol_Delta_fps[0], delta[0, 0, 0].ravel(), atol=0.01
)
np.testing.assert_allclose(
si_pbesol_Delta_fps[1], delta[0, 0, 1].ravel(), atol=0.01
)
# for b in delta[0, 0, 0]:
# print("".join("%.8f, " % s for s in b))
# for b in delta[0, 1, 0]:
# print("".join("%.8f, " % s for s in b))
# print("".join(f"{s:.8f}, " % s for s in b))
# for b in delta[0, 0, 1]:
# print("".join(f"{s:.8f}, " % s for s in b))
np.testing.assert_allclose(frequency_points, fps, atol=1e-5)
np.testing.assert_allclose(ref_Delta_fps[0], delta[0, 0, 0].ravel(), atol=0.01)
np.testing.assert_allclose(ref_Delta_fps[1], delta[0, 0, 1].ravel(), atol=0.01)
def test_real_self_energy_nacl_nac_npoints(nacl_pbe: Phono3py):
@ -303,22 +210,290 @@ def test_real_self_energy_nacl_nac_npoints(nacl_pbe: Phono3py):
* at q->0
"""
ref_freq_points_nacl_nac = [
0.0,
1.63223063,
3.26446125,
4.89669188,
6.5289225,
8.16115313,
9.79338375,
11.42561438,
13.057845,
14.69007563,
]
if nacl_pbe._make_r0_average:
ref_delta_nacl_nac = [
[
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
],
[
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
],
[
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
],
[
0.00000000,
-0.43955299,
-0.24659961,
-0.45227602,
-0.80296691,
-0.35433156,
0.54514663,
0.29417714,
0.16346531,
0.11216578,
],
[
0.00000000,
-0.43955299,
-0.24659961,
-0.45227602,
-0.80296691,
-0.35433156,
0.54514663,
0.29417714,
0.16346531,
0.11216578,
],
[
0.00000000,
-0.27249573,
-0.15287654,
-0.28038322,
-0.49778992,
-0.21966368,
0.33795727,
0.18237167,
0.10133841,
0.06953586,
],
]
else:
ref_delta_nacl_nac = [
[
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
],
[
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
],
[
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
0.00000000,
],
[
0.00000000,
-0.43835860,
-0.24732790,
-0.45125795,
-0.80781808,
-0.36217377,
0.54848873,
0.29335955,
0.16329652,
0.11208513,
],
[
0.00000000,
-0.43835860,
-0.24732790,
-0.45125795,
-0.80781808,
-0.36217377,
0.54848873,
0.29335955,
0.16329652,
0.11208513,
],
[
0.00000000,
-0.27175528,
-0.15332803,
-0.27975208,
-0.50079735,
-0.22452538,
0.34002916,
0.18186482,
0.10123376,
0.06948586,
],
]
nacl_pbe.mesh_numbers = [9, 9, 9]
nacl_pbe.init_phph_interaction(nac_q_direction=[1, 0, 0])
fps, delta = nacl_pbe.run_real_self_energy(
[nacl_pbe.grid.gp_Gamma], [300], num_frequency_points=10
)
# for line in np.swapaxes(delta, -1, -2).ravel().reshape(-1, 6):
# print(("%10.8f, " * 6) % tuple(line))
# print(fps.ravel())
np.testing.assert_allclose(freq_points_nacl_nac, fps.ravel(), rtol=0, atol=1e-5)
np.testing.assert_allclose(
delta_nacl_nac, np.swapaxes(delta, -1, -2).ravel(), rtol=0, atol=1e-2
)
# for line in delta[0, 0, 0]:
# print("[", ",".join([f"{val:.8f}" for val in line]), "],")
np.testing.assert_allclose(ref_freq_points_nacl_nac, fps.ravel(), rtol=0, atol=1e-5)
np.testing.assert_allclose(ref_delta_nacl_nac, delta[0, 0, 0], rtol=0, atol=1e-2)
def test_ImagToReal():
"""Test ImagToReal class (KramersKronig relation)."""
# imag-self-energy Si-PBEsol 50x50x50 gp=5, bi=4, 101 points, 300K
im_part = [
[0.0000000, 0.0000000, -0.0000000, -0.1750223, 0.1534611, -0.1794583],
[0.3069222, 0.0180686, 0.3069222, -0.1692049, 0.4603833, -0.1636592],
[0.6138444, 0.0158916, 0.6138444, -0.1621245, 0.7673055, -0.1625514],
[0.9207667, 0.0238034, 0.9207667, -0.1556618, 1.0742278, -0.1484696],
[1.2276889, 0.0131519, 1.2276889, -0.1515719, 1.3811500, -0.1525501],
[1.5346111, 0.0124129, 1.5346111, -0.1541357, 1.6880722, -0.1566124],
[1.8415333, 0.0165506, 1.8415333, -0.1556995, 1.9949944, -0.1567434],
[2.1484555, 0.0196960, 2.1484555, -0.1556492, 2.3019166, -0.1563791],
[2.4553778, 0.0225276, 2.4553778, -0.1553117, 2.6088389, -0.1562531],
[2.7623000, 0.0269193, 2.7623000, -0.1536529, 2.9157611, -0.1520174],
[3.0692222, 0.0247502, 3.0692222, -0.1530976, 3.2226833, -0.1545476],
[3.3761444, 0.0253261, 3.3761444, -0.1565178, 3.5296055, -0.1617560],
[3.6830666, 0.0360216, 3.6830666, -0.1586552, 3.8365277, -0.1618262],
[3.9899888, 0.0510642, 3.9899888, -0.1523272, 4.1434499, -0.1463620],
[4.2969111, 0.0494221, 4.2969111, -0.1428688, 4.4503722, -0.1388442],
[4.6038333, 0.0474328, 4.6038333, -0.1361604, 4.7572944, -0.1307086],
[4.9107555, 0.0370451, 4.9107555, -0.1345154, 5.0642166, -0.1359581],
[5.2176777, 0.0375397, 5.2176777, -0.1361887, 5.3711388, -0.1356714],
[5.5245999, 0.0345936, 5.5245999, -0.1377925, 5.6780610, -0.1390885],
[5.8315222, 0.0327132, 5.8315222, -0.1425343, 5.9849833, -0.1472336],
[6.1384444, 0.0374592, 6.1384444, -0.1489307, 6.2919055, -0.1562694],
[6.4453666, 0.0555985, 6.4453666, -0.1481088, 6.5988277, -0.1452657],
[6.7522888, 0.0586765, 6.7522888, -0.1409779, 6.9057499, -0.1375563],
[7.0592110, 0.0560470, 7.0592110, -0.1371741, 7.2126721, -0.1365273],
[7.3661333, 0.0550400, 7.3661333, -0.1372613, 7.5195944, -0.1387434],
[7.6730555, 0.0565263, 7.6730555, -0.1399341, 7.8265166, -0.1440837],
[7.9799777, 0.0624044, 7.9799777, -0.1457614, 8.1334388, -0.1582010],
[8.2868999, 0.1009214, 8.2868999, -0.1369623, 8.4403610, -0.1261905],
[8.5938221, 0.1090238, 8.5938221, -0.1087372, 8.7472832, -0.0870371],
[8.9007444, 0.0807253, 8.9007444, -0.0903838, 9.0542055, -0.0835210],
[9.2076666, 0.0658383, 9.2076666, -0.0875470, 9.3611277, -0.0853012],
[9.5145888, 0.0592222, 9.5145888, -0.0867791, 9.6680499, -0.0838069],
[9.8215110, 0.0521071, 9.8215110, -0.0853895, 9.9749721, -0.0820186],
[10.1284332, 0.0419588, 10.1284332, -0.0862870, 10.2818943, -0.0860513],
[10.4353554, 0.0364097, 10.4353554, -0.0892629, 10.5888165, -0.0892228],
[10.7422777, 0.0316193, 10.7422777, -0.0922975, 10.8957388, -0.0926032],
[11.0491999, 0.0274798, 11.0491999, -0.0955924, 11.2026610, -0.0960711],
[11.3561221, 0.0233126, 11.3561221, -0.0994131, 11.5095832, -0.1004271],
[11.6630443, 0.0193464, 11.6630443, -0.1043388, 11.8165054, -0.1065527],
[11.9699665, 0.0174292, 11.9699665, -0.1099907, 12.1234276, -0.1125414],
[12.2768888, 0.0164239, 12.2768888, -0.1157951, 12.4303499, -0.1188108],
[12.5838110, 0.0165308, 12.5838110, -0.1218120, 12.7372721, -0.1253937],
[12.8907332, 0.0184723, 12.8907332, -0.1275275, 13.0441943, -0.1309579],
[13.1976554, 0.0211215, 13.1976554, -0.1325454, 13.3511165, -0.1358727],
[13.5045776, 0.0244407, 13.5045776, -0.1369047, 13.6580387, -0.1400194],
[13.8114999, 0.0282908, 13.8114999, -0.1404205, 13.9649610, -0.1429165],
[14.1184221, 0.0313175, 14.1184221, -0.1435582, 14.2718832, -0.1462968],
[14.4253443, 0.0348581, 14.4253443, -0.1467576, 14.5788054, -0.1495649],
[14.7322665, 0.0386150, 14.7322665, -0.1500845, 14.8857276, -0.1533339],
[15.0391887, 0.0424503, 15.0391887, -0.1550110, 15.1926498, -0.1625259],
[15.3461109, 0.0605747, 15.3461109, -0.1550584, 15.4995720, -0.1547951],
[15.6530332, 0.0727408, 15.6530332, -0.1443151, 15.8064943, -0.1346934],
[15.9599554, 0.0625829, 15.9599554, -0.1346277, 16.1134165, -0.1305515],
[16.2668776, 0.0547742, 16.2668776, -0.1324223, 16.4203387, -0.1301107],
[16.5737998, 0.0459500, 16.5737998, -0.1348752, 16.7272609, -0.1365713],
[16.8807220, 0.0432888, 16.8807220, -0.1397155, 17.0341831, -0.1410867],
[17.1876443, 0.0398939, 17.1876443, -0.1450244, 17.3411054, -0.1471968],
[17.4945665, 0.0351088, 17.4945665, -0.1540409, 17.6480276, -0.1617873],
[17.8014887, 0.0424833, 17.8014887, -0.1635035, 17.9549498, -0.1699703],
[18.1084109, 0.0556675, 18.1084109, -0.1649880, 18.2618720, -0.1626782],
[18.4153331, 0.0532241, 18.4153331, -0.1631579, 18.5687942, -0.1618524],
[18.7222554, 0.0458460, 18.7222554, -0.1672846, 18.8757165, -0.1709147],
[19.0291776, 0.0443150, 19.0291776, -0.1758322, 19.1826387, -0.1808661],
[19.3360998, 0.0454289, 19.3360998, -0.1853104, 19.4895609, -0.1911626],
[19.6430220, 0.0483353, 19.6430220, -0.1952856, 19.7964831, -0.2019949],
[19.9499442, 0.0534799, 19.9499442, -0.2053378, 20.1034053, -0.2123304],
[20.2568665, 0.0599861, 20.2568665, -0.2151359, 20.4103276, -0.2225551],
[20.5637887, 0.0685856, 20.5637887, -0.2240731, 20.7172498, -0.2305568],
[20.8707109, 0.0755373, 20.8707109, -0.2331629, 21.0241720, -0.2419628],
[21.1776331, 0.0906438, 21.1776331, -0.2384003, 21.3310942, -0.2380604],
[21.4845553, 0.0827018, 21.4845553, -0.2476712, 21.6380164, -0.2593767],
[21.7914775, 0.0907297, 21.7914775, -0.2660044, 21.9449386, -0.2793854],
[22.0983998, 0.1025946, 22.0983998, -0.2859215, 22.2518609, -0.3026711],
[22.4053220, 0.1210133, 22.4053220, -0.3084041, 22.5587831, -0.3297156],
[22.7122442, 0.1517773, 22.7122442, -0.3307280, 22.8657053, -0.3535969],
[23.0191664, 0.1918115, 23.0191664, -0.3505455, 23.1726275, -0.3769971],
[23.3260886, 0.2484881, 23.3260886, -0.3659809, 23.4795497, -0.3980745],
[23.6330109, 0.3449959, 23.6330109, -0.3587633, 23.7864720, -0.3785512],
[23.9399331, 0.4932745, 23.9399331, -0.2683146, 24.0933942, -0.1740930],
[24.2468553, 0.4000672, 24.2468553, -0.1714061, 24.4003164, -0.1388929],
[24.5537775, 0.3476085, 24.5537775, -0.1478397, 24.7072386, -0.1341295],
[24.8606997, 0.3031722, 24.8606997, -0.1588841, 25.0141608, -0.1796324],
[25.1676220, 0.3332258, 25.1676220, -0.1716723, 25.3210831, -0.1741573],
[25.4745442, 0.3514490, 25.4745442, -0.1621265, 25.6280053, -0.1553650],
[25.7814664, 0.3514801, 25.7814664, -0.1503569, 25.9349275, -0.1458311],
[26.0883886, 0.3490583, 26.0883886, -0.1437619, 26.2418497, -0.1387991],
[26.3953108, 0.3346525, 26.3953108, -0.1471754, 26.5487719, -0.1497006],
[26.7022331, 0.3145614, 26.7022331, -0.1719482, 26.8556942, -0.1898755],
[27.0091553, 0.2913173, 27.0091553, -0.2370443, 27.1626164, -0.2939869],
[27.3160775, 0.2707732, 27.3160775, -0.4139632, 27.4695386, -0.6910918],
[27.6229997, 0.9436577, 27.6229997, -0.3688420, 27.7764608, -0.2026185],
[27.9299219, 0.9147269, 27.9299219, -0.1095194, 28.0833830, -0.0365244],
[28.2368441, 0.9515446, 28.2368441, 0.0642006, 28.3903052, 0.1596622],
[28.5437664, 0.9296466, 28.5437664, 0.2357042, 28.6972275, 0.3228099],
[28.8506886, 0.9383991, 28.8506886, 0.4390380, 29.0041497, 0.6142345],
[29.1576108, 0.7465231, 29.1576108, 0.6502426, 29.3110719, 0.8357126],
[29.4645330, 0.3472854, 29.4645330, 0.6927159, 29.6179941, 0.6873352],
[29.7714552, 0.2258269, 29.7714552, 0.6147208, 29.9249163, 0.6117702],
[30.0783775, 0.1397870, 30.0783775, 0.5578788, 30.2318386, 0.5591731],
[30.3852997, 0.0468188, 30.3852997, 0.4941608, 30.5387608, 0.4706733],
[30.6922219, 0.0000000, 30.6922219, 0.4173657, 30.8456830, 0.3821416],
]
vals = np.array(im_part)
i2r = ImagToReal(vals[:, 1], vals[:, 0])
i2r.run()

View File

@ -1,259 +1,620 @@
"""Test spectral_function.py."""
import numpy as np
import pytest
from phono3py import Phono3py
from phono3py.phonon3.spectral_function import SpectralFunction
shifts = [
-0.0049592,
-0.0049592,
-0.0120983,
-0.1226471,
-0.1214069,
-0.1214069,
-0.0051678,
-0.0051678,
-0.0128471,
-0.1224616,
-0.1200362,
-0.1200362,
-0.0055308,
-0.0055308,
-0.0122157,
-0.1093754,
-0.1077399,
-0.1077399,
-0.0037992,
-0.0037992,
-0.0089979,
-0.0955525,
-0.0958995,
-0.0958995,
-0.0034397,
-0.0034397,
-0.0107575,
-0.1068741,
-0.1067815,
-0.1067815,
-0.0017800,
-0.0017800,
-0.0102865,
-0.1348585,
-0.1275650,
-0.1275650,
0.0006728,
0.0006728,
-0.0065349,
-0.2011702,
-0.2015991,
-0.2015991,
0.0021133,
0.0021133,
0.0020353,
-0.0740009,
-0.0833644,
-0.0833644,
0.0037739,
0.0037739,
0.0121357,
0.1597195,
0.1585307,
0.1585307,
0.0026257,
0.0026257,
0.0103523,
0.1626420,
0.1634832,
0.1634832,
-0.0189694,
-0.0188985,
-0.0415773,
-0.0955391,
-0.1180182,
-0.1126508,
-0.0194533,
-0.0191057,
-0.0420358,
-0.0913521,
-0.1140995,
-0.1075009,
-0.0233933,
-0.0219600,
-0.0466734,
-0.0865867,
-0.1086070,
-0.1014454,
-0.0140271,
-0.0150165,
-0.0344515,
-0.0755416,
-0.1018518,
-0.0951606,
-0.0058780,
-0.0089457,
-0.0256867,
-0.0775726,
-0.1070427,
-0.1018654,
-0.0069737,
-0.0092857,
-0.0333909,
-0.1014042,
-0.1320678,
-0.1288315,
-0.0030075,
-0.0060858,
-0.0245855,
-0.1186313,
-0.1963719,
-0.1857004,
0.0058243,
0.0030539,
-0.0049966,
-0.0583228,
-0.0921850,
-0.0893692,
0.0141517,
0.0149365,
0.0312156,
0.0898626,
0.1454759,
0.1347802,
0.0110954,
0.0137260,
0.0427527,
0.1280421,
0.1715647,
0.1648037,
]
spec_funcs = [
-0.0000000,
-0.0000000,
0.0000000,
-0.0000000,
-0.0000000,
-0.0000000,
0.0000165,
0.0000165,
0.0022357,
0.0001249,
0.0001318,
0.0001318,
0.0000027,
0.0000027,
0.0000592,
0.0005056,
0.0004722,
0.0004722,
0.0000016,
0.0000016,
0.0000118,
0.0008887,
0.0008281,
0.0008281,
0.0000001,
0.0000001,
0.0000007,
0.0062806,
0.0053809,
0.0053809,
0.0000003,
0.0000003,
0.0000026,
0.0025466,
0.0035400,
0.0035400,
0.0000001,
0.0000001,
0.0000010,
0.0004469,
0.0002613,
0.0002613,
0.0000001,
0.0000001,
0.0000011,
0.0011874,
0.0012518,
0.0012518,
0.0000000,
0.0000000,
0.0000003,
0.0002964,
0.0003119,
0.0003119,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
-0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0032185,
0.0005560,
0.0001434,
0.0001868,
0.0001602,
0.0001670,
0.0000726,
0.0002220,
0.0016122,
0.0004059,
0.0003461,
0.0003024,
0.0000878,
0.0001280,
0.0033720,
0.0027162,
0.0013271,
0.0011427,
0.0000049,
0.0000094,
0.0000892,
0.0137571,
0.0405108,
0.0173674,
0.0000052,
0.0000084,
0.0000567,
0.0005807,
0.0013438,
0.0014025,
0.0000021,
0.0000034,
0.0000405,
0.0003176,
0.0003022,
0.0003523,
0.0000019,
0.0000034,
0.0000235,
0.0003419,
0.0008701,
0.0008436,
0.0000004,
0.0000010,
0.0000162,
0.0001759,
0.0002910,
0.0002978,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
0.0000000,
]
def test_SpectralFunction(si_pbesol: Phono3py):
@pytest.mark.parametrize("check_bands", [False, True])
def test_SpectralFunction(si_pbesol: Phono3py, check_bands: bool):
"""Spectral function of Si."""
if si_pbesol._make_r0_average:
ref_shifts = [
[
[
-0.00491549,
-0.00513379,
-0.00549296,
-0.00377646,
-0.00342792,
-0.00178271,
0.00063823,
0.00208652,
0.00376214,
0.00262103,
],
[
-0.00491549,
-0.00513379,
-0.00549296,
-0.00377646,
-0.00342792,
-0.00178271,
0.00063823,
0.00208652,
0.00376214,
0.00262103,
],
[
-0.01200352,
-0.01272740,
-0.01213832,
-0.00902171,
-0.01079296,
-0.01033632,
-0.00661888,
0.00196845,
0.01212704,
0.01037479,
],
[
-0.12224881,
-0.12186476,
-0.10950402,
-0.09619987,
-0.10705652,
-0.13503653,
-0.20145401,
-0.07468261,
0.15954608,
0.16311580,
],
[
-0.12117175,
-0.11966157,
-0.10786945,
-0.09635481,
-0.10686396,
-0.12762500,
-0.20163789,
-0.08374266,
0.15834565,
0.16375939,
],
[
-0.12117175,
-0.11966157,
-0.10786945,
-0.09635481,
-0.10686396,
-0.12762500,
-0.20163789,
-0.08374266,
0.15834565,
0.16375939,
],
],
[
[
-0.01895098,
-0.01944799,
-0.02343492,
-0.01391542,
-0.00562335,
-0.00675556,
-0.00299433,
0.00568717,
0.01407410,
0.01103152,
],
[
-0.01883020,
-0.01904414,
-0.02189420,
-0.01497364,
-0.00887001,
-0.00907876,
-0.00600166,
0.00297018,
0.01485332,
0.01364674,
],
[
-0.04158644,
-0.04204489,
-0.04660642,
-0.03449069,
-0.02581911,
-0.03329617,
-0.02458896,
-0.00519089,
0.03119712,
0.04283032,
],
[
-0.09542060,
-0.09131037,
-0.08642350,
-0.07536168,
-0.07744657,
-0.10100751,
-0.11855897,
-0.05851935,
0.08976609,
0.12789279,
],
[
-0.11827973,
-0.11431900,
-0.10875016,
-0.10196855,
-0.10719767,
-0.13236285,
-0.19702133,
-0.09252739,
0.14584477,
0.17195801,
],
[
-0.11277741,
-0.10757643,
-0.10150954,
-0.09524697,
-0.10202478,
-0.12884057,
-0.18556233,
-0.08932224,
0.13482432,
0.16483631,
],
],
]
ref_spec_funcs = [
[
[
0.00000000,
0.00001578,
0.00000272,
0.00000161,
0.00000013,
0.00000032,
0.00000006,
0.00000006,
0.00000001,
0.00000000,
],
[
0.00000000,
0.00001578,
0.00000272,
0.00000161,
0.00000013,
0.00000032,
0.00000006,
0.00000006,
0.00000001,
0.00000000,
],
[
0.00000000,
0.00223977,
0.00005791,
0.00001160,
0.00000066,
0.00000259,
0.00000098,
0.00000112,
0.00000029,
0.00000000,
],
[
0.00000000,
0.00012503,
0.00049470,
0.00089500,
0.00632551,
0.00256627,
0.00044659,
0.00118653,
0.00029733,
0.00000000,
],
[
0.00000000,
0.00013193,
0.00044796,
0.00083448,
0.00540572,
0.00352615,
0.00026154,
0.00125032,
0.00031326,
0.00000000,
],
[
0.00000000,
0.00013193,
0.00044796,
0.00083448,
0.00540572,
0.00352615,
0.00026154,
0.00125032,
0.00031326,
0.00000000,
],
],
[
[
-0.00000000,
0.00320096,
0.00007269,
0.00008693,
0.00000484,
0.00000526,
0.00000203,
0.00000189,
0.00000039,
0.00000000,
],
[
0.00000000,
0.00055197,
0.00022117,
0.00012818,
0.00000952,
0.00000843,
0.00000335,
0.00000334,
0.00000105,
0.00000000,
],
[
0.00000000,
0.00014311,
0.00162453,
0.00335197,
0.00009023,
0.00005696,
0.00004058,
0.00002353,
0.00001610,
0.00000000,
],
[
0.00000000,
0.00018525,
0.00041136,
0.00272557,
0.01393003,
0.00057594,
0.00031515,
0.00034235,
0.00017612,
0.00000000,
],
[
0.00000000,
0.00016156,
0.00034722,
0.00132145,
0.04066875,
0.00134953,
0.00030062,
0.00087157,
0.00029123,
0.00000000,
],
[
-0.00000000,
0.00016722,
0.00030198,
0.00114459,
0.01745510,
0.00141671,
0.00035262,
0.00084328,
0.00029789,
0.00000000,
],
],
]
else:
ref_shifts = [
[
[
-0.00496121,
-0.00517009,
-0.00553453,
-0.00380260,
-0.00343693,
-0.00177772,
0.00067068,
0.00210892,
0.00377279,
0.00262923,
],
[
-0.00496121,
-0.00517009,
-0.00553453,
-0.00380260,
-0.00343693,
-0.00177772,
0.00067068,
0.00210892,
0.00377279,
0.00262923,
],
[
-0.01202453,
-0.01275071,
-0.01219115,
-0.00903023,
-0.01073474,
-0.01031603,
-0.00662244,
0.00195097,
0.01211624,
0.01038809,
],
[
-0.12223984,
-0.12186467,
-0.10941590,
-0.09614195,
-0.10716126,
-0.13519843,
-0.20168604,
-0.07470229,
0.15969340,
0.16315933,
],
[
-0.12114484,
-0.11964957,
-0.10778748,
-0.09630527,
-0.10697739,
-0.12776042,
-0.20180332,
-0.08373516,
0.15847215,
0.16377770,
],
[
-0.12114484,
-0.11964957,
-0.10778748,
-0.09630527,
-0.10697739,
-0.12776042,
-0.20180332,
-0.08373516,
0.15847215,
0.16377770,
],
],
[
[
-0.01893616,
-0.01942744,
-0.02339230,
-0.01392117,
-0.00568286,
-0.00676300,
-0.00298881,
0.00566943,
0.01407270,
0.01103835,
],
[
-0.01882494,
-0.01903756,
-0.02188396,
-0.01496531,
-0.00891242,
-0.00912826,
-0.00600410,
0.00298462,
0.01486886,
0.01365297,
],
[
-0.04155678,
-0.04201981,
-0.04661298,
-0.03446840,
-0.02577765,
-0.03332493,
-0.02460421,
-0.00520459,
0.03117184,
0.04283480,
],
[
-0.09551912,
-0.09141204,
-0.08650838,
-0.07531933,
-0.07736040,
-0.10097208,
-0.11850788,
-0.05857319,
0.08971321,
0.12793090,
],
[
-0.11821481,
-0.11425389,
-0.10865996,
-0.10189830,
-0.10716084,
-0.13231357,
-0.19690540,
-0.09252776,
0.14571718,
0.17189918,
],
[
-0.11276994,
-0.10757084,
-0.10142181,
-0.09519851,
-0.10205844,
-0.12882962,
-0.18549798,
-0.08931099,
0.13476362,
0.16481222,
],
],
]
ref_spec_funcs = [
[
[
0.00000000,
0.00001654,
0.00000271,
0.00000163,
0.00000013,
0.00000032,
0.00000006,
0.00000006,
0.00000001,
0.00000000,
],
[
0.00000000,
0.00001654,
0.00000271,
0.00000163,
0.00000013,
0.00000032,
0.00000006,
0.00000006,
0.00000001,
0.00000000,
],
[
0.00000000,
0.00223584,
0.00005772,
0.00001181,
0.00000067,
0.00000258,
0.00000098,
0.00000112,
0.00000029,
0.00000000,
],
[
0.00000000,
0.00012499,
0.00049591,
0.00088903,
0.00629350,
0.00256216,
0.00044658,
0.00118784,
0.00029727,
0.00000000,
],
[
0.00000000,
0.00013178,
0.00044892,
0.00082915,
0.00537908,
0.00352736,
0.00026142,
0.00125148,
0.00031313,
0.00000000,
],
[
0.00000000,
0.00013178,
0.00044892,
0.00082915,
0.00537908,
0.00352736,
0.00026142,
0.00125148,
0.00031313,
0.00000000,
],
],
[
[
-0.00000000,
0.00320916,
0.00007278,
0.00008659,
0.00000484,
0.00000528,
0.00000202,
0.00000189,
0.00000039,
0.00000000,
],
[
0.00000000,
0.00055185,
0.00022088,
0.00012806,
0.00000942,
0.00000847,
0.00000336,
0.00000334,
0.00000105,
0.00000000,
],
[
0.00000000,
0.00014260,
0.00161534,
0.00335775,
0.00008970,
0.00005681,
0.00004062,
0.00002350,
0.00001611,
0.00000000,
],
[
0.00000000,
0.00018553,
0.00041303,
0.00273911,
0.01389025,
0.00057626,
0.00031509,
0.00034209,
0.00017625,
0.00000000,
],
[
0.00000000,
0.00016153,
0.00034741,
0.00131818,
0.04062696,
0.00134833,
0.00030074,
0.00087080,
0.00029123,
0.00000000,
],
[
-0.00000000,
0.00016730,
0.00030334,
0.00113844,
0.01748363,
0.00141678,
0.00035292,
0.00084285,
0.00029790,
0.00000000,
],
],
]
si_pbesol.mesh_numbers = [9, 9, 9]
if check_bands:
si_pbesol.band_indices = [[4, 5]]
si_pbesol.init_phph_interaction()
sf = SpectralFunction(
si_pbesol.phph_interaction,
@ -266,49 +627,35 @@ def test_SpectralFunction(si_pbesol: Phono3py):
)
sf.run()
# for line in np.swapaxes(sf.spectral_functions, -2, -1).reshape(-1, 6):
# print(("%.7f, " * 6) % tuple(line))
# raise
if check_bands:
np.testing.assert_allclose(
np.array(ref_shifts)[:, [4, 5], :],
sf.shifts[0, 0],
atol=1e-2,
)
np.testing.assert_allclose(
np.array(ref_spec_funcs)[:, [4, 5], :],
sf.spectral_functions[0, 0],
atol=1e-2,
rtol=1e-2,
)
else:
# for line in sf.shifts[0, 0, 0]:
# print("[", ",".join([f"{val:.8f}" for val in line]), "],")
# print("")
# for line in sf.shifts[0, 0, 1]:
# print("[", ",".join([f"{val:.8f}" for val in line]), "],")
np.testing.assert_allclose(
shifts, np.swapaxes(sf.shifts, -2, -1).ravel(), atol=1e-2
)
np.testing.assert_allclose(
spec_funcs,
np.swapaxes(sf.spectral_functions, -2, -1).ravel(),
atol=1e-2,
rtol=1e-2,
)
for line in sf.spectral_functions[0, 0, 0]:
print("[", ",".join([f"{val:.8f}" for val in line]), "],")
print("")
for line in sf.spectral_functions[0, 0, 1]:
print("[", ",".join([f"{val:.8f}" for val in line]), "],")
np.testing.assert_allclose(ref_shifts, sf.shifts[0, 0], atol=1e-2)
np.testing.assert_allclose(
ref_spec_funcs, sf.spectral_functions[0, 0], atol=1e-2, rtol=1e-2
)
def test_SpectralFunction_band_indices(si_pbesol: Phono3py):
"""Spectral function of Si."""
si_pbesol.mesh_numbers = [9, 9, 9]
si_pbesol.band_indices = [[4, 5]]
si_pbesol.init_phph_interaction()
sf = SpectralFunction(
si_pbesol.phph_interaction,
si_pbesol.grid.grg2bzg[[1, 103]],
temperatures=[
300,
],
num_frequency_points=10,
log_level=1,
)
sf.run()
# for line in np.swapaxes(sf.spectral_functions, -2, -1).reshape(-1, 6):
# print(("%.7f, " * 6) % tuple(line))
# raise
np.testing.assert_allclose(
np.reshape(shifts, (-1, 6))[:, [4, 5]],
np.swapaxes(sf.shifts, -2, -1).reshape(-1, 2),
atol=1e-2,
)
np.testing.assert_allclose(
np.reshape(spec_funcs, (-1, 6))[:, [4, 5]],
np.swapaxes(sf.spectral_functions, -2, -1).reshape(-1, 2),
atol=1e-2,
rtol=1e-2,
)
if check_bands:
si_pbesol.band_indices = None

View File

@ -5,6 +5,7 @@ from phonopy import Phonopy
from phonopy.structure.atoms import PhonopyAtoms
from phonopy.structure.symmetry import Symmetry
from phono3py import Phono3py
from phono3py.phonon3.triplets import (
_get_BZ_triplets_at_q,
_get_triplets_reciprocal_mesh_at_q,
@ -68,7 +69,7 @@ def test_get_triplets_at_q_type1(si_pbesol_111):
np.testing.assert_equal(weights, weights_ref)
def test_get_triplets_at_q_type2(si_pbesol_111):
def test_get_triplets_at_q_type2(si_pbesol_111: Phono3py):
"""Test triplets under type2 grid."""
pcell = si_pbesol_111.primitive
psym = si_pbesol_111.primitive_symmetry