62 pseudopotential_set, crystal_structure.
cell_volume(), q_spacing_, number_of_q_points_);
69 [[nodiscard]]
const std::vector<AtomicOrbitalLabel>&
orbital_labels()
const {
70 return orbital_labels_;
74 return static_cast<int>(orbital_labels_.size());
85 [[nodiscard]] std::vector<std::vector<Real>>
87 int kpoint_state_index,
88 int number_of_plane_waves,
90 const std::vector<int>& g_vector_indices,
91 const Crystal& crystal_structure,
97 std::vector<std::vector<Complex>> orbitals;
99 number_of_plane_waves,
105 atomic_wavefunction_table_,
118 std::vector<std::vector<Complex>> orbitals_in_s_metric =
121 int orbital_count =
static_cast<int>(orbitals.size());
122 std::vector<std::vector<Real>> projections(number_of_bands,
123 std::vector<Real>(orbital_count, 0.0));
125 for (
int band_index = 0; band_index < number_of_bands; band_index++) {
128 for (
int orbital_index = 0; orbital_index < orbital_count; orbital_index++) {
130 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
131 overlap += std::conj(orbitals_in_s_metric[orbital_index][g_index]) *
134 projections[band_index][orbital_index] = std::norm(overlap);
141 std::vector<AtomicOrbitalLabel> orbital_labels_;
142 std::vector<std::vector<std::vector<Real>>> atomic_wavefunction_table_;
143 Real q_spacing_ = 0.01;
144 int number_of_q_points_ = 900;
Complex * wavefunction_band_data(int kpoint_state_index, int band_index)
PlanewaveWavefunctionProjectionCalculator(const Crystal &crystal_structure, const PseudopotentialSet &pseudopotential_set)
const std::vector< AtomicOrbitalLabel > & orbital_labels() const
std::vector< std::vector< Real > > compute_projections_at_kpoint(int kpoint_index, int kpoint_state_index, int number_of_plane_waves, int number_of_bands, const std::vector< int > &g_vector_indices, const Crystal &crystal_structure, const KPointsGrid &kpoint_grid, const PlanewaveBasis &planewave_basis, const PseudopotentialSet &pseudopotential_set, const PlanewaveKohnShamQuantumSystem &quantum_system, const OverlapOperator *overlap_operator) const
int number_of_orbitals() const
void build_atomic_orbitals_g_space(int kpoint_index, int number_of_plane_waves, const std::vector< int > &g_vector_indices, const Crystal &crystal_structure, const KPointsGrid &kpoint_grid, const PlanewaveBasis &planewave_basis, const PseudopotentialSet &pseudopotential_set, const std::vector< std::vector< std::vector< Real > > > &atomic_wavefunction_table, Real q_spacing, int number_of_q_points, std::vector< std::vector< Complex > > &orbitals)
std::vector< std::vector< Complex > > apply_overlap_operator_to_orbitals(const std::vector< std::vector< Complex > > &orbitals, const OverlapOperator *overlap_operator)
void lowdin_orthogonalize_orbitals(std::vector< std::vector< Complex > > &orbitals, std::vector< Complex > overlap_column_major)
std::vector< Complex > compute_orbital_overlap_matrix_in_s_metric(const std::vector< std::vector< Complex > > &orbitals, const OverlapOperator *overlap_operator)
std::vector< AtomicOrbitalLabel > enumerate_atomic_orbitals(const Crystal &crystal_structure, const PseudopotentialSet &pseudopotential_set)
std::vector< std::vector< std::vector< Real > > > tabulate_atomic_wavefunctions_in_q_space(const PseudopotentialSet &pseudopotential_set, Real cell_volume, Real q_spacing, int number_of_q_points)
std::complex< double > Complex