46 if (paw !=
nullptr && paw->has_reciprocal_core_charge()) {
47 std::vector<Real> single_q{q_value};
48 std::vector<Real> tabulated;
50 paw->charge_core_reciprocal, paw->reciprocal_core_grid_spacing, 0, single_q, tabulated);
54 std::vector<Real> integrand(mesh_size);
55 for (
int radial_index = 0; radial_index < mesh_size; radial_index++) {
60 pseudopotential.
radial_grid[radial_index] * bessel_value;
101 const std::vector<int>& mesh_sizes,
102 const std::vector<Real>& g_vector_magnitudes,
105 int number_of_q_points) {
107 int number_of_species_types =
static_cast<int>(pseudopotential_set.
size());
108 int number_of_g_vectors =
static_cast<int>(g_vector_magnitudes.size());
113 for (
int type_index = 0; type_index < number_of_species_types; type_index++) {
114 if (pseudopotential_set[type_index].has_nonlinear_core_correction) {
124 std::vector<Real> q_point_values(number_of_q_points);
125 for (
int q_index = 0; q_index < number_of_q_points; q_index++) {
126 q_point_values[q_index] = q_index * q_spacing;
131 for (
int element_type = 0; element_type < number_of_species_types; element_type++) {
132 const auto& pseudopotential = pseudopotential_set[element_type];
133 if (!pseudopotential.has_nonlinear_core_correction) {
137 int radial_mesh_size = mesh_sizes[element_type];
138 std::vector<Real> radial_function(pseudopotential.mesh_size, 0.0);
139 for (
int radial_index = 0; radial_index < pseudopotential.mesh_size; radial_index++) {
140 radial_function[radial_index] =
141 pseudopotential.charge_core.radial_values[radial_index] *
142 pseudopotential.radial_grid[radial_index];
145 pseudopotential.radial_grid_derivative,
155 for (
int g_vector_index = 0; g_vector_index < number_of_g_vectors; g_vector_index++) {
156 for (
int element_type = 0; element_type < number_of_species_types; element_type++) {
157 if (!pseudopotential_set[element_type].has_nonlinear_core_correction)
159 Real q_value = g_vector_magnitudes[g_vector_index];
161 pseudopotential_set[element_type], mesh_sizes[element_type], q_value);
163 Complex structure_factor(0.0, 0.0);
164 for (
int atom_index = 0; atom_index < crystal_structure.
number_of_atoms();
169 const auto& g_vector = planewave_basis.
g_vectors()[g_vector_index];
175 core_charge_density_value * structure_factor / cell_volume;
CoreChargeTabulationResult tabulate_core_charge_density_in_g_space(const Crystal &crystal_structure, const PlanewaveBasis &planewave_basis, const PseudopotentialSet &pseudopotential_set, const std::vector< int > &mesh_sizes, const std::vector< Real > &g_vector_magnitudes, Real cell_volume, Real q_spacing, int number_of_q_points)
void transform_spherical_bessel(const std::vector< Real > &grid, const std::vector< Real > &integration_factors, const std::vector< Real > &function, int degree, int mesh_size, const std::vector< Real > &q_points, std::vector< Real > &fourier_transform)