#pragma once #include #include #include struct SIv2_API integrator { auto eval_surf_int_by(const integrand_handle_base& handle) const { double result{}; for (auto i = 0; i < integral_points.size(); ++i) { for (auto j = 0; j < integral_points[i].size(); ++j) { const auto& p = integral_points[i][j]; result += surface_integral_weights[i][j] * handle.f(p.x(), p.y(), p.z()); } } return result * handle.w_without_grad(); } auto eval_volu_int_by(const integrand_handle_base& handle) const { double result{}; for (auto i = 0; i < integral_points.size(); ++i) { for (auto j = 0; j < integral_points[i].size(); ++j) { const auto& p = integral_points[i][j]; result += volume_integral_weights[i][j] * handle.f(p.x(), p.y(), p.z()); } } return result * handle.w(); } std::vector> integral_points{}; std::vector> surface_integral_weights{}; std::vector> volume_integral_weights{}; };