Loading...
Searching...
No Matches
q3::paw_one_center::OnSiteOccupationSymmetrizer Class Reference

#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
 

Detailed Description

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.

Member Function Documentation

◆ build()

void q3::paw_one_center::OnSiteOccupationSymmetrizer::build ( const Crystal &  crystal_structure,
const std::vector< SymmetryOperation > &  symmetry_operations,
std::vector< ChannelAngularLayout >  layout_by_species 
)
inline
Parameters
crystal_structuresupplies the lattice for R_cart and the atom→species map
symmetry_operationsthe crystal's operations, atom_map filled in
layout_by_speciesone 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().

◆ is_active()

bool q3::paw_one_center::OnSiteOccupationSymmetrizer::is_active ( ) const
inline

Definition at line 162 of file occupation_symmetrization.hpp.

Referenced by symmetrize().

◆ number_of_symmetry_operations()

int q3::paw_one_center::OnSiteOccupationSymmetrizer::number_of_symmetry_operations ( ) const
inline

Definition at line 166 of file occupation_symmetrization.hpp.

◆ symmetrize()

void q3::paw_one_center::OnSiteOccupationSymmetrizer::symmetrize ( const Crystal &  crystal_structure,
Matrix< Real > &  occupations 
) const
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().


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