Occupation number smearing
See also
Convergence with respect to number of k-point for bulk Cu energy with different smearing methods:
fromase.buildimport bulk fromgpawimport GPAW, PW cu = bulk('Cu', 'fcc', a=3.6) for smearing in [{'name': 'improved-tetrahedron-method'}, {'name': 'tetrahedron-method'}, {'name': 'fermi-dirac', 'width': 0.05}, {'name': 'marzari-vanderbilt', 'width': 0.2}]: name = ''.join(word[0].upper() for word in smearing['name'].split('-')) width = smearing.get('width') if width: name += f'-{width}' for k in range(8, 21): cu.calc = GPAW( mode=PW(400), kpts=(k, k, k), occupations=smearing, txt=f'Cu-{name}-{k}.txt') e = cu.get_potential_energy()
(made with cu_plot.py). See also figure 3 in
Blöchl et. al.
- gpaw.occupations.create_occ_calc(dct, *, parallel_layout=None, fixed_magmom_value=None, rcell=None, monkhorst_pack_size=None, bz2ibzmap=None, nspins=None, nelectrons=None, nkpts=None, nbands=None)[source]
Surprise: Create occupation-number object.
The unit of width is eV and name must be one of:
‘fermi-dirac’
‘marzari-vanderbilt’
‘methfessel-paxton’
‘fixed’
‘tetrahedron-method’
‘improved-tetrahedron-method’
‘orbital-free’
>>> occ = create_occ_calc({'width': 0.0}) >>> occ.calculate(nelectrons=3, ... eigenvalues=[[0, 1, 2], [0, 2, 3]], ... weights=[1, 1]) (array([[1., 1., 0.], [1., 0., 0.]]), [1.5], 0.0)
- gpaw.occupations.fermi_dirac(eig, fermi_level, width)[source]
Fermi-Dirac distribution function.
>>> f, _, _ = fermi_dirac(np.array([-1.0, 0.0, 1.0]), 0.0, 0.01) >>> f.round(5) array([1. , 0.5, 0. ])
- gpaw.occupations.marzari_vanderbilt(eig, fermi_level, width)[source]
Marzari-Vanderbilt distribution (cold smearing).
- gpaw.occupations.methfessel_paxton(eig, fermi_level, width, order=0)[source]
Methfessel-Paxton distribution.
- classgpaw.occupations.OccupationNumberCalculator(parallel_layout=None)[source]
Base class for all occupation number calculators.
Object for calculating fermi level(s) and occupation numbers.
If fixmagmom=True then the fixed_magmom_value attribute must be set and two fermi levels will be calculated.
- calculate(nelectrons, eigenvalues, weights, spins=None, fermi_levels_guess=None, fix_fermi_level=False)[source]
Calculate occupation numbers and fermi level(s) from eigenvalues.
- nelectrons:
Number of electrons.
- eigenvalues: ndarray, shape=(nibzkpts, nbands)
Eigenvalues in Hartree.
- weights: ndarray, shape=(nibzkpts,)
Weights of k-points in IBZ (must sum to 1).
- parallel:
Parallel distribution of eigenvalues.
- fermi_level_guesses:
Optional guess(es) at fermi level(s).
Returns a tuple containing:
occupation numbers (in the range 0 to 1)
fermi-level in Hartree
entropy as -S*T in Hartree
>>> occ = ZeroWidth() >>> occ.calculate(1, [[0, 1]], [1]) (array([[1., 0.]]), [0.5], 0.0)
- classgpaw.occupations.FixedOccupationNumbers(numbers, parallel_layout=None)[source]
Fixed occupation numbers.
- f_sn: ndarray, shape=(nspins, nbands)
Occupation numbers (in the range from 0 to 1)
Example (excited state with 4 electrons):
occ = FixedOccupationNumbers([[1, 0, 1, 0], [1, 1, 0, 0]])
- classgpaw.occupations.ParallelLayout(bd, kpt_comm, domain_comm)[source]
Collection of parallel stuff.
Create new instance of ParallelLayout(bd, kpt_comm, domain_comm)
- gpaw.occupations.occupation_numbers(occ, eig_skn, weight_k, nelectrons)[source]
Calculate occupation numbers from eigenvalues in eV (deprecated).
- occ: dict
Example: {‘name’: ‘fermi-dirac’, ‘width’: 0.05} (width in eV).
- eps_skn: ndarray, shape=(nspins, nibzkpts, nbands)
Eigenvalues.
- weight_k: ndarray, shape=(nibzkpts,)
Weights of k-points in IBZ (must sum to 1).
- nelectrons: int or float
Number of electrons.
Returns a tuple containing:
f_skn (sums to nelectrons)
fermi-level [Hartree]
magnetic moment
entropy as -S*T [Hartree]
Tetrahedron method
- classgpaw.tetrahedron.TetrahedronMethod(rcell, size, improved=False, bz2ibzmap=None, parallel_layout=None)[source]
Tetrahedron method for calculating occupation numbers.
The reciprocal cell, rcell, can be given in arbitrary units (only the shape matters) and size is the size of the Monkhorst-Pack grid. If k-points have been symmetry-reduced the bz2ibzmap parameter mapping BZ k-point indizes to IBZ k-point indices must be given.