Chris@102: /* Chris@102: [auto_generated] Chris@102: boost/numeric/odeint/external/mpi/mpi_state.hpp Chris@102: Chris@102: [begin_description] Chris@102: A generic split state, storing partial data on each node. Chris@102: [end_description] Chris@102: Chris@102: Copyright 2013 Karsten Ahnert Chris@102: Copyright 2013 Mario Mulansky Chris@102: Copyright 2013 Pascal Germroth 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_MPI_MPI_STATE_HPP_INCLUDED Chris@102: #define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_STATE_HPP_INCLUDED Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace numeric { Chris@102: namespace odeint { Chris@102: Chris@102: /** \brief A container which has its contents distributed among the nodes. Chris@102: */ Chris@102: template< class InnerState > Chris@102: struct mpi_state Chris@102: { Chris@102: typedef InnerState value_type; Chris@102: Chris@102: // the node's local data. Chris@102: InnerState m_data; Chris@102: Chris@102: boost::mpi::communicator world; Chris@102: Chris@102: mpi_state() {} Chris@102: mpi_state(boost::mpi::communicator comm) : world(comm) {} Chris@102: Chris@102: inline InnerState &operator()() { return m_data; } Chris@102: inline const InnerState &operator()() const { return m_data; } Chris@102: }; Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: template< class InnerState > Chris@102: struct is_resizeable< mpi_state< InnerState > > Chris@102: : is_resizeable< InnerState > { }; Chris@102: Chris@102: Chris@102: template< class InnerState1 , class InnerState2 > Chris@102: struct same_size_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > > Chris@102: { Chris@102: static bool same_size( const mpi_state< InnerState1 > &x , const mpi_state< InnerState2 > &y ) Chris@102: { Chris@102: const bool local = boost::numeric::odeint::same_size(x(), y()); Chris@102: return boost::mpi::all_reduce(x.world, local, mpi::bitwise_and()); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template< class InnerState1 , class InnerState2 > Chris@102: struct resize_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > > Chris@102: { Chris@102: static void resize( mpi_state< InnerState1 > &x , const mpi_state< InnerState2 > &y ) Chris@102: { Chris@102: // resize local parts on each node. Chris@102: boost::numeric::odeint::resize(x(), y()); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: /** \brief Copy data between mpi_states of same size. */ Chris@102: template< class InnerState1 , class InnerState2 > Chris@102: struct copy_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > > Chris@102: { Chris@102: static void copy( const mpi_state< InnerState1 > &from , mpi_state< InnerState2 > &to ) Chris@102: { Chris@102: // copy local parts on each node. Chris@102: boost::numeric::odeint::copy(from(), to()); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: Chris@102: /** \brief Use `mpi_algebra` for `mpi_state`. */ Chris@102: template< class InnerState > Chris@102: struct algebra_dispatcher< mpi_state< InnerState > > Chris@102: { Chris@102: typedef mpi_nested_algebra< Chris@102: typename algebra_dispatcher< InnerState >::algebra_type Chris@102: > algebra_type; Chris@102: }; Chris@102: Chris@102: Chris@102: } Chris@102: } Chris@102: } Chris@102: Chris@102: Chris@102: #endif