230 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			230 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |  [auto_generated] | ||
|  |  boost/numeric/odeint/external/gsl/gsl_wrapper.hpp | ||
|  | 
 | ||
|  |  [begin_description] | ||
|  |  Wrapper for gsl_vector. | ||
|  |  [end_description] | ||
|  | 
 | ||
|  |  Copyright 2011-2012 Mario Mulansky | ||
|  |  Copyright 2011 Karsten Ahnert | ||
|  | 
 | ||
|  |  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_GSL_GSL_WRAPPER_HPP_INCLUDED | ||
|  | #define BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <new> | ||
|  | 
 | ||
|  | #include <gsl/gsl_vector.h> | ||
|  | 
 | ||
|  | #include <boost/type_traits/integral_constant.hpp> | ||
|  | #include <boost/range.hpp> | ||
|  | #include <boost/iterator/iterator_facade.hpp> | ||
|  | 
 | ||
|  | 
 | ||
|  | #include <boost/numeric/odeint/util/state_wrapper.hpp> | ||
|  | #include <boost/numeric/odeint/util/is_resizeable.hpp> | ||
|  | #include <boost/numeric/odeint/util/copy.hpp> | ||
|  | 
 | ||
|  | class const_gsl_vector_iterator; | ||
|  | 
 | ||
|  | /* | ||
|  |  * defines an iterator for gsl_vector | ||
|  |  */ | ||
|  | class gsl_vector_iterator : public boost::iterator_facade< gsl_vector_iterator , double , boost::random_access_traversal_tag > | ||
|  | { | ||
|  | public : | ||
|  | 
 | ||
|  |     gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { } | ||
|  |     explicit gsl_vector_iterator( gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { } | ||
|  |     friend gsl_vector_iterator end_iterator( gsl_vector * ); | ||
|  | 
 | ||
|  | private : | ||
|  | 
 | ||
|  |     friend class boost::iterator_core_access; | ||
|  |     friend class const_gsl_vector_iterator; | ||
|  | 
 | ||
|  |     void increment( void ) { m_p += m_stride; } | ||
|  |     void decrement( void ) { m_p -= m_stride; } | ||
|  |     void advance( ptrdiff_t n ) { m_p += n*m_stride; } | ||
|  |     bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } | ||
|  |     bool equal( const const_gsl_vector_iterator &other ) const; | ||
|  |     double& dereference( void ) const { return *m_p; } | ||
|  | 
 | ||
|  |     double *m_p; | ||
|  |     size_t m_stride; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* | ||
|  |  * defines an const iterator for gsl_vector | ||
|  |  */ | ||
|  | class const_gsl_vector_iterator : public boost::iterator_facade< const_gsl_vector_iterator , const double , boost::random_access_traversal_tag > | ||
|  | { | ||
|  | public : | ||
|  | 
 | ||
|  |     const_gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { } | ||
|  |     explicit const_gsl_vector_iterator( const gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { } | ||
|  |     const_gsl_vector_iterator( const gsl_vector_iterator &p ) : m_p( p.m_p ) , m_stride( p.m_stride ) { } | ||
|  | 
 | ||
|  | private : | ||
|  | 
 | ||
|  |     friend class boost::iterator_core_access; | ||
|  |     friend class gsl_vector_iterator; | ||
|  |     friend const_gsl_vector_iterator end_iterator( const gsl_vector * ); | ||
|  | 
 | ||
|  |     void increment( void ) { m_p += m_stride; } | ||
|  |     void decrement( void ) { m_p -= m_stride; } | ||
|  |     void advance( ptrdiff_t n ) { m_p += n*m_stride; } | ||
|  |     bool equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } | ||
|  |     bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } | ||
|  |     const double& dereference( void ) const { return *m_p; } | ||
|  | 
 | ||
|  |     const double *m_p; | ||
|  |     size_t m_stride; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | bool gsl_vector_iterator::equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } | ||
|  | 
 | ||
