OGS
Subdivision.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "Subdivision.h"
5
6#include <algorithm>
7#include <cmath>
8
9#include "BaseLib/Error.h"
10
11namespace BaseLib
12{
14 const double dL0,
15 const double max_dL,
16 const double multiplier)
17 : length_(L), dL0_(dL0), max_dL_(max_dL), multiplier_(multiplier)
18{
19 // Check if accumulated subdivisions can ever sum up to length.
20 // Cf. geometric series formula.
21 if (multiplier < 1.0 && dL0 / (1.0 - multiplier) < L)
22 {
24 "Using dL0={:g} and multiplier={:g} the generated subdivisions can "
25 "not sum up to a total length of {:g}.",
26 dL0,
27 multiplier,
28 L);
29 }
30}
31
32std::vector<double> GradualSubdivision::operator()() const
33{
34 std::vector<double> vec_x;
35
36 double x = 0;
37 unsigned i = 0;
38 do
39 {
40 vec_x.push_back(x);
41 x += std::min(max_dL_,
42 dL0_ * std::pow(multiplier_, static_cast<double>(i)));
43 i++;
44 } while (x < length_);
45
46 if (vec_x.back() < length_)
47 {
48 double last_dx = vec_x[vec_x.size() - 1] - vec_x[vec_x.size() - 2];
49 if (length_ - vec_x.back() < last_dx)
50 {
51 vec_x[vec_x.size() - 1] = length_;
52 }
53 else
54 {
55 vec_x.push_back(length_);
56 }
57 }
58 return vec_x;
59}
60
62 const double L, const std::size_t num_subdivisions, const double multiplier)
63 : length_{L}, num_subdivisions_{num_subdivisions}, multiplier_{multiplier}
64{
65}
66
67std::vector<double> GradualSubdivisionFixedNum::operator()() const
68{
69 std::vector<double> subdivisions;
70 subdivisions.reserve(num_subdivisions_ + 1);
71 subdivisions.push_back(0.0);
72 auto const q = multiplier_;
73
74 if (q == 1.0)
75 {
76 double const dx = length_ / num_subdivisions_;
77
78 for (std::size_t i = 1; i < num_subdivisions_; ++i)
79 {
80 subdivisions.push_back(dx * i);
81 }
82 }
83 else
84 {
85 // compute initial subdivision size
86 auto const a =
87 length_ * (q - 1.0) / (std::pow(q, num_subdivisions_) - 1.0);
88
89 double qi = q; // q^i
90 for (std::size_t i = 1; i < num_subdivisions_; ++i)
91 {
92 subdivisions.push_back(a * (qi - 1.0) / (q - 1.0));
93 qi *= q;
94 }
95 }
96
97 subdivisions.push_back(length_);
98
99 return subdivisions;
100}
101
102} // namespace BaseLib
#define OGS_FATAL(...)
Definition Error.h:19
GradualSubdivisionFixedNum(const double L, const std::size_t num_subdivisions, const double multiplier)
std::vector< double > operator()() const override
Returns a vector of subdivided points.
GradualSubdivision(const double L, const double dL0, const double max_dL, const double multiplier)
std::vector< double > operator()() const override
Returns a vector of subdivided points.