1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Using boost::range</title> 5<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../index.html" title="Chapter 1. Boost.Numeric.Odeint"> 8<link rel="up" href="../odeint_in_detail.html" title="odeint in detail"> 9<link rel="prev" href="using_boost__ref.html" title="Using boost::ref"> 10<link rel="next" href="binding_member_functions.html" title="Binding member functions"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../logo.jpg"></td> 15<td align="center"><a href="../../../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="using_boost__ref.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../odeint_in_detail.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_member_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h3 class="title"> 27<a name="boost_numeric_odeint.odeint_in_detail.using_boost__range"></a><a class="link" href="using_boost__range.html" title="Using boost::range">Using 28 boost::range</a> 29</h3></div></div></div> 30<p> 31 Most steppers in odeint also accept the state give as a range. A range is 32 sequence of values modeled by a range concept. See <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a> 33 for an overview over existing concepts and examples of ranges. This means 34 that the <code class="computeroutput"><span class="identifier">state_type</span></code> of the 35 stepper need not necessarily be used to call the <code class="computeroutput"><span class="identifier">do_step</span></code> 36 method. 37 </p> 38<p> 39 One use-case for <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a> 40 in odeint has been shown in <a class="link" href="../tutorial/chaotic_systems_and_lyapunov_exponents.html" title="Chaotic systems and Lyapunov exponents">Chaotic 41 System</a> where the state consists of two parts: one for the original 42 system and one for the perturbations. The ranges are used to initialize (solve) 43 only the system part where the perturbation part is not touched, that is 44 a range consisting only of the system part is used. After that the complete 45 state including the perturbations is solved. 46 </p> 47<p> 48 Another use case is a system consisting of coupled units where you want to 49 initialize each unit separately with the ODE of the uncoupled unit. An example 50 is a chain of coupled van-der-Pol-oscillators which are initialized uniformly 51 from the uncoupled van-der-Pol-oscillator. Then you can use <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a> 52 to solve only one individual oscillator in the chain. 53 </p> 54<p> 55 In short, you can <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a> 56 to use one state within two system functions which expect states with different 57 sizes. 58 </p> 59<p> 60 An example was given in the <a class="link" href="../tutorial/chaotic_systems_and_lyapunov_exponents.html" title="Chaotic systems and Lyapunov exponents">Chaotic 61 System</a> tutorial. Using Boost.Range usually means that your system 62 function needs to adapt to the iterators of Boost.Range. That is, your function 63 is called with a range and you need to get the iterators from that range. 64 This can easily be done. You have to implement your system as a class or 65 a struct and you have to templatize the <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>. Then you can use the <code class="computeroutput"><span class="identifier">range_iterator</span></code>-meta 66 function and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span></code> and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">end</span></code> to 67 obtain the iterators of your range: 68 </p> 69<p> 70</p> 71<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">sys</span> 72<span class="special">{</span> 73 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">State</span> <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Deriv</span> <span class="special">></span> 74 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">State</span> <span class="special">&</span><span class="identifier">x_</span> <span class="special">,</span> <span class="identifier">Deriv</span> <span class="special">&</span><span class="identifier">dxdt_</span> <span class="special">,</span> <span class="keyword">double</span> <span class="identifier">t</span> <span class="special">)</span> <span class="keyword">const</span> 75 <span class="special">{</span> 76 <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_iterator</span><span class="special"><</span> <span class="keyword">const</span> <span class="identifier">State</span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span> <span class="identifier">x_</span> <span class="special">);</span> 77 <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_iterator</span><span class="special"><</span> <span class="identifier">Deriv</span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">dxdt</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span> <span class="identifier">dxdt_</span> <span class="special">);</span> 78 79 <span class="comment">// fill dxdt</span> 80 <span class="special">}</span> 81<span class="special">};</span> 82</pre> 83<p> 84 </p> 85<p> 86 If your range is a random access-range you can also apply the bracket operator 87 to the iterator to access the elements in the range: 88</p> 89<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">sys</span> 90<span class="special">{</span> 91 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">State</span> <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Deriv</span> <span class="special">></span> 92 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">State</span> <span class="special">&</span><span class="identifier">x_</span> <span class="special">,</span> <span class="identifier">Deriv</span> <span class="special">&</span><span class="identifier">dxdt_</span> <span class="special">,</span> <span class="keyword">double</span> <span class="identifier">t</span> <span class="special">)</span> <span class="keyword">const</span> 93 <span class="special">{</span> 94 <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_iterator</span><span class="special"><</span> <span class="keyword">const</span> <span class="identifier">State</span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span> <span class="identifier">x_</span> <span class="special">);</span> 95 <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_iterator</span><span class="special"><</span> <span class="identifier">Deriv</span> <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">dxdt</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span> <span class="identifier">dxdt_</span> <span class="special">);</span> 96 97 <span class="identifier">dxdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">f1</span><span class="special">(</span> <span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">,</span> <span class="identifier">x</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">);</span> 98 <span class="identifier">dxdt</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">f2</span><span class="special">(</span> <span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">,</span> <span class="identifier">x</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">);</span> 99 <span class="special">}</span> 100<span class="special">};</span> 101</pre> 102<p> 103 </p> 104<p> 105 The following two tables show which steppers and which algebras are compatible 106 with <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>. 107 </p> 108<div class="table"> 109<a name="boost_numeric_odeint.odeint_in_detail.using_boost__range.steppers_supporting_boost_range"></a><p class="title"><b>Table 1.9. Steppers supporting Boost.Range</b></p> 110<div class="table-contents"><table class="table" summary="Steppers supporting Boost.Range"> 111<colgroup><col></colgroup> 112<thead><tr><th> 113 <p> 114 Stepper 115 </p> 116 </th></tr></thead> 117<tbody> 118<tr><td> 119 <p> 120 adams_bashforth_moulton 121 </p> 122 </td></tr> 123<tr><td> 124 <p> 125 bulirsch_stoer_dense_out 126 </p> 127 </td></tr> 128<tr><td> 129 <p> 130 bulirsch_stoer 131 </p> 132 </td></tr> 133<tr><td> 134 <p> 135 controlled_runge_kutta 136 </p> 137 </td></tr> 138<tr><td> 139 <p> 140 dense_output_runge_kutta 141 </p> 142 </td></tr> 143<tr><td> 144 <p> 145 euler 146 </p> 147 </td></tr> 148<tr><td> 149 <p> 150 explicit_error_generic_rk 151 </p> 152 </td></tr> 153<tr><td> 154 <p> 155 explicit_generic_rk 156 </p> 157 </td></tr> 158<tr><td> 159 <p> 160 rosenbrock4_controller 161 </p> 162 </td></tr> 163<tr><td> 164 <p> 165 rosenbrock4_dense_output 166 </p> 167 </td></tr> 168<tr><td> 169 <p> 170 rosenbrock4 171 </p> 172 </td></tr> 173<tr><td> 174 <p> 175 runge_kutta4_classic 176 </p> 177 </td></tr> 178<tr><td> 179 <p> 180 runge_kutta4 181 </p> 182 </td></tr> 183<tr><td> 184 <p> 185 runge_kutta_cash_karp54_classic 186 </p> 187 </td></tr> 188<tr><td> 189 <p> 190 runge_kutta_cash_karp54 191 </p> 192 </td></tr> 193<tr><td> 194 <p> 195 runge_kutta_dopri5 196 </p> 197 </td></tr> 198<tr><td> 199 <p> 200 runge_kutta_fehlberg78 201 </p> 202 </td></tr> 203<tr><td> 204 <p> 205 symplectic_euler 206 </p> 207 </td></tr> 208<tr><td> 209 <p> 210 symplectic_rkn_sb3a_mclachlan 211 </p> 212 </td></tr> 213</tbody> 214</table></div> 215</div> 216<br class="table-break"><div class="table"> 217<a name="boost_numeric_odeint.odeint_in_detail.using_boost__range.algebras_supporting_boost_range"></a><p class="title"><b>Table 1.10. Algebras supporting Boost.Range</b></p> 218<div class="table-contents"><table class="table" summary="Algebras supporting Boost.Range"> 219<colgroup><col></colgroup> 220<thead><tr><th> 221 <p> 222 algebra 223 </p> 224 </th></tr></thead> 225<tbody> 226<tr><td> 227 <p> 228 range_algebra 229 </p> 230 </td></tr> 231<tr><td> 232 <p> 233 thrust_algebra 234 </p> 235 </td></tr> 236</tbody> 237</table></div> 238</div> 239<br class="table-break"> 240</div> 241<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 242<td align="left"></td> 243<td align="right"><div class="copyright-footer">Copyright © 2009-2015 Karsten Ahnert and Mario Mulansky<p> 244 Distributed under the Boost Software License, Version 1.0. (See accompanying 245 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 246 </p> 247</div></td> 248</tr></table> 249<hr> 250<div class="spirit-nav"> 251<a accesskey="p" href="using_boost__ref.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../odeint_in_detail.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_member_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 252</div> 253</body> 254</html> 255