include/meltpooldg/utilities/utility_functions.hpp Source File

Developer Documentation: include/meltpooldg/utilities/utility_functions.hpp Source File
Developer Documentation
utility_functions.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/config.h>
4
5#include <deal.II/base/exceptions.h>
6#include <deal.II/base/point.h>
7#include <deal.II/base/vectorization.h>
8
9#include <deal.II/fe/mapping.h>
10
11#include <deal.II/grid/grid_tools_geometry.h>
12#include <deal.II/grid/tria.h>
13
14#include <algorithm>
15#include <cmath>
16#include <ios>
17#include <sstream>
18#include <string>
19#include <unordered_set>
20#include <vector>
21
23{
24 template <typename number1, typename number2>
25 void
26 remove_duplicates(std::vector<number1> &a, std::vector<number2> &b)
27 {
28 std::unordered_set<int> seen;
29 auto it_a = a.begin();
30 auto it_b = b.begin();
31
32 while (it_a != a.end())
33 {
34 if (seen.contains(*it_a))
35 {
36 // If element is duplicate, remove it from both vectors
37 it_a = a.erase(it_a);
38 it_b = b.erase(it_b);
39 }
40 else
41 {
42 // If element is not duplicate, mark it as seen and move iterators forward
43 seen.insert(*it_a);
44 ++it_a;
45 ++it_b;
46 }
47 }
48 }
49
50 template <typename T>
51 std::string
52 to_string_with_precision(const T a_value, const int n = 6)
53 {
54 std::ostringstream out;
55 out.precision(n);
56 out << std::scientific << a_value;
57 return out.str();
58 }
59
60 template <typename number>
61 inline dealii::VectorizedArray<number>
62 limit_to_bounds(const dealii::VectorizedArray<number> &in,
63 const number lower_limit,
64 const number upper_limit)
65 {
66 const auto ub = compare_and_apply_mask<dealii::SIMDComparison::greater_than>(in,
67 upper_limit,
68 upper_limit,
69 in);
70 return compare_and_apply_mask<dealii::SIMDComparison::less_than>(ub,
71 lower_limit,
72 lower_limit,
73 ub);
74 }
75
76 template <typename number>
77 inline number
78 limit_to_bounds(const number in, const number lower_limit, const number upper_limit)
79 {
80 const auto ub = in > upper_limit ? upper_limit : in;
81 return ub < lower_limit ? lower_limit : ub;
82 }
83
88 template <typename number>
89 dealii::VectorizedArray<number>
90 is_between(const dealii::VectorizedArray<number> &in,
91 const number lower_limit,
92 const number upper_limit)
93 {
94 return compare_and_apply_mask<dealii::SIMDComparison::less_than>(
95 in,
96 upper_limit,
97 compare_and_apply_mask<dealii::SIMDComparison::greater_than>(in, lower_limit, 1.0, 0.0),
98 0.0);
99 }
100
104 template <typename number>
105 inline int
107 {
108 if (x >= 1e-16) // positive number
109 return std::floor(std::log10(x));
110 else if (x <= 1e-16) // negative number
111 return std::floor(std::log10(std::abs(x)));
112 else // number close to 0
113 return 0;
114 }
115
116 /*
117 * 1d numerical integration of @p vals given at @p points using a trapezoidal rule.
118 */
119 template <int dim, typename number>
120 number
121 integrate_over_line(const std::vector<number> &vals,
122 const std::vector<dealii::Point<dim>> &points)
123 {
124 number result = 0;
125 for (unsigned int i = 0; i < vals.size() - 1; ++i)
126 result += (vals[i] + vals[i + 1]) / 2. * (points[i + 1].distance(points[i]));
127
128 return result;
129 }
130
131 template <int dim, typename number>
132 number
133 compute_numerical_zero_of_norm(const dealii::Triangulation<dim> &triangulation,
134 const dealii::Mapping<dim> &mapping)
135 {
136 return std::min(1e-2,
137 std::max(std::pow(10,
139 dealii::GridTools::volume<dim>(triangulation, mapping),
140 1. / dim))) *
141 1e-3,
142 1e-12));
143 }
144
145 template <int dim, typename ForwardIterator>
146 dealii::Point<dim>
147 to_point(const ForwardIterator begin, const ForwardIterator end)
148 {
149 (void)end;
150 AssertIndexRange(dim, std::distance(begin, end) + 1);
151
152 dealii::Point<dim> point;
153
154 auto it = begin;
155 for (int i = 0; i < dim; ++i)
156 point[i] = *it++;
157
158 return point;
159 }
160
165 template <typename TypeWeight, typename TypeTerm>
166 TypeTerm
168 const TypeTerm &term_a,
169 const TypeWeight &weight_b,
170 const TypeTerm &term_b)
171 {
172 return weight_a * term_a + weight_b * term_b;
173 }
174
183 template <typename number>
184 [[nodiscard]] dealii::VectorizedArray<number>
185 calculate_complementary_error_function_vec(const dealii::VectorizedArray<number> &x)
186 {
187 dealii::VectorizedArray<number> result;
188
189 for (unsigned int i = 0; i < dealii::VectorizedArray<number>::size(); ++i)
190 result[i] = std::erfc(x[i]);
191
192 return result;
193 }
194} // namespace MeltPoolDG::UtilityFunctions
Definition utility_functions.hpp:23
dealii::Point< dim > to_point(const ForwardIterator begin, const ForwardIterator end)
Definition utility_functions.hpp:147
TypeTerm calculate_arithmetic_phase_weighted_average(const TypeWeight &weight_a, const TypeTerm &term_a, const TypeWeight &weight_b, const TypeTerm &term_b)
Definition utility_functions.hpp:167
std::string to_string_with_precision(const T a_value, const int n=6)
Definition utility_functions.hpp:52
dealii::VectorizedArray< number > is_between(const dealii::VectorizedArray< number > &in, const number lower_limit, const number upper_limit)
Definition utility_functions.hpp:90
int get_exponent_power_ten(const number x)
Definition utility_functions.hpp:106
number compute_numerical_zero_of_norm(const dealii::Triangulation< dim > &triangulation, const dealii::Mapping< dim > &mapping)
Definition utility_functions.hpp:133
number integrate_over_line(const std::vector< number > &vals, const std::vector< dealii::Point< dim > > &points)
Definition utility_functions.hpp:121
void remove_duplicates(std::vector< number1 > &a, std::vector< number2 > &b)
Definition utility_functions.hpp:26
dealii::VectorizedArray< number > limit_to_bounds(const dealii::VectorizedArray< number > &in, const number lower_limit, const number upper_limit)
Definition utility_functions.hpp:62
dealii::VectorizedArray< number > calculate_complementary_error_function_vec(const dealii::VectorizedArray< number > &x)
Helper function for the element-wise computation of the complementary error function of a vectorized ...
Definition utility_functions.hpp:185