I got confused about kppvol, kppa and reciprocal_density, which are used in pymatgen.
kppvol is an input argument of the below automatic_density_by_vol
def automatic_density_by_vol(structure, kppvol, force_gamma=False): """ Returns an automatic Kpoint object based on a structure and a kpoint density per inverse Angstrom^3 of reciprocal cell. Algorithm: Same as automatic_density() Args: structure (Structure): Input structure kppvol (int): Grid density per Angstrom^(-3) of reciprocal cell force_gamma (bool): Force a gamma centered mesh Returns: Kpoints """ vol = structure.lattice.reciprocal_lattice.volume kppa = kppvol * vol * structure.num_sites return Kpoints.automatic_density(structure, kppa, force_gamma=force_gamma)
kppa is the input arguement of automatic_density
def automatic_density(structure, kppa, force_gamma=False):
Returns an automatic Kpoint object based on a structure and a kpoint
density. Uses Gamma centered meshes for hexagonal cells and
Monkhorst-Pack grids otherwise.
Uses a simple approach scaling the number of divisions along each
reciprocal lattice vector proportional to its length.
structure (Structure): Input structure
kppa (int): Grid density
force_gamma (bool): Force a gamma centered mesh (default is to
use gamma only for hexagonal cells or odd meshes)
Returns: Kpoints """ comment = "pymatgen v%s with grid density = %.0f / number of atoms" % (__version__, kppa) if math.fabs((math.floor(kppa ** (1 / 3) + 0.5)) ** 3 - kppa) < 1: kppa += kppa * 0.01 latt = structure.lattice lengths = latt.abc ngrid = kppa / structure.num_sites mult = (ngrid * lengths * lengths * lengths) ** (1 / 3) num_div = [int(math.floor(max(mult / l, 1))) for l in lengths] is_hexagonal = latt.is_hexagonal() has_odd = any([i % 2 == 1 for i in num_div]) if has_odd or is_hexagonal or force_gamma: style = Kpoints.supported_modes.Gamma else: style = Kpoints.supported_modes.Monkhorst return Kpoints(comment, 0, style, [num_div], [0, 0, 0])
reciprocal_density is the input argument of MPStaticSet. In the documentation, it is explained as follows:
reciprocal_density (int): For static calculations, we usually set the reciprocal density by volume. This is a convenience arg to change that, rather than using user_kpoints_settings. Defaults to 100, which is ~50% more than that of standard relaxation calculations.
I have read the document and definition many times, but still have a few questoins as below. Appreciate it if you can help me out with them!
Question 1: In automatic_density_by_vol,
kppa = kppvol * vol * structure.num_sites, where the number of atoms is multiplied. But why is kppa still per atom as shown in variable comment in atuomatic_density:
comment = 'pymatgen v%s with grid density=%.0f/atom' % (__version__, kppa)? variable
comment says that
kppa is grid density. In the document of
automatic_density_by_vol, However, kppvol is explained as Grid density per Angstrom^(-2) of reciprocal cell. So should it be
kppa=kppvol * vol instead?
Question 2: in automatic_density, variable ngrid is introduced:
ngrid=kppa / structure.num_sites. Should it be
ngrid=kppa*struture.num_sites to cancel the unit of
Question 3: In the official document of Materials Project, it is documented that total energies are calculated using a k-point mesh of 1000 per reciprocal atom (pra). Does it mean the variable
MPStaticSet equals 1000?
Question 4: Is the variable
MPStaticSet exactly the variable
Thanks very much for your help!