Skip to content
Snippets Groups Projects
math.hh 2.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • // -*- 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
    
    
    Oliver Sander's avatar
    Oliver Sander committed
    /** \file
     * \brief Some useful basic math stuff
     */
    
    
    #include <complex>
    
      /**
         \brief Provides commonly used mathematical constants.
    
    
    Oliver Sander's avatar
    Oliver Sander committed
         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.
    
    Oliver Sander's avatar
    Oliver Sander committed
         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);
      }