53 int number_of_q_points) {
55 int number_of_species =
static_cast<int>(pseudopotential_set.
size());
59 std::vector<int> mesh_truncation_sizes(number_of_species);
60 for (
int species_index = 0; species_index < number_of_species; species_index++) {
61 const auto& pseudopotential = pseudopotential_set[species_index];
63 mesh_truncation_sizes[species_index] = pseudopotential.mesh_size;
64 for (
int radial_index = pseudopotential.mesh_size - 1; radial_index >= 0;
66 if (pseudopotential.radial_grid[radial_index] <
68 mesh_truncation_sizes[species_index] = radial_index + 1;
69 if (mesh_truncation_sizes[species_index] % 2 == 0)
70 mesh_truncation_sizes[species_index]++;
74 if (mesh_truncation_sizes[species_index] > pseudopotential.mesh_size) {
75 mesh_truncation_sizes[species_index] = pseudopotential.mesh_size;
76 if (mesh_truncation_sizes[species_index] % 2 == 0) {
77 mesh_truncation_sizes[species_index]--;
81 mesh_truncation_sizes[species_index] = pseudopotential.mesh_size;
82 if (mesh_truncation_sizes[species_index] % 2 == 0) {
83 mesh_truncation_sizes[species_index]--;
89 std::vector<std::vector<std::vector<Real>>> table(number_of_species);
90 for (
int type_index = 0; type_index < number_of_species; type_index++) {
91 const auto& pseudopotential = pseudopotential_set[type_index];
92 table[type_index].resize(pseudopotential.wavefunctions_atomic.size());
94 for (
int wavefunction_index = 0;
95 wavefunction_index < static_cast<int>(pseudopotential.wavefunctions_atomic.size());
96 wavefunction_index++) {
97 table[type_index][wavefunction_index].resize(number_of_q_points, 0.0);
99 if (pseudopotential.wavefunctions_atomic[wavefunction_index].occupations < 0.0)
102 int angular_momentum =
103 pseudopotential.wavefunctions_atomic[wavefunction_index].angular_momentum;
105 for (
int q_index = 0; q_index < number_of_q_points; q_index++) {
106 Real q_value = q_spacing * q_index;
108 std::vector<Real> integrand(mesh_truncation_sizes[type_index]);
109 for (
int radial_index = 0; radial_index < mesh_truncation_sizes[type_index];
112 angular_momentum, q_value * pseudopotential.radial_grid[radial_index]);
113 integrand[radial_index] =
114 pseudopotential.wavefunctions_atomic[wavefunction_index]
115 .radial_values[radial_index] *
116 bessel_value * pseudopotential.radial_grid[radial_index];
118 table[type_index][wavefunction_index][q_index] =
120 pseudopotential.radial_grid_derivative,
121 mesh_truncation_sizes[type_index]);