24 const std::vector<Real>& integration_factors,
25 int number_of_grid_points) {
26 Real integrated_sum = 0.0;
27 int mesh_size = std::min(number_of_grid_points,
static_cast<int>(function_values.size()));
32 for (
int grid_index = 1; grid_index < mesh_size - 1; grid_index++) {
33 Real integration_weight = (grid_index % 2 == 1) ? 4.0 : 2.0;
35 integration_weight * function_values[grid_index] * integration_factors[grid_index];
38 if (mesh_size % 2 == 1) {
39 integrated_sum += function_values[0] * integration_factors[0] +
40 function_values[mesh_size - 1] * integration_factors[mesh_size - 1];
43 function_values[0] * integration_factors[0] -
44 function_values[mesh_size - 3] * integration_factors[mesh_size - 3] * 0.25 +
45 function_values[mesh_size - 2] * integration_factors[mesh_size - 2] +
46 function_values[mesh_size - 1] * integration_factors[mesh_size - 1] * 1.25;
49 return integrated_sum / 3.0;