Loading...
Searching...
No Matches
q3::PawPseudopotential Class Reference

PAW pseudopotential — extends ultrasoft with one-center (on-site) data. More...

#include <init.hpp>

+ Inheritance diagram for q3::PawPseudopotential:

Public Member Functions

 ~PawPseudopotential () override=default
 
std::unique_ptr< Pseudopotential > clone () const override
 Clone this pseudopotential (deep copy preserving derived type).
 
bool has_augmentation_charges () const override
 
bool has_reciprocal_atomic_charge () const
 
bool has_reciprocal_core_charge () const
 
bool has_reciprocal_local_potential () const
 
bool has_reciprocal_projectors () const
 
PseudopotentialType pseudopotential_type_enum () const override
 
- Public Member Functions inherited from q3::UltrasoftPseudopotential
 ~UltrasoftPseudopotential () override=default
 
std::unique_ptr< Pseudopotential > clone () const override
 Clone this pseudopotential (deep copy preserving derived type).
 
bool has_augmentation_charges () const override
 
PseudopotentialType pseudopotential_type_enum () const override
 
- Public Member Functions inherited from q3::Pseudopotential
virtual ~Pseudopotential ()=default
 

Public Attributes

Real augmentation_cutoff_radius {}
 Radius beyond which the augmentation charges vanish (bohr).
 
int augmentation_cutoff_radius_index {}
 Grid index corresponding to augmentation_cutoff_radius.
 
std::string augmentation_shape
 Shape function used to pseudize the augmentation charges (e.g. "BESSEL").
 
std::vector< Real > channel_occupations
 Reference occupation of each projector channel in the generating atom.
 
std::vector< Real > charge_atomic_reciprocal
 
ChargeCore charge_core_all_electron
 All-electron core density (distinct from the pseudized NLCC core density).
 
std::vector< Real > charge_core_reciprocal
 
Real core_energy {}
 One-center core energy, when the dataset provides it.
 
bool has_core_energy {false}
 
int maximum_angular_momentum_augmentation {}
 Highest angular momentum carried by the augmentation channels.
 
std::vector< std::vector< std::vector< Real > > > multipole_moments
 
int number_of_augmentation_angular_momenta {}
 Number of angular-momentum channels, 2·l_max + 1.
 
std::string one_center_convention {"absolute"}
 
std::vector< PartialWave > partial_waves_all_electron
 All-electron partial waves φ_i(r), one per projector channel.
 
std::vector< PartialWave > partial_waves_pseudo
 Pseudo partial waves φ̃_i(r), one per projector channel.
 
PotentialLocal potential_local_all_electron
 All-electron local potential (Ry); diverges as -2Z/r toward the origin.
 
std::vector< Real > potential_local_reciprocal
 
std::vector< std::vector< Real > > projectors_reciprocal
 
Real reciprocal_charge_grid_spacing {}
 
Real reciprocal_core_grid_spacing {}
 
Real reciprocal_grid_spacing {}
 
Real reciprocal_potential_grid_spacing {}
 
- Public Attributes inherited from q3::UltrasoftPseudopotential
std::vector< std::vector< std::vector< Real > > > augmentation_coefficients
 
std::vector< std::vector< Real > > augmentation_function
 
std::vector< std::vector< std::vector< Real > > > augmentation_function_by_angular_momentum
 
std::vector< std::vector< Real > > augmentation_overlap_integrals
 
std::vector< Real > inner_cutoff_radii
 
int number_of_q_angular_momenta {0}
 
int number_of_q_coefficients {0}
 
- Public Attributes inherited from q3::Pseudopotential
ChargeAtomic charge_atomic
 
ChargeCore charge_core
 
std::vector< std::vector< Real > > d_ion_matrix
 
std::string element
 
bool has_nonlinear_core_correction {false}
 
int maximum_angular_momentum {}
 
int mesh_size {}
 
int number_of_projectors {}
 
int number_of_wavefunctions {}
 
