1#ifndef DUNE_FEM_DOUBLE_HH
2#define DUNE_FEM_DOUBLE_HH
11#include <dune/common/version.hh>
12#include <dune/common/typetraits.hh>
27 template<
class FloatImp >
31 template <
class FloatImp>
34 typedef FlOpSummary< FloatImp > ThisType;
37 ThreadSafeValue< unsigned long > count_;
39 FlOpSummary(
const std::string& name) : name_(name), count_( 0 ) {}
43 unsigned long totalCount = 0;
44 for(
size_t i=0; i<count_.size(); ++i )
46 std::cout << name_ <<
" thread[ " << i <<
" ]: " << count_[ i ] << std::endl;
47 totalCount += count_[ i ];
50 std :: cout <<
"Total number of floating point operations (" << name_ <<
"): "
51 << totalCount << std :: endl;
54 inline void add(
const unsigned long count,
const int thread )
56 count_[ thread ] += count ;
61 static ThisType& instance(
const std::string& name )
63 return Singleton< ThisType >::instance( name );
68 template<
class FloatImp >
75 typedef FlOpCounter< FloatType > ThisType;
83 : count_( 0 ), thread_( MPIManager::thread() )
85 FlOpSummary< FloatImp > :: instance( FloatImp::typeName() ) ;
89 inline ~FlOpCounter ()
91 FlOpSummary< FloatImp > :: instance( FloatImp::typeName() ).add( count_, thread_ );
100 inline ThisType &
operator += (
const unsigned long i )
110 static thread_local ThisType
instance;
120 template<
class FloatImp >
161 static double log (
const Double& v);
163 static double sqrt(
const Double& v);
165 static double cos (
const Double& v);
167 static double sin(
const Double& v);
170 static inline double min (
const Double& v,
const double p);
172 static inline double min (
const double v,
const Double& p);
174 static inline double max (
const Double& v,
const double p);
176 static inline double max (
const double v,
const Double& p);
270 template<
class Traits >
273 template<
class Traits >
277 friend double pow (
const Double& v,
const double p);
285 friend double min(
const Double&,
const double);
286 friend double min(
const double,
const Double&);
287 friend double max(
const Double&,
const double);
288 friend double max(
const double,
const Double&);
290 friend double real(
const std::complex<Double>& );
292 friend double imag(
const std::complex<Double>& );
295#if DUNE_FEM_COMPATIBILITY
296 friend struct XdrIO<
Double >;
308 operator double ()
const
378 ++(FlOpCounterType :: instance());
386 static inline double min (
const Double& v,
const double p)
392 static inline double min (
const double v,
const Double& p)
398 static inline double max (
const Double& v,
const double p)
404 static inline double max (
const double v,
const Double& p)
850 template<
class Traits >
858 template<
class Traits >
859 inline InStreamInterface< Traits > &
878 return std::log(v.
value_);
893 return std::sin(v.
value_);
898 return std::cos(v.
value_);
906 inline double real (
const std::complex<Double>& x)
908 return x.real().value_;
916 inline double imag (
const std::complex<Double>& x)
918 return x.imag().value_;
928 using Fem :: Double ;
931 struct IsNumber< Double > :
public IsNumber< double > {};
932#if DUNE_VERSION_GT(DUNE_COMMON, 2, 6)
934 struct HasNaN < Double > :
public HasNaN < double > {};
983 inline double real (
const complex<Dune::Fem::Double>& x)
995 inline double imag (
const complex<Dune::Fem::Double>& x)
1012 struct numeric_limits<
Dune::Fem::Double >
1014 static const bool is_specialized =
true;
1016 static const int radix = numeric_limits< double > :: radix;
1017 static const int digits = numeric_limits< double > :: digits;
1018 static const int digits10 = numeric_limits< double > :: digits10;
1020 static const bool is_signed = numeric_limits< double > :: is_signed;
1021 static const bool is_integer = numeric_limits< double > :: is_integer;
1022 static const bool is_exact = numeric_limits< double > :: is_exact;
1064 static const int min_exponent = numeric_limits< double > :: min_exponent;
1065 static const int max_exponent = numeric_limits< double > :: max_exponent;
1066 static const int min_exponent10 = numeric_limits< double > :: min_exponent10;
1067 static const int max_exponent10 = numeric_limits< double > :: max_exponent10;
1069 static const bool has_infinity = numeric_limits< double > :: has_infinity;
1070 static const bool has_quiet_NaN = numeric_limits< double > :: has_quiet_NaN;
1071 static const bool has_signaling_NaN = numeric_limits< double > :: has_signaling_NaN;
1072 static const float_denorm_style has_denorm = numeric_limits< double > :: has_denorm;
1073 static const bool has_denorm_loss = numeric_limits< double > :: has_denorm_loss;
1075 static const bool is_iec559 = numeric_limits< double > :: is_iec559;
1076 static const bool is_bounded = numeric_limits< double > :: is_bounded;
1077 static const bool is_modulo = numeric_limits< double > :: is_modulo;
1079 static const bool traps = numeric_limits< double > :: traps;
1080 static const bool tinyness_before = numeric_limits< double > :: tinyness_before;
1081 static const float_round_style round_style
1082 = numeric_limits< double > :: round_style;
1087 struct is_floating_point<
Dune::Fem::Double > :
public is_floating_point< double > {};
bool operator==(const DiscreteFunctionInterface< ImplX > &x, const DiscreteFunctionInterface< ImplY > &y)
Definition: common/discretefunction.hh:1053
bool operator!=(const DiscreteFunctionInterface< ImplX > &x, const DiscreteFunctionInterface< ImplY > &y)
Definition: common/discretefunction.hh:1059
double sqrt(const Dune::Fem::Double &v)
Definition: double.hh:977
Dune::Fem::Double abs(const Dune::Fem::Double &a)
Definition: double.hh:942
double imag(const complex< Dune::Fem::Double > &x)
Definition: double.hh:995
double real(const complex< Dune::Fem::Double > &x)
Definition: double.hh:983
double max(const Dune::Fem::Double &v, const double p)
Definition: double.hh:965
double min(const Dune::Fem::Double &v, const double p)
Definition: double.hh:953
Dune::Fem::Double pow(const Dune::Fem::Double &a, const Dune::Fem::Double &b)
Definition: double.hh:947
Definition: bindguard.hh:11
double imag(const std::complex< Double > &x)
Definition: double.hh:916
OutStreamInterface< StreamTraits > & operator<<(OutStreamInterface< StreamTraits > &out, const DiscreteFunctionInterface< Impl > &df)
write a discrete function into an output stream
Definition: discretefunction_inline.hh:396
Double operator/(const Double &a, const Double &b)
Definition: double.hh:553
bool operator<(const Double &a, const Double &b)
Definition: double.hh:680
double real(const std::complex< Double > &x)
Definition: double.hh:906
double pow(const Double &a, const double b)
Definition: double.hh:881
Double operator*(const Double &a, const Double &b)
Definition: double.hh:506
bool operator<=(const Double &a, const Double &b)
Definition: double.hh:720
static double cos(const Double &v)
Definition: double.hh:896
static double min(const Double &v, const double p)
Definition: double.hh:386
Double abs(const Double &a)
Definition: double.hh:871
static double sqrt(const Double &v)
Definition: double.hh:886
void field_cast(const Double &f1, double &f2)
Definition: double.hh:901
static double sin(const Double &v)
Definition: double.hh:891
bool operator>=(const Double &a, const Double &b)
Definition: double.hh:800
bool operator>(const Double &a, const Double &b)
Definition: double.hh:760
static double log(const Double &v)
Definition: double.hh:876
Double operator+(const Double &a, const Double &b)
Definition: double.hh:412
Double operator-(const Double &a, const Double &b)
Definition: double.hh:459
static double max(const Double &v, const double p)
Definition: double.hh:398
InStreamInterface< StreamTraits > & operator>>(InStreamInterface< StreamTraits > &in, DiscreteFunctionInterface< Impl > &df)
read a discrete function from an input stream
Definition: discretefunction_inline.hh:416
abstract interface for an output stream
Definition: streams.hh:46
abstract interface for an input stream
Definition: streams.hh:179
Definition: double.hh:122
static DUNE_EXPORT ThisType & instance()
Definition: double.hh:145
FlOpCounter()
Definition: double.hh:130
FloatImp FloatType
Definition: double.hh:124
ThisType & operator++()
Definition: double.hh:135
ThisType & operator+=(const unsigned long i)
Definition: double.hh:140
Definition: double.hh:183
friend std::ostream & operator<<(std ::ostream &, const Double &)
Definition: double.hh:840
friend bool operator<=(const Double &, const Double &)
Definition: double.hh:720
friend void field_cast(const Double &, double &)
Definition: double.hh:901
friend bool operator>(const Double &, const Double &)
Definition: double.hh:760
friend double real(const std::complex< Double > &)
Definition: double.hh:906
friend double sin(const Double &v)
Definition: double.hh:891
FlOpCounter< ThisType > FlOpCounterType
Definition: double.hh:302
friend Double operator*(const Double &, const Double &)
Definition: double.hh:506
friend double pow(const Double &v, const double p)
Definition: double.hh:881
friend double sqrt(const Double &v)
Definition: double.hh:886
friend std::istream & operator>>(std ::istream &, Double &)
Definition: double.hh:845
friend double log(const Double &v)
Definition: double.hh:876
friend bool operator>=(const Double &, const Double &)
Definition: double.hh:800
friend double min(const Double &, const double)
Definition: double.hh:386
friend double max(const Double &, const double)
Definition: double.hh:398
friend bool operator!=(const Double &, const Double &)
Definition: double.hh:640
friend Double operator+(const Double &, const Double &)
Definition: double.hh:412
Double(const double value)
Definition: double.hh:321
Double()
Definition: double.hh:313
friend Double operator-(const Double &, const Double &)
Definition: double.hh:459
double value_
Definition: double.hh:305
ThisType & operator/=(const ThisType other)
Definition: double.hh:357
ThisType & operator-=(const ThisType other)
Definition: double.hh:343
Double(const ThisType &other)
Definition: double.hh:325
friend bool operator==(const Double &, const Double &)
Definition: double.hh:600
friend Double abs(const Double &)
Definition: double.hh:871
friend Double operator/(const Double &, const Double &)
Definition: double.hh:553
friend bool operator<(const Double &, const Double &)
Definition: double.hh:680
ThisType & operator*=(const ThisType other)
Definition: double.hh:350
ThisType & operator+=(const ThisType other)
Definition: double.hh:336
static void flOp()
Definition: double.hh:376
static std::string typeName()
Definition: double.hh:370
friend double cos(const Double &v)
Definition: double.hh:896
friend double imag(const std::complex< Double > &)
Definition: double.hh:916
ThisType & operator=(const ThisType other)
Definition: double.hh:329
static Dune::Fem::Double quiet_NaN()
Definition: double.hh:1049
static Dune::Fem::Double signaling_NaN()
Definition: double.hh:1054
static Dune::Fem::Double max()
Definition: double.hh:1029
static Dune::Fem::Double infinity()
Definition: double.hh:1044
static Dune::Fem::Double min()
Definition: double.hh:1024
static Dune::Fem::Double denorm_min()
Definition: double.hh:1059
static Dune::Fem::Double epsilon()
Definition: double.hh:1034
static Dune::Fem::Double round_error()
Definition: double.hh:1039
return singleton instance of given Object type.
Definition: singleton.hh:88
static DUNE_EXPORT Object & instance(Args &&... args)
return singleton instance of given Object type.
Definition: singleton.hh:118