eigen_algebra.hpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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::CwiseBinaryOp<
  25. internal::scalar_sum_op<typename internal::traits<D>::Scalar>,
  26. typename DenseBase<D>::ConstantReturnType,
  27. const D>
  28. operator+(const typename Eigen::MatrixBase<D> &m,
  29. const typename Eigen::internal::traits<D>::Scalar &s) {
  30. return CwiseBinaryOp<
  31. internal::scalar_sum_op<typename internal::traits<D>::Scalar>,
  32. typename DenseBase<D>::ConstantReturnType,
  33. const D>(DenseBase<D>::Constant(m.rows(), m.cols(), s), m.derived());
  34. }
  35. template<typename D>
  36. inline const
  37. typename Eigen::CwiseBinaryOp<
  38. internal::scalar_sum_op<typename internal::traits<D>::Scalar>,
  39. typename DenseBase<D>::ConstantReturnType,
  40. const D>
  41. operator+(const typename Eigen::internal::traits<D>::Scalar &s,
  42. const typename Eigen::MatrixBase<D> &m) {
  43. return CwiseBinaryOp<
  44. internal::scalar_sum_op<typename internal::traits<D>::Scalar>,
  45. typename DenseBase<D>::ConstantReturnType,
  46. const D>(DenseBase<D>::Constant(m.rows(), m.cols(), s), m.derived());
  47. }
  48. template<typename D1,typename D2>
  49. inline const
  50. typename Eigen::CwiseBinaryOp<
  51. typename Eigen::internal::scalar_quotient_op<
  52. typename Eigen::internal::traits<D1>::Scalar>,
  53. const D1, const D2>
  54. operator/(const Eigen::MatrixBase<D1> &x1, const Eigen::MatrixBase<D2> &x2) {
  55. return x1.cwiseQuotient(x2);
  56. }
  57. template< typename D >
  58. inline const
  59. typename Eigen::CwiseUnaryOp<
  60. typename Eigen::internal::scalar_abs_op<
  61. typename Eigen::internal::traits< D >::Scalar > ,
  62. const D >
  63. abs( const Eigen::MatrixBase< D > &m ) {
  64. return m.cwiseAbs();
  65. }
  66. } // end Eigen namespace
  67. namespace boost {
  68. namespace numeric {
  69. namespace odeint {
  70. template<typename B,int S1,int S2,int O, int M1, int M2>
  71. struct vector_space_norm_inf< Eigen::Matrix<B,S1,S2,O,M1,M2> >
  72. {
  73. typedef B result_type;
  74. result_type operator()( const Eigen::Matrix<B,S1,S2,O,M1,M2> &m ) const
  75. {
  76. return m.template lpNorm<Eigen::Infinity>();
  77. }
  78. };
  79. } } } // end boost::numeric::odeint namespace
  80. #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED