#include <occupation_symmetrization.hpp>
Public Member Functions | |
| void | build (const Crystal &crystal_structure, const std::vector< SymmetryOperation > &symmetry_operations, std::vector< ChannelAngularLayout > layout_by_species) |
| bool | is_active () const |
| int | number_of_symmetry_operations () const |
| void | symmetrize (const Crystal &crystal_structure, Matrix< Real > &occupations) const |
The point-group average of ρ_ij, with D^l(R) built once and reused.
Built once per run (the operations and the datasets do not change during an SCF) and applied to every ρ_ij array each iteration. is_active() is false when there is nothing to do — one operation, or no channels — so the caller does not need a second condition of its own.
Definition at line 112 of file occupation_symmetrization.hpp.
|
inline |
| crystal_structure | supplies the lattice for R_cart and the atom→species map |
| symmetry_operations | the crystal's operations, atom_map filled in |
| layout_by_species | one entry per species type, indexed as species_type_index |
One D^l per (operation, l): two channels sharing an l share the matrix, and the angular quadrature that builds it is the expensive part.
Definition at line 119 of file occupation_symmetrization.hpp.
References q3::build_real_harmonic_rotation_matrix(), and q3::cartesian_rotation_of().
|
inline |
Definition at line 162 of file occupation_symmetrization.hpp.
Referenced by symmetrize().
|
inline |
Definition at line 166 of file occupation_symmetrization.hpp.
|
inline |
Replace ρ_ij by its group average, in place.
occupations[atom][i * nh_atom + j], with nh_atom the atom's own channel count — the indexing stride the ultrasoft accumulation writes with, which is not the allocated row length in a mixed-species cell. An atom whose image under some operation could not be identified (an atom_map entry left unresolved) contributes nothing for that operation, and the average is taken over the operations that did contribute: averaging against an array that was never accumulated would be worse than averaging over fewer operations.
(D ᵀ ρ D)_{m m'} = Σ_pq D_{p m} ρ_{pq} D_{q m'}, with p and q running over the partners of first and second — the channels sharing their radial index.
Definition at line 182 of file occupation_symmetrization.hpp.
References is_active(), q3::Crystal::number_of_atoms(), and q3::Crystal::species_type_index().