12 #ifndef BEMBEL_SRC_HELMHOLTZ_HYPERSINGULAROPERATOR_HPP_
13 #define BEMBEL_SRC_HELMHOLTZ_HYPERSINGULAROPERATOR_HPP_
18 class HelmholtzHypersingularOperator;
22 typedef Eigen::VectorXcd EigenType;
23 typedef Eigen::VectorXcd::Scalar Scalar;
26 Form = DifferentialForm::Continuous,
27 NumberOfFMMComponents = 3
41 void evaluateIntegrand_impl(
const T &super_space,
const SurfacePoint &p1,
43 Eigen::MatrixXcd *intval)
const {
44 auto polynomial_degree = super_space.get_polynomial_degree();
45 auto polynomial_degree_plus_one_squared =
46 (polynomial_degree + 1) * (polynomial_degree + 1);
49 Eigen::Vector2d s = p1.segment<2>(0);
50 Eigen::Vector2d t = p2.segment<2>(0);
57 Eigen::Vector3d x_f = p1.segment<3>(3);
58 Eigen::Vector3d x_f_dx = p1.segment<3>(6);
59 Eigen::Vector3d x_f_dy = p1.segment<3>(9);
60 Eigen::Vector3d y_f = p2.segment<3>(3);
61 Eigen::Vector3d y_f_dx = p2.segment<3>(6);
62 Eigen::Vector3d y_f_dy = p2.segment<3>(9);
65 Eigen::Vector3d x_n = x_f_dx.cross(x_f_dy);
66 Eigen::Vector3d y_n = y_f_dx.cross(y_f_dy);
70 1. / (1 << super_space.get_refinement_level());
76 std::complex<double> integrandScalar =
77 -kernel * x_n.dot(y_n) * wavenumber2_ * ws * wt;
78 std::complex<double> integrandCurl =
79 kernel * x_n.norm() * y_n.norm() * ws * wt / h / h;
83 super_space.addScaledBasisInteraction(intval, integrandScalar, s, t);
84 super_space.addScaledSurfaceCurlInteraction(intval, integrandCurl, p1, p2);
89 Eigen::Matrix<std::complex<double>, 3, 3> evaluateFMMInterpolation_impl(
92 Eigen::Vector2d s = p1.segment<2>(0);
93 Eigen::Vector2d t = p2.segment<2>(0);
96 Eigen::Vector3d x_f = p1.segment<3>(3);
97 Eigen::Vector3d x_f_dx = p1.segment<3>(6);
98 Eigen::Vector3d x_f_dy = p1.segment<3>(9);
99 Eigen::Vector3d y_f = p2.segment<3>(3);
100 Eigen::Vector3d y_f_dx = p2.segment<3>(6);
101 Eigen::Vector3d y_f_dy = p2.segment<3>(9);
104 Eigen::Vector3d x_n = x_f_dx.cross(x_f_dy);
105 Eigen::Vector3d y_n = y_f_dx.cross(y_f_dy);
111 Eigen::Matrix<std::complex<double>, 3, 3> intval;
113 intval(0, 0) = -kernel * wavenumber2_ * x_n.dot(y_n);
114 intval(1, 1) = kernel * x_f_dy.dot(y_f_dy);
115 intval(1, 2) = -kernel * x_f_dy.dot(y_f_dx);
116 intval(2, 1) = -kernel * x_f_dx.dot(y_f_dy);
117 intval(2, 2) = kernel * x_f_dx.dot(y_f_dx);
126 const Eigen::Vector3d &y)
const {
127 auto r = (x - y).norm();
128 return std::exp(-std::complex<double>(0., 1.) * wavenumber_ * r) / 4. /
134 void set_wavenumber(std::complex<double> wavenumber) {
135 wavenumber_ = wavenumber;
136 wavenumber2_ = wavenumber_ * wavenumber_;
141 std::complex<double> get_wavenumber() {
return wavenumber_; }
144 std::complex<double> wavenumber_;
145 std::complex<double> wavenumber2_;
153 template <
typename InterpolationPo
ints>
156 static std::vector<Eigen::MatrixXd> compute2DMoment(
158 const int cluster_level,
const int cluster_refinements,
159 const int number_of_points) {
163 super_space, cluster_level, cluster_refinements, number_of_points);
167 super_space, cluster_level, cluster_refinements, number_of_points);
172 super_space, cluster_level, cluster_refinements, number_of_points);
174 Eigen::MatrixXd moment_total(
175 moment.rows() + moment_dx.rows() + moment_dy.rows(), moment_dx.cols());
176 moment_total << moment, moment_dx, moment_dy;
178 std::vector<Eigen::MatrixXd> vector_of_moments;
179 vector_of_moments.push_back(moment_total);
181 return vector_of_moments;
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
Eigen::MatrixXd moment2DComputer(const SuperSpace< LinOp > &super_space, const int cluster_level, const int cluster_refinements, const int number_of_points)
Computes a single 2D moment for the FMM by tensorisation of the 1D moments.
Routines for the evalutation of pointwise errors.
Computes 1D moment for FMM using derivatives of the basis functions. All calculations ar performed on...
Computes 1D moment for FMM. All calculations ar performed on [0,1].
Computes all 2D moment for the FMM by tensorisation of the 1D moments. Specialice this for your linea...
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...
The superspace manages local polynomial bases on each element of the mesh and provides an interface t...