69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |   [auto_generated] | ||
|  |   boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp | ||
|  | 
 | ||
|  |   [begin_description] | ||
|  |   vector_space_norm_inf specialization for vexcl | ||
|  |   [end_description] | ||
|  | 
 | ||
|  |   Copyright 2009-2013 Karsten Ahnert | ||
|  |   Copyright 2009-2013 Mario Mulansky | ||
|  | 
 | ||
|  |   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_VEXCL_VEXCL_NORM_INF_HPP_DEFINED | ||
|  | #define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_NORM_INF_HPP_DEFINED | ||
|  | 
 | ||
|  | #include <map> | ||
|  | #include <algorithm> | ||
|  | 
 | ||
|  | #include <vexcl/vector.hpp> | ||
|  | #include <vexcl/multivector.hpp> | ||
|  | #include <vexcl/reductor.hpp> | ||
|  | 
 | ||
|  | #include <boost/numeric/odeint/algebra/vector_space_algebra.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace numeric { | ||
|  | namespace odeint { | ||
|  | 
 | ||
|  | // specialization for vexcl vector | ||
|  | template <typename T> | ||
|  | struct vector_space_norm_inf< vex::vector<T> > { | ||
|  |     typedef T result_type; | ||
|  | 
 | ||
|  |     T operator()( const vex::vector<T> &x ) const { | ||
|  |         const auto &max = vex::get_reductor<T, vex::MAX>(x.queue_list()); | ||
|  | 
 | ||
|  |         return max( fabs(x) ); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | // specialization for vexcl multivector | ||
|  | template <typename T, size_t N> | ||
|  | struct vector_space_norm_inf< vex::multivector<T, N> > { | ||
|  |     typedef T result_type; | ||
|  | 
 | ||
|  |     T operator()( const vex::multivector<T, N> &x ) const { | ||
|  |         const auto &max = vex::get_reductor<T, vex::MAX>(x.queue_list()); | ||
|  | 
 | ||
|  |         // Reducing a multivector results in std::array<T, N>: | ||
|  |         auto m = max( fabs(x) ); | ||
|  | 
 | ||
|  |         // We will need to reduce it even further: | ||
|  |         return *std::max_element(m.begin(), m.end()); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | } // namespace odeint | ||
|  | } // namespace numeric | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_NORM_INF_HPP_DEFINED |