GCC Code Coverage Report


Directory: Bembel/src/
File: Bembel/src/Spline/Knots.hpp
Date: 2024-03-19 14:38:05
Exec Total Coverage
Lines: 30 31 96.8%
Functions: 4 4 100.0%
Branches: 28 32 87.5%

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_SPLINE_KNOTS_HPP_
12 #define BEMBEL_SRC_SPLINE_KNOTS_HPP_
13
14 namespace Bembel {
15 namespace Spl {
16 /**
17 * \ingroup Spline
18 * \brief Here, routines for the creation and processing of knot vectors are
19 * defined.
20 */
21 64188 inline std::vector<double> MakeBezierKnotVector(
22 int polynomial_degree) noexcept {
23 64188 std::vector<double> out;
24 64188 out.reserve(polynomial_degree * 2);
25
2/2
✓ Branch 1 taken 918888 times.
✓ Branch 2 taken 64188 times.
983076 for (int i = 0; i < polynomial_degree; i++) out.push_back(0);
26
2/2
✓ Branch 1 taken 918888 times.
✓ Branch 2 taken 64188 times.
983076 for (int i = 0; i < polynomial_degree; i++) out.push_back(1);
27 64188 return out;
28 }
29
30 inline int GetPolynomialDegreeFromKnotVector(
31 const std::vector<double> &knot_vector) {
32 constexpr double tol = .0000001;
33 int i = 0;
34 const int sz = knot_vector.size();
35 while (++i < sz) {
36 if (knot_vector[i] > tol) {
37 return i;
38 }
39 }
40 return 0;
41 }
42
43 542 inline std::vector<double> MakeUniformKnotVector(int polynomial_degree,
44 int interior,
45 int knotrepetition) noexcept {
46 542 std::vector<double> out;
47 542 const double h = 1. / (interior + 1);
48 542 out.reserve(polynomial_degree * 2);
49
2/2
✓ Branch 1 taken 1662 times.
✓ Branch 2 taken 542 times.
2204 for (int i = 0; i < polynomial_degree; i++) out.push_back(0);
50
2/2
✓ Branch 0 taken 1414 times.
✓ Branch 1 taken 542 times.
1956 for (int i = 1; i < interior + 1; i++)
51
2/2
✓ Branch 1 taken 1534 times.
✓ Branch 2 taken 1414 times.
2948 for (int k = 0; k < knotrepetition; k++) out.push_back(i * h);
52
2/2
✓ Branch 1 taken 1662 times.
✓ Branch 2 taken 542 times.
2204 for (int i = 0; i < polynomial_degree; i++) out.push_back(1);
53 542 return out;
54 }
55
56 inline std::vector<double> MakeUniformKnotVector(int p, int lvl) {
57 return MakeUniformKnotVector(p, lvl, 1);
58 }
59
60 // Chunk knots eats knotvectors and returns knotvectors in which each knot is
61 // unique, up to tolerance tol.
62 180 inline std::vector<double> ExtractUniqueKnotVector(
63 const std::vector<double> &in) {
64 180 constexpr double tol = Bembel::Constants::generic_tolerance;
65 180 std::vector<double> out;
66 180 const int size = in.size();
67 // std::cout<< "chunk " << in[0] <<"\n";
68
1/2
✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
180 out.push_back(in[0]);
69
2/2
✓ Branch 0 taken 1122 times.
✓ Branch 1 taken 180 times.
1302 for (int i = 1; i < size; i++) {
70
3/4
✓ Branch 2 taken 182 times.
✓ Branch 3 taken 940 times.
✓ Branch 6 taken 182 times.
✗ Branch 7 not taken.
1122 if (in[i] > (in[i - 1] + tol)) out.push_back(in[i]);
71 }
72 180 return out;
73 }
74
75 // Up tp tol, fins knot element index for a given x.
76 199811960 inline int FindLocationInKnotVector(const double &x,
77 const std::vector<double> &v) {
78 199811960 constexpr double tol = Bembel::Constants::generic_tolerance;
79 199811960 int size = v.size();
80
3/4
✓ Branch 0 taken 17280 times.
✓ Branch 1 taken 199794680 times.
✓ Branch 2 taken 17280 times.
✗ Branch 3 not taken.
199811960 if (((x - tol) < 0.) && ((x + tol) > 0.)) return 0;
81
2/2
✓ Branch 0 taken 199794680 times.
✓ Branch 1 taken 17684 times.
199812364 for (int i = 0; i < size - 1; i++) {
82
5/6
✓ Branch 1 taken 199794680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 199776996 times.
✓ Branch 5 taken 17684 times.
✓ Branch 6 taken 199776996 times.
✓ Branch 7 taken 17684 times.
199794680 if (v[i] <= x && v[i + 1] > x) return i;
83 }
84 17684 return size - 2;
85 }
86 } // namespace Spl
87 } // namespace Bembel
88 #endif // BEMBEL_SRC_SPLINE_KNOTS_HPP_
89