| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // This file is part of Bembel, the higher order C++ boundary element library. | ||
| 2 | // | ||
| 3 | // Copyright (C) 2022 see <http://www.bembel.eu> | ||
| 4 | // | ||
| 5 | // It was written as part of a cooperation of J. Doelz, H. Harbrecht, S. Kurz, | ||
| 6 | // M. Multerer, S. Schoeps, and F. Wolf at Technische Universitaet Darmstadt, | ||
| 7 | // Universitaet Basel, and Universita della Svizzera italiana, Lugano. This | ||
| 8 | // source code is subject to the GNU General Public License version 3 and | ||
| 9 | // provided WITHOUT ANY WARRANTY, see <http://www.bembel.eu> for further | ||
| 10 | // information. | ||
| 11 | #ifndef BEMBEL_SRC_LINEAROPERATOR_LINEAROPERATORBASE_HPP_ | ||
| 12 | #define BEMBEL_SRC_LINEAROPERATOR_LINEAROPERATORBASE_HPP_ | ||
| 13 | |||
| 14 | namespace Bembel { | ||
| 15 | /** | ||
| 16 | * \ingroup LinearOperator | ||
| 17 | * \brief linear operator base class. this serves as a common interface for | ||
| 18 | * existing linear operators. | ||
| 19 | * | ||
| 20 | * Take a look at the [Design Considerations](\ref CRTPLinearOperator) for | ||
| 21 | * details. | ||
| 22 | **/ | ||
| 23 | template <typename Derived> | ||
| 24 | struct LinearOperatorBase { | ||
| 25 | // Constructors | ||
| 26 | 17 | LinearOperatorBase() {} | |
| 27 | // the user has to provide the implementation of this function, which | ||
| 28 | // is able to evaluate the integrand of the Galerkin formulation in a | ||
| 29 | // pair of quadrature points represented as a | ||
| 30 | // Surface point [xi; h * w; Chi(xi); dsChi(xi); dtChi(xi)] | ||
| 31 | template <class T> | ||
| 32 | 100287940 | void evaluateIntegrand( | |
| 33 | const T &super_space, const SurfacePoint &p1, const SurfacePoint &p2, | ||
| 34 | Eigen::Matrix<typename LinearOperatorTraits<Derived>::Scalar, | ||
| 35 | Eigen::Dynamic, Eigen::Dynamic> *intval) const { | ||
| 36 | 100287940 | static_cast<const Derived *>(this)->evaluateIntegrand_impl(super_space, p1, | |
| 37 | p2, intval); | ||
| 38 | 100287940 | return; | |
| 39 | } | ||
| 40 | // the user has to provide the implementation of this function, which | ||
| 41 | // is able to evaluate the interpolation values of the Galerkin formulation on | ||
| 42 | // the reference domain in a pair of interpolation points represented as a | ||
| 43 | // Surface point [xi; 1.; Chi(xi); dsChi(xi); dtChi(xi)] | ||
| 44 | Eigen::Matrix< | ||
| 45 | typename LinearOperatorTraits<Derived>::Scalar, | ||
| 46 | getFunctionSpaceVectorDimension<LinearOperatorTraits<Derived>::Form>() * | ||
| 47 | LinearOperatorTraits<Derived>::NumberOfFMMComponents, | ||
| 48 | getFunctionSpaceVectorDimension<LinearOperatorTraits<Derived>::Form>() * | ||
| 49 | LinearOperatorTraits<Derived>::NumberOfFMMComponents> | ||
| 50 | 6928416 | evaluateFMMInterpolation(const SurfacePoint &p1, | |
| 51 | const SurfacePoint &p2) const { | ||
| 52 | return static_cast<const Derived *>(this)->evaluateFMMInterpolation_impl( | ||
| 53 | 6928416 | p1, p2); | |
| 54 | } | ||
| 55 | // return the required quadrature degree for the far-field | ||
| 56 | 39027 | int get_FarfieldQuadratureDegree(int ansatz_degree) const { | |
| 57 | 39027 | return ansatz_degree - LinearOperatorTraits<Derived>::OperatorOrder + 1; | |
| 58 | } | ||
| 59 | /** | ||
| 60 | * \brief Compute quadrature degree for numerical integretation close to the | ||
| 61 | * singularity based on distance, refinement level, degree of ansatz | ||
| 62 | * functions and operator_order. | ||
| 63 | * | ||
| 64 | * See also WAVELET GALERKIN SCHEMES FOR BOUNDARY INTEGRAL EQUATIONS - | ||
| 65 | * IMPLEMENTATION AND QUADRATURE by Helmut Harbrecht and Reinhold Schneider | ||
| 66 | * for more details. | ||
| 67 | **/ | ||
| 68 | // return the required quadrature degree for the near-field | ||
| 69 | 39012 | int getNearfieldQuadratureDegree(int ansatz_degree, double distance, | |
| 70 | int level) const { | ||
| 71 | // if farfield quadrature is computed: take log of distance | ||
| 72 | // otherwise compute quadrature degree for Duffy trick | ||
| 73 | 39012 | double distance_log = | |
| 74 |
2/2✓ Branch 0 taken 13740 times.
✓ Branch 1 taken 25272 times.
|
39012 | (distance * (1 << level) < 1) ? -(level * log(2.)) : log(distance); |
| 75 | |||
| 76 | // alpha/2 is the convergence rate of the corresponding Galerkin solution, | ||
| 77 | // this ensures the correct convergence rate of the potential | ||
| 78 | 39012 | int alpha = | |
| 79 | 39012 | 2 - LinearOperatorTraits<Derived>::OperatorOrder + 2 * ansatz_degree; | |
| 80 | |||
| 81 | // compute numerator and denominator of quadrature degree | ||
| 82 | 39012 | double numerator = | |
| 83 | 39012 | (alpha + ansatz_degree) * level * log(2.) - | |
| 84 | 39012 | (2 - ansatz_degree + LinearOperatorTraits<Derived>::OperatorOrder) * | |
| 85 | distance_log; | ||
| 86 | 39012 | double denominator = (level + 2) * log(2.) + distance_log; | |
| 87 | |||
| 88 | 39012 | return 0.5 * numerator / denominator; | |
| 89 | } | ||
| 90 | // pointer to the derived object | ||
| 91 | Derived &derived() { return *static_cast<Derived *>(this); } | ||
| 92 | // const pointer to the derived object | ||
| 93 | const Derived &derived() const { return *static_cast<const Derived *>(this); } | ||
| 94 | }; | ||
| 95 | } // namespace Bembel | ||
| 96 | #endif // BEMBEL_SRC_LINEAROPERATOR_LINEAROPERATORBASE_HPP_ | ||
| 97 |