Chris@102: /* Chris@102: [auto_generated] Chris@102: boost/numeric/odeint/external/eigen/eigen_algebra.hpp Chris@102: Chris@102: [begin_description] Chris@102: tba. Chris@102: [end_description] Chris@102: Chris@102: Copyright 2013 Christian Shelton Chris@102: Copyright 2013 Karsten Ahnert Chris@102: Chris@102: Distributed under the Boost Software License, Version 1.0. Chris@102: (See accompanying file LICENSE_1_0.txt or Chris@102: copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: */ Chris@102: Chris@102: Chris@102: #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED Chris@102: #define BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: // Necessary routines for Eigen matrices to work with vector_space_algebra Chris@102: // from odeint Chris@102: // (that is, it lets odeint treat the eigen matrices correctly, knowing Chris@102: // how to add, multiply, compute the norm, etc) Chris@102: Chris@102: namespace Eigen { Chris@102: Chris@102: Chris@102: template Chris@102: inline const Chris@102: typename Eigen::CwiseUnaryOp< Chris@102: typename Eigen::internal::scalar_add_op< Chris@102: typename Eigen::internal::traits::Scalar>, Chris@102: const D > Chris@102: operator+(const typename Eigen::MatrixBase &m, Chris@102: const typename Eigen::internal::traits::Scalar &s) { Chris@102: return Eigen::CwiseUnaryOp< Chris@102: typename Eigen::internal::scalar_add_op< Chris@102: typename Eigen::internal::traits::Scalar>, Chris@102: const D >(m.derived(),Eigen::internal::scalar_add_op< Chris@102: typename Eigen::internal::traits::Scalar>(s)); Chris@102: } Chris@102: Chris@102: template Chris@102: inline const Chris@102: typename Eigen::CwiseUnaryOp< Chris@102: typename Eigen::internal::scalar_add_op< Chris@102: typename Eigen::internal::traits::Scalar>, Chris@102: const D > Chris@102: operator+(const typename Eigen::internal::traits::Scalar &s, Chris@102: const typename Eigen::MatrixBase &m) { Chris@102: return Eigen::CwiseUnaryOp< Chris@102: typename Eigen::internal::scalar_add_op< Chris@102: typename Eigen::internal::traits::Scalar>, Chris@102: const D >(m.derived(),Eigen::internal::scalar_add_op< Chris@102: typename Eigen::internal::traits::Scalar>(s)); Chris@102: } Chris@102: Chris@102: Chris@102: Chris@102: template Chris@102: inline const Chris@102: typename Eigen::CwiseBinaryOp< Chris@102: typename Eigen::internal::scalar_quotient_op< Chris@102: typename Eigen::internal::traits::Scalar>, Chris@102: const D1, const D2> Chris@102: operator/(const Eigen::MatrixBase &x1, const Eigen::MatrixBase &x2) { Chris@102: return x1.cwiseQuotient(x2); Chris@102: } Chris@102: Chris@102: Chris@102: template< typename D > Chris@102: inline const Chris@102: typename Eigen::CwiseUnaryOp< Chris@102: typename Eigen::internal::scalar_abs_op< Chris@102: typename Eigen::internal::traits< D >::Scalar > , Chris@102: const D > Chris@102: abs( const Eigen::MatrixBase< D > &m ) { Chris@102: return m.cwiseAbs(); Chris@102: } Chris@102: Chris@102: Chris@102: Chris@102: } // end Eigen namespace Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: namespace boost { Chris@102: namespace numeric { Chris@102: namespace odeint { Chris@102: Chris@102: template Chris@102: struct vector_space_norm_inf< Eigen::Matrix > Chris@102: { Chris@102: typedef B result_type; Chris@102: result_type operator()( const Eigen::Matrix &m ) const Chris@102: { Chris@102: return m.template lpNorm(); Chris@102: } Chris@102: }; Chris@102: Chris@102: } } } // end boost::numeric::odeint namespace Chris@102: Chris@102: #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED