12 #ifndef BEMBEL_SRC_HELMHOLTZ_SINGLELAYEROPERATOR_HPP_
13 #define BEMBEL_SRC_HELMHOLTZ_SINGLELAYEROPERATOR_HPP_
18 class HelmholtzSingleLayerOperator;
24 typedef Eigen::VectorXcd EigenType;
25 typedef Eigen::VectorXcd::Scalar Scalar;
28 Form = DifferentialForm::Discontinuous,
29 NumberOfFMMComponents = 1
45 void evaluateIntegrand_impl(
49 Eigen::Dynamic, Eigen::Dynamic> *intval)
const {
50 auto polynomial_degree = super_space.get_polynomial_degree();
51 auto polynomial_degree_plus_one_squared =
52 (polynomial_degree + 1) * (polynomial_degree + 1);
55 auto s = p1.segment<2>(0);
56 auto t = p2.segment<2>(0);
63 auto x_f = p1.segment<3>(3);
64 auto x_f_dx = p1.segment<3>(6);
65 auto x_f_dy = p1.segment<3>(9);
66 auto y_f = p2.segment<3>(3);
67 auto y_f_dx = p2.segment<3>(6);
68 auto y_f_dy = p2.segment<3>(9);
71 auto x_kappa = x_f_dx.cross(x_f_dy).norm();
72 auto y_kappa = y_f_dx.cross(y_f_dy).norm();
75 auto integrand =
evaluateKernel(x_f, y_f) * x_kappa * y_kappa * ws * wt;
82 super_space.addScaledBasisInteraction(intval, integrand, s, t);
87 Eigen::Matrix<std::complex<double>, 1, 1> evaluateFMMInterpolation_impl(
90 auto s = p1.segment<2>(0);
91 auto t = p2.segment<2>(0);
94 auto x_f = p1.segment<3>(3);
95 auto x_f_dx = p1.segment<3>(6);
96 auto x_f_dy = p1.segment<3>(9);
97 auto y_f = p2.segment<3>(3);
98 auto y_f_dx = p2.segment<3>(6);
99 auto y_f_dy = p2.segment<3>(9);
102 auto x_kappa = x_f_dx.cross(x_f_dy).norm();
103 auto y_kappa = y_f_dx.cross(y_f_dy).norm();
106 Eigen::Matrix<std::complex<double>, 1, 1> intval;
116 const Eigen::Vector3d &y)
const {
117 auto r = (x - y).norm();
118 return std::exp(-std::complex<double>(0., 1.) * wavenumber_ * r) / 4. /
124 void set_wavenumber(std::complex<double> wavenumber) {
125 wavenumber_ = wavenumber;
130 std::complex<double> get_wavenumber() {
return wavenumber_; }
133 std::complex<double> wavenumber_;
This class implements the specification of the integration for the single layer potential for Helmhol...
std::complex< double > evaluateKernel(const Eigen::Vector3d &x, const Eigen::Vector3d &y) const
Fundamental solution of Helmholtz problem.
Eigen::Matrix< double, 12, 1 > SurfacePoint
typedef of SurfacePoint
Routines for the evalutation of pointwise errors.
linear operator base class. this serves as a common interface for existing linear operators.
struct containing specifications on the linear operator has to be specialized or derived for any part...