PotentialLocal potential_local
 
std::vector< Projector > projectors
 
std::string pseudopotential_type
 
std::vector< Real > radial_grid
 
std::vector< Real > radial_grid_derivative
 
Real valence_charge {}
 
std::vector< WavefunctionAtomic > wavefunctions_atomic
 
std::string xc_functional
 

Detailed Description

PAW pseudopotential — extends ultrasoft with one-center (on-site) data.

Definition at line 33 of file init.hpp.

Constructor & Destructor Documentation

◆ ~PawPseudopotential()

q3::PawPseudopotential::~PawPseudopotential ( )
overridedefault

Member Function Documentation

◆ clone()

std::unique_ptr< Pseudopotential > q3::PawPseudopotential::clone ( ) const
inlineoverridevirtual

Clone this pseudopotential (deep copy preserving derived type).

Reimplemented from q3::Pseudopotential.

Definition at line 59 of file init.hpp.

◆ has_augmentation_charges()

bool q3::PawPseudopotential::has_augmentation_charges ( ) const
inlineoverridevirtual

Whether this PP has augmentation charges. Overridden by UltrasoftPseudopotential.

Reimplemented from q3::Pseudopotential.

Definition at line 67 of file init.hpp.

◆ has_reciprocal_atomic_charge()

bool q3::PawPseudopotential::has_reciprocal_atomic_charge ( ) const
inline

Definition at line 169 of file init.hpp.

References charge_atomic_reciprocal, and reciprocal_charge_grid_spacing.

◆ has_reciprocal_core_charge()

bool q3::PawPseudopotential::has_reciprocal_core_charge ( ) const
inline

Definition at line 223 of file init.hpp.

References charge_core_reciprocal, and reciprocal_core_grid_spacing.

◆ has_reciprocal_local_potential()

bool q3::PawPseudopotential::has_reciprocal_local_potential ( ) const
inline

◆ has_reciprocal_projectors()

bool q3::PawPseudopotential::has_reciprocal_projectors ( ) const
inline

Definition at line 140 of file init.hpp.

References projectors_reciprocal, and reciprocal_grid_spacing.

◆ pseudopotential_type_enum()

PseudopotentialType q3::PawPseudopotential::pseudopotential_type_enum ( ) const
inlineoverridevirtual

Return the type classification of this pseudopotential. Overridden by UltrasoftPseudopotential to return ultrasoft. No base-class instance can ever hold PAW data: both UPF readers throw UnsupportedPseudopotentialTypeError before constructing/populating a Pseudopotential from a PAW file, so projector_augmented_wave is reachable only once a future PawPseudopotential subclass overrides this method.

Reimplemented from q3::Pseudopotential.

Definition at line 63 of file init.hpp.

References q3::projector_augmented_wave.

Member Data Documentation

◆ augmentation_cutoff_radius

Real q3::PawPseudopotential::augmentation_cutoff_radius {}

Radius beyond which the augmentation charges vanish (bohr).

Definition at line 106 of file init.hpp.

Referenced by q3::paw_compensation::synthesize_augmentation_functions().

◆ augmentation_cutoff_radius_index

int q3::PawPseudopotential::augmentation_cutoff_radius_index {}

Grid index corresponding to augmentation_cutoff_radius.

Definition at line 108 of file init.hpp.

◆ augmentation_shape

std::string q3::PawPseudopotential::augmentation_shape

Shape function used to pseudize the augmentation charges (e.g. "BESSEL").

Definition at line 104 of file init.hpp.

◆ channel_occupations

std::vector<Real> q3::PawPseudopotential::channel_occupations

Reference occupation of each projector channel in the generating atom.

Definition at line 78 of file init.hpp.

◆ charge_atomic_reciprocal

std::vector<Real> q3::PawPseudopotential::charge_atomic_reciprocal

The atomic valence density ρ_at(q), when the dataset gives it reciprocally rather than radially.

