264 int total_projectors =
265 pseudopotential_snapshot.pseudopotential_basis().total_number_of_projectors();
268 ++kpoint_index_state) {
269 int kpoint_index = kpoint_index_state % number_of_kpoints;
274 const auto& kleinman_bylander_projectors =
278 std::vector<int> occupied_band_indices;
279 std::vector<Real> occupied_band_weights;
282 kpoint_index_state, band_index);
286 occupied_band_indices.push_back(band_index);
287 occupied_band_weights.push_back(kpoint_weight *
occupation);
289 int number_of_occupied_bands =
static_cast<int>(occupied_band_indices.size());
290 if (number_of_occupied_bands == 0) {
295 std::vector<Complex> psi_matrix(
static_cast<size_t>(plane_waves_at_kpoint) *
296 number_of_occupied_bands);
297 for (
int occupied_index = 0; occupied_index < number_of_occupied_bands;
300 kpoint_index_state, occupied_band_indices[occupied_index]);
302 band_data + plane_waves_at_kpoint,
304 static_cast<size_t>(occupied_index) * plane_waves_at_kpoint);
308 std::vector<Complex> projector_overlaps(
static_cast<size_t>(total_projectors) *
309 number_of_occupied_bands,
313 int double_number_of_plane_waves = 2 * plane_waves_at_kpoint;
314 double alpha_two = 2.0;
315 double double_beta_zero = 0.0;
317 std::vector<double> real_projector_overlaps(
318 static_cast<size_t>(total_projectors) * number_of_occupied_bands, 0.0);
319 const double* real_kleinman_bylander_projectors =
320 reinterpret_cast<const double*
>(kleinman_bylander_projectors.data());
321 const double* real_psi_matrix =
reinterpret_cast<const double*
>(psi_matrix.data());
326 &number_of_occupied_bands,
327 &double_number_of_plane_waves,
329 real_kleinman_bylander_projectors,
330 &double_number_of_plane_waves,
332 &double_number_of_plane_waves,
334 real_projector_overlaps.data(),
346 if (has_zero_g_vector) {
347 for (
int occupied_index = 0; occupied_index < number_of_occupied_bands;
350 psi_matrix[
static_cast<size_t>(occupied_index) * plane_waves_at_kpoint];
351 for (
int projector_index = 0; projector_index < total_projectors;
354 kleinman_bylander_projectors[projector_index][0];
355 size_t index =
static_cast<size_t>(projector_index) +
356 static_cast<size_t>(occupied_index) * total_projectors;
357 real_projector_overlaps[index] -=
358 (std::conj(kleinman_bylander_g0) * psi_g0).real();
363 for (
size_t index = 0; index < real_projector_overlaps.size(); ++index) {
364 projector_overlaps[index] =
Complex(real_projector_overlaps[index], 0.0);
369 auto* cast_alpha =
reinterpret_cast<const std::complex<double>*
>(&alpha_blas);
370 auto* cast_beta_coeff =
reinterpret_cast<const std::complex<double>*
>(&beta_blas);
371 auto* cast_kb =
reinterpret_cast<const std::complex<double>*
>(
372 kleinman_bylander_projectors.data());
373 auto* cast_psi =
reinterpret_cast<const std::complex<double>*
>(psi_matrix.data());
374 auto* cast_projector_overlaps =
375 reinterpret_cast<std::complex<double>*
>(projector_overlaps.data());
380 &number_of_occupied_bands,
381 &plane_waves_at_kpoint,
384 &plane_waves_at_kpoint,
386 &plane_waves_at_kpoint,
388 cast_projector_overlaps,
402 static_cast<int>(projector_overlaps.size()));
406 int current_projector_index = 0;
410 int number_of_projectors_on_atom =
411 pseudopotential_snapshot.pseudopotential_basis().number_of_projector_channels(
414 for (
int projector_a_index = 0; projector_a_index < number_of_projectors_on_atom;
415 ++projector_a_index) {
416 for (
int projector_b_index = 0;
417 projector_b_index < number_of_projectors_on_atom;
418 ++projector_b_index) {
420 int global_a = current_projector_index + projector_a_index;
421 int global_b = current_projector_index + projector_b_index;
422 for (
int occupied_index = 0; occupied_index < number_of_occupied_bands;
429 projector_overlaps[
static_cast<size_t>(global_a) +
430 static_cast<size_t>(occupied_index) *
433 projector_overlaps[
static_cast<size_t>(global_b) +
434 static_cast<size_t>(occupied_index) *
437 occupied_band_weights[occupied_index] *
438 std::real(std::conj(projector_overlaps_a) * projector_overlaps_b);
440 int coefficient_index =
441 projector_a_index * number_of_projectors_on_atom + projector_b_index;
444 number_of_kpoints][atom_index]
445 [coefficient_index] += sum;
448 current_projector_index += number_of_projectors_on_atom;