63 lines
1.7 KiB
Plaintext
63 lines
1.7 KiB
Plaintext
/*
|
|
[auto_generated]
|
|
boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp
|
|
|
|
[begin_description]
|
|
Nested parallelized algebra for MPI.
|
|
[end_description]
|
|
|
|
Copyright 2013 Karsten Ahnert
|
|
Copyright 2013 Mario Mulansky
|
|
Copyright 2013 Pascal Germroth
|
|
|
|
Distributed under the Boost Software License, Version 1.0.
|
|
(See accompanying file LICENSE_1_0.txt or
|
|
copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
|
|
|
|
#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_NESTED_ALGEBRA_HPP_INCLUDED
|
|
#define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_NESTED_ALGEBRA_HPP_INCLUDED
|
|
|
|
#include <boost/numeric/odeint/algebra/norm_result_type.hpp>
|
|
#include <boost/numeric/odeint/util/n_ary_helper.hpp>
|
|
|
|
namespace boost {
|
|
namespace numeric {
|
|
namespace odeint {
|
|
|
|
/** \brief MPI-parallelized algebra, wrapping another algebra.
|
|
*/
|
|
template< class InnerAlgebra >
|
|
struct mpi_nested_algebra
|
|
{
|
|
|
|
// execute the InnerAlgebra on each node's local data.
|
|
#define BOOST_ODEINT_GEN_BODY(n) \
|
|
InnerAlgebra::for_each##n( \
|
|
BOOST_PP_ENUM_BINARY_PARAMS(n, s, () BOOST_PP_INTERCEPT) , \
|
|
op \
|
|
);
|
|
BOOST_ODEINT_GEN_FOR_EACH(BOOST_ODEINT_GEN_BODY)
|
|
#undef BOOST_ODEINT_GEN_BODY
|
|
|
|
|
|
template< class NestedState >
|
|
static typename norm_result_type< typename NestedState::value_type >::type norm_inf( const NestedState &s )
|
|
{
|
|
typedef typename norm_result_type< typename NestedState::value_type >::type result_type;
|
|
// local maximum
|
|
result_type value = InnerAlgebra::norm_inf( s() );
|
|
// global maximum
|
|
return boost::mpi::all_reduce(s.world, value, boost::mpi::maximum<result_type>());
|
|
}
|
|
|
|
};
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|