GCC Code Coverage Report


Directory: Bembel/src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 98.4% 244 / 0 / 248
Functions: 97.6% 82 / 0 / 84
Branches: 98.8% 158 / 0 / 160

Spline/ShapeFunctions.hpp
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 //
12 #ifndef BEMBEL_SRC_SPLINE_SHAPEFUNCTIONS_HPP_
13 #define BEMBEL_SRC_SPLINE_SHAPEFUNCTIONS_HPP_
14
15 namespace Bembel {
16 namespace Basis {
17
18 using funptr_doubleOut_doubleptrDoubleIn = double (*)(double*, double);
19 using funptr_voidOut_doubleptrDoubleIn = void (*)(double*, double);
20
21 /**
22 * \ingroup Spline
23 * \brief These routines implement a template recursion that allows to choose a
24 *compile time instantiation of a basis-evaluation routine with a runtime p. To
25 *replace the underlying basis, only these routines should be changed.
26 **/
27 template <int P>
28 class PSpecificShapeFunctionHandler {
29 public:
30 7650 inline static double evalCoef(int p, double* ar, double x) {
31
40/40
Bembel::Basis::PSpecificShapeFunctionHandler<10>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 366 times.
Bembel::Basis::PSpecificShapeFunctionHandler<11>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 377 times.
Bembel::Basis::PSpecificShapeFunctionHandler<12>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 388 times.
Bembel::Basis::PSpecificShapeFunctionHandler<13>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 399 times.
Bembel::Basis::PSpecificShapeFunctionHandler<14>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 410 times.
Bembel::Basis::PSpecificShapeFunctionHandler<15>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 421 times.
Bembel::Basis::PSpecificShapeFunctionHandler<16>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 432 times.
Bembel::Basis::PSpecificShapeFunctionHandler<17>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 443 times.
Bembel::Basis::PSpecificShapeFunctionHandler<18>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 454 times.
Bembel::Basis::PSpecificShapeFunctionHandler<19>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 465 times.
Bembel::Basis::PSpecificShapeFunctionHandler<1>::evalCoef(int, double*, double):
✓ Branch 0 taken 267 times.
✓ Branch 1 taken 11 times.
Bembel::Basis::PSpecificShapeFunctionHandler<20>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 476 times.
Bembel::Basis::PSpecificShapeFunctionHandler<2>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 278 times.
Bembel::Basis::PSpecificShapeFunctionHandler<3>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 289 times.
Bembel::Basis::PSpecificShapeFunctionHandler<4>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 300 times.
Bembel::Basis::PSpecificShapeFunctionHandler<5>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 311 times.
Bembel::Basis::PSpecificShapeFunctionHandler<6>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 322 times.
Bembel::Basis::PSpecificShapeFunctionHandler<7>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 333 times.
Bembel::Basis::PSpecificShapeFunctionHandler<8>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 344 times.
Bembel::Basis::PSpecificShapeFunctionHandler<9>::evalCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 355 times.
7650 return p == P ? Bembel::Basis::EvalBernstein<double, P>(ar, x)
32 7650 : PSpecificShapeFunctionHandler<P - 1>::evalCoef(p, ar, x);
33 }
34 2310 inline static double evalDerCoef(int p, double* ar, double x) {
35
39/40
Bembel::Basis::PSpecificShapeFunctionHandler<10>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 99 times.
Bembel::Basis::PSpecificShapeFunctionHandler<11>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 110 times.
Bembel::Basis::PSpecificShapeFunctionHandler<12>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 121 times.
Bembel::Basis::PSpecificShapeFunctionHandler<13>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 132 times.
Bembel::Basis::PSpecificShapeFunctionHandler<14>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 143 times.
Bembel::Basis::PSpecificShapeFunctionHandler<15>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 154 times.
Bembel::Basis::PSpecificShapeFunctionHandler<16>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 165 times.
Bembel::Basis::PSpecificShapeFunctionHandler<17>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 176 times.
Bembel::Basis::PSpecificShapeFunctionHandler<18>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 187 times.
Bembel::Basis::PSpecificShapeFunctionHandler<19>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 198 times.
Bembel::Basis::PSpecificShapeFunctionHandler<1>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
Bembel::Basis::PSpecificShapeFunctionHandler<20>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 209 times.
Bembel::Basis::PSpecificShapeFunctionHandler<2>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 11 times.
Bembel::Basis::PSpecificShapeFunctionHandler<3>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 22 times.
Bembel::Basis::PSpecificShapeFunctionHandler<4>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 33 times.
Bembel::Basis::PSpecificShapeFunctionHandler<5>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 44 times.
Bembel::Basis::PSpecificShapeFunctionHandler<6>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 55 times.
Bembel::Basis::PSpecificShapeFunctionHandler<7>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 66 times.
Bembel::Basis::PSpecificShapeFunctionHandler<8>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 77 times.
Bembel::Basis::PSpecificShapeFunctionHandler<9>::evalDerCoef(int, double*, double):
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 88 times.
2310 return p == P ? Bembel::Basis::EvalBernsteinDer<double, P>(ar, x)
36 2310 : PSpecificShapeFunctionHandler<P - 1>::evalDerCoef(p, ar, x);
37 }
38 3974676652 inline static void evalBasis(int p, double* ar, double x) {
39
40/40
Bembel::Basis::PSpecificShapeFunctionHandler<10>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<11>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<12>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<13>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<14>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<15>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<16>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<17>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<18>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<19>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<1>::evalBasis(int, double*, double):
✓ Branch 0 taken 222014686 times.
✓ Branch 1 taken 20 times.
Bembel::Basis::PSpecificShapeFunctionHandler<20>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<2>::evalBasis(int, double*, double):
✓ Branch 0 taken 3162 times.
✓ Branch 1 taken 177883674 times.
Bembel::Basis::PSpecificShapeFunctionHandler<3>::evalBasis(int, double*, double):
✓ Branch 0 taken 3642 times.
✓ Branch 1 taken 177884394 times.
Bembel::Basis::PSpecificShapeFunctionHandler<4>::evalBasis(int, double*, double):
✓ Branch 0 taken 21932872 times.
✓ Branch 1 taken 177885594 times.
Bembel::Basis::PSpecificShapeFunctionHandler<5>::evalBasis(int, double*, double):
✓ Branch 0 taken 764 times.
✓ Branch 1 taken 199816024 times.
Bembel::Basis::PSpecificShapeFunctionHandler<6>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<7>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<8>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
Bembel::Basis::PSpecificShapeFunctionHandler<9>::evalBasis(int, double*, double):
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 199816266 times.
3974676652 return p == P ? Bembel::Basis::EvalBernsteinBasis<double, P>(ar, x)
40 3974676652 : PSpecificShapeFunctionHandler<P - 1>::evalBasis(p, ar, x);
41 }
42 3937696693 inline static void evalDerBasis(int p, double* ar, double x) {
43 return p == P
44
39/40
Bembel::Basis::PSpecificShapeFunctionHandler<10>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<11>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<12>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<13>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<14>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<15>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<16>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<17>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<18>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<19>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<1>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 188165494 times.
✗ Branch 1 not taken.
Bembel::Basis::PSpecificShapeFunctionHandler<20>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<2>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 177727132 times.
Bembel::Basis::PSpecificShapeFunctionHandler<3>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 177727132 times.
Bembel::Basis::PSpecificShapeFunctionHandler<4>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 21924335 times.
✓ Branch 1 taken 177727132 times.
Bembel::Basis::PSpecificShapeFunctionHandler<5>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 151 times.
✓ Branch 1 taken 199651437 times.
Bembel::Basis::PSpecificShapeFunctionHandler<6>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<7>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<8>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
Bembel::Basis::PSpecificShapeFunctionHandler<9>::evalDerBasis(int, double*, double):
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 199651558 times.
3937696693 ? Bembel::Basis::EvalBernsteinDerBasis<double, P>(ar, x)
45 3937696693 : PSpecificShapeFunctionHandler<P - 1>::evalDerBasis(p, ar, x);
46 }
47 inline static constexpr funptr_doubleOut_doubleptrDoubleIn ptrEvalCoef(
48 int p) {
49 return p == P ? &Bembel::Basis::EvalBernstein<double, P>
50 : PSpecificShapeFunctionHandler<P - 1>::ptrEvalCoef(p);
51 }
52 inline static constexpr funptr_doubleOut_doubleptrDoubleIn ptrEvalDerCoef(
53 int p) {
54 return p == P ? &Bembel::Basis::EvalBernsteinDer<double, P>
55 : PSpecificShapeFunctionHandler<P - 1>::ptrEvalDerCoef(p);
56 }
57 inline static constexpr funptr_voidOut_doubleptrDoubleIn ptrEvalBasis(int p) {
58 return p == P ? &Bembel::Basis::EvalBernsteinBasis<double, P>
59 : PSpecificShapeFunctionHandler<P - 1>::ptrEvalBasis(p);
60 }
61 inline static constexpr funptr_voidOut_doubleptrDoubleIn ptrEvalDerBasis(
62 int p) {
63 return p == P ? &Bembel::Basis::EvalBernsteinDerBasis<double, P>
64 : PSpecificShapeFunctionHandler<P - 1>::ptrEvalDerBasis(p);
65 }
66 inline static constexpr bool checkP(int p) {
67 static_assert(P > 0, "Polynomial degree must be larger than zero");
68 return p <= Constants::MaxP;
69 }
70 };
71
72 template <>
73 class PSpecificShapeFunctionHandler<0> {
74 public:
75 11 inline static double evalCoef(int p, double* ar, double x) {
76 11 return Bembel::Basis::EvalBernstein<double, 0>(ar, x);
77 }
78 inline static double evalDerCoef(int p, double* ar, double x) {
79 return Bembel::Basis::EvalBernsteinDer<double, 0>(ar, x);
80 }
81 11330670 inline static void evalBasis(int p, double* ar, double x) {
82 11330670 return Bembel::Basis::EvalBernsteinBasis<double, 0>(ar, x);
83 }
84 inline static void evalDerBasis(int p, double* ar, double x) {
85 return Bembel::Basis::EvalBernsteinDerBasis<double, 0>(ar, x);
86 }
87 inline static constexpr funptr_doubleOut_doubleptrDoubleIn ptrEvalCoef(
88 int p) {
89 return &Bembel::Basis::EvalBernstein<double, 0>;
90 }
91 inline static constexpr funptr_doubleOut_doubleptrDoubleIn ptrEvalDerCoef(
92 int p) {
93 return &Bembel::Basis::EvalBernsteinDer<double, 0>;
94 }
95 inline static constexpr funptr_voidOut_doubleptrDoubleIn ptrEvalBasis(int p) {
96 return &Bembel::Basis::EvalBernsteinBasis<double, 0>;
97 }
98 inline static constexpr funptr_voidOut_doubleptrDoubleIn ptrEvalDerBasis(
99 int p) {
100 return &Bembel::Basis::EvalBernsteinDerBasis<double, 0>;
101 }
102 inline static constexpr bool checkP(int p) { return Constants::MaxP >= 0; }
103 };
104
105 using ShapeFunctionHandler = PSpecificShapeFunctionHandler<Constants::MaxP>;
106
107 } // namespace Basis
108 } // namespace Bembel
109 #endif // BEMBEL_SRC_SPLINE_SHAPEFUNCTIONS_HPP_
110