Gowdy solver
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
numMethods/dataTypes.h
Go to the documentation of this file.
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 /////////////////////////////////////////////////////////////////////////////////////////