21 const std::vector<Complex>& charge_density_g_space,
22 std::vector<Real>& charge_density_real_space) {
28 std::vector<Complex> work(
32 const auto& g_vectors = g_vectors_grid.
g_vectors();
37 const auto& g_vector = g_vectors[g_vector_index];
39 g_vector.miller[0], g_vector.miller[1], g_vector.miller[2]);
41 work[fft_index] = charge_density_g_space[g_vector_index];
47 -g_vector.miller[0], -g_vector.miller[1], -g_vector.miller[2]);
48 if (minus_g_fft_index >= 0) {
49 work[minus_g_fft_index] = std::conj(charge_density_g_space[g_vector_index]);
56 charge_density_real_space.resize(local_points);
58 for (
int grid_index = 0; grid_index < local_points; grid_index++) {
59 charge_density_real_space[grid_index] = work[grid_index].real() * total_grid_points;
65 const std::vector<Real>& charge_density_real_space,
66 std::vector<Complex>& charge_density_g_space) {
68 std::vector<Complex> work(
71 for (
int grid_index = 0; grid_index < local_points; grid_index++) {
72 work[grid_index] =
Complex(charge_density_real_space[grid_index], 0.0);
78 const auto& g_vectors = g_vectors_grid.
g_vectors();
80 charge_density_g_space.assign(number_of_g_vectors,
Complex(0.0, 0.0));
81 for (
int g_vector_index = 0; g_vector_index < number_of_g_vectors; g_vector_index++) {
82 const auto& g_vector = g_vectors[g_vector_index];
84 g_vector.miller[0], g_vector.miller[1], g_vector.miller[2]);
86 charge_density_g_space[g_vector_index] = work[fft_index] * inverse_grid_size;
91 fft_rho.
reduce_g_space(charge_density_g_space.data(), number_of_g_vectors);