Same situation as the projectors, and the same resolution. Q3 wants this quantity in q-space too — the starting density is built by superposing ρ_at(G) — so the table is consumed as given instead of being inverted to r and transformed straight back.

The convention matches Q3's radial path, ρ_at(q) = ∫ ρ_at(r) j_0(qr) dr, whose q = 0 value is the valence charge, so no rescaling.

Reconstructing it from the partial waves is not an alternative: a dataset's reference occupancies need not be the neutral atom's, and then Σ_i f_i |φ̃_i|² does not integrate to the valence charge.

Empty when the dataset gives the density radially (UPF), in which case charge_atomic carries it and the transform is used as before.

Tabulated on a uniform grid q_i = i · reciprocal_charge_grid_spacing, which need not be the projector grid.

Definition at line 166 of file init.hpp.

Referenced by has_reciprocal_atomic_charge().

◆ charge_core_all_electron

ChargeCore q3::PawPseudopotential::charge_core_all_electron

All-electron core density (distinct from the pseudized NLCC core density).

Definition at line 83 of file init.hpp.

Referenced by q3::paw_validation::integrated_all_electron_core_charge().

◆ charge_core_reciprocal

std::vector<Real> q3::PawPseudopotential::charge_core_reciprocal

The pseudized partial core density ñ_c(q), when the dataset gives it reciprocally.

The third quantity a format may tabulate in q-space for the plane-wave grid, and the third that must not be taken from radial data instead: a radial pseudized core density kept for the one-center terms can be a different object on a truncated grid, carrying a different charge.

Getting it wrong is not a constant shift. The grid-side XC is evaluated at n + ñ_c and is nonlinear in it, so an error here changes the energy's dependence on volume — which is exactly how it shows up: as a plausible-looking but wrong equation of state.

Same convention as the radial path produces, 4π∫ñ_c(r)r²j₀(qr)dr, whose q = 0 value is the partial core charge.

Empty for UPF datasets.

Definition at line 220 of file init.hpp.

Referenced by has_reciprocal_core_charge().

◆ core_energy

Real q3::PawPseudopotential::core_energy {}

One-center core energy, when the dataset provides it.

Definition at line 115 of file init.hpp.

◆ has_core_energy

bool q3::PawPseudopotential::has_core_energy {false}

Definition at line 116 of file init.hpp.

◆ maximum_angular_momentum_augmentation

int q3::PawPseudopotential::maximum_angular_momentum_augmentation {}

Highest angular momentum carried by the augmentation channels.

Definition at line 110 of file init.hpp.

◆ multipole_moments

std::vector<std::vector<std::vector<Real> > > q3::PawPseudopotential::multipole_moments

Multipole moments of the augmentation channels, indexed [angular_momentum][projector_i][projector_j]:

multipole_moments[L][i][j] = ∫ (φ_i φ_j − φ̃_i φ̃_j) r^L dr

with r-weighted partial waves. Entries forbidden by the angular-momentum triangle condition (|l_i − l_j| ≤ L ≤ l_i + l_j with l_i + l_j + L even) are stored as zero. The L = 0 block equals augmentation_overlap_integrals.

Definition at line 99 of file init.hpp.

Referenced by q3::paw_validation::worst_augmentation_charge_deviation(), and q3::paw_validation::worst_multipole_moment_deviation().

◆ number_of_augmentation_angular_momenta

int q3::PawPseudopotential::number_of_augmentation_angular_momenta {}

Number of angular-momentum channels, 2·l_max + 1.

Definition at line 112 of file init.hpp.

Referenced by q3::paw_validation::worst_multipole_moment_deviation().

◆ one_center_convention

std::string q3::PawPseudopotential::one_center_convention {"absolute"}

Name of the one-center convention this dataset's D_ion and one-center data are expressed in, resolved through the convention registry (layer_4_computation/paw/one_center/convention/registry.hpp).

