12 #ifndef BEMBEL_SRC_HELMHOLTZ_DOUBLELAYEROPERATOR_HPP_
13 #define BEMBEL_SRC_HELMHOLTZ_DOUBLELAYEROPERATOR_HPP_
18 class HelmholtzDoubleLayerOperator;
22 typedef Eigen::VectorXcd EigenType;
23 typedef Eigen::VectorXcd::Scalar Scalar;
26 Form = DifferentialForm::Discontinuous,
27 NumberOfFMMComponents = 1
41 void evaluateIntegrand_impl(
45 Eigen::Dynamic, Eigen::Dynamic> *intval)
const {
46 auto polynomial_degree = super_space.get_polynomial_degree();
47 auto polynomial_degree_plus_one_squared =
48 (polynomial_degree + 1) * (polynomial_degree + 1);
51 auto s = p1.segment<2>(0);
52 auto t = p2.segment<2>(0);
59 auto x_f = p1.segment<3>(3);
60 auto x_f_dx = p1.segment<3>(6);
61 auto x_f_dy = p1.segment<3>(9);
62 auto y_f = p2.segment<3>(3);
63 auto y_f_dx = p2.segment<3>(6);
64 auto y_f_dy = p2.segment<3>(9);
67 auto x_kappa = x_f_dx.cross(x_f_dy).norm();
68 auto y_n = y_f_dx.cross(y_f_dy);
78 super_space.addScaledBasisInteraction(intval, integrand, s, t);
83 Eigen::Matrix<std::complex<double>, 1, 1> evaluateFMMInterpolation_impl(
86 auto s = p1.segment<2>(0);
87 auto t = p2.segment<2>(0);
90 auto x_f = p1.segment<3>(3);
91 auto x_f_dx = p1.segment<3>(6);
92 auto x_f_dy = p1.segment<3>(9);
93 auto y_f = p2.segment<3>(3);
94 auto y_f_dx = p2.segment<3>(6);
95 auto y_f_dy = p2.segment<3>(9);
99 auto x_kappa = x_f_dx.cross(x_f_dy).norm();
100 auto y_n = y_f_dx.cross(y_f_dy);
103 Eigen::Matrix<std::complex<double>, 1, 1> intval;
113 const Eigen::Vector3d &y,
114 const Eigen::Vector3d &y_n)
const {
118 auto i = std::complex<double>(0., 1.);
119 return c.dot(y_n) * std::exp(-i * wavenumber_ * r) *
120 (1. + i * wavenumber_ * r) / 4. / BEMBEL_PI / r3;
125 void set_wavenumber(std::complex<double> wavenumber) {
126 wavenumber_ = wavenumber;
131 std::complex<double> get_wavenumber() {
return wavenumber_; }
134 std::complex<double> wavenumber_;
std::complex< double > evaluateKernelGrad(const Eigen::Vector3d &x, const Eigen::Vector3d &y, const Eigen::Vector3d &y_n) const
Gradient of 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...