annotate DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_state.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 /*
Chris@102 2 [auto_generated]
Chris@102 3 boost/numeric/odeint/external/mpi/mpi_state.hpp
Chris@102 4
Chris@102 5 [begin_description]
Chris@102 6 A generic split state, storing partial data on each node.
Chris@102 7 [end_description]
Chris@102 8
Chris@102 9 Copyright 2013 Karsten Ahnert
Chris@102 10 Copyright 2013 Mario Mulansky
Chris@102 11 Copyright 2013 Pascal Germroth
Chris@102 12
Chris@102 13 Distributed under the Boost Software License, Version 1.0.
Chris@102 14 (See accompanying file LICENSE_1_0.txt or
Chris@102 15 copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@102 16 */
Chris@102 17
Chris@102 18
Chris@102 19 #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_STATE_HPP_INCLUDED
Chris@102 20 #define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_STATE_HPP_INCLUDED
Chris@102 21
Chris@102 22 #include <vector>
Chris@102 23 #include <algorithm>
Chris@102 24 #include <boost/mpi.hpp>
Chris@102 25 #include <boost/numeric/odeint/util/copy.hpp>
Chris@102 26 #include <boost/numeric/odeint/util/split.hpp>
Chris@102 27 #include <boost/numeric/odeint/util/resize.hpp>
Chris@102 28 #include <boost/numeric/odeint/util/same_size.hpp>
Chris@102 29 #include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
Chris@102 30 #include <boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp>
Chris@102 31
Chris@102 32 namespace boost {
Chris@102 33 namespace numeric {
Chris@102 34 namespace odeint {
Chris@102 35
Chris@102 36 /** \brief A container which has its contents distributed among the nodes.
Chris@102 37 */
Chris@102 38 template< class InnerState >
Chris@102 39 struct mpi_state
Chris@102 40 {
Chris@102 41 typedef InnerState value_type;
Chris@102 42
Chris@102 43 // the node's local data.
Chris@102 44 InnerState m_data;
Chris@102 45
Chris@102 46 boost::mpi::communicator world;
Chris@102 47
Chris@102 48 mpi_state() {}
Chris@102 49 mpi_state(boost::mpi::communicator comm) : world(comm) {}
Chris@102 50
Chris@102 51 inline InnerState &operator()() { return m_data; }
Chris@102 52 inline const InnerState &operator()() const { return m_data; }
Chris@102 53 };
Chris@102 54
Chris@102 55
Chris@102 56
Chris@102 57
Chris@102 58 template< class InnerState >
Chris@102 59 struct is_resizeable< mpi_state< InnerState > >
Chris@102 60 : is_resizeable< InnerState > { };
Chris@102 61
Chris@102 62
Chris@102 63 template< class InnerState1 , class InnerState2 >
Chris@102 64 struct same_size_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > >
Chris@102 65 {
Chris@102 66 static bool same_size( const mpi_state< InnerState1 > &x , const mpi_state< InnerState2 > &y )
Chris@102 67 {
Chris@102 68 const bool local = boost::numeric::odeint::same_size(x(), y());
Chris@102 69 return boost::mpi::all_reduce(x.world, local, mpi::bitwise_and<bool>());
Chris@102 70 }
Chris@102 71 };
Chris@102 72
Chris@102 73
Chris@102 74 template< class InnerState1 , class InnerState2 >
Chris@102 75 struct resize_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > >
Chris@102 76 {
Chris@102 77 static void resize( mpi_state< InnerState1 > &x , const mpi_state< InnerState2 > &y )
Chris@102 78 {
Chris@102 79 // resize local parts on each node.
Chris@102 80 boost::numeric::odeint::resize(x(), y());
Chris@102 81 }
Chris@102 82 };
Chris@102 83
Chris@102 84
Chris@102 85 /** \brief Copy data between mpi_states of same size. */
Chris@102 86 template< class InnerState1 , class InnerState2 >
Chris@102 87 struct copy_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > >
Chris@102 88 {
Chris@102 89 static void copy( const mpi_state< InnerState1 > &from , mpi_state< InnerState2 > &to )
Chris@102 90 {
Chris@102 91 // copy local parts on each node.
Chris@102 92 boost::numeric::odeint::copy(from(), to());
Chris@102 93 }
Chris@102 94 };
Chris@102 95
Chris@102 96
Chris@102 97
Chris@102 98 /** \brief Use `mpi_algebra` for `mpi_state`. */
Chris@102 99 template< class InnerState >
Chris@102 100 struct algebra_dispatcher< mpi_state< InnerState > >
Chris@102 101 {
Chris@102 102 typedef mpi_nested_algebra<
Chris@102 103 typename algebra_dispatcher< InnerState >::algebra_type
Chris@102 104 > algebra_type;
Chris@102 105 };
Chris@102 106
Chris@102 107
Chris@102 108 }
Chris@102 109 }
Chris@102 110 }
Chris@102 111
Chris@102 112
Chris@102 113 #endif