![]() |
Gowdy solver
|
00001 /** 00002 * @file dataTypes.h 00003 * @brief Number datatypes Int and Real. 00004 * @author Mikica Kocic 00005 * @copyright GNU General Public License (GPLv3). 00006 */ 00007 00008 ///////////////////////////////////////////////////////////////////////////////////////// 00009 /** @defgroup g1 Number datatypes */ 00010 ///////////////////////////////////////////////////////////////////////////////////////// 00011 /*@{*/ 00012 typedef long Int; 00013 00014 ///////////////////////////////////////////////////////////////////////////////////////// 00015 00016 #ifdef USE_QUADMATH // 128-bit floating point 00017 00018 #include <quadmath.h> 00019 00020 typedef __float128 Real; 00021 00022 #define strToReal strtoflt128 00023 #define Power(v,e) powq(v,e) 00024 #define Sqrt(v) sqrtq(v) 00025 #define sqrt(v) sqrtq(v) 00026 #define round(v) roundq(v) 00027 00028 /** @warning Without std::, abs() is a GCC built-in function, which returns an int. 00029 */ 00030 inline static Real abs( Real v ) { return fabsq(v); } 00031 00032 inline static std::ostream& operator<< ( std::ostream& os, const Real& value ) { 00033 char str[256]; 00034 quadmath_snprintf( str, sizeof(str), "%Qg", value ); 00035 return os << str; 00036 } 00037 00038 inline static void fputReal( FILE* outf, Real value ) { 00039 char str[256]; 00040 quadmath_snprintf( str, 256, "%Qf", value ); 00041 fputs( str, outf ); 00042 } 00043 00044 inline static Real operator ""_q ( const char* str ) { 00045 return strtoflt128( str, NULL ); 00046 } 00047 00048 #else 00049 typedef double Real; 00050 00051 #define strToReal strtod 00052 #define Power(v,e) pow(v,e) 00053 #define Sqrt(v) sqrt(v) 00054 #define Erf(v) erf(v) 00055 #define Tanh(v) tanh(v) 00056 00057 /** @warning Without std::, abs() is a GCC built-in function, which returns an int. 00058 */ 00059 inline static Real abs( Real v ) { return std::fabs(v); } 00060 00061 inline static void fputReal( FILE* outf, Real value ) { 00062 fprintf( outf, "%lf", value ); 00063 } 00064 #endif 00065 00066 00067 const Real TINY_Real = 1e-100; // std::numeric_limits<Real>::min(); 00068 00069 00070 /** Reads an array of real numbers from a string. 00071 */ 00072 static size_t sscanf_Real( const char* line, Real* data, size_t count ) 00073 { 00074 for( size_t i = 0; i < count; ++ i ) 00075 { 00076 char* endPtr = NULL; 00077 data[i] = strToReal( line, &endPtr ); 00078 if( endPtr == line ) return i; 00079 line = endPtr; 00080 } 00081 00082 return count; 00083 } 00084 00085 // static const Real PI = acos(-1.0); 00086 00087 static inline Real pow2 ( Real v ) { return v * v; } 00088 static inline Real pow3 ( Real v ) { return v * v * v; } 00089 static inline Real pow15( Real v ) { return pow( v, 1.5 ); } 00090 /*@}*/ 00091 /////////////////////////////////////////////////////////////////////////////////////////