ug4
Loading...
Searching...
No Matches
number_util.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013-2015: G-CSC, Goethe University Frankfurt
3 * Author: Martin Rupp
4 *
5 * This file is part of UG4.
6 *
7 * UG4 is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License version 3 (as published by the
9 * Free Software Foundation) with the following additional attribution
10 * requirements (according to LGPL/GPL v3 §7):
11 *
12 * (1) The following notice must be displayed in the Appropriate Legal Notices
13 * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 *
15 * (2) The following notice must be displayed at a prominent place in the
16 * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 *
18 * (3) The following bibliography is recommended for citation and must be
19 * preserved in all covered files:
20 * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 * parallel geometric multigrid solver on hierarchically distributed grids.
22 * Computing and visualization in science 16, 4 (2013), 151-164"
23 * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 * flexible software system for simulating pde based models on high performance
25 * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 *
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU Lesser General Public License for more details.
31 */
32
33#ifndef NUMBER_UTIL_H_
34#define NUMBER_UTIL_H_
35
36#include "common/math/ugmath.h"
37namespace ug{
38extern bool g_bNoNANCheck;
39inline bool IsFiniteAndNotTooBig(double d)
40{
41 const double tooBigValue = 1e30;
42 if(d > tooBigValue || d < -tooBigValue || std::isfinite(d) == false)
43// if(std::isfinite(d) == false)
44 return false;
45 return true;
46}
47
48inline bool CloseToZero(double d)
49{
50 if(d > -1e-100 && d < +1e-100)
51 return true;
52 else
53 return false;
54}
55
56//inline bool IsFiniteAndNotTooBig(float d)
57//{
58// return IsFiniteAndNotTooBig((double) d);
59//}
60
61
62template <std::size_t N, std::size_t M, typename T>
64{
65 for(size_t r=0; r<m.num_rows(); r++)
66 for(size_t c=0; c<m.num_cols(); c++)
67 if(IsFiniteAndNotTooBig(m(r,c)) == false) return false;
68 return true;
69}
70
71template <std::size_t N, typename T>
73{
74 for(size_t r=0; r<m.size(); r++)
75 if(IsFiniteAndNotTooBig(m[r]) == false) return false;
76 return true;
77}
78
79
80
81template <size_t TRank, size_t N, typename T>
83{
84 for(size_t i=0; i<t.size(); i++)
85 if(IsFiniteAndNotTooBig(t[i]) == false) return false;
86
87 return true;
88}
89
90
91template<typename TData, size_t N>
93{
94 for(size_t i=0; i<t.size(); i++)
95 if(IsFiniteAndNotTooBig(t[i]) == false) return false;
96
97 return true;
98}
99
100template<typename TData>
101inline bool IsFiniteAndNotTooBig(const std::vector<TData> &t)
102{
103 for(size_t i=0; i<t.size(); i++)
104 if(IsFiniteAndNotTooBig(t[i]) == false) return false;
105
106 return true;
107}
108
109template<typename T>
110inline bool IsVectorFiniteAndNotTooBig(const T &t)
111{
112 for(size_t i=0; i<t.size(); i++)
113 if(IsFiniteAndNotTooBig(t[i]) == false) return false;
114
115 return true;
116}
117
118
119template<typename T>
120inline bool WarnIfIsVectorNanOrTooBig(const T &t, const char *callerName)
121{
122 if(g_bNoNANCheck) return true;
123 size_t iFirst, iCount=0;
124 for(size_t i=0; i<t.size(); i++)
125 if(IsFiniteAndNotTooBig(t[i]) == false)
126 {
127 if(iCount == 0) iFirst = i;
128 iCount++;
129 }
130
131 if(iCount > 0)
132 {
133 UG_LOG("WARNING in " << callerName << ": " << iFirst << " nan or too big (" << t[iFirst] << "). ");
134 if(iCount > 1)
135 { UG_LOG(iCount-1 << " more.");}
136 UG_LOG("\n");
137 return false;
138 }
139 return true;
140}
141
142
143template<typename T>
144inline bool ThrowIfIsVectorNanOrTooBig(const T &t, const char *callerName)
145{
146 if(g_bNoNANCheck) return true;
147 size_t iFirst, iCount=0;
148 for(size_t i=0; i<t.size(); i++)
149 if(IsFiniteAndNotTooBig(t[i]) == false)
150 {
151 if(iCount == 0) iFirst = i;
152 iCount++;
153 }
154
155 if(iCount > 0)
156 {
157 UG_THROW("In " << callerName << ": " << iFirst << " nan or too big (" << t[iFirst] << "). "
158 << iCount-1 << " more.");
159 return false;
160 }
161
162 return true;
163}
164
165}
166
167
168#endif /* NUMBER_UTIL_H_ */
A class for fixed size, dense matrices.
Definition math_matrix.h:63
std::size_t num_cols() const
Definition math_matrix.h:216
std::size_t num_rows() const
Definition math_matrix.h:215
a mathematical Tensor of rank TRank and N entries.
Definition math_tensor.h:56
size_t size() const
Definition math_tensor.h:81
Definition math_tensor.h:160
size_t size() const
Definition math_tensor.h:185
a mathematical Vector with N entries.
Definition math_vector.h:97
std::size_t size() const
Definition math_vector.h:139
#define UG_THROW(msg)
Definition error.h:57
#define UG_LOG(msg)
Definition log.h:367
the ug namespace
bool g_bNoNANCheck
Definition number_util.cpp:36
bool WarnIfIsVectorNanOrTooBig(const T &t, const char *callerName)
Definition number_util.h:120
bool CloseToZero(double d)
Definition number_util.h:48
bool IsFiniteAndNotTooBig(double d)
Definition number_util.h:39
bool ThrowIfIsVectorNanOrTooBig(const T &t, const char *callerName)
Definition number_util.h:144
bool IsVectorFiniteAndNotTooBig(const T &t)
Definition number_util.h:110