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 |
PAW pseudopotential — extends ultrasoft with one-center (on-site) data.
|
overridedefault |
|
inlineoverridevirtual |
Clone this pseudopotential (deep copy preserving derived type).
Reimplemented from q3::Pseudopotential.
|
inlineoverridevirtual |
Whether this PP has augmentation charges. Overridden by UltrasoftPseudopotential.
Reimplemented from q3::Pseudopotential.
|
inline |
Definition at line 169 of file init.hpp.
References charge_atomic_reciprocal, and reciprocal_charge_grid_spacing.
|
inline |
Definition at line 223 of file init.hpp.
References charge_core_reciprocal, and reciprocal_core_grid_spacing.
|
inline |
Definition at line 197 of file init.hpp.
References potential_local_reciprocal, and reciprocal_potential_grid_spacing.
Referenced by q3::local_potential_is_tabulated_reciprocally().
|
inline |
Definition at line 140 of file init.hpp.
References projectors_reciprocal, and reciprocal_grid_spacing.
|
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.
| 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().
| int q3::PawPseudopotential::augmentation_cutoff_radius_index {} |
| std::string q3::PawPseudopotential::augmentation_shape |
| std::vector<Real> q3::PawPseudopotential::channel_occupations |
| 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().
| 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().
| 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().
| Real q3::PawPseudopotential::core_energy {} |
| int q3::PawPseudopotential::maximum_angular_momentum_augmentation {} |
| 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().
| 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().
| 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().
| std::vector<PartialWave> q3::PawPseudopotential::partial_waves_all_electron |
All-electron partial waves φ_i(r), one per projector channel.
Definition at line 74 of file init.hpp.
Referenced by q3::paw_one_center::build_one_center_densities(), q3::paw_one_center::compute_one_center_d_matrix(), q3::paw_compensation::partial_wave_moment(), and q3::paw_validation::worst_multipole_moment_deviation().
| std::vector<PartialWave> q3::PawPseudopotential::partial_waves_pseudo |
Pseudo partial waves φ̃_i(r), one per projector channel.
Definition at line 76 of file init.hpp.
Referenced by q3::paw_one_center::build_one_center_densities(), q3::paw_one_center::channel_expansion_matches_projectors(), q3::paw_one_center::compute_one_center_d_matrix(), q3::paw_one_center::density_lm_count(), q3::paw_one_center::expand_channels(), q3::paw_compensation::partial_wave_moment(), q3::paw_compensation::synthesize_augmentation_functions(), q3::paw_validation::worst_multipole_moment_deviation(), and q3::paw_validation::worst_projector_duality_deviation().
| 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().
| 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().
| 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().
| Real q3::PawPseudopotential::reciprocal_charge_grid_spacing {} |
Definition at line 167 of file init.hpp.
Referenced by has_reciprocal_atomic_charge().
| Real q3::PawPseudopotential::reciprocal_core_grid_spacing {} |
Definition at line 221 of file init.hpp.
Referenced by has_reciprocal_core_charge().
| Real q3::PawPseudopotential::reciprocal_grid_spacing {} |
Definition at line 138 of file init.hpp.
Referenced by has_reciprocal_projectors().
| Real q3::PawPseudopotential::reciprocal_potential_grid_spacing {} |
Definition at line 195 of file init.hpp.
Referenced by has_reciprocal_local_potential().