state_types__algebras_and_operations.html 88 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>State types, algebras and operations</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&#160;1.&#160;Boost.Numeric.Odeint">
  8. <link rel="up" href="../odeint_in_detail.html" title="odeint in detail">
  9. <link rel="prev" href="iterators_and_ranges.html" title="Iterators and Ranges">
  10. <link rel="next" href="using_boost__ref.html" title="Using boost::ref">
  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="iterators_and_ranges.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="using_boost__ref.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.state_types__algebras_and_operations"></a><a class="link" href="state_types__algebras_and_operations.html" title="State types, algebras and operations">State
  28. types, algebras and operations</a>
  29. </h3></div></div></div>
  30. <div class="toc"><dl class="toc">
  31. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing">Construction/Resizing</a></span></dt>
  32. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations">Algebras
  33. and Operations</a></span></dt>
  34. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.adapt_your_own_operations">Adapt
  35. your own operations</a></span></dt>
  36. </dl></div>
  37. <p>
  38. In odeint the stepper algorithms are implemented independently of the underlying
  39. fundamental mathematical operations. This is realized by giving the user
  40. full control over the state type and the mathematical operations for this
  41. state type. Technically, this is done by introducing three concepts: StateType,
  42. Algebra, Operations. Most of the steppers in odeint expect three class types
  43. fulfilling these concepts as template parameters. Note that these concepts
  44. are not fully independent of each other but rather a valid combination must
  45. be provided in order to make the steppers work. In the following we will
  46. give some examples on reasonable state_type-algebra-operations combinations.
  47. For the most common state types, like <code class="computeroutput"><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span></code> or <code class="computeroutput"><span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span><span class="identifier">N</span><span class="special">&gt;</span></code>
  48. the default values range_algebra and default_operations are perfectly fine
  49. and odeint can be used as is without worrying about algebra/operations at
  50. all.
  51. </p>
  52. <div class="important"><table border="0" summary="Important">
  53. <tr>
  54. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../../doc/src/images/important.png"></td>
  55. <th align="left">Important</th>
  56. </tr>
  57. <tr><td align="left" valign="top"><p>
  58. state_type, algebra and operations are not independent, a valid combination
  59. must be provided to make odeint work properly
  60. </p></td></tr>
  61. </table></div>
  62. <p>
  63. Moreover, as odeint handles the memory required for intermediate temporary
  64. objects itself, it also needs knowledge about how to create state_type objects
  65. and maybe how to allocate memory (resizing). All in all, the following things
  66. have to be taken care of when odeint is used with non-standard state types:
  67. </p>
  68. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  69. <li class="listitem">
  70. construction/destruction
  71. </li>
  72. <li class="listitem">
  73. resizing (if possible/required)
  74. </li>
  75. <li class="listitem">
  76. algebraic operations
  77. </li>
  78. </ul></div>
  79. <p>
  80. Again, odeint already provides basic interfaces for most of the usual state
  81. types. So if you use a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>,
  82. or a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code> as state type no additional work
  83. is required, they just work out of the box.
  84. </p>
  85. <div class="section">
  86. <div class="titlepage"><div><div><h4 class="title">
  87. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing" title="Construction/Resizing">Construction/Resizing</a>
  88. </h4></div></div></div>
  89. <div class="toc"><dl class="toc">
  90. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing.using_the_container_interface">Using
  91. the container interface</a></span></dt>
  92. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing.std__list">std::list</a></span></dt>
  93. </dl></div>
  94. <p>
  95. We distinguish between two basic state types: fixed sized and dynamically
  96. sized. For fixed size state types the default constructor <code class="computeroutput"><span class="identifier">state_type</span><span class="special">()</span></code>
  97. already allocates the required memory, prominent example is <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">N</span><span class="special">&gt;</span></code>. Dynamically sized types have to be
  98. resized to make sure enough memory is allocated, the standard constructor
  99. does not take care of the resizing. Examples for this are the STL containers
  100. like <code class="computeroutput"><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span></code>.
  101. </p>
  102. <p>
  103. The most easy way of getting your own state type to work with odeint is
  104. to use a fixed size state, base calculations on the range_algebra and provide
  105. the following functionality:
  106. </p>
  107. <div class="informaltable"><table class="table">
  108. <colgroup>
  109. <col>
  110. <col>
  111. <col>
  112. <col>
  113. </colgroup>
  114. <thead><tr>
  115. <th>
  116. <p>
  117. Name
  118. </p>
  119. </th>
  120. <th>
  121. <p>
  122. Expression
  123. </p>
  124. </th>
  125. <th>
  126. <p>
  127. Type
  128. </p>
  129. </th>
  130. <th>
  131. <p>
  132. Semantics
  133. </p>
  134. </th>
  135. </tr></thead>
  136. <tbody>
  137. <tr>
  138. <td>
  139. <p>
  140. Construct State
  141. </p>
  142. </td>
  143. <td>
  144. <p>
  145. <code class="computeroutput"><span class="identifier">State</span> <span class="identifier">x</span><span class="special">()</span></code>
  146. </p>
  147. </td>
  148. <td>
  149. <p>
  150. <code class="computeroutput"><span class="keyword">void</span></code>
  151. </p>
  152. </td>
  153. <td>
  154. <p>
  155. Creates an instance of <code class="computeroutput"><span class="identifier">State</span></code>
  156. and allocates memory.
  157. </p>
  158. </td>
  159. </tr>
  160. <tr>
  161. <td>
  162. <p>
  163. Begin of the sequence
  164. </p>
  165. </td>
  166. <td>
  167. <p>
  168. boost::begin(x)
  169. </p>
  170. </td>
  171. <td>
  172. <p>
  173. Iterator
  174. </p>
  175. </td>
  176. <td>
  177. <p>
  178. Returns an iterator pointing to the begin of the sequence
  179. </p>
  180. </td>
  181. </tr>
  182. <tr>
  183. <td>
  184. <p>
  185. End of the sequence
  186. </p>
  187. </td>
  188. <td>
  189. <p>
  190. boost::end(x)
  191. </p>
  192. </td>
  193. <td>
  194. <p>
  195. Iterator
  196. </p>
  197. </td>
  198. <td>
  199. <p>
  200. Returns an iterator pointing to the end of the sequence
  201. </p>
  202. </td>
  203. </tr>
  204. </tbody>
  205. </table></div>
  206. <div class="warning"><table border="0" summary="Warning">
  207. <tr>
  208. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../../../doc/src/images/warning.png"></td>
  209. <th align="left">Warning</th>
  210. </tr>
  211. <tr><td align="left" valign="top"><p>
  212. If your state type does not allocate memory by default construction,
  213. you <span class="bold"><strong>must define it as resizeable</strong></span> and
  214. provide resize functionality (see below). Otherwise segmentation faults
  215. will occur.
  216. </p></td></tr>
  217. </table></div>
  218. <p>
  219. So fixed sized arrays supported by <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  220. immediately work with odeint. For dynamically sized arrays one has to additionally
  221. supply the resize functionality. First, the state has to be tagged as resizeable
  222. by specializing the struct <code class="computeroutput"><span class="identifier">is_resizeable</span></code>
  223. which consists of one typedef and one bool value:
  224. </p>
  225. <div class="informaltable"><table class="table">
  226. <colgroup>
  227. <col>
  228. <col>
  229. <col>
  230. <col>
  231. </colgroup>
  232. <thead><tr>
  233. <th>
  234. <p>
  235. Name
  236. </p>
  237. </th>
  238. <th>
  239. <p>
  240. Expression
  241. </p>
  242. </th>
  243. <th>
  244. <p>
  245. Type
  246. </p>
  247. </th>
  248. <th>
  249. <p>
  250. Semantics
  251. </p>
  252. </th>
  253. </tr></thead>
  254. <tbody>
  255. <tr>
  256. <td>
  257. <p>
  258. Resizability
  259. </p>
  260. </td>
  261. <td>
  262. <p>
  263. <code class="computeroutput"><span class="identifier">is_resizeable</span><span class="special">&lt;</span><span class="identifier">State</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
  264. </p>
  265. </td>
  266. <td>
  267. <p>
  268. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span></code> or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">false_type</span></code>
  269. </p>
  270. </td>
  271. <td>
  272. <p>
  273. Determines resizeability of the state type, returns <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span></code> if the state is resizeable.
  274. </p>
  275. </td>
  276. </tr>
  277. <tr>
  278. <td>
  279. <p>
  280. Resizability
  281. </p>
  282. </td>
  283. <td>
  284. <p>
  285. <code class="computeroutput"><span class="identifier">is_resizeable</span><span class="special">&lt;</span><span class="identifier">State</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
  286. </p>
  287. </td>
  288. <td>
  289. <p>
  290. <code class="computeroutput"><span class="keyword">bool</span></code>
  291. </p>
  292. </td>
  293. <td>
  294. <p>
  295. Same as above, but with <code class="computeroutput"><span class="keyword">bool</span></code>
  296. value.
  297. </p>
  298. </td>
  299. </tr>
  300. </tbody>
  301. </table></div>
  302. <p>
  303. Defining <code class="computeroutput"><span class="identifier">type</span></code> to be <code class="computeroutput"><span class="identifier">true_type</span></code> and <code class="computeroutput"><span class="identifier">value</span></code>
  304. as <code class="computeroutput"><span class="keyword">true</span></code> tells odeint that
  305. your state is resizeable. By default, odeint now expects the support of
  306. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> and
  307. a <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">size</span><span class="special">(</span><span class="identifier">y</span><span class="special">)</span> <span class="special">)</span></code>
  308. member function for resizing:
  309. </p>
  310. <div class="informaltable"><table class="table">
  311. <colgroup>
  312. <col>
  313. <col>
  314. <col>
  315. <col>
  316. </colgroup>
  317. <thead><tr>
  318. <th>
  319. <p>
  320. Name
  321. </p>
  322. </th>
  323. <th>
  324. <p>
  325. Expression
  326. </p>
  327. </th>
  328. <th>
  329. <p>
  330. Type
  331. </p>
  332. </th>
  333. <th>
  334. <p>
  335. Semantics
  336. </p>
  337. </th>
  338. </tr></thead>
  339. <tbody>
  340. <tr>
  341. <td>
  342. <p>
  343. Get size
  344. </p>
  345. </td>
  346. <td>
  347. <p>
  348. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">size</span><span class="special">(</span>
  349. <span class="identifier">x</span> <span class="special">)</span></code>
  350. </p>
  351. </td>
  352. <td>
  353. <p>
  354. <code class="computeroutput"><span class="identifier">size_type</span></code>
  355. </p>
  356. </td>
  357. <td>
  358. <p>
  359. Returns the current size of x.
  360. </p>
  361. </td>
  362. </tr>
  363. <tr>
  364. <td>
  365. <p>
  366. Resize
  367. </p>
  368. </td>
  369. <td>
  370. <p>
  371. <code class="computeroutput"><span class="identifier">x</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span>
  372. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">size</span><span class="special">(</span>
  373. <span class="identifier">y</span> <span class="special">)</span>
  374. <span class="special">)</span></code>
  375. </p>
  376. </td>
  377. <td>
  378. <p>
  379. <code class="computeroutput"><span class="keyword">void</span></code>
  380. </p>
  381. </td>
  382. <td>
  383. <p>
  384. Resizes x to have the same size as y.
  385. </p>
  386. </td>
  387. </tr>
  388. </tbody>
  389. </table></div>
  390. <div class="section">
  391. <div class="titlepage"><div><div><h5 class="title">
  392. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing.using_the_container_interface"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing.using_the_container_interface" title="Using the container interface">Using
  393. the container interface</a>
  394. </h5></div></div></div>
  395. <p>
  396. As a first example we take the most simple case and implement our own
  397. vector <code class="computeroutput"><span class="identifier">my_vector</span></code> which
  398. will provide a container interface. This makes <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  399. working out-of-box. We add a little functionality to our vector which
  400. makes it allocate some default capacity by construction. This is helpful
  401. when using resizing as then a resize can be assured to not require a
  402. new allocation.
  403. </p>
  404. <p>
  405. </p>
  406. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="identifier">size_t</span> <span class="identifier">MAX_N</span> <span class="special">&gt;</span>
  407. <span class="keyword">class</span> <span class="identifier">my_vector</span>
  408. <span class="special">{</span>
  409. <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">&gt;</span> <span class="identifier">vector</span><span class="special">;</span>
  410. <span class="keyword">public</span><span class="special">:</span>
  411. <span class="keyword">typedef</span> <span class="identifier">vector</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
  412. <span class="keyword">typedef</span> <span class="identifier">vector</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
  413. <span class="keyword">public</span><span class="special">:</span>
  414. <span class="identifier">my_vector</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">size_t</span> <span class="identifier">N</span> <span class="special">)</span>
  415. <span class="special">:</span> <span class="identifier">m_v</span><span class="special">(</span> <span class="identifier">N</span> <span class="special">)</span>
  416. <span class="special">{</span>
  417. <span class="identifier">m_v</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span> <span class="identifier">MAX_N</span> <span class="special">);</span>
  418. <span class="special">}</span>
  419. <span class="identifier">my_vector</span><span class="special">()</span>
  420. <span class="special">:</span> <span class="identifier">m_v</span><span class="special">()</span>
  421. <span class="special">{</span>
  422. <span class="identifier">m_v</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span> <span class="identifier">MAX_N</span> <span class="special">);</span>
  423. <span class="special">}</span>
  424. <span class="comment">// ... [ implement container interface ]</span>
  425. </pre>
  426. <p>
  427. </p>
  428. <p>
  429. The only thing that has to be done other than defining is thus declaring
  430. my_vector as resizeable:
  431. </p>
  432. <p>
  433. </p>
  434. <pre class="programlisting"><span class="comment">// define my_vector as resizeable</span>
  435. <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">odeint</span> <span class="special">{</span>
  436. <span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  437. <span class="keyword">struct</span> <span class="identifier">is_resizeable</span><span class="special">&lt;</span> <span class="identifier">my_vector</span><span class="special">&lt;</span><span class="identifier">N</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  438. <span class="special">{</span>
  439. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span> <span class="identifier">type</span><span class="special">;</span>
  440. <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">;</span>
  441. <span class="special">};</span>
  442. <span class="special">}</span> <span class="special">}</span> <span class="special">}</span>
  443. </pre>
  444. <p>
  445. </p>
  446. <p>
  447. If we wouldn't specialize the <code class="computeroutput"><span class="identifier">is_resizeable</span></code>
  448. template, the code would still compile but odeint would not adjust the
  449. size of temporary internal instances of my_vector and hence try to fill
  450. zero-sized vectors resulting in segmentation faults! The full example
  451. can be found in <a href="https://github.com/headmyshoulder/odeint-v2/blob/master/examples/my_vector.cpp" target="_top">my_vector.cpp</a>
  452. </p>
  453. </div>
  454. <div class="section">
  455. <div class="titlepage"><div><div><h5 class="title">
  456. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing.std__list"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.construction_resizing.std__list" title="std::list">std::list</a>
  457. </h5></div></div></div>
  458. <p>
  459. If your state type does work with <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>,
  460. but handles resizing differently you are required to specialize two implementations
  461. used by odeint to check a state's size and to resize:
  462. </p>
  463. <div class="informaltable"><table class="table">
  464. <colgroup>
  465. <col>
  466. <col>
  467. <col>
  468. <col>
  469. </colgroup>
  470. <thead><tr>
  471. <th>
  472. <p>
  473. Name
  474. </p>
  475. </th>
  476. <th>
  477. <p>
  478. Expression
  479. </p>
  480. </th>
  481. <th>
  482. <p>
  483. Type
  484. </p>
  485. </th>
  486. <th>
  487. <p>
  488. Semantics
  489. </p>
  490. </th>
  491. </tr></thead>
  492. <tbody>
  493. <tr>
  494. <td>
  495. <p>
  496. Check size
  497. </p>
  498. </td>
  499. <td>
  500. <p>
  501. <code class="computeroutput"><span class="identifier">same_size_impl</span><span class="special">&lt;</span><span class="identifier">State</span><span class="special">,</span><span class="identifier">State</span><span class="special">&gt;::</span><span class="identifier">same_size</span><span class="special">(</span><span class="identifier">x</span>
  502. <span class="special">,</span> <span class="identifier">y</span><span class="special">)</span></code>
  503. </p>
  504. </td>
  505. <td>
  506. <p>
  507. <code class="computeroutput"><span class="keyword">bool</span></code>
  508. </p>
  509. </td>
  510. <td>
  511. <p>
  512. Returns true if the size of x equals the size of y.
  513. </p>
  514. </td>
  515. </tr>
  516. <tr>
  517. <td>
  518. <p>
  519. Resize
  520. </p>
  521. </td>
  522. <td>
  523. <p>
  524. <code class="computeroutput"><span class="identifier">resize_impl</span><span class="special">&lt;</span><span class="identifier">State</span><span class="special">,</span><span class="identifier">State</span><span class="special">&gt;::</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">x</span>
  525. <span class="special">,</span> <span class="identifier">y</span><span class="special">)</span></code>
  526. </p>
  527. </td>
  528. <td>
  529. <p>
  530. <code class="computeroutput"><span class="keyword">void</span></code>
  531. </p>
  532. </td>
  533. <td>
  534. <p>
  535. Resizes x to have the same size as y.
  536. </p>
  537. </td>
  538. </tr>
  539. </tbody>
  540. </table></div>
  541. <p>
  542. As an example we will use a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span></code>
  543. as state type in odeint. Because <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span></code>
  544. is not supported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">size</span></code>
  545. we have to replace the same_size and resize implementation to get list
  546. to work with odeint. The following code shows the required template specializations:
  547. </p>
  548. <p>
  549. </p>
  550. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">&gt;</span> <span class="identifier">state_type</span><span class="special">;</span>
  551. <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">odeint</span> <span class="special">{</span>
  552. <span class="keyword">template</span><span class="special">&lt;</span> <span class="special">&gt;</span>
  553. <span class="keyword">struct</span> <span class="identifier">is_resizeable</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;</span>
  554. <span class="special">{</span> <span class="comment">// declare resizeability</span>
  555. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span> <span class="identifier">type</span><span class="special">;</span>
  556. <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">;</span>
  557. <span class="special">};</span>
  558. <span class="keyword">template</span><span class="special">&lt;</span> <span class="special">&gt;</span>
  559. <span class="keyword">struct</span> <span class="identifier">same_size_impl</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&gt;</span>
  560. <span class="special">{</span> <span class="comment">// define how to check size</span>
  561. <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">same_size</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">v1</span> <span class="special">,</span>
  562. <span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">v2</span> <span class="special">)</span>
  563. <span class="special">{</span>
  564. <span class="keyword">return</span> <span class="identifier">v1</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v2</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  565. <span class="special">}</span>
  566. <span class="special">};</span>
  567. <span class="keyword">template</span><span class="special">&lt;</span> <span class="special">&gt;</span>
  568. <span class="keyword">struct</span> <span class="identifier">resize_impl</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&gt;</span>
  569. <span class="special">{</span> <span class="comment">// define how to resize</span>
  570. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">v1</span> <span class="special">,</span>
  571. <span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">v2</span> <span class="special">)</span>
  572. <span class="special">{</span>
  573. <span class="identifier">v1</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span> <span class="identifier">v2</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">);</span>
  574. <span class="special">}</span>
  575. <span class="special">};</span>
  576. <span class="special">}</span> <span class="special">}</span> <span class="special">}</span>
  577. </pre>
  578. <p>
  579. </p>
  580. <p>
  581. With these definitions odeint knows how to resize <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span></code>s
  582. and so they can be used as state types. A complete example can be found
  583. in <a href="https://github.com/headmyshoulder/odeint-v2/blob/master/examples/list_lattice.cpp" target="_top">list_lattice.cpp</a>.
  584. </p>
  585. </div>
  586. </div>
  587. <div class="section">
  588. <div class="titlepage"><div><div><h4 class="title">
  589. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations" title="Algebras and Operations">Algebras
  590. and Operations</a>
  591. </h4></div></div></div>
  592. <div class="toc"><dl class="toc">
  593. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.gsl_vector">GSL
  594. Vector</a></span></dt>
  595. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.vector_space_algebra">Vector
  596. Space Algebra</a></span></dt>
  597. <dt><span class="section"><a href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.point_type">Point
  598. type</a></span></dt>
  599. </dl></div>
  600. <p>
  601. To provide maximum flexibility odeint is implemented in a highly modularized
  602. way. This means it is possible to change the underlying mathematical operations
  603. without touching the integration algorithms. The fundamental mathematical
  604. operations are those of a vector space, that is addition of <code class="computeroutput"><span class="identifier">state_types</span></code> and multiplication of <code class="computeroutput"><span class="identifier">state_type</span></code>s with a scalar (<code class="computeroutput"><span class="identifier">time_type</span></code>). In odeint this is realized
  605. in two concepts: <span class="underline">Algebra</span> and <span class="underline">Operations</span>. The standard way how this works
  606. is by the range algebra which provides functions that apply a specific
  607. operation to each of the individual elements of a container based on the
  608. <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  609. library. If your state type is not supported by <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  610. there are several possibilities to tell odeint how to do algebraic operations:
  611. </p>
  612. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  613. <li class="listitem">
  614. Implement <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>
  615. for your state type so it works with <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>.
  616. </li>
  617. <li class="listitem">
  618. Implement vector-vector addition operator <code class="computeroutput"><span class="special">+</span></code>
  619. and scalar-vector multiplication operator <code class="computeroutput"><span class="special">*</span></code>
  620. and use the non-standard <code class="computeroutput"><span class="identifier">vector_space_algebra</span></code>.
  621. </li>
  622. <li class="listitem">
  623. Implement your own algebra that implements the required functions.
  624. </li>
  625. </ul></div>
  626. <div class="section">
  627. <div class="titlepage"><div><div><h5 class="title">
  628. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.gsl_vector"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.gsl_vector" title="GSL Vector">GSL
  629. Vector</a>
  630. </h5></div></div></div>
  631. <p>
  632. In the following example we will try to use the <code class="computeroutput"><span class="identifier">gsl_vector</span></code>
  633. type from <a href="http://www.gsl.org" target="_top">GSL</a> (GNU Scientific
  634. Library) as state type in odeint. We will realize this by implementing
  635. a wrapper around the gsl_vector that takes care of construction/destruction.
  636. Also, <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  637. is extended such that it works with <code class="computeroutput"><span class="identifier">gsl_vector</span></code>s
  638. as well which required also the implementation of a new <code class="computeroutput"><span class="identifier">gsl_iterator</span></code>.
  639. </p>
  640. <div class="note"><table border="0" summary="Note">
  641. <tr>
  642. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
  643. <th align="left">Note</th>
  644. </tr>
  645. <tr><td align="left" valign="top"><p>
  646. odeint already includes all the code presented here, see <a href="https://github.com/headmyshoulder/odeint-v2/blob/master/boost/numeric/odeint/external/gsl/gsl_wrapper.hpp" target="_top">gsl_wrapper.hpp</a>,
  647. so <code class="computeroutput"><span class="identifier">gsl_vector</span></code>s can
  648. be used straight out-of-box. The following description is just for
  649. educational purpose.
  650. </p></td></tr>
  651. </table></div>
  652. <p>
  653. The GSL is a C library, so <code class="computeroutput"><span class="identifier">gsl_vector</span></code>
  654. has neither constructor, nor destructor or any <code class="computeroutput"><span class="identifier">begin</span></code>
  655. or <code class="computeroutput"><span class="identifier">end</span></code> function, no iterators
  656. at all. So to make it work with odeint plenty of things have to be implemented.
  657. Note that all of the work shown here is already included in odeint, so
  658. using <code class="computeroutput"><span class="identifier">gsl_vector</span></code>s in
  659. odeint doesn't require any further adjustments. We present it here just
  660. as an educational example. We start with defining appropriate constructors
  661. and destructors. This is done by specializing the <code class="computeroutput"><span class="identifier">state_wrapper</span></code>
  662. for <code class="computeroutput"><span class="identifier">gsl_vector</span></code>. State
  663. wrappers are used by the steppers internally to create and manage temporary
  664. instances of state types:
  665. </p>
  666. <p>
  667. </p>
  668. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;&gt;</span>
  669. <span class="keyword">struct</span> <span class="identifier">state_wrapper</span><span class="special">&lt;</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">&gt;</span>
  670. <span class="special">{</span>
  671. <span class="keyword">typedef</span> <span class="keyword">double</span> <span class="identifier">value_type</span><span class="special">;</span>
  672. <span class="keyword">typedef</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="identifier">state_type</span><span class="special">;</span>
  673. <span class="keyword">typedef</span> <span class="identifier">state_wrapper</span><span class="special">&lt;</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">&gt;</span> <span class="identifier">state_wrapper_type</span><span class="special">;</span>
  674. <span class="identifier">state_type</span> <span class="identifier">m_v</span><span class="special">;</span>
  675. <span class="identifier">state_wrapper</span><span class="special">(</span> <span class="special">)</span>
  676. <span class="special">{</span>
  677. <span class="identifier">m_v</span> <span class="special">=</span> <span class="identifier">gsl_vector_alloc</span><span class="special">(</span> <span class="number">1</span> <span class="special">);</span>
  678. <span class="special">}</span>
  679. <span class="identifier">state_wrapper</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">state_wrapper_type</span> <span class="special">&amp;</span><span class="identifier">x</span> <span class="special">)</span>
  680. <span class="special">{</span>
  681. <span class="identifier">resize</span><span class="special">(</span> <span class="identifier">m_v</span> <span class="special">,</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">m_v</span> <span class="special">);</span>
  682. <span class="identifier">gsl_vector_memcpy</span><span class="special">(</span> <span class="identifier">m_v</span> <span class="special">,</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">m_v</span> <span class="special">);</span>
  683. <span class="special">}</span>
  684. <span class="special">~</span><span class="identifier">state_wrapper</span><span class="special">()</span>
  685. <span class="special">{</span>
  686. <span class="identifier">gsl_vector_free</span><span class="special">(</span> <span class="identifier">m_v</span> <span class="special">);</span>
  687. <span class="special">}</span>
  688. <span class="special">};</span>
  689. </pre>
  690. <p>
  691. </p>
  692. <p>
  693. This <code class="computeroutput"><span class="identifier">state_wrapper</span></code> specialization
  694. tells odeint how gsl_vectors are created, copied and destroyed. Next
  695. we need resizing, this is required because gsl_vectors are dynamically
  696. sized objects:
  697. </p>
  698. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;&gt;</span>
  699. <span class="keyword">struct</span> <span class="identifier">is_resizeable</span><span class="special">&lt;</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">&gt;</span>
  700. <span class="special">{</span>
  701. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span> <span class="identifier">type</span><span class="special">;</span>
  702. <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">;</span>
  703. <span class="special">};</span>
  704. <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
  705. <span class="keyword">struct</span> <span class="identifier">same_size_impl</span><span class="special">&lt;</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">,</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">&gt;</span>
  706. <span class="special">{</span>
  707. <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">same_size</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="identifier">x</span> <span class="special">,</span> <span class="keyword">const</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="identifier">y</span> <span class="special">)</span>
  708. <span class="special">{</span>
  709. <span class="keyword">return</span> <span class="identifier">x</span><span class="special">-&gt;</span><span class="identifier">size</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">-&gt;</span><span class="identifier">size</span><span class="special">;</span>
  710. <span class="special">}</span>
  711. <span class="special">};</span>
  712. <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
  713. <span class="keyword">struct</span> <span class="identifier">resize_impl</span><span class="special">&lt;</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">,</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="special">&gt;</span>
  714. <span class="special">{</span>
  715. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="identifier">x</span> <span class="special">,</span> <span class="keyword">const</span> <span class="identifier">gsl_vector</span><span class="special">*</span> <span class="identifier">y</span> <span class="special">)</span>
  716. <span class="special">{</span>
  717. <span class="identifier">gsl_vector_free</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">);</span>
  718. <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">gsl_vector_alloc</span><span class="special">(</span> <span class="identifier">y</span><span class="special">-&gt;</span><span class="identifier">size</span> <span class="special">);</span>
  719. <span class="special">}</span>
  720. <span class="special">};</span>
  721. </pre>
  722. <p>
  723. </p>
  724. <p>
  725. Up to now, we defined creation/destruction and resizing, but gsl_vectors
  726. also don't support iterators, so we first implement a gsl iterator:
  727. </p>
  728. <p>
  729. </p>
  730. <pre class="programlisting"><span class="comment">/*
  731. * defines an iterator for gsl_vector
  732. */</span>
  733. <span class="keyword">class</span> <span class="identifier">gsl_vector_iterator</span>
  734. <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">iterator_facade</span><span class="special">&lt;</span> <span class="identifier">gsl_vector_iterator</span> <span class="special">,</span> <span class="keyword">double</span> <span class="special">,</span>
  735. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">random_access_traversal_tag</span> <span class="special">&gt;</span>
  736. <span class="special">{</span>
  737. <span class="keyword">public</span> <span class="special">:</span>
  738. <span class="identifier">gsl_vector_iterator</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">):</span> <span class="identifier">m_p</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">,</span> <span class="identifier">m_stride</span><span class="special">(</span> <span class="number">0</span> <span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
  739. <span class="keyword">explicit</span> <span class="identifier">gsl_vector_iterator</span><span class="special">(</span> <span class="identifier">gsl_vector</span> <span class="special">*</span><span class="identifier">p</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">m_p</span><span class="special">(</span> <span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">data</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">m_stride</span><span class="special">(</span> <span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">stride</span> <span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
  740. <span class="keyword">friend</span> <span class="identifier">gsl_vector_iterator</span> <span class="identifier">end_iterator</span><span class="special">(</span> <span class="identifier">gsl_vector</span> <span class="special">*</span> <span class="special">);</span>
  741. <span class="keyword">private</span> <span class="special">:</span>
  742. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">iterator_core_access</span><span class="special">;</span>
  743. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">const_gsl_vector_iterator</span><span class="special">;</span>
  744. <span class="keyword">void</span> <span class="identifier">increment</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{</span> <span class="identifier">m_p</span> <span class="special">+=</span> <span class="identifier">m_stride</span><span class="special">;</span> <span class="special">}</span>
  745. <span class="keyword">void</span> <span class="identifier">decrement</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{</span> <span class="identifier">m_p</span> <span class="special">-=</span> <span class="identifier">m_stride</span><span class="special">;</span> <span class="special">}</span>
  746. <span class="keyword">void</span> <span class="identifier">advance</span><span class="special">(</span> <span class="identifier">ptrdiff_t</span> <span class="identifier">n</span> <span class="special">)</span> <span class="special">{</span> <span class="identifier">m_p</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">*</span><span class="identifier">m_stride</span><span class="special">;</span> <span class="special">}</span>
  747. <span class="keyword">bool</span> <span class="identifier">equal</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">gsl_vector_iterator</span> <span class="special">&amp;</span><span class="identifier">other</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">m_p</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">m_p</span><span class="special">;</span> <span class="special">}</span>
  748. <span class="keyword">bool</span> <span class="identifier">equal</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">const_gsl_vector_iterator</span> <span class="special">&amp;</span><span class="identifier">other</span> <span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  749. <span class="keyword">double</span><span class="special">&amp;</span> <span class="identifier">dereference</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="identifier">m_p</span><span class="special">;</span> <span class="special">}</span>
  750. <span class="keyword">double</span> <span class="special">*</span><span class="identifier">m_p</span><span class="special">;</span>
  751. <span class="identifier">size_t</span> <span class="identifier">m_stride</span><span class="special">;</span>
  752. <span class="special">};</span>
  753. </pre>
  754. <p>
  755. A similar class exists for the <code class="computeroutput"><span class="keyword">const</span></code>
  756. version of the iterator. Then we have a function returning the end iterator
  757. (similarly for <code class="computeroutput"><span class="keyword">const</span></code> again):
  758. </p>
  759. <pre class="programlisting"><span class="identifier">gsl_vector_iterator</span> <span class="identifier">end_iterator</span><span class="special">(</span> <span class="identifier">gsl_vector</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">)</span>
  760. <span class="special">{</span>
  761. <span class="identifier">gsl_vector_iterator</span> <span class="identifier">iter</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">);</span>
  762. <span class="identifier">iter</span><span class="special">.</span><span class="identifier">m_p</span> <span class="special">+=</span> <span class="identifier">iter</span><span class="special">.</span><span class="identifier">m_stride</span> <span class="special">*</span> <span class="identifier">x</span><span class="special">-&gt;</span><span class="identifier">size</span><span class="special">;</span>
  763. <span class="keyword">return</span> <span class="identifier">iter</span><span class="special">;</span>
  764. <span class="special">}</span>
  765. </pre>
  766. <p>
  767. </p>
  768. <p>
  769. Finally, the bindings for <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  770. are added:
  771. </p>
  772. <pre class="programlisting"><span class="comment">// template&lt;&gt;</span>
  773. <span class="keyword">inline</span> <span class="identifier">gsl_vector_iterator</span> <span class="identifier">range_begin</span><span class="special">(</span> <span class="identifier">gsl_vector</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">)</span>
  774. <span class="special">{</span>
  775. <span class="keyword">return</span> <span class="identifier">gsl_vector_iterator</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">);</span>
  776. <span class="special">}</span>
  777. <span class="comment">// template&lt;&gt;</span>
  778. <span class="keyword">inline</span> <span class="identifier">gsl_vector_iterator</span> <span class="identifier">range_end</span><span class="special">(</span> <span class="identifier">gsl_vector</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">)</span>
  779. <span class="special">{</span>
  780. <span class="keyword">return</span> <span class="identifier">end_iterator</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">);</span>
  781. <span class="special">}</span>
  782. </pre>
  783. <p>
  784. Again with similar definitions for the <code class="computeroutput"><span class="keyword">const</span></code>
  785. versions. This eventually makes odeint work with gsl vectors as state
  786. types. The full code for these bindings is found in <a href="https://github.com/headmyshoulder/odeint-v2/blob/master/boost/numeric/odeint/external/gsl/gsl_wrapper.hpp" target="_top">gsl_wrapper.hpp</a>.
  787. It might look rather complicated but keep in mind that gsl is a pre-compiled
  788. C library.
  789. </p>
  790. </div>
  791. <div class="section">
  792. <div class="titlepage"><div><div><h5 class="title">
  793. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.vector_space_algebra"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.vector_space_algebra" title="Vector Space Algebra">Vector
  794. Space Algebra</a>
  795. </h5></div></div></div>
  796. <p>
  797. As seen above, the standard way of performing algebraic operations on
  798. container-like state types in odeint is to iterate through the elements
  799. of the container and perform the operations element-wise on the underlying
  800. value type. This is realized by means of the <code class="computeroutput"><span class="identifier">range_algebra</span></code>
  801. that uses <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>
  802. for obtaining iterators of the state types. However, there are other
  803. ways to implement the algebraic operations on containers, one of which
  804. is defining the addition/multiplication operators for the containers
  805. directly and then using the <code class="computeroutput"><span class="identifier">vector_space_algebra</span></code>.
  806. If you use this algebra, the following operators have to be defined for
  807. the state_type:
  808. </p>
  809. <div class="informaltable"><table class="table">
  810. <colgroup>
  811. <col>
  812. <col>
  813. <col>
  814. <col>
  815. </colgroup>
  816. <thead><tr>
  817. <th>
  818. <p>
  819. Name
  820. </p>
  821. </th>
  822. <th>
  823. <p>
  824. Expression
  825. </p>
  826. </th>
  827. <th>
  828. <p>
  829. Type
  830. </p>
  831. </th>
  832. <th>
  833. <p>
  834. Semantics
  835. </p>
  836. </th>
  837. </tr></thead>
  838. <tbody>
  839. <tr>
  840. <td>
  841. <p>
  842. Addition
  843. </p>
  844. </td>
  845. <td>
  846. <p>
  847. <code class="computeroutput"><span class="identifier">x</span> <span class="special">+</span>
  848. <span class="identifier">y</span></code>
  849. </p>
  850. </td>
  851. <td>
  852. <p>
  853. <code class="computeroutput"><span class="identifier">state_type</span></code>
  854. </p>
  855. </td>
  856. <td>
  857. <p>
  858. Calculates the vector sum 'x+y'.
  859. </p>
  860. </td>
  861. </tr>
  862. <tr>
  863. <td>
  864. <p>
  865. Assign addition
  866. </p>
  867. </td>
  868. <td>
  869. <p>
  870. <code class="computeroutput"><span class="identifier">x</span> <span class="special">+=</span>
  871. <span class="identifier">y</span></code>
  872. </p>
  873. </td>
  874. <td>
  875. <p>
  876. <code class="computeroutput"><span class="identifier">state_type</span></code>
  877. </p>
  878. </td>
  879. <td>
  880. <p>
  881. Performs x+y in place.
  882. </p>
  883. </td>
  884. </tr>
  885. <tr>
  886. <td>
  887. <p>
  888. Scalar multiplication
  889. </p>
  890. </td>
  891. <td>
  892. <p>
  893. <code class="computeroutput"><span class="identifier">a</span> <span class="special">*</span>
  894. <span class="identifier">x</span> </code>
  895. </p>
  896. </td>
  897. <td>
  898. <p>
  899. <code class="computeroutput"><span class="identifier">state_type</span></code>
  900. </p>
  901. </td>
  902. <td>
  903. <p>
  904. Performs multiplication of vector x with scalar a.
  905. </p>
  906. </td>
  907. </tr>
  908. <tr>
  909. <td>
  910. <p>
  911. Assign scalar multiplication
  912. </p>
  913. </td>
  914. <td>
  915. <p>
  916. <code class="computeroutput"><span class="identifier">x</span> <span class="special">*=</span>
  917. <span class="identifier">a</span></code>
  918. </p>
  919. </td>
  920. <td>
  921. <p>
  922. <code class="computeroutput"><span class="identifier">state_type</span></code>
  923. </p>
  924. </td>
  925. <td>
  926. <p>
  927. Performs in-place multiplication of vector x with scalar a.
  928. </p>
  929. </td>
  930. </tr>
  931. </tbody>
  932. </table></div>
  933. <p>
  934. Defining these operators makes your state type work with any basic Runge-Kutta
  935. stepper. However, if you want to use step-size control, some more functionality
  936. is required. Specifically, operations like <span class="emphasis"><em>max<sub>i</sub>( |err<sub>i</sub>| / (alpha
  937. * |s<sub>i</sub>|) )</em></span> have to be performed. <span class="emphasis"><em>err</em></span> and
  938. <span class="emphasis"><em>s</em></span> are state_types, alpha is a scalar. As you can
  939. see, we need element wise absolute value and division as well as an reduce
  940. operation to get the maximum value. So for controlled steppers the following
  941. things have to be implemented:
  942. </p>
  943. <div class="informaltable"><table class="table">
  944. <colgroup>
  945. <col>
  946. <col>
  947. <col>
  948. <col>
  949. </colgroup>
  950. <thead><tr>
  951. <th>
  952. <p>
  953. Name
  954. </p>
  955. </th>
  956. <th>
  957. <p>
  958. Expression
  959. </p>
  960. </th>
  961. <th>
  962. <p>
  963. Type
  964. </p>
  965. </th>
  966. <th>
  967. <p>
  968. Semantics
  969. </p>
  970. </th>
  971. </tr></thead>
  972. <tbody>
  973. <tr>
  974. <td>
  975. <p>
  976. Division
  977. </p>
  978. </td>
  979. <td>
  980. <p>
  981. <code class="computeroutput"><span class="identifier">x</span> <span class="special">/</span>
  982. <span class="identifier">y</span></code>
  983. </p>
  984. </td>
  985. <td>
  986. <p>
  987. <code class="computeroutput"><span class="identifier">state_type</span></code>
  988. </p>
  989. </td>
  990. <td>
  991. <p>
  992. Calculates the element-wise division 'x/y'
  993. </p>
  994. </td>
  995. </tr>
  996. <tr>
  997. <td>
  998. <p>
  999. Absolute value
  1000. </p>
  1001. </td>
  1002. <td>
  1003. <p>
  1004. <code class="computeroutput"><span class="identifier">abs</span><span class="special">(</span>
  1005. <span class="identifier">x</span> <span class="special">)</span></code>
  1006. </p>
  1007. </td>
  1008. <td>
  1009. <p>
  1010. <code class="computeroutput"><span class="identifier">state_type</span></code>
  1011. </p>
  1012. </td>
  1013. <td>
  1014. <p>
  1015. Element wise absolute value
  1016. </p>
  1017. </td>
  1018. </tr>
  1019. <tr>
  1020. <td>
  1021. <p>
  1022. Reduce
  1023. </p>
  1024. </td>
  1025. <td>
  1026. <p>
  1027. <code class="computeroutput"><span class="identifier">vector_space_reduce_impl</span><span class="special">&lt;</span> <span class="identifier">state_type</span>
  1028. <span class="special">&gt;::</span><span class="identifier">reduce</span><span class="special">(</span> <span class="identifier">state</span>
  1029. <span class="special">,</span> <span class="identifier">operation</span>
  1030. <span class="special">,</span> <span class="identifier">init</span>
  1031. <span class="special">)</span></code>
  1032. </p>
  1033. </td>
  1034. <td>
  1035. <p>
  1036. <code class="computeroutput"><span class="identifier">value_type</span></code>
  1037. </p>
  1038. </td>
  1039. <td>
  1040. <p>
  1041. Performs the <code class="computeroutput"><span class="identifier">operation</span></code>
  1042. for subsequently each element of <code class="computeroutput"><span class="identifier">state</span></code>
  1043. and returns the aggregate value. E.g.
  1044. </p>
  1045. <p>
  1046. <code class="computeroutput"><span class="identifier">init</span> <span class="special">=</span>
  1047. <span class="keyword">operator</span><span class="special">(</span>
  1048. <span class="identifier">init</span> <span class="special">,</span>
  1049. <span class="identifier">state</span><span class="special">[</span><span class="number">0</span><span class="special">]</span>
  1050. <span class="special">);</span></code>
  1051. </p>
  1052. <p>
  1053. <code class="computeroutput"><span class="identifier">init</span> <span class="special">=</span>
  1054. <span class="keyword">operator</span><span class="special">(</span>
  1055. <span class="identifier">init</span> <span class="special">,</span>
  1056. <span class="identifier">state</span><span class="special">[</span><span class="number">1</span><span class="special">]</span>
  1057. <span class="special">)</span></code>
  1058. </p>
  1059. <p>
  1060. <code class="computeroutput"><span class="special">...</span></code>
  1061. </p>
  1062. </td>
  1063. </tr>
  1064. </tbody>
  1065. </table></div>
  1066. </div>
  1067. <div class="section">
  1068. <div class="titlepage"><div><div><h5 class="title">
  1069. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.point_type"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.algebras_and_operations.point_type" title="Point type">Point
  1070. type</a>
  1071. </h5></div></div></div>
  1072. <p>
  1073. Here we show how to implement the required operators on a state type.
  1074. As example we define a new class <code class="computeroutput"><span class="identifier">point3D</span></code>
  1075. representing a three-dimensional vector with components x,y,z and define
  1076. addition and scalar multiplication operators for it. We use <a href="http://www.boost.org/doc/libs/release/libs/utility/operators.htm" target="_top">Boost.Operators</a>
  1077. to reduce the amount of code to be written. The class for the point type
  1078. looks as follows:
  1079. </p>
  1080. <p>
  1081. </p>
  1082. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">point3D</span> <span class="special">:</span>
  1083. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">additive1</span><span class="special">&lt;</span> <span class="identifier">point3D</span> <span class="special">,</span>
  1084. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">additive2</span><span class="special">&lt;</span> <span class="identifier">point3D</span> <span class="special">,</span> <span class="keyword">double</span> <span class="special">,</span>
  1085. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiplicative2</span><span class="special">&lt;</span> <span class="identifier">point3D</span> <span class="special">,</span> <span class="keyword">double</span> <span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
  1086. <span class="special">{</span>
  1087. <span class="keyword">public</span><span class="special">:</span>
  1088. <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">y</span> <span class="special">,</span> <span class="identifier">z</span><span class="special">;</span>
  1089. <span class="identifier">point3D</span><span class="special">()</span>
  1090. <span class="special">:</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">0.0</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">y</span><span class="special">(</span> <span class="number">0.0</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">z</span><span class="special">(</span> <span class="number">0.0</span> <span class="special">)</span>
  1091. <span class="special">{</span> <span class="special">}</span>
  1092. <span class="identifier">point3D</span><span class="special">(</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">val</span> <span class="special">)</span>
  1093. <span class="special">:</span> <span class="identifier">x</span><span class="special">(</span> <span class="identifier">val</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">y</span><span class="special">(</span> <span class="identifier">val</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">z</span><span class="special">(</span> <span class="identifier">val</span> <span class="special">)</span>
  1094. <span class="special">{</span> <span class="special">}</span>
  1095. <span class="identifier">point3D</span><span class="special">(</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">_x</span> <span class="special">,</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">_y</span> <span class="special">,</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">_z</span> <span class="special">)</span>
  1096. <span class="special">:</span> <span class="identifier">x</span><span class="special">(</span> <span class="identifier">_x</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">y</span><span class="special">(</span> <span class="identifier">_y</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">z</span><span class="special">(</span> <span class="identifier">_z</span> <span class="special">)</span>
  1097. <span class="special">{</span> <span class="special">}</span>
  1098. <span class="identifier">point3D</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">+=(</span> <span class="keyword">const</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">p</span> <span class="special">)</span>
  1099. <span class="special">{</span>
  1100. <span class="identifier">x</span> <span class="special">+=</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">x</span><span class="special">;</span> <span class="identifier">y</span> <span class="special">+=</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">y</span><span class="special">;</span> <span class="identifier">z</span> <span class="special">+=</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">z</span><span class="special">;</span>
  1101. <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
  1102. <span class="special">}</span>
  1103. <span class="identifier">point3D</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*=(</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">a</span> <span class="special">)</span>
  1104. <span class="special">{</span>
  1105. <span class="identifier">x</span> <span class="special">*=</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">y</span> <span class="special">*=</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">z</span> <span class="special">*=</span> <span class="identifier">a</span><span class="special">;</span>
  1106. <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
  1107. <span class="special">}</span>
  1108. <span class="special">};</span>
  1109. </pre>
  1110. <p>
  1111. </p>
  1112. <p>
  1113. By deriving from <a href="http://www.boost.org/doc/libs/release/libs/utility/operators.htm" target="_top">Boost.Operators</a>
  1114. classes we don't have to define outer class operators like <code class="computeroutput"><span class="keyword">operator</span><span class="special">+(</span> <span class="identifier">point3D</span> <span class="special">,</span>
  1115. <span class="identifier">point3D</span> <span class="special">)</span></code>
  1116. because that is taken care of by the operators library. Note that for
  1117. simple Runge-Kutta schemes (like <code class="computeroutput"><span class="identifier">runge_kutta4</span></code>)
  1118. only the <code class="computeroutput"><span class="special">+</span></code> and <code class="computeroutput"><span class="special">*</span></code> operators are required. If, however,
  1119. a controlled stepper is used one also needs to specify the division operator
  1120. <code class="computeroutput"><span class="special">/</span></code> because calculation of
  1121. the error term involves an element wise division of the state types.
  1122. Additionally, controlled steppers require an <code class="computeroutput"><span class="identifier">abs</span></code>
  1123. function calculating the element-wise absolute value for the state type:
  1124. </p>
  1125. <p>
  1126. </p>
  1127. <pre class="programlisting"><span class="comment">// only required for steppers with error control</span>
  1128. <span class="identifier">point3D</span> <span class="keyword">operator</span><span class="special">/(</span> <span class="keyword">const</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">p1</span> <span class="special">,</span> <span class="keyword">const</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">p2</span> <span class="special">)</span>
  1129. <span class="special">{</span>
  1130. <span class="keyword">return</span> <span class="identifier">point3D</span><span class="special">(</span> <span class="identifier">p1</span><span class="special">.</span><span class="identifier">x</span><span class="special">/</span><span class="identifier">p2</span><span class="special">.</span><span class="identifier">x</span> <span class="special">,</span> <span class="identifier">p1</span><span class="special">.</span><span class="identifier">y</span><span class="special">/</span><span class="identifier">p2</span><span class="special">.</span><span class="identifier">y</span> <span class="special">,</span> <span class="identifier">p1</span><span class="special">.</span><span class="identifier">z</span><span class="special">/</span><span class="identifier">p2</span><span class="special">.</span><span class="identifier">z</span> <span class="special">);</span>
  1131. <span class="special">}</span>
  1132. <span class="identifier">point3D</span> <span class="identifier">abs</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">p</span> <span class="special">)</span>
  1133. <span class="special">{</span>
  1134. <span class="keyword">return</span> <span class="identifier">point3D</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">(</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">x</span><span class="special">)</span> <span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">(</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">y</span><span class="special">)</span> <span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">(</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">z</span><span class="special">)</span> <span class="special">);</span>
  1135. <span class="special">}</span>
  1136. </pre>
  1137. <p>
  1138. </p>
  1139. <p>
  1140. Finally, we have to provide a specialization to calculate the infintity
  1141. norm of a state:
  1142. </p>
  1143. <p>
  1144. </p>
  1145. <pre class="programlisting"><span class="comment">// also only for steppers with error control</span>
  1146. <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">odeint</span> <span class="special">{</span>
  1147. <span class="keyword">template</span><span class="special">&lt;&gt;</span>
  1148. <span class="keyword">struct</span> <span class="identifier">vector_space_norm_inf</span><span class="special">&lt;</span> <span class="identifier">point3D</span> <span class="special">&gt;</span>
  1149. <span class="special">{</span>
  1150. <span class="keyword">typedef</span> <span class="keyword">double</span> <span class="identifier">result_type</span><span class="special">;</span>
  1151. <span class="keyword">double</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">p</span> <span class="special">)</span> <span class="keyword">const</span>
  1152. <span class="special">{</span>
  1153. <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">max</span><span class="special">;</span>
  1154. <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">;</span>
  1155. <span class="keyword">return</span> <span class="identifier">max</span><span class="special">(</span> <span class="identifier">max</span><span class="special">(</span> <span class="identifier">abs</span><span class="special">(</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">x</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">abs</span><span class="special">(</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">y</span> <span class="special">)</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">abs</span><span class="special">(</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">z</span> <span class="special">)</span> <span class="special">);</span>
  1156. <span class="special">}</span>
  1157. <span class="special">};</span>
  1158. <span class="special">}</span> <span class="special">}</span> <span class="special">}</span>
  1159. </pre>
  1160. <p>
  1161. </p>
  1162. <p>
  1163. Again, note that the two last steps were only required if you want to
  1164. use controlled steppers. For simple steppers definition of the simple
  1165. <code class="computeroutput"><span class="special">+=</span></code> and <code class="computeroutput"><span class="special">*=</span></code>
  1166. operators are sufficient. Having defined such a point type, we can easily
  1167. perform the integration on a Lorenz system by explicitely configuring
  1168. the <code class="computeroutput"><span class="identifier">vector_space_algebra</span></code>
  1169. in the stepper's template argument list:
  1170. </p>
  1171. <p>
  1172. </p>
  1173. <pre class="programlisting"><span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">sigma</span> <span class="special">=</span> <span class="number">10.0</span><span class="special">;</span>
  1174. <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">R</span> <span class="special">=</span> <span class="number">28.0</span><span class="special">;</span>
  1175. <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">8.0</span> <span class="special">/</span> <span class="number">3.0</span><span class="special">;</span>
  1176. <span class="keyword">void</span> <span class="identifier">lorenz</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">x</span> <span class="special">,</span> <span class="identifier">point3D</span> <span class="special">&amp;</span><span class="identifier">dxdt</span> <span class="special">,</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">t</span> <span class="special">)</span>
  1177. <span class="special">{</span>
  1178. <span class="identifier">dxdt</span><span class="special">.</span><span class="identifier">x</span> <span class="special">=</span> <span class="identifier">sigma</span> <span class="special">*</span> <span class="special">(</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">y</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">x</span> <span class="special">);</span>
  1179. <span class="identifier">dxdt</span><span class="special">.</span><span class="identifier">y</span> <span class="special">=</span> <span class="identifier">R</span> <span class="special">*</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">y</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">x</span> <span class="special">*</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">z</span><span class="special">;</span>
  1180. <span class="identifier">dxdt</span><span class="special">.</span><span class="identifier">z</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">b</span> <span class="special">*</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">z</span> <span class="special">+</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">x</span> <span class="special">*</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">y</span><span class="special">;</span>
  1181. <span class="special">}</span>
  1182. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">;</span>
  1183. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  1184. <span class="special">{</span>
  1185. <span class="identifier">point3D</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">10.0</span> <span class="special">,</span> <span class="number">5.0</span> <span class="special">,</span> <span class="number">5.0</span> <span class="special">);</span>
  1186. <span class="comment">// point type defines it's own operators -&gt; use vector_space_algebra !</span>
  1187. <span class="keyword">typedef</span> <span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">point3D</span> <span class="special">,</span> <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">point3D</span> <span class="special">,</span>
  1188. <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">vector_space_algebra</span> <span class="special">&gt;</span> <span class="identifier">stepper</span><span class="special">;</span>
  1189. <span class="keyword">int</span> <span class="identifier">steps</span> <span class="special">=</span> <span class="identifier">integrate_adaptive</span><span class="special">(</span> <span class="identifier">make_controlled</span><span class="special">&lt;</span><span class="identifier">stepper</span><span class="special">&gt;(</span> <span class="number">1E-10</span> <span class="special">,</span> <span class="number">1E-10</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">lorenz</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span>
  1190. <span class="number">0.0</span> <span class="special">,</span> <span class="number">10.0</span> <span class="special">,</span> <span class="number">0.1</span> <span class="special">);</span>
  1191. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  1192. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"steps: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">steps</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  1193. <span class="special">}</span>
  1194. </pre>
  1195. <p>
  1196. </p>
  1197. <p>
  1198. The whole example can be found in <a href="https://github.com/headmyshoulder/odeint-v2/blob/master/examples/lorenz_point.cpp" target="_top">lorenz_point.cpp</a>
  1199. </p>
  1200. <div class="note"><table border="0" summary="Note">
  1201. <tr>
  1202. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
  1203. <th align="left">Note</th>
  1204. </tr>
  1205. <tr><td align="left" valign="top"><p>
  1206. For the most <code class="computeroutput"><span class="identifier">state_types</span></code>,
  1207. odeint is able to automatically determine the correct algebra and operations.
  1208. But if you want to use your own <code class="computeroutput"><span class="identifier">state_type</span></code>,
  1209. as in this example with <code class="computeroutput"><span class="identifier">point3D</span></code>,
  1210. you have to manually configure the right algebra/operations, unless
  1211. your <code class="computeroutput"><span class="identifier">state_type</span></code> works
  1212. with the default choice of <code class="computeroutput"><span class="identifier">range_algebra</span></code>
  1213. and <code class="computeroutput"><span class="identifier">default_operations</span></code>.
  1214. </p></td></tr>
  1215. </table></div>
  1216. </div>
  1217. </div>
  1218. <p>
  1219. gsl_vector, gsl_matrix, ublas::matrix, blitz::matrix, thrust
  1220. </p>
  1221. <div class="section">
  1222. <div class="titlepage"><div><div><h4 class="title">
  1223. <a name="boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.adapt_your_own_operations"></a><a class="link" href="state_types__algebras_and_operations.html#boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations.adapt_your_own_operations" title="Adapt your own operations">Adapt
  1224. your own operations</a>
  1225. </h4></div></div></div>
  1226. <p>
  1227. to be continued
  1228. </p>
  1229. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  1230. <li class="listitem">
  1231. thrust
  1232. </li>
  1233. <li class="listitem">
  1234. gsl_complex
  1235. </li>
  1236. <li class="listitem">
  1237. min, max, pow
  1238. </li>
  1239. </ul></div>
  1240. </div>
  1241. </div>
  1242. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  1243. <td align="left"></td>
  1244. <td align="right"><div class="copyright-footer">Copyright &#169; 2009-2015 Karsten Ahnert and Mario Mulansky<p>
  1245. Distributed under the Boost Software License, Version 1.0. (See accompanying
  1246. 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>)
  1247. </p>
  1248. </div></td>
  1249. </tr></table>
  1250. <hr>
  1251. <div class="spirit-nav">
  1252. <a accesskey="p" href="iterators_and_ranges.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="using_boost__ref.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  1253. </div>
  1254. </body>
  1255. </html>