eigen_algebra.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/external/eigen/eigen_algebra.hpp
  4. [begin_description]
  5. tba.
  6. [end_description]
  7. Copyright 2013 Christian Shelton
  8. Copyright 2013 Karsten Ahnert
  9. Distributed under the Boost Software License, Version 1.0.
  10. (See accompanying file LICENSE_1_0.txt or
  11. copy at http://www.boost.org/LICENSE_1_0.txt)
  12. */
  13. #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED
  14. #define BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED
  15. #include <Eigen/Dense>
  16. #include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
  17. // Necessary routines for Eigen matrices to work with vector_space_algebra
  18. // from odeint
  19. // (that is, it lets odeint treat the eigen matrices correctly, knowing
  20. // how to add, multiply, compute the norm, etc)
  21. namespace Eigen {
  22. template<typename D>
  23. inline const
  24. typename Eigen::CwiseUnaryOp<
  25. typename Eigen::internal::scalar_add_op<
  26. typename Eigen::internal::traits<D>::Scalar>,
  27. const D >
  28. operator+(const typename Eigen::MatrixBase<D> &m,
  29. const typename Eigen::internal::traits<D>::Scalar &s) {
  30. return Eigen::CwiseUnaryOp<
  31. typename Eigen::internal::scalar_add_op<
  32. typename Eigen::internal::traits<D>::Scalar>,
  33. const D >(m.derived(),Eigen::internal::scalar_add_op<
  34. typename Eigen::internal::traits<D>::Scalar>(s));
  35. }
  36. template<typename D>
  37. inline const
  38. typename Eigen::CwiseUnaryOp<
  39. typename Eigen::internal::scalar_add_op<
  40. typename Eigen::internal::traits<D>::Scalar>,
  41. const D >
  42. operator+(const typename Eigen::internal::traits<D>::Scalar &s,
  43. const typename Eigen::MatrixBase<D> &m) {
  44. return Eigen::CwiseUnaryOp<
  45. typename Eigen::internal::scalar_add_op<
  46. typename Eigen::internal::traits<D>::Scalar>,
  47. const D >(m.derived(),Eigen::internal::scalar_add_op<
  48. typename Eigen::internal::traits<D>::Scalar>(s));
  49. }
  50. template<typename D1,typename D2>
  51. inline const
  52. typename Eigen::CwiseBinaryOp<
  53. typename Eigen::internal::scalar_quotient_op<
  54. typename Eigen::internal::traits<D1>::Scalar>,
  55. const D1, const D2>
  56. operator/(const Eigen::MatrixBase<D1> &x1, const Eigen::MatrixBase<D2> &x2) {
  57. return x1.cwiseQuotient(x2);
  58. }
  59. template< typename D >
  60. inline const
  61. typename Eigen::CwiseUnaryOp<
  62. typename Eigen::internal::scalar_abs_op<
  63. typename Eigen::internal::traits< D >::Scalar > ,
  64. const D >
  65. abs( const Eigen::MatrixBase< D > &m ) {
  66. return m.cwiseAbs();
  67. }
  68. } // end Eigen namespace
  69. namespace boost {
  70. namespace numeric {
  71. namespace odeint {
  72. template<typename B,int S1,int S2,int O, int M1, int M2>
  73. struct vector_space_norm_inf< Eigen::Matrix<B,S1,S2,O,M1,M2> >
  74. {
  75. typedef B result_type;
  76. result_type operator()( const Eigen::Matrix<B,S1,S2,O,M1,M2> &m ) const
  77. {
  78. return m.template lpNorm<Eigen::Infinity>();
  79. }
  80. };
  81. } } } // end boost::numeric::odeint namespace
  82. #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED