aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/defs.hh
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@cct.lsu.edu>2010-03-18 15:28:39 -0700
committerBarry Wardell <barry.wardell@gmail.com>2011-12-14 16:45:35 +0000
commitb1ca9bb147872979ec3b14a9f5a4b9f23986be4d (patch)
tree23713491fecd4f5fab37a70b025cbc73ea6a6c41 /Carpet/CarpetLib/src/defs.hh
parent264f5a5989293d3b9686516c23596bde64a117f8 (diff)
CarpetLib: Provide good implementations of isnan and friends
Find the system's implementations of isnan etc., and provide them in the CarpetLib::good namespace.
Diffstat (limited to 'Carpet/CarpetLib/src/defs.hh')
-rw-r--r--Carpet/CarpetLib/src/defs.hh247
1 files changed, 246 insertions, 1 deletions
diff --git a/Carpet/CarpetLib/src/defs.hh b/Carpet/CarpetLib/src/defs.hh
index 577f35e6d..d4ff68505 100644
--- a/Carpet/CarpetLib/src/defs.hh
+++ b/Carpet/CarpetLib/src/defs.hh
@@ -209,7 +209,62 @@ inline const char * typestring (const CCTK_COMPLEX32&)
-// Capture the system's isnan function
+// Capture the system's fpclassify, isfinite, isinf, isnan, and
+// isnormal functions
+
+#ifdef HAVE_CCTK_REAL4
+inline int myfpclassify (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+int myfpclassify (CCTK_REAL4 const & x)
+{ return fpclassify (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+inline int myfpclassify (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myfpclassify (CCTK_REAL8 const & x)
+{ return fpclassify (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+inline int myfpclassify (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myfpclassify (CCTK_REAL16 const & x)
+{ return fpclassify (x); }
+#endif
+
+#undef fpclassify
+
+#ifdef HAVE_CCTK_REAL4
+inline int myisfinite (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+int myisfinite (CCTK_REAL4 const & x)
+{ return isfinite (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+inline int myisfinite (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myisfinite (CCTK_REAL8 const & x)
+{ return isfinite (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+inline int myisfinite (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myisfinite (CCTK_REAL16 const & x)
+{ return isfinite (x); }
+#endif
+
+#undef isfinite
+
+#ifdef HAVE_CCTK_REAL4
+inline int myisinf (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+int myisinf (CCTK_REAL4 const & x)
+{ return isinf (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+inline int myisinf (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myisinf (CCTK_REAL8 const & x)
+{ return isinf (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+inline int myisinf (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myisinf (CCTK_REAL16 const & x)
+{ return isinf (x); }
+#endif
+
+#undef isinf
#ifdef HAVE_CCTK_REAL4
inline int myisnan (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
@@ -229,6 +284,24 @@ inline int myisnan (CCTK_REAL16 const & x)
#undef isnan
+#ifdef HAVE_CCTK_REAL4
+inline int myisnormal (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+int myisnormal (CCTK_REAL4 const & x)
+{ return isnormal (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+inline int myisnormal (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myisnormal (CCTK_REAL8 const & x)
+{ return isnormal (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+inline int myisnormal (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+inline int myisnormal (CCTK_REAL16 const & x)
+{ return isnormal (x); }
+#endif
+
+#undef isnormal
+
namespace CarpetLib {
@@ -291,6 +364,135 @@ namespace CarpetLib {
#endif
//
+ // fpclassify
+ //
+
+ // Default implementation, only good for integers
+ template <typename T>
+ inline int fpclassify (T const & x) CCTK_ATTRIBUTE_CONST;
+ template <typename T>
+ inline int fpclassify (T const & x)
+ { return x ? FP_NORMAL : FP_ZERO; }
+
+#ifdef HAVE_CCTK_REAL4
+ template<> inline int fpclassify (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int fpclassify (CCTK_REAL4 const & x)
+ { return myfpclassify (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+ template<> inline int fpclassify (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int fpclassify (CCTK_REAL8 const & x)
+ { return myfpclassify (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+ template<> inline int fpclassify (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int fpclassify (CCTK_REAL16 const & x)
+ { return myfpclassify (x); }
+#endif
+
+#ifdef HAVE_CCTK_COMPLEX8
+ template<> inline int fpclassify (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int fpclassify (CCTK_COMPLEX8 const & x)
+ { assert(0); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+ template<> inline int fpclassify (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int fpclassify (CCTK_COMPLEX16 const & x)
+ { assert(0); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+ template<> inline int fpclassify (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int fpclassify (CCTK_COMPLEX32 const & x)
+ { assert(0); }
+#endif
+
+ //
+ // isfinite
+ //
+
+ // Default implementation, only good for integers
+ template <typename T>
+ inline int isfinite (T const & x) CCTK_ATTRIBUTE_CONST;
+ template <typename T>
+ inline int isfinite (T const & x)
+ { return 1; }
+
+#ifdef HAVE_CCTK_REAL4
+ template<> inline int isfinite (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isfinite (CCTK_REAL4 const & x)
+ { return myisfinite (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+ template<> inline int isfinite (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isfinite (CCTK_REAL8 const & x)
+ { return myisfinite (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+ template<> inline int isfinite (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isfinite (CCTK_REAL16 const & x)
+ { return myisfinite (x); }
+#endif
+
+#ifdef HAVE_CCTK_COMPLEX8
+ template<> inline int isfinite (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isfinite (CCTK_COMPLEX8 const & x)
+ { return myisfinite (CCTK_Cmplx8Real (x)) and myisfinite (CCTK_Cmplx8Imag (x)); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+ template<> inline int isfinite (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isfinite (CCTK_COMPLEX16 const & x)
+ { return myisfinite (CCTK_Cmplx16Real (x)) and myisfinite (CCTK_Cmplx16Imag (x)); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+ template<> inline int isfinite (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isfinite (CCTK_COMPLEX32 const & x)
+ { return myisfinite (CCTK_Cmplx32Real (x)) and myisfinite (CCTK_Cmplx32Imag (x)); }
+#endif
+
+ //
+ // isinf
+ //
+
+ // Default implementation, only good for integers
+ template <typename T>
+ inline int isinf (T const & x) CCTK_ATTRIBUTE_CONST;
+ template <typename T>
+ inline int isinf (T const & x)
+ { return 0; }
+
+#ifdef HAVE_CCTK_REAL4
+ template<> inline int isinf (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isinf (CCTK_REAL4 const & x)
+ { return myisinf (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+ template<> inline int isinf (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isinf (CCTK_REAL8 const & x)
+ { return myisinf (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+ template<> inline int isinf (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isinf (CCTK_REAL16 const & x)
+ { return myisinf (x); }
+#endif
+
+#ifdef HAVE_CCTK_COMPLEX8
+ template<> inline int isinf (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isinf (CCTK_COMPLEX8 const & x)
+ { return myisinf (CCTK_Cmplx8Real (x)) or myisinf (CCTK_Cmplx8Imag (x)); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+ template<> inline int isinf (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isinf (CCTK_COMPLEX16 const & x)
+ { return myisinf (CCTK_Cmplx16Real (x)) or myisinf (CCTK_Cmplx16Imag (x)); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+ template<> inline int isinf (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isinf (CCTK_COMPLEX32 const & x)
+ { return myisinf (CCTK_Cmplx32Real (x)) or myisinf (CCTK_Cmplx32Imag (x)); }
+#endif
+
+ //
// isnan
//
@@ -333,6 +535,49 @@ namespace CarpetLib {
{ return myisnan (CCTK_Cmplx32Real (x)) or myisnan (CCTK_Cmplx32Imag (x)); }
#endif
+ //
+ // isnormal
+ //
+
+ // Default implementation, only good for integers
+ template <typename T>
+ inline int isnormal (T const & x) CCTK_ATTRIBUTE_CONST;
+ template <typename T>
+ inline int isnormal (T const & x)
+ { return 1; }
+
+#ifdef HAVE_CCTK_REAL4
+ template<> inline int isnormal (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnormal (CCTK_REAL4 const & x)
+ { return myisnormal (x); }
+#endif
+#ifdef HAVE_CCTK_REAL8
+ template<> inline int isnormal (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnormal (CCTK_REAL8 const & x)
+ { return myisnormal (x); }
+#endif
+#ifdef HAVE_CCTK_REAL16
+ template<> inline int isnormal (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnormal (CCTK_REAL16 const & x)
+ { return myisnormal (x); }
+#endif
+
+#ifdef HAVE_CCTK_COMPLEX8
+ template<> inline int isnormal (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnormal (CCTK_COMPLEX8 const & x)
+ { return myisnormal (CCTK_Cmplx8Real (x)) and myisnormal (CCTK_Cmplx8Imag (x)); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+ template<> inline int isnormal (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnormal (CCTK_COMPLEX16 const & x)
+ { return myisnormal (CCTK_Cmplx16Real (x)) and myisnormal (CCTK_Cmplx16Imag (x)); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+ template<> inline int isnormal (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnormal (CCTK_COMPLEX32 const & x)
+ { return myisnormal (CCTK_Cmplx32Real (x)) and myisnormal (CCTK_Cmplx32Imag (x)); }
+#endif
+
} // namespace good
} // namespace CarpetLib