Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1468055

Browse files
committed
Add fuzzy_equal complex overloads
1 parent edbdf6b commit 1468055

File tree

2 files changed

+49
-14
lines changed

2 files changed

+49
-14
lines changed

include/utils/compare_types.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,12 @@ struct ScalarTraits<MetaPhysicL::DualNumber<T, D, asd>>
279279
{
280280
static const bool value = ScalarTraits<T>::value;
281281
};
282+
template <typename T, typename D, bool asd>
283+
struct RealTraits<MetaPhysicL::DualNumber<T, D, asd>>
284+
{
285+
static const bool value = RealTraits<T>::value;
286+
};
287+
282288
} // namespace libMesh
283289

284290
#endif // LIBMESH_HAVE_METAPHYSICL

include/utils/fuzzy_equal.h

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,42 @@
2525

2626
namespace libMesh
2727
{
28+
/**
29+
* Function to check whether two variables are equal within an absolute tolerance
30+
* @param var1 The first variable to be checked
31+
* @param var2 The second variable to be checked
32+
* @param tol The tolerance to be used
33+
* @return true if var1 and var2 are equal within tol
34+
*/
35+
template <typename T,
36+
typename T2,
37+
typename T3 = T,
38+
typename std::enable_if<ScalarTraits<T>::value && ScalarTraits<T2>::value &&
39+
ScalarTraits<T3>::value,
40+
int>::type = 0>
41+
bool absolute_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE * TOLERANCE);
42+
43+
/**
44+
* Function to check whether both the real and imaginary parts of two complex variables are equal
45+
* within an absolute tolerance
46+
* @param var1 The first complex variable to be checked
47+
* @param var2 The second complex variable to be checked
48+
* @param tol The real tolerance to be used for comparing both real and imgainary parts
49+
* @return true if both real and imginary parts are equal within tol
50+
*/
51+
template <typename T,
52+
typename T2,
53+
typename T3 = T,
54+
typename std::enable_if<ScalarTraits<T3>::value, int>::type = 0>
55+
bool
56+
absolute_fuzzy_equal(const std::complex<T> & var1,
57+
const std::complex<T2> & var2,
58+
const T3 & tol = TOLERANCE * TOLERANCE)
59+
{
60+
return absolute_fuzzy_equal(var1.real(), var2.real(), tol) &&
61+
absolute_fuzzy_equal(var1.imag(), var2.imag(), tol);
62+
}
63+
2864
#ifdef LIBMESH_HAVE_METAPHYSICL
2965

3066
#include "metaphysicl/raw_type.h"
@@ -38,12 +74,12 @@ namespace libMesh
3874
*/
3975
template <typename T,
4076
typename T2,
41-
typename T3 = T,
77+
typename T3,
4278
typename std::enable_if<ScalarTraits<T>::value && ScalarTraits<T2>::value &&
4379
ScalarTraits<T3>::value,
44-
int>::type = 0>
80+
int>::type>
4581
bool
46-
absolute_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE * TOLERANCE)
82+
absolute_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol)
4783
{
4884
return (std::abs(MetaPhysicL::raw_value(var1) - MetaPhysicL::raw_value(var2)) <=
4985
MetaPhysicL::raw_value(tol));
@@ -90,7 +126,7 @@ relative_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE
90126
else
91127
{
92128
// We dare to dream
93-
mooseAssert(var1.size() == var2.size(), "These must be the same size");
129+
libmesh_assert(var1.size() == var2.size());
94130
for (const auto i : index_range(var1))
95131
if (!relative_fuzzy_equal(var1(i), var2(i), tol))
96132
return false;
@@ -101,21 +137,14 @@ relative_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE
101137

102138
#else
103139

104-
/**
105-
* Function to check whether two variables are equal within an absolute tolerance
106-
* @param var1 The first variable to be checked
107-
* @param var2 The second variable to be checked
108-
* @param tol The tolerance to be used
109-
* @return true if var1 and var2 are equal within tol
110-
*/
111140
template <typename T,
112141
typename T2,
113-
typename T3 = T,
142+
typename T3,
114143
typename std::enable_if<ScalarTraits<T>::value && ScalarTraits<T2>::value &&
115144
ScalarTraits<T3>::value,
116-
int>::type = 0>
145+
int>::type>
117146
bool
118-
absolute_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE * TOLERANCE)
147+
absolute_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol)
119148
{
120149
return (std::abs(var1 - var2) <= tol);
121150
}

0 commit comments

Comments
 (0)