// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- // vi: set et ts=4 sw=2 sts=2: #ifndef DUNE_MATH_HH #define DUNE_MATH_HH /** \file * \brief Some useful basic math stuff */ #include <cmath> #include <complex> namespace Dune { /** \brief Provides commonly used mathematical constants. a struct that is specialized for types repesenting real or complex numbers. I provides commonly used mathematical constants with the required accuary for the specified type. */ template< class Field > struct MathematicalConstants; /** \brief Standard implementation of MathematicalConstants. This implementation will work with all built-in floating point types. It provides * e as std::exp(1.0) * pi as std::acos(-1.0) */ template< class T > struct StandardMathematicalConstants { static T e () { static const T e = std::exp( T( 1 ) ); return e; } static T pi () { static const T pi = std::acos( T( -1 ) ); return pi; } }; #ifndef DOXYGEN // MathematicalConstants for float // ------------------------------- template<> struct MathematicalConstants< float > : public StandardMathematicalConstants< float > {}; // MathematicalConstants for double // -------------------------------- template<> struct MathematicalConstants< double > : public StandardMathematicalConstants< double > {}; // MathematicalConstants for long double // ------------------------------------- template<> struct MathematicalConstants< long double > : public StandardMathematicalConstants< long double > {}; #endif // DOXYGEN //! Calculates the factorial of m at compile time template <int m> struct Factorial { //! factorial stores m! enum { factorial = m * Factorial<m-1>::factorial }; }; //! end of recursion of factorial via specialization template <> struct Factorial<0> { // 0! = 1 enum { factorial = 1 }; }; //! compute conjugate complex of x // conjugate complex does nothing for non-complex types template<class K> inline K conjugateComplex (const K& x) { return x; } #ifndef DOXYGEN // specialization for complex template<class K> inline std::complex<K> conjugateComplex (const std::complex<K>& c) { return std::complex<K>(c.real(),-c.imag()); } #endif //! Return the sign of the value template <class T> int sign(const T& val) { return (val < 0 ? -1 : 1); } } #endif // #ifndef DUNE_MATH_HH