|  | 
 | ||
|  | gsl_vector_iterator end_iterator( gsl_vector *x ) | ||
|  | { | ||
|  |     gsl_vector_iterator iter( x ); | ||
|  |     iter.m_p += iter.m_stride * x->size; | ||
|  |     return iter; | ||
|  | } | ||
|  | 
 | ||
|  | const_gsl_vector_iterator end_iterator( const gsl_vector *x ) | ||
|  | { | ||
|  |     const_gsl_vector_iterator iter( x ); | ||
|  |     iter.m_p += iter.m_stride * x->size; | ||
|  |     return iter; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  | template<> | ||
|  | struct range_mutable_iterator< gsl_vector* > | ||
|  | { | ||
|  |     typedef gsl_vector_iterator type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> | ||
|  | struct range_const_iterator< gsl_vector* > | ||
|  | { | ||
|  |     typedef const_gsl_vector_iterator type; | ||
|  | }; | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // template<> | ||
|  | inline gsl_vector_iterator range_begin( gsl_vector *x ) | ||
|  | { | ||
|  |     return gsl_vector_iterator( x ); | ||
|  | } | ||
|  | 
 | ||
|  | // template<> | ||
|  | inline const_gsl_vector_iterator range_begin( const gsl_vector *x ) | ||
|  | { | ||
|  |     return const_gsl_vector_iterator( x ); | ||
|  | } | ||
|  | 
 | ||
|  | // template<> | ||
|  | inline gsl_vector_iterator range_end( gsl_vector *x ) | ||
|  | { | ||
|  |     return end_iterator( x ); | ||
|  | } | ||
|  | 
 | ||
|  | // template<> | ||
|  | inline const_gsl_vector_iterator range_end( const gsl_vector *x ) | ||
|  | { | ||
|  |     return end_iterator( x ); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace numeric { | ||
|  | namespace odeint { | ||
|  | 
 | ||
|  | 
 | ||
|  | template<> | ||
|  | struct is_resizeable< gsl_vector* > | ||
|  | { | ||
|  |     //struct type : public boost::true_type { }; | ||
|  |     typedef boost::true_type type; | ||
|  |     const static bool value = type::value; | ||
|  | }; | ||
|  | 
 | ||
|  | template <> | ||
|  | struct same_size_impl< gsl_vector* , gsl_vector* > | ||
|  | { | ||
|  |     static bool same_size( const gsl_vector* x , const gsl_vector* y ) | ||
|  |     { | ||
|  |         return x->size == y->size; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template <> | ||
|  | struct resize_impl< gsl_vector* , gsl_vector* > | ||
|  | { | ||
|  |     static void resize( gsl_vector* &x , const gsl_vector* y ) | ||
|  |     { | ||
|  |         gsl_vector_free( x ); | ||
|  |         x = gsl_vector_alloc( y->size ); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template<> | ||
|  | struct state_wrapper< gsl_vector* > | ||
|  | { | ||
|  |     typedef double value_type; | ||
|  |     typedef gsl_vector* state_type; | ||
|  |     typedef state_wrapper< gsl_vector* > state_wrapper_type; | ||
|  | 
 | ||
|  |     state_type m_v; | ||
|  | 
 | ||
|  |     state_wrapper( ) | ||
|  |     { | ||
|  |         m_v = gsl_vector_alloc( 1 ); | ||
|  |     } | ||
|  | 
 | ||
|  |     state_wrapper( const state_wrapper_type &x ) | ||
|  |     { | ||
|  |         resize( m_v , x.m_v ); | ||
|  |         gsl_vector_memcpy( m_v , x.m_v ); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     ~state_wrapper() | ||
|  |     { | ||
|  |         gsl_vector_free( m_v ); | ||
|  |     } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | } // odeint | ||
|  | } // numeric | ||
|  | } // boost | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED |