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 force constants (in real space) are stored in \(\mathrm{eV}/\text{Angstrom}^3\).

In phono3py, this is stored in the numpy array dtype='double' and order='C' in the shape of:

(num_atom, num_atom, num_atom, 3, 3, 3)

against \(\Phi_{\alpha\beta\gamma}(l\kappa, l'\kappa', l''\kappa'')\). The first three num_atom are the atom indices in supercell corresponding to \(l\kappa\), \(l'\kappa'\), \(l''\kappa''\), respectively. The last three elements are the Cartesian coordinates corresponding to \(\alpha\), \(\beta\), \(\gamma\), respectively.

If you want to import a supercell structure and its fc3, you may suffer from matching its atom index between the supercell and an expected unit cell. This may be easily dealt with by letting phono3py see your supercell as the unit cell (e.g., POSCAR, unitcell.in, etc) and find the unit (primitive) cell using –pa option. For example, let us assume your supercell is the 2x2x2 multiples of your unit cell that has no centring, then your --pa setting will be 1/2 0 0 0 1/2 0 0 1/2 0. If your unit cell is a conventional unit cell and has a centring, e.g., the face centring,

\[\begin{split} (\mathbf{a}_\text{p}, \mathbf{b}_\text{p}, \mathbf{c}_\text{p}) = (\mathbf{a}_\text{s}, \mathbf{b}_\text{s}, \mathbf{c}_\text{s}) \begin{pmatrix} \frac{{1}}{2} & 0 & 0 \\ 0 & \frac{{1}}{2} & 0 \\ 0 & 0 & \frac{{1}}{2} \end{pmatrix} \begin{pmatrix} 0 & \frac{{1}}{2} & \frac{{1}}{2} \\ \frac{{1}}{2} & 0 & \frac{{1}}{2} \\ \frac{{1}}{2} & \frac{{1}}{2} & 0 \end{pmatrix} = (\mathbf{a}_\text{s}, \mathbf{b}_\text{s}, \mathbf{c}_\text{s}) \begin{pmatrix} 0 & \frac{{1}}{4} & \frac{{1}}{4} \\ \frac{{1}}{4} & 0 & \frac{{1}}{4} \\ \frac{{1}}{4} & \frac{{1}}{4} & 0 \end{pmatrix}. \end{split}\]

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 force constants are stored in \(\mathrm{eV}/\text{Angstrom}^2\).

In phono3py, this is stored in the numpy array dtype='double' and order='C' in the shape of:

(num_atom, num_atom, 3, 3)

against \(\Phi_{\alpha\beta}(l\kappa, l'\kappa')\). More detail is 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

\[ C_\lambda = k_\mathrm{B} \left(\frac{\hbar\omega_\lambda}{k_\mathrm{B} T} \right)^2 \frac{\exp(\hbar\omega_\lambda/k_\mathrm{B} T)}{[\exp(\hbar\omega_\lambda/k_\mathrm{B} T)-1]^2}. \]

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}\)):

\[ \sum_{\mathbf{q} \in {}^*\mathbf{k}} \kappa_{\mathbf{q}j}. \]

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\)):

\[ \sum_{\mathbf{q} \in {}^*\mathbf{k}} \mathbf{v}_{\mathbf{q}j} \otimes \mathbf{v}_{\mathbf{q}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\):

\[ P_{\mathbf{q}j} = \frac{1}{(3n_\mathrm{a})^2} \sum_{\lambda'\lambda''} |\Phi_{\lambda\lambda'\lambda''}|^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

\[ \kappa_\lambda = \frac{1}{V_0} C_\lambda \mathbf{v}_\lambda \otimes \mathbf{v}_\lambda \tau_\lambda^{\mathrm{SMRT}}. \]

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 --ise

(temperature, sampling frequency point, symmetry reduced set of triplets at given grid point, band1, band2, band3) in THz (without \(2\pi\))

gamma_detail for --br

(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 --ise

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.

linewidth-*.dat#