Not a detail of the file format but a statement about what the numbers in it mean, and conventions are not interchangeable. The default, "absolute", is QE's convention, which UPF-PAW datasets follow: PP_DIJ already contains the kinetic and core-reference pieces, and the SCF adds an absolute one-center Hxc energy on top. A format whose D_ion is instead referenced to the dataset's own atomic configuration (the linearized frozen-core formulation of Kresse & Joubert, PRB 59, 1758 (1999)) has its reader record the name of the convention that re-references it, registered alongside that reader.

Pairing one dataset's numbers with another convention's formulation is silently wrong by a per-element constant, which is why the reader records it on the dataset rather than it being inferred at the point of use.

Definition at line 55 of file init.hpp.

Referenced by q3::paw_one_center::create_one_center_convention().

◆ partial_waves_all_electron

std::vector<PartialWave> q3::PawPseudopotential::partial_waves_all_electron

◆ partial_waves_pseudo

◆ potential_local_all_electron

PotentialLocal q3::PawPseudopotential::potential_local_all_electron

All-electron local potential (Ry); diverges as -2Z/r toward the origin.

Definition at line 85 of file init.hpp.

Referenced by q3::paw_validation::nuclear_charge_from_all_electron_potential().

◆ potential_local_reciprocal

std::vector<Real> q3::PawPseudopotential::potential_local_reciprocal

The local pseudopotential V_loc(q), when the dataset gives it reciprocally.

This is not the same object as the radial potential_local. A format may describe the potential inside the augmentation sphere radially and, separately, tabulate the pseudized local potential the plane waves see; using the radial one in its place is simply the wrong potential, not a coarser version of the right one.

Stored in the dataset's own convention, which the table itself makes checkable: the Coulomb divergence is already subtracted, so the entry at q = 0 is finite and equals the α_Z constant. Q3's own V_loc(q) keeps that divergence, so the consumer subtracts 4πZe²/(Ωq²) back on — see calculate_local_potential_at_q.

Units are energy × volume, so V(G) is the tabulated value at |G| divided by Ω; stored in Ry·bohr³.

Empty for UPF datasets, which give the potential radially.

Definition at line 194 of file init.hpp.

Referenced by has_reciprocal_local_potential().

◆ projectors_reciprocal

std::vector<std::vector<Real> > q3::PawPseudopotential::projectors_reciprocal

Some dataset formats tabulate the projectors in reciprocal space rather than radially. Q3 also applies projectors in reciprocal space (BetaFunctionTable tabulates β(q) and the engine uses that), so such a dataset is best consumed directly instead of being transformed to r and straight back again.

The values are β(q) in the convention of Q3's own forward transform, β(q) = 4π ∫ β(r) j_l(qr) r² dr, so they need no rescaling. The reader that fills this field records how that agreement was established.

Empty when the dataset gives projectors radially (UPF), in which case projectors carries r·β(r) and the transform is used as before.

Tabulated on a uniform grid q_i = i · reciprocal_grid_spacing, one entry per projector channel.

Definition at line 137 of file init.hpp.

Referenced by has_reciprocal_projectors().

◆ reciprocal_charge_grid_spacing

Real q3::PawPseudopotential::reciprocal_charge_grid_spacing {}

Definition at line 167 of file init.hpp.

Referenced by has_reciprocal_atomic_charge().

◆ reciprocal_core_grid_spacing

Real q3::PawPseudopotential::reciprocal_core_grid_spacing {}

Definition at line 221 of file init.hpp.

Referenced by has_reciprocal_core_charge().

◆ reciprocal_grid_spacing

Real q3::PawPseudopotential::reciprocal_grid_spacing {}

Definition at line 138 of file init.hpp.

Referenced by has_reciprocal_projectors().

◆ reciprocal_potential_grid_spacing

Real q3::PawPseudopotential::reciprocal_potential_grid_spacing {}

Definition at line 195 of file init.hpp.

Referenced by has_reciprocal_local_potential().


The documentation for this class was generated from the following file: