Input / Output files#
The calculation results are written into files. Mostly the data are stored in HDF5 format, therefore how to read the data from HDF5 files is also shown.
phono3py_disp.yaml#
This is created with -d or –rd option. This file contains displacement dataset and crystal structure information. Parameters for non-analytical term correction can be also included.
phono3py_params.yaml#
This is created with the combination of –cf3 and –sp options. This file contains displacement-force dataset and crystal structure information. In addition, energies of supercells may be included in the dataset. Parameters for non-analytical term correction can be also included.
FORCES_FC3#
This is created with –cf3 option . There are two formats of
FORCES_FC3. The type-I format is like that shown below
# File: 1
# 1 0.0300000000000000 0.0000000000000000 0.0000000000000000
-0.6458483000 0.0223064300 -0.0143299700
0.0793497000 0.0088413200 -0.0052766800
0.0768176500 -0.0095501600 0.0057262300
-0.0016552800 -0.0366684600 -0.0059480700
-0.0023432300 0.0373490000 0.0059468600
0.0143901800 0.0000959800 -0.0001100900
-0.0019487200 -0.0553591300 -0.0113649500
0.0143732700 -0.0000614400 0.0000502600
-0.0020311400 0.0554678300 0.0115355100
...
# File: 1254
# 37 0.0000000000000000 0.0000000000000000 -0.0300000000000000
# 68 0.0000000000000000 0.0000000000000000 -0.0300000000000000
-0.0008300600 -0.0004792400 0.0515596200
-0.0133197900 -0.0078480800 0.0298334900
0.0141518600 -0.0105405200 0.0106313000
0.0153762500 -0.0072671600 0.0112864200
-0.0134565300 -0.0076112400 0.0298334900
-0.0019180000 -0.0011073600 0.0272454300
0.0013945800 0.0169498000 0.0112864200
0.0006578200 0.0003797900 0.0085617600
-0.0020524300 0.0175261300 0.0106313000
0.0019515200 0.0011267100 -0.2083651200
0.0148675800 -0.0516285500 -0.0924200600
-0.0168043800 0.0074232400 -0.0122506300
-0.0128831200 0.0114004400 -0.0110906700
...
This file contains supercell forces. Lines starting with # is ignored when
parsing. Each line gives forces of at atom in Cartesian coordinates. All forces
of atoms in each supercell are written in the same order as the atoms in the
supercell. All forces of all supercells are concatenated. If force sets are
stored in a numpy array (forces) of the shape of
(num_supercells, num_atoms_in_supercell, 3), this file is generated using
numpy as follows:
np.savetxt("FORCES_FC3", forces.reshape(-1, 3))
The type-II format is the same as
phonopy’s type-II format
of FORCE_SETS.
FORCES_FC2#
This is created with –cf2 option. The file formats
(type-I and type-II) are same as those of FORCES_FC3.
fc3.hdf5#
Third-order supercell force constants (in real space) are stored in \(\mathrm{eV}/\text{Angstrom}^3\).
The force cosntas are stored in a numpy array with dtype='double' and
order='C'. Two array shapes are supported,
Full format:
(n_satom, n_satom, n_satom, 3, 3, 3)Compact format:
(n_patom, n_satom, n_satom, 3, 3, 3)
where n_satom and n_patom are the numbers of atoms in the supercell and
primitive cell, respectively. The full format:
(num_satom, num_satom, num_satom, 3, 3, 3)
corresponds to \(\Phi_{\alpha\beta\gamma}(l\kappa, l'\kappa', l''\kappa'')\). The
first three num_satom dimensions are the atom indices in the supercell
corresponding to \(l\kappa\), \(l'\kappa'\), and \(l''\kappa''\), respectively. The
last three dimensions are the Cartesian coordinates corresponding to \(\alpha\),
\(\beta\), and \(\gamma\), respectively.
Using lattice translation symmetry, a compact format (n_patom, n_satom, n_satom, 3, 3, 3) is also supported, where n_patom is the number of atoms in
the primitive cell. The atomic indices of the n_patom atoms in the supercell
are stored in the dataset p2s_map.
If you want to import a supercell structure and its fc3 manually, you may
encounter issues with matching atom indices between the supercell and the
expected primitive cell. This can be easily resolved by having phono3py treat
your supercell as the primitive cell (e.g., POSCAR, unitcell.in, etc.) and
then finding the primitive cell using the –pa option. For
example, if your supercell is 2×2×2 multiples of your primitive cell, your
--pa setting should be 1/2 0 0 0 1/2 0 0 0 1/2. For a conventional unit cell
with centering, e.g., face-centered,
So what you have to set is --pa="0 1/4 1/4 1/4 0 1/4 1/4 1/4 0".
fc2.hdf5#
Second-order supercell force constants (in real space) are stored in \(\mathrm{eV}/\text{Angstrom}^2\).
The force constants are stored in a numpy array with dtype='double' and
order='C'. Two array shapes are supported:
Full format:
(n_satom, n_satom, 3, 3)Compact format:
(n_patom, n_satom, 3, 3)
where n_satom and n_patom are the numbers of atoms in the supercell and
primitive cell, respectively. The full format:
(num_satom, num_satom, 3, 3)
corresponds to \(\Phi_{\alpha\beta}(l\kappa, l'\kappa')\). More details are similar to the case for fc3.hdf5.
kappa-*.hdf5#
Files name, e.g. kappa-m323220.hdf5, is determined by some
specific options. mxxx, show the numbers of sampling
mesh. sxxx and gxxx appear optionally. sxxx gives the
smearing width in the smearing method for Brillouin zone integration
for phonon lifetime, and gxxx denotes the grid number. Using the
command option of -o, the file name can be modified slightly. For
example -o nac gives kappa-m323220.nac.hdf5 to
memorize the option --nac was used.
mesh#
(Versions 1.10.11 or later)
The numbers of mesh points for reciprocal space sampling along reciprocal axes, \(a^*, b^*, c^*\).
frequency#
Phonon frequencies. The physical unit is THz, where THz is in the ordinal frequency not the angular frequency.
The array shape is (irreducible q-point, phonon band).
gamma#
Imaginary part of self energy of phonon bubble diagram (phonon-phonon scattering). The physical unit is THz, where THz is in the ordinal frequency not the angular frequency.
The array shape for all grid-points (irreducible q-points) is (temperature, irreducible q-point, phonon band).
The array shape for a specific grid-point is (temperature, phonon band).
Phonon lifetime (\(\tau_\lambda=1/2\Gamma_\lambda(\omega_\lambda)\)) may
be estimated from gamma. \(2\pi\) has to be multiplied with
gamma values in the hdf5 file to convert the unit of ordinal
frequency to angular frequency. Zeros in gamma values mean that
those elements were not calculated such as for three acoustic modes at
\(\Gamma\) point. The below is the copy-and-paste from the
previous section to show how to obtain phonon lifetime in pico
second:
In [8]: g = f['gamma'][30]
In [9]: import numpy as np
In [10]: g = np.where(g > 0, g, -1)
In [11]: lifetime = np.where(g > 0, 1.0 / (2 * 2 * np.pi * g), 0)
gamma_isotope#
Isotope scattering of \(1/2\tau^\mathrm{iso}_\lambda\). The physical unit is same as that of gamma.
The array shape is same as that of frequency.
group_velocity#
Phonon group velocity, \(\nabla_\mathbf{q}\omega_\lambda\). The physical unit is \(\text{THz}\cdot\text{Angstrom}\), where THz is in the ordinal frequency not the angular frequency.
The array shape is (irreducible q-point, phonon band, 3 = Cartesian coordinates).
heat_capacity#
Mode-heat-capacity defined by
The physical unit is eV/K.
The array shape is (temperature, irreducible q-point, phonon band).
kappa#
Thermal conductivity tensor. The physical unit is W/m-K.
The array shape is (temperature, 6 = (xx, yy, zz, yz, xz, xy)).
mode-kappa#
Thermal conductivity tensors at k-stars (\({}^*\mathbf{k}\)):
The sum of this over \({}^*\mathbf{k}\) corresponding to irreducible q-points divided by number of grid points gives \(\kappa\) (kappa), e.g.,:
kappa_xx_at_index_30 = mode_kappa[30, :, :, 0].sum()/ weight.sum()
Be careful that until version 1.12.7, mode-kappa values were divided by number of grid points.
The physical unit is W/m-K. Each tensor element is the sum of tensor elements on the members of \({}^*\mathbf{k}\), i.e., symmetrically equivalent q-points by crystallographic point group and time reversal symmetry.
The array shape is (temperature, irreducible q-point, phonon band, 6 = (xx, yy, zz, yz, xz, xy)).
gv_by_gv#
Outer products of group velocities for k-stars (\({}^*\mathbf{k}\)) for each irreducible q-point and phonon band (\(j\)):
The physical unit is \(\text{THz}^2\cdot\text{Angstrom}^2\), where THz is in the ordinal frequency not the angular frequency.
The array shape is (irreducible q-point, phonon band, 6 = (xx, yy, zz, yz, xz, xy)).
q-point#
Irreducible q-points in reduced coordinates.
The array shape is (irreducible q-point, 3 = reduced coordinates in reciprocal space).
temperature#
Temperatures where thermal conductivities are calculated. The physical unit is K.
weight#
Weights corresponding to irreducible q-points. Sum of weights equals to the number of mesh grid points.
ave_pp#
Averaged phonon-phonon interaction \(P_{\mathbf{q}j}\) in \(\text{eV}^2\):
This is not going to be calculated in the RTA thermal coductivity
calculation mode by default. To calculate this, --full-pp option
has to be specified (see --full-pp (FULL_PP = .TRUE.)).
boundary_mfp#
A value specified by --boundary-mfp, --bmfp (BOUNDARY_MFP). The physical unit is micrometer.
When --boundary-mfp option is explicitly specified, its value is stored here.
kappa_unit_conversion#
This is used to convert the physical unit of lattice thermal
conductivity made of heat_capacity, group_velocity, and
gamma, to W/m-K. In the single mode relaxation time (SMRT) method,
a mode contribution to the lattice thermal conductivity is given by
For example, \(\kappa_{\lambda,{xx}}\) is calculated by:
In [1]: import h5py
In [2]: f = h5py.File("kappa-m111111.hdf5")
In [3]: kappa_unit_conversion = f['kappa_unit_conversion'][()]
In [4]: weight = f['weight'][:]
In [5]: heat_capacity = f['heat_capacity'][:]
In [6]: gv_by_gv = f['gv_by_gv'][:]
In [7]: gamma = f['gamma'][:]
In [8]: kappa_unit_conversion * heat_capacity[30, 2, 0] * gv_by_gv[2, 0] / (2 * gamma[30, 2, 0])
Out[8]:
array([ 1.02050241e+03, 1.02050241e+03, 1.02050241e+03,
4.40486382e-15, 0.00000000e+00, -4.40486382e-15])
In [9]: f['mode_kappa'][30, 2, 0]
Out[9]:
array([ 1.02050201e+03, 1.02050201e+03, 1.02050201e+03,
4.40486209e-15, 0.00000000e+00, -4.40486209e-15])
gamma_N and gamma_U#
The data are stored in kappa-mxxx(-gx-sx-sdx).hdf5 file and accessed by
gamma_N and gamma_U keys. The shape of the arrays is the same as that of
gamma (see gamma). An example (Si-PBEsol) is shown
below:
% phono3py-load --mesh 11 11 11 --fc3 --fc2 --br --nu
...
% ipython
In [1]: import h5py
In [2]: f = h5py.File("kappa-m111111.hdf5", 'r')
In [3]: list(f)
Out[3]:
['frequency',
'gamma',
'gamma_N',
'gamma_U',
'group_velocity',
'gv_by_gv',
'heat_capacity',
'kappa',
'kappa_unit_conversion',
'mesh',
'mode_kappa',
'qpoint',
'temperature',
'weight']
In [4]: f['gamma'].shape
Out[4]: (101, 56, 6)
In [5]: f['gamma_N'].shape
Out[5]: (101, 56, 6)
In [6]: f['gamma_U'].shape
Out[6]: (101, 56, 6)
gamma-*.hdf5#
Imaginary parts of self energies at harmonic phonon frequencies (\(\Gamma_\lambda(\omega_\lambda)\) = half linewidths) are stored in THz. See --write-gamma (WRITE_GAMMA = .TRUE.).
gamma_detail-*.hdf5#
Q-point triplet contributions to imaginary parts of self energies at phonon frequencies (half linewidths) are stored in THz. See –write-gamma-detail option.
In the output file in hdf5, following keys are used to extract the detailed information.
dataset |
Array shape |
|---|---|
gamma_detail for |
(temperature, sampling frequency point, symmetry reduced set of triplets at given grid point, band1, band2, band3) in THz (without \(2\pi\)) |
gamma_detail for |
(temperature, symmetry reduced set of triplets at gvien grid point, band1, band2, band3) in THz (without \(2\pi\)) |
mesh |
Numbers of sampling mesh along reciprocal axes. |
frequency_point for |
Sampling frequency points in THz (without \(2\pi\)), i.e., \(\omega\) in \(\Gamma_\lambda(\omega)\) |
temperature |
(temperature,), Temperatures in K |
triplet |
(symmetry reduced set of triplets at given grid point, 3), Triplets are given by the grid point indices (see below). |
weight |
(symmetry reduced set of triplets at given grid point,), Weight of each triplet to imaginary part of self energy |
triplet_all |
(triplets at given grid point, 3), symmetry non-reduced version of the triplet information. |
See Grid point triplets to recover the q-points of each triplet.
Imaginary part of self energy (linewidth/2) is recovered by the following script:
import h5py
import numpy as np
gd = h5py.File("gamma_detail-mxxx-gx.hdf5")
temp_index = 30 # index of temperature
temperature = gd['temperature'][temp_index]
gamma_tp = gd['gamma_detail'][:].sum(axis=-1).sum(axis=-1)
weight = gd['weight'][:]
gamma = np.dot(weight, gamma_tp[temp_index])
For example, for --br, this gamma gives \(\Gamma_\lambda(\omega_\lambda)\) of
the band indices at the grid point indicated by \(\lambda\) at the temperature of
index 30. If any bands are degenerated, those gamma in
kappa-mxxx-gx(-sx-sdx).hdf5 or gamma-mxxx-gx(-sx-sdx).hdf5 type file are
averaged, but the gamma obtained here in this way are not symmetrized. Apart
from this symmetrization, the values must be equivalent between them.
To understand each contribution of triptle to imaginary part of self energy,
reading phonon-mxxx.hdf5 is useful (see --write-phonon (WRITE_PHONON = .TRUE.)). For
example, phonon triplets of three phonon scatterings are obtained by
import h5py
import numpy as np
gd = h5py.File("gamma_detail-mxxx-gx.hdf5", 'r')
ph = h5py.File("phonon-mxxx.hdf5", 'r')
gp1 = gd['grid_point'][()]
triplets = gd['triplet'][:] # Sets of (gp1, gp2, gp3) where gp1 is fixed
mesh = gd['mesh'][:]
grid_address = ph['grid_address'][:]
q_triplets = grid_address[triplets] / mesh.astype('double') # For conventional regular grid
# Phonons of triplets[2]
phonon_tp = [(ph['frequency'][i], ph['eigenvector'][i]) for i in triplets[2]]
# Fractions of contributions of triplets at this grid point and temperature index 30
gamma_sum_over_bands = np.dot(weight, gd['gamma_detail'][30].sum(axis=-1).sum(axis=-1).sum(axis=-1))
contrib_tp = [gd['gamma_detail'][30, i].sum() / gamma_sum_over_bands for i in range(len(weight))]
np.dot(weight, contrib_tp) # is one
phonon-*.hdf5#
Contents of phonon-mxxx.hdf5 are watched by:
In [1]: import h5py
In [2]: f = h5py.File("phonon-m111111.hdf5")
In [3]: list(f)
Out[3]:
['eigenvector',
'frequency',
'grid_address',
'ir_grid_points',
'ir_grid_weights',
'mesh',
'version']
In [4]: f['mesh'][:]
Out[4]: array([11, 11, 11])
In [5]: f['grid_address'].shape
Out[5]: (1367, 3)
In [6]: f['frequency'].shape
Out[6]: (1367, 6)
In [7]: f['eigenvector'].shape
Out[7]: (1367, 6, 6)
In [8]: f['ir_grid_points'].shape
Out[8]: (56,)
The first axis of ph['grid_address'], ph['frequency'], and
ph['eigenvector'] corresponds to the number of q-points where phonons are
calculated. Here the number of phonons may not be equal to product of mesh
numbers (\(1367 \neq 11^3\)). This is because all q-points on Brillouin zone
boundary are included, i.e., even if multiple q-points are translationally
equivalent, those phonons are stored separately though these phonons are
physically equivalent within the equations employed in phono3py. Here Brillouin
zone is defined by Wigner–Seitz cell of reciprocal primitive basis vectors. This
is convenient to categorize phonon triplets into Umklapp and Normal scatterings
based on the Brillouin zone.
pp-*.hdf5#
This file contains phonon-phonon interaction strength
\(\bigl|\Phi_{\lambda\lambda'\lambda''}\bigl|^2\). To use the data in this
file, it is recommended to generate with --full-pp option because the data
structure to access becomes simpler.
% phono3py-load phono3py.yaml --gp 5 --br --mesh 11 11 11 --write-pp --full-pp
In [1]: import h5py
In [2]: f = h5py.File("pp-m111111-g5.hdf5")
In [3]: list(f)
Out[3]: ['pp', 'triplet', 'triplet_all', 'version', 'weight']
In [4]: f['pp'].shape
Out[4]: (146, 6, 6, 6)
Indices of the pp array are (symmetry reduced set of triplets at given grid
point, band1, band2, band3), and the values are given in \(\text{eV}^2\). See
Grid point triplets to recover the q-points of each triplet.
Except for pp, all the other information are equivalent to those found in
gamma_detail-*.hdf5.
gammas-*.dat#
Imaginary parts of self energies with respect to frequency \(\Gamma_\lambda(\omega)\) are stored in THz. See --ise (IMAG_SELF_ENERGY = .TRUE.).
jdos-*.dat#
Joint densities of states are stored in Thz. See Joint density of states (JDOS) and weighted-JDOS.