annotate DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_operations.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/compute/compute_operations.hpp
Chris@102 4
Chris@102 5 [begin_description]
Chris@102 6 Operations of Boost.Compute zipped iterators. Is the counterpart of the compute_algebra.
Chris@102 7 [end_description]
Chris@102 8
Chris@102 9 Copyright 2009-2011 Karsten Ahnert
Chris@102 10 Copyright 2009-2011 Mario Mulansky
Chris@102 11
Chris@102 12 Distributed under the Boost Software License, Version 1.0.
Chris@102 13 (See accompanying file LICENSE_1_0.txt or
Chris@102 14 copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@102 15 */
Chris@102 16
Chris@102 17
Chris@102 18 #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_HPP_DEFINED
Chris@102 19 #define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_HPP_DEFINED
Chris@102 20
Chris@102 21 #include <boost/preprocessor/repetition.hpp>
Chris@102 22 #include <boost/compute.hpp>
Chris@102 23
Chris@102 24 namespace boost {
Chris@102 25 namespace numeric {
Chris@102 26 namespace odeint {
Chris@102 27
Chris@102 28 struct compute_operations {
Chris@102 29
Chris@102 30 #define BOOST_ODEINT_COMPUTE_TEMPL_FAC(z, n, unused) \
Chris@102 31 , class Fac ## n = BOOST_PP_CAT(Fac, BOOST_PP_DEC(n))
Chris@102 32
Chris@102 33 #define BOOST_ODEINT_COMPUTE_MEMB_FAC(z, n, unused) \
Chris@102 34 const Fac ## n m_alpha ## n;
Chris@102 35
Chris@102 36 #define BOOST_ODEINT_COMPUTE_PRM_FAC(z, n, unused) \
Chris@102 37 BOOST_PP_COMMA_IF(n) const Fac ## n alpha ## n
Chris@102 38
Chris@102 39 #define BOOST_ODEINT_COMPUTE_INIT_FAC(z, n, unused) \
Chris@102 40 BOOST_PP_COMMA_IF(n) m_alpha ## n (alpha ## n)
Chris@102 41
Chris@102 42 #define BOOST_ODEINT_COMPUTE_PRM_STATE(z, n, unused) \
Chris@102 43 BOOST_PP_COMMA_IF(n) StateType ## n &s ## n
Chris@102 44
Chris@102 45 #define BOOST_ODEINT_COMPUTE_BEGIN_STATE(z, n, unused) \
Chris@102 46 BOOST_PP_COMMA_IF( BOOST_PP_DEC(n) ) s ## n.begin()
Chris@102 47
Chris@102 48 #define BOOST_ODEINT_COMPUTE_END_STATE(z, n, unused) \
Chris@102 49 BOOST_PP_COMMA_IF( BOOST_PP_DEC(n) ) s ## n.end()
Chris@102 50
Chris@102 51 #define BOOST_ODEINT_COMPUTE_LAMBDA(z, n, unused) \
Chris@102 52 BOOST_PP_EXPR_IF(n, +) m_alpha ## n * bc::lambda::get< n >(bc::_1)
Chris@102 53
Chris@102 54 #define BOOST_ODEINT_COMPUTE_OPERATIONS(z, n, unused) \
Chris@102 55 template< \
Chris@102 56 class Fac0 = double \
Chris@102 57 BOOST_PP_REPEAT_FROM_TO(1, n, BOOST_ODEINT_COMPUTE_TEMPL_FAC, ~) \
Chris@102 58 > \
Chris@102 59 struct scale_sum ## n { \
Chris@102 60 BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_MEMB_FAC, ~) \
Chris@102 61 scale_sum ## n( \
Chris@102 62 BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_PRM_FAC, ~) \
Chris@102 63 ) \
Chris@102 64 : BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_INIT_FAC, ~) \
Chris@102 65 { } \
Chris@102 66 template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), class StateType) > \
Chris@102 67 void operator()( \
Chris@102 68 BOOST_PP_REPEAT( \
Chris@102 69 BOOST_PP_INC(n), \
Chris@102 70 BOOST_ODEINT_COMPUTE_PRM_STATE, ~) \
Chris@102 71 ) const \
Chris@102 72 { \
Chris@102 73 namespace bc = boost::compute; \
Chris@102 74 bc::transform( \
Chris@102 75 bc::make_zip_iterator( \
Chris@102 76 boost::make_tuple( \
Chris@102 77 BOOST_PP_REPEAT_FROM_TO( \
Chris@102 78 1, BOOST_PP_INC(n), \
Chris@102 79 BOOST_ODEINT_COMPUTE_BEGIN_STATE, ~) \
Chris@102 80 ) \
Chris@102 81 ), \
Chris@102 82 bc::make_zip_iterator( \
Chris@102 83 boost::make_tuple( \
Chris@102 84 BOOST_PP_REPEAT_FROM_TO( \
Chris@102 85 1, BOOST_PP_INC(n), \
Chris@102 86 BOOST_ODEINT_COMPUTE_END_STATE, ~) \
Chris@102 87 ) \
Chris@102 88 ), \
Chris@102 89 s0.begin(), \
Chris@102 90 BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_LAMBDA, ~) \
Chris@102 91 ); \
Chris@102 92 } \
Chris@102 93 };
Chris@102 94
Chris@102 95 BOOST_PP_REPEAT_FROM_TO(2, 8, BOOST_ODEINT_COMPUTE_OPERATIONS, ~)
Chris@102 96
Chris@102 97 #undef BOOST_ODEINT_COMPUTE_TEMPL_FAC
Chris@102 98 #undef BOOST_ODEINT_COMPUTE_MEMB_FAC
Chris@102 99 #undef BOOST_ODEINT_COMPUTE_PRM_FAC
Chris@102 100 #undef BOOST_ODEINT_COMPUTE_INIT_FAC
Chris@102 101 #undef BOOST_ODEINT_COMPUTE_PRM_STATE
Chris@102 102 #undef BOOST_ODEINT_COMPUTE_BEGIN_STATE
Chris@102 103 #undef BOOST_ODEINT_COMPUTE_END_STATE
Chris@102 104 #undef BOOST_ODEINT_COMPUTE_LAMBDA
Chris@102 105 #undef BOOST_ODEINT_COMPUTE_OPERATIONS
Chris@102 106
Chris@102 107 template<class Fac1 = double, class Fac2 = Fac1>
Chris@102 108 struct scale_sum_swap2 {
Chris@102 109 const Fac1 m_alpha1;
Chris@102 110 const Fac2 m_alpha2;
Chris@102 111
Chris@102 112 scale_sum_swap2(const Fac1 alpha1, const Fac2 alpha2)
Chris@102 113 : m_alpha1(alpha1), m_alpha2(alpha2) { }
Chris@102 114
Chris@102 115 template<class State0, class State1, class State2>
Chris@102 116 void operator()(State0 &s0, State1 &s1, State2 &s2) const {
Chris@102 117 namespace bc = boost::compute;
Chris@102 118
Chris@102 119 bc::command_queue &queue = bc::system::default_queue();
Chris@102 120 const bc::context &context = queue.get_context();
Chris@102 121
Chris@102 122 const char source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(
Chris@102 123 kernel void scale_sum_swap2(
Chris@102 124 F1 a1, F2 a2,
Chris@102 125 global T0 *x0, global T1 *x1, global T2 *x2,
Chris@102 126 )
Chris@102 127 {
Chris@102 128 uint i = get_global_id(0);
Chris@102 129 T0 tmp = x0[i];
Chris@102 130 x0[i] = a1 * x1[i] + a2 * x2[i];
Chris@102 131 x1[i] = tmp;
Chris@102 132 }
Chris@102 133 );
Chris@102 134
Chris@102 135 std::stringstream options;
Chris@102 136 options
Chris@102 137 << " -DT0=" << bc::type_name<typename State0::value_type>()
Chris@102 138 << " -DT1=" << bc::type_name<typename State1::value_type>()
Chris@102 139 << " -DT2=" << bc::type_name<typename State2::value_type>()
Chris@102 140 << " -DF1=" << bc::type_name<Fac1>()
Chris@102 141 << " -DF2=" << bc::type_name<Fac2>();
Chris@102 142
Chris@102 143 bc::program program =
Chris@102 144 bc::program::build_with_source(source, context, options.str());
Chris@102 145
Chris@102 146 bc::kernel kernel(program, "scale_sum_swap2");
Chris@102 147 kernel.set_arg(0, m_alpha1);
Chris@102 148 kernel.set_arg(1, m_alpha2);
Chris@102 149 kernel.set_arg(2, s0.get_buffer());
Chris@102 150 kernel.set_arg(3, s1.get_buffer());
Chris@102 151 kernel.set_arg(4, s2.get_buffer());
Chris@102 152
Chris@102 153 queue.enqueue_1d_range_kernel(kernel, 0, s0.size());
Chris@102 154
Chris@102 155 }
Chris@102 156 };
Chris@102 157
Chris@102 158 template<class Fac1 = double>
Chris@102 159 struct rel_error {
Chris@102 160 const Fac1 m_eps_abs, m_eps_rel, m_a_x, m_a_dxdt;
Chris@102 161
Chris@102 162 rel_error(const Fac1 eps_abs, const Fac1 eps_rel, const Fac1 a_x, const Fac1 a_dxdt)
Chris@102 163 : m_eps_abs(eps_abs), m_eps_rel(eps_rel), m_a_x(a_x), m_a_dxdt(a_dxdt) { }
Chris@102 164
Chris@102 165
Chris@102 166 template <class State0, class State1, class State2>
Chris@102 167 void operator()(State0 &s0, State1 &s1, State2 &s2) const {
Chris@102 168 namespace bc = boost::compute;
Chris@102 169 using bc::_1;
Chris@102 170 using bc::lambda::get;
Chris@102 171
Chris@102 172 bc::for_each(
Chris@102 173 bc::make_zip_iterator(
Chris@102 174 boost::make_tuple(
Chris@102 175 s0.begin(),
Chris@102 176 s1.begin(),
Chris@102 177 s2.begin()
Chris@102 178 )
Chris@102 179 ),
Chris@102 180 bc::make_zip_iterator(
Chris@102 181 boost::make_tuple(
Chris@102 182 s0.end(),
Chris@102 183 s1.end(),
Chris@102 184 s2.end()
Chris@102 185 )
Chris@102 186 ),
Chris@102 187 get<0>(_1) = abs( get<0>(_1) ) /
Chris@102 188 (m_eps_abs + m_eps_rel * (m_a_x * abs(get<1>(_1) + m_a_dxdt * abs(get<2>(_1)))))
Chris@102 189 );
Chris@102 190 }
Chris@102 191 };
Chris@102 192 };
Chris@102 193
Chris@102 194 } // odeint
Chris@102 195 } // numeric
Chris@102 196 } // boost
Chris@102 197
Chris@102 198 #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_HPP_DEFINED