25
25
26
26
namespace libMesh
27
27
{
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
+
28
64
#ifdef LIBMESH_HAVE_METAPHYSICL
29
65
30
66
#include " metaphysicl/raw_type.h"
@@ -38,12 +74,12 @@ namespace libMesh
38
74
*/
39
75
template <typename T,
40
76
typename T2,
41
- typename T3 = T ,
77
+ typename T3,
42
78
typename std::enable_if<ScalarTraits<T>::value && ScalarTraits<T2>::value &&
43
79
ScalarTraits<T3>::value,
44
- int >::type = 0 >
80
+ int >::type>
45
81
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)
47
83
{
48
84
return (std::abs (MetaPhysicL::raw_value (var1) - MetaPhysicL::raw_value (var2)) <=
49
85
MetaPhysicL::raw_value (tol));
@@ -90,7 +126,7 @@ relative_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE
90
126
else
91
127
{
92
128
// We dare to dream
93
- mooseAssert (var1.size () == var2.size (), " These must be the same size " );
129
+ libmesh_assert (var1.size () == var2.size ());
94
130
for (const auto i : index_range (var1))
95
131
if (!relative_fuzzy_equal (var1 (i), var2 (i), tol))
96
132
return false ;
@@ -101,21 +137,14 @@ relative_fuzzy_equal(const T & var1, const T2 & var2, const T3 & tol = TOLERANCE
101
137
102
138
#else
103
139
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
- */
111
140
template <typename T,
112
141
typename T2,
113
- typename T3 = T ,
142
+ typename T3,
114
143
typename std::enable_if<ScalarTraits<T>::value && ScalarTraits<T2>::value &&
115
144
ScalarTraits<T3>::value,
116
- int >::type = 0 >
145
+ int >::type>
117
146
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)
119
148
{
120
149
return (std::abs (var1 - var2) <= tol);
121
150
}
0 commit comments