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
							 |