• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&lt;</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">&gt;</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">&amp;</span><span class="identifier">x_</span> <span class="special">,</span> <span class="identifier">Deriv</span> <span class="special">&amp;</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">&lt;</span> <span class="keyword">const</span> <span class="identifier">State</span> <span class="special">&gt;::</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">&lt;</span> <span class="identifier">Deriv</span> <span class="special">&gt;::</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">&lt;</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">&gt;</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">&amp;</span><span class="identifier">x_</span> <span class="special">,</span> <span class="identifier">Deriv</span> <span class="special">&amp;</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">&lt;</span> <span class="keyword">const</span> <span class="identifier">State</span> <span class="special">&gt;::</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">&lt;</span> <span class="identifier">Deriv</span> <span class="special">&gt;::</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