34 void apply(
int number_of_plane_waves,
36 Complex* overlap_wavefunction)
const override {
38 std::memcpy(overlap_wavefunction, wavefunction, number_of_plane_waves *
sizeof(
Complex));
41 if (total_projectors == 0) {
46 if (cached_q_matrix_.empty()) {
51 std::vector<Complex> projector_overlaps(total_projectors,
Complex(0.0, 0.0));
55 int double_number_of_plane_waves = 2 * number_of_plane_waves;
56 double alpha_two = 2.0;
57 double double_beta_zero = 0.0;
58 int one_increment = 1;
60 std::vector<double> real_projector_overlaps(total_projectors, 0.0);
61 const double* real_kleinman_bylander_potential =
63 const double* real_wavefunction =
reinterpret_cast<const double*
>(wavefunction);
66 &double_number_of_plane_waves,
69 real_kleinman_bylander_potential,
70 &double_number_of_plane_waves,
74 real_projector_overlaps.data(),
82 if (has_zero_g_vector) {
83 for (
int projector_index = 0; projector_index < total_projectors;
86 Complex wavefunction_g0 = wavefunction[0];
87 real_projector_overlaps[projector_index] -=
88 (std::conj(kleinman_bylander_g0) * wavefunction_g0).real();
92 for (
int projector_index = 0; projector_index < total_projectors; ++projector_index) {
93 projector_overlaps[projector_index] =
94 Complex(real_projector_overlaps[projector_index], 0.0);
98 Complex beta_zero_val(0.0, 0.0);
99 int one_increment = 1;
100 auto* cast_alpha =
reinterpret_cast<const std::complex<double>*
>(&alpha_one);
101 auto* cast_beta_zero =
reinterpret_cast<const std::complex<double>*
>(&beta_zero_val);
102 auto* cast_kleinman_bylander =
104 auto* cast_wavefunction =
reinterpret_cast<const std::complex<double>*
>(wavefunction);
105 auto* cast_projector_overlaps =
106 reinterpret_cast<std::complex<double>*
>(projector_overlaps.data());
109 &number_of_plane_waves,
112 cast_kleinman_bylander,
113 &number_of_plane_waves,
117 cast_projector_overlaps,
124 std::vector<Complex> projector_overlaps_with_q_matrix(total_projectors,
Complex(0.0, 0.0));
125 Complex alpha_one_val(1.0, 0.0);
126 Complex beta_zero_val(0.0, 0.0);
127 int one_increment = 1;
128 auto* cast_alpha =
reinterpret_cast<const std::complex<double>*
>(&alpha_one_val);
129 auto* cast_beta_zero =
reinterpret_cast<const std::complex<double>*
>(&beta_zero_val);
130 auto* cast_q_matrix =
131 reinterpret_cast<const std::complex<double>*
>(cached_q_matrix_.data());
132 auto* cast_projector_overlaps =
133 reinterpret_cast<std::complex<double>*
>(projector_overlaps.data());
134 auto* cast_projector_overlaps_with_q_matrix =
135 reinterpret_cast<std::complex<double>*
>(projector_overlaps_with_q_matrix.data());
143 cast_projector_overlaps,
146 cast_projector_overlaps_with_q_matrix,
151 auto* cast_one =
reinterpret_cast<const std::complex<double>*
>(&beta_one);
152 auto* cast_kleinman_bylander =
154 auto* cast_overlap_wavefunction =
155 reinterpret_cast<std::complex<double>*
>(overlap_wavefunction);
158 &number_of_plane_waves,
161 cast_kleinman_bylander,
162 &number_of_plane_waves,
163 cast_projector_overlaps_with_q_matrix,
166 cast_overlap_wavefunction,
177 int number_of_vectors,
179 Complex* overlap_wavefunctions)
const override {
181 std::memcpy(overlap_wavefunctions,
183 static_cast<size_t>(number_of_plane_waves) * number_of_vectors *
187 if (total_projectors == 0) {
195 std::vector<Complex> projector_overlaps(
196 static_cast<size_t>(total_projectors) * number_of_vectors,
Complex(0.0, 0.0));
200 int double_number_of_plane_waves = 2 * number_of_plane_waves;
201 double alpha_two = 2.0;
202 double double_beta_zero = 0.0;
204 std::vector<double> real_projector_overlaps(
205 static_cast<size_t>(total_projectors) * number_of_vectors, 0.0);
206 const double* real_kleinman_bylander_potential =
208 const double* real_wavefunctions =
reinterpret_cast<const double*
>(wavefunctions);
215 &double_number_of_plane_waves,
217 real_kleinman_bylander_potential,
218 &double_number_of_plane_waves,
220 &double_number_of_plane_waves,
222 real_projector_overlaps.data(),
230 if (has_zero_g_vector) {
231 for (
int vector_index = 0; vector_index < number_of_vectors; ++vector_index) {
233 wavefunctions[
static_cast<size_t>(vector_index) * number_of_plane_waves];
234 for (
int projector_index = 0; projector_index < total_projectors;
238 size_t index =
static_cast<size_t>(projector_index) +
239 static_cast<size_t>(vector_index) * total_projectors;
240 real_projector_overlaps[index] -=
241 (std::conj(kleinman_bylander_g0) * wavefunction_g0).real();
246 for (
size_t index = 0; index < real_projector_overlaps.size(); ++index) {
247 projector_overlaps[index] =
Complex(real_projector_overlaps[index], 0.0);
251 Complex beta_blas_zero(0.0, 0.0);
252 auto* cast_alpha =
reinterpret_cast<const std::complex<double>*
>(&alpha_blas);
253 auto* cast_zero =
reinterpret_cast<const std::complex<double>*
>(&beta_blas_zero);
254 auto* cast_kleinman_bylander =
256 auto* cast_wavefunctions =
reinterpret_cast<const std::complex<double>*
>(wavefunctions);
257 auto* cast_projector_overlaps =
258 reinterpret_cast<std::complex<double>*
>(projector_overlaps.data());
264 &number_of_plane_waves,
266 cast_kleinman_bylander,
267 &number_of_plane_waves,
269 &number_of_plane_waves,
271 cast_projector_overlaps,
276 total_projectors * number_of_vectors);
282 if (cached_q_matrix_.empty()) {
285 std::vector<Complex> projector_overlaps_with_q_matrix(
286 static_cast<size_t>(total_projectors) * number_of_vectors,
Complex(0.0, 0.0));
288 Complex beta_blas_zero(0.0, 0.0);
289 auto* cast_alpha =
reinterpret_cast<const std::complex<double>*
>(&alpha_blas);
290 auto* cast_zero =
reinterpret_cast<const std::complex<double>*
>(&beta_blas_zero);
291 auto* cast_q_matrix =
292 reinterpret_cast<const std::complex<double>*
>(cached_q_matrix_.data());
293 auto* cast_projector_overlaps =
294 reinterpret_cast<std::complex<double>*
>(projector_overlaps.data());
295 auto* cast_projector_overlaps_with_q_matrix =
296 reinterpret_cast<std::complex<double>*
>(projector_overlaps_with_q_matrix.data());
306 cast_projector_overlaps,
309 cast_projector_overlaps_with_q_matrix,
313 Complex beta_blas_one(1.0, 0.0);
314 auto* cast_one =
reinterpret_cast<const std::complex<double>*
>(&beta_blas_one);
315 auto* cast_kleinman_bylander =
317 auto* cast_overlap_wavefunctions =
318 reinterpret_cast<std::complex<double>*
>(overlap_wavefunctions);
322 &number_of_plane_waves,
326 cast_kleinman_bylander,
327 &number_of_plane_waves,
328 cast_projector_overlaps_with_q_matrix,
331 cast_overlap_wavefunctions,
332 &number_of_plane_waves);
336 std::vector<Complex>& overlap_matrix)
const override {
337 overlap_matrix.assign(number_of_plane_waves * number_of_plane_waves,
Complex(0.0, 0.0));
338 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
339 overlap_matrix[g_index + g_index * number_of_plane_waves] =
Complex(1.0, 0.0);
342 int projector_index_offset = 0;
345 int number_of_projectors =
347 std::vector<int> projector_angular_momenta, projector_magnetic_projections,
348 projector_beta_indices;
349 for (
int beta_index = 0; beta_index < number_of_projectors; beta_index++) {
350 int angular_momentum =
352 species_type_index, beta_index);
354 projector_angular_momenta.push_back(angular_momentum);
355 projector_magnetic_projections.push_back(magnetic_projection);
356 projector_beta_indices.push_back(beta_index);
359 int number_of_projectors_for_atom =
static_cast<int>(projector_angular_momenta.size());
360 for (
int projector_index_a = 0; projector_index_a < number_of_projectors_for_atom;
361 projector_index_a++) {
362 for (
int projector_index_b = 0; projector_index_b < number_of_projectors_for_atom;
363 projector_index_b++) {
364 Real overlap_coefficient =
367 .augmentation_overlap_integral(
369 projector_beta_indices[projector_index_a],
370 projector_beta_indices[projector_index_b]);
371 if (projector_angular_momenta[projector_index_a] !=
372 projector_angular_momenta[projector_index_b] ||
373 projector_magnetic_projections[projector_index_a] !=
374 projector_magnetic_projections[projector_index_b])
375 overlap_coefficient = 0.0;
376 if (std::abs(overlap_coefficient) <
379 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
380 for (
int plane_wave_index_jg = 0;
381 plane_wave_index_jg < number_of_plane_waves;
382 plane_wave_index_jg++) {
383 overlap_matrix[g_index + plane_wave_index_jg * number_of_plane_waves] +=
384 Complex(overlap_coefficient, 0.0) *
386 projector_index_a][g_index] *
389 [plane_wave_index_jg]);
394 projector_index_offset += number_of_projectors_for_atom;