1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>State Algebra 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 1. Boost.Numeric.Odeint"> 8<link rel="up" href="../concepts.html" title="Concepts"> 9<link rel="prev" href="dense_output_stepper.html" title="Dense Output Stepper"> 10<link rel="next" href="state_wrapper.html" title="State Wrapper"> 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="dense_output_stepper.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../concepts.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="state_wrapper.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.concepts.state_algebra_operations"></a><a class="link" href="state_algebra_operations.html" title="State Algebra Operations">State 28 Algebra Operations</a> 29</h3></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.operations">Operations</a></span></dt> 32<dt><span class="section"><a href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.algebra">Algebra</a></span></dt> 33<dt><span class="section"><a href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.pre_defined_implementations">Pre-Defined 34 implementations</a></span></dt> 35<dt><span class="section"><a href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.example_expressions">Example 36 expressions</a></span></dt> 37</dl></div> 38<div class="note"><table border="0" summary="Note"> 39<tr> 40<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> 41<th align="left">Note</th> 42</tr> 43<tr><td align="left" valign="top"><p> 44 The following does not apply to implicit steppers like implicit_euler or 45 Rosenbrock 4 as there the <code class="computeroutput"><span class="identifier">state_type</span></code> 46 can not be changed from <code class="computeroutput"><span class="identifier">ublas</span><span class="special">::</span><span class="identifier">vector</span></code> 47 and no algebra/operations are used. 48 </p></td></tr> 49</table></div> 50<h5> 51<a name="boost_numeric_odeint.concepts.state_algebra_operations.h0"></a> 52 <span class="phrase"><a name="boost_numeric_odeint.concepts.state_algebra_operations.description"></a></span><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.description">Description</a> 53 </h5> 54<p> 55 The <code class="computeroutput"><span class="identifier">State</span></code>, <code class="computeroutput"><span class="identifier">Algebra</span></code> and <code class="computeroutput"><span class="identifier">Operations</span></code> 56 together define a concept describing how the mathematical vector operations 57 required for the stepper algorithms are performed. The typical vector operation 58 done within steppers is 59 </p> 60<p> 61 <span class="emphasis"><em><span class="bold"><strong>y</strong></span> = Σ α<sub>i</sub> <span class="bold"><strong>x<sub>i</sub></strong></span></em></span>. 62 </p> 63<p> 64 The <code class="computeroutput"><span class="identifier">State</span></code> represents the 65 state variable of an ODE, usually denoted with <span class="emphasis"><em>x</em></span>. Algorithmically, 66 the state is often realized as a <code class="computeroutput"><span class="identifier">vector</span><span class="special"><</span> <span class="keyword">double</span> <span class="special">></span></code> or <code class="computeroutput"><span class="identifier">array</span><span class="special"><</span> <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">N</span> <span class="special">></span></code>, 67 however, the genericity of odeint enables you to basically use anything as 68 a state type. The algorithmic counterpart of such mathematical expressions 69 is divided into two parts. First, the <code class="computeroutput"><span class="identifier">Algebra</span></code> 70 is used to account for the vector character of the equation. In the case 71 of a <code class="computeroutput"><span class="identifier">vector</span></code> as state type 72 this means the <code class="computeroutput"><span class="identifier">Algebra</span></code> is 73 responsible for iteration over all vector elements. Second, the <code class="computeroutput"><span class="identifier">Operations</span></code> are used to represent the actual 74 operation applied to each of the vector elements. So the <code class="computeroutput"><span class="identifier">Algebra</span></code> 75 iterates over all elements of the <code class="computeroutput"><span class="identifier">State</span></code>s 76 and calls an operation taken from the <code class="computeroutput"><span class="identifier">Operations</span></code> 77 for each element. This is where <code class="computeroutput"><span class="identifier">State</span></code>, 78 <code class="computeroutput"><span class="identifier">Algebra</span></code> and <code class="computeroutput"><span class="identifier">Operations</span></code> have to work together to make 79 odeint running. Please have a look at the <code class="computeroutput"><span class="identifier">range_algebra</span></code> 80 and <code class="computeroutput"><span class="identifier">default_operations</span></code> to 81 see an example how this is implemented. 82 </p> 83<p> 84 In the following we describe how <code class="computeroutput"><span class="identifier">State</span></code>, 85 <code class="computeroutput"><span class="identifier">Algebra</span></code> and <code class="computeroutput"><span class="identifier">Operations</span></code> are used together within the 86 stepper implementations. 87 </p> 88<div class="section"> 89<div class="titlepage"><div><div><h4 class="title"> 90<a name="boost_numeric_odeint.concepts.state_algebra_operations.operations"></a><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.operations" title="Operations">Operations</a> 91</h4></div></div></div> 92<h6> 93<a name="boost_numeric_odeint.concepts.state_algebra_operations.operations.h0"></a> 94 <span class="phrase"><a name="boost_numeric_odeint.concepts.state_algebra_operations.operations.notation"></a></span><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.operations.notation">Notation</a> 95 </h6> 96<div class="variablelist"> 97<p class="title"><b></b></p> 98<dl class="variablelist"> 99<dt><span class="term"><code class="computeroutput"><span class="identifier">Operations</span></code></span></dt> 100<dd><p> 101 The operations type 102 </p></dd> 103<dt><span class="term"><code class="computeroutput"><span class="identifier">Value1</span></code>, ... , 104 <code class="computeroutput"><span class="identifier">ValueN</span></code></span></dt> 105<dd><p> 106 Types representing the value or time type of stepper 107 </p></dd> 108<dt><span class="term"><code class="computeroutput"><span class="identifier">Scale</span></code></span></dt> 109<dd><p> 110 Type of the scale operation 111 </p></dd> 112<dt><span class="term"><code class="computeroutput"><span class="identifier">scale</span></code></span></dt> 113<dd><p> 114 Object of type <code class="computeroutput"><span class="identifier">Scale</span></code> 115 </p></dd> 116<dt><span class="term"><code class="literal">ScaleSum<span class="emphasis"><em>N</em></span></code></span></dt> 117<dd><p> 118 Type that represents a general scale_sum operation, <code class="literal"><span class="emphasis"><em>N</em></span></code> 119 should be replaced by a number from 1 to 14. 120 </p></dd> 121<dt><span class="term"><code class="literal">scale_sum<span class="emphasis"><em>N</em></span></code></span></dt> 122<dd><p> 123 Object of type <code class="literal">ScaleSum<span class="emphasis"><em>N</em></span></code>, 124 <code class="literal"><span class="emphasis"><em>N</em></span></code> should be replaced by a 125 number from 1 to 14. 126 </p></dd> 127<dt><span class="term"><code class="computeroutput"><span class="identifier">ScaleSumSwap2</span></code></span></dt> 128<dd><p> 129 Type of the scale sum swap operation 130 </p></dd> 131<dt><span class="term"><code class="computeroutput"><span class="identifier">scale_sum_swap2</span></code></span></dt> 132<dd><p> 133 Object of type <code class="computeroutput"><span class="identifier">ScaleSumSwap2</span></code> 134 </p></dd> 135<dt><span class="term"><code class="computeroutput"><span class="identifier">a1</span><span class="special">,</span> 136 <span class="identifier">a2</span><span class="special">,</span> 137 <span class="special">...</span></code></span></dt> 138<dd><p> 139 Objects of type <code class="computeroutput"><span class="identifier">Value1</span></code>, 140 <code class="computeroutput"><span class="identifier">Value2</span></code>, ... 141 </p></dd> 142<dt><span class="term"><code class="computeroutput"><span class="identifier">y</span><span class="special">,</span> 143 <span class="identifier">x1</span><span class="special">,</span> 144 <span class="identifier">x2</span><span class="special">,</span> 145 <span class="special">...</span></code></span></dt> 146<dd><p> 147 Objects of <code class="computeroutput"><span class="identifier">State</span></code>'s 148 value type 149 </p></dd> 150</dl> 151</div> 152<h6> 153<a name="boost_numeric_odeint.concepts.state_algebra_operations.operations.h1"></a> 154 <span class="phrase"><a name="boost_numeric_odeint.concepts.state_algebra_operations.operations.valid_expressions"></a></span><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.operations.valid_expressions">Valid 155 Expressions</a> 156 </h6> 157<div class="informaltable"><table class="table"> 158<colgroup> 159<col> 160<col> 161<col> 162<col> 163</colgroup> 164<thead><tr> 165<th> 166 <p> 167 Name 168 </p> 169 </th> 170<th> 171 <p> 172 Expression 173 </p> 174 </th> 175<th> 176 <p> 177 Type 178 </p> 179 </th> 180<th> 181 <p> 182 Semantics 183 </p> 184 </th> 185</tr></thead> 186<tbody> 187<tr> 188<td> 189 <p> 190 Get scale operation 191 </p> 192 </td> 193<td> 194 <p> 195 <code class="computeroutput"><span class="identifier">Operations</span><span class="special">::</span><span class="identifier">scale</span><span class="special"><</span> 196 <span class="identifier">Value</span> <span class="special">></span></code> 197 </p> 198 </td> 199<td> 200 <p> 201 <code class="computeroutput"><span class="identifier">Scale</span></code> 202 </p> 203 </td> 204<td> 205 <p> 206 Get <code class="computeroutput"><span class="identifier">Scale</span></code> from 207 <code class="computeroutput"><span class="identifier">Operations</span></code> 208 </p> 209 </td> 210</tr> 211<tr> 212<td> 213 <p> 214 <code class="computeroutput"><span class="identifier">Scale</span></code> constructor 215 </p> 216 </td> 217<td> 218 <p> 219 <code class="computeroutput"><span class="identifier">Scale</span><span class="special"><</span> 220 <span class="identifier">Value</span> <span class="special">>(</span> 221 <span class="identifier">a</span> <span class="special">)</span></code> 222 </p> 223 </td> 224<td> 225 <p> 226 <code class="computeroutput"><span class="identifier">Scale</span></code> 227 </p> 228 </td> 229<td> 230 <p> 231 Constructs a <code class="computeroutput"><span class="identifier">Scale</span></code> 232 object 233 </p> 234 </td> 235</tr> 236<tr> 237<td> 238 <p> 239 <code class="computeroutput"><span class="identifier">Scale</span></code> operation 240 </p> 241 </td> 242<td> 243 <p> 244 <code class="computeroutput"><span class="identifier">scale</span><span class="special">(</span> 245 <span class="identifier">x</span> <span class="special">)</span></code> 246 </p> 247 </td> 248<td> 249 <p> 250 <code class="computeroutput"><span class="keyword">void</span></code> 251 </p> 252 </td> 253<td> 254 <p> 255 Calculates <code class="computeroutput"><span class="identifier">x</span> <span class="special">*=</span> <span class="identifier">a</span></code> 256 </p> 257 </td> 258</tr> 259<tr> 260<td> 261 <p> 262 Get general <code class="computeroutput"><span class="identifier">scale_sum</span></code> 263 operation 264 </p> 265 </td> 266<td> 267 <p> 268 <code class="literal">Operations::scale_sum<span class="emphasis"><em>N</em></span>< Value1 269 , ... , ValueN ></code> 270 </p> 271 </td> 272<td> 273 <p> 274 <code class="literal">ScaleSum<span class="emphasis"><em>N</em></span></code> 275 </p> 276 </td> 277<td> 278 <p> 279 Get the <code class="literal">ScaleSum<span class="emphasis"><em>N</em></span></code> type 280 from <code class="computeroutput"><span class="identifier">Operations</span></code>, 281 <code class="literal"><span class="emphasis"><em>N</em></span></code> should be replaced 282 by a number from 1 to 14. 283 </p> 284 </td> 285</tr> 286<tr> 287<td> 288 <p> 289 <code class="computeroutput"><span class="identifier">scale_sum</span></code> constructor 290 </p> 291 </td> 292<td> 293 <p> 294 <code class="literal">ScaleSum<span class="emphasis"><em>N</em></span>< Value1 , ... , ValueN 295 >( a1 , ... , aN )</code> 296 </p> 297 </td> 298<td> 299 <p> 300 <code class="literal">ScaleSum<span class="emphasis"><em>N</em></span></code> 301 </p> 302 </td> 303<td> 304 <p> 305 Constructs a <code class="computeroutput"><span class="identifier">scale_sum</span></code> 306 object given <code class="literal"><span class="emphasis"><em>N</em></span></code> parameter 307 values with <code class="literal"><span class="emphasis"><em>N</em></span></code> between 308 1 and 14. 309 </p> 310 </td> 311</tr> 312<tr> 313<td> 314 <p> 315 <code class="computeroutput"><span class="identifier">scale_sum</span></code> operation 316 </p> 317 </td> 318<td> 319 <p> 320 <code class="literal">scale_sum<span class="emphasis"><em>N</em></span>( y , x1 , ... , xN )</code> 321 </p> 322 </td> 323<td> 324 <p> 325 <code class="computeroutput"><span class="keyword">void</span></code> 326 </p> 327 </td> 328<td> 329 <p> 330 Calculates <code class="computeroutput"><span class="identifier">y</span> <span class="special">=</span> <span class="identifier">a1</span><span class="special">*</span><span class="identifier">x1</span> 331 <span class="special">+</span> <span class="identifier">a2</span><span class="special">*</span><span class="identifier">x2</span> 332 <span class="special">+</span> <span class="special">...</span> 333 <span class="special">+</span> <span class="identifier">aN</span><span class="special">*</span><span class="identifier">xN</span></code>. 334 Note that this is an <code class="literal"><span class="emphasis"><em>N</em></span>+1</code>-ary 335 function call. 336 </p> 337 </td> 338</tr> 339<tr> 340<td> 341 <p> 342 Get scale sum swap operation 343 </p> 344 </td> 345<td> 346 <p> 347 <code class="computeroutput"><span class="identifier">Operations</span><span class="special">::</span><span class="identifier">scale_sum_swap2</span><span class="special"><</span> 348 <span class="identifier">Value1</span> <span class="special">,</span> 349 <span class="identifier">Value2</span> <span class="special">></span></code> 350 </p> 351 </td> 352<td> 353 <p> 354 <code class="computeroutput"><span class="identifier">ScaleSumSwap2</span></code> 355 </p> 356 </td> 357<td> 358 <p> 359 Get scale sum swap from operations 360 </p> 361 </td> 362</tr> 363<tr> 364<td> 365 <p> 366 <code class="computeroutput"><span class="identifier">ScaleSumSwap2</span></code> 367 constructor 368 </p> 369 </td> 370<td> 371 <p> 372 <code class="computeroutput"><span class="identifier">ScaleSumSwap2</span><span class="special"><</span> <span class="identifier">Value1</span> 373 <span class="special">,</span> <span class="identifier">Value2</span> 374 <span class="special">>(</span> <span class="identifier">a1</span> 375 <span class="special">,</span> <span class="identifier">a2</span> 376 <span class="special">)</span></code> 377 </p> 378 </td> 379<td> 380 <p> 381 <code class="computeroutput"><span class="identifier">ScaleSumSwap2</span></code> 382 </p> 383 </td> 384<td> 385 <p> 386 Constructor 387 </p> 388 </td> 389</tr> 390<tr> 391<td> 392 <p> 393 <code class="computeroutput"><span class="identifier">ScaleSumSwap2</span></code> 394 operation 395 </p> 396 </td> 397<td> 398 <p> 399 <code class="computeroutput"><span class="identifier">scale_sum_swap2</span><span class="special">(</span> <span class="identifier">x1</span> 400 <span class="special">,</span> <span class="identifier">x2</span> 401 <span class="special">,</span> <span class="identifier">x3</span> 402 <span class="special">)</span></code> 403 </p> 404 </td> 405<td> 406 <p> 407 <code class="computeroutput"><span class="keyword">void</span></code> 408 </p> 409 </td> 410<td> 411 <p> 412 Calculates <code class="computeroutput"><span class="identifier">tmp</span> <span class="special">=</span> <span class="identifier">x1</span></code>, 413 <code class="computeroutput"><span class="identifier">x1</span> <span class="special">=</span> 414 <span class="identifier">a1</span><span class="special">*</span><span class="identifier">x2</span> <span class="special">+</span> 415 <span class="identifier">a2</span><span class="special">*</span><span class="identifier">x3</span></code> and <code class="computeroutput"><span class="identifier">x2</span> 416 <span class="special">=</span> <span class="identifier">tmp</span></code>. 417 </p> 418 </td> 419</tr> 420</tbody> 421</table></div> 422</div> 423<div class="section"> 424<div class="titlepage"><div><div><h4 class="title"> 425<a name="boost_numeric_odeint.concepts.state_algebra_operations.algebra"></a><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.algebra" title="Algebra">Algebra</a> 426</h4></div></div></div> 427<h6> 428<a name="boost_numeric_odeint.concepts.state_algebra_operations.algebra.h0"></a> 429 <span class="phrase"><a name="boost_numeric_odeint.concepts.state_algebra_operations.algebra.notation"></a></span><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.algebra.notation">Notation</a> 430 </h6> 431<div class="variablelist"> 432<p class="title"><b></b></p> 433<dl class="variablelist"> 434<dt><span class="term"><code class="computeroutput"><span class="identifier">State</span></code></span></dt> 435<dd><p> 436 The state type 437 </p></dd> 438<dt><span class="term"><code class="computeroutput"><span class="identifier">Algebra</span></code></span></dt> 439<dd><p> 440 The algebra type 441 </p></dd> 442<dt><span class="term"><code class="literal">Operation<span class="emphasis"><em>N</em></span></code></span></dt> 443<dd><p> 444 An <code class="literal"><span class="emphasis"><em>N</em></span></code>-ary operation type, 445 <code class="literal"><span class="emphasis"><em>N</em></span></code> should be a number from 446 1 to 14. 447 </p></dd> 448<dt><span class="term"><code class="computeroutput"><span class="identifier">algebra</span></code></span></dt> 449<dd><p> 450 Object of type <code class="computeroutput"><span class="identifier">Algebra</span></code> 451 </p></dd> 452<dt><span class="term"><code class="literal">operation<span class="emphasis"><em>N</em></span></code></span></dt> 453<dd><p> 454 Object of type <code class="literal">Operation<span class="emphasis"><em>N</em></span></code> 455 </p></dd> 456<dt><span class="term"><code class="computeroutput"><span class="identifier">y</span><span class="special">,</span> 457 <span class="identifier">x1</span><span class="special">,</span> 458 <span class="identifier">x2</span><span class="special">,</span> 459 <span class="special">...</span></code></span></dt> 460<dd><p> 461 Objects of type <code class="computeroutput"><span class="identifier">State</span></code> 462 </p></dd> 463</dl> 464</div> 465<h6> 466<a name="boost_numeric_odeint.concepts.state_algebra_operations.algebra.h1"></a> 467 <span class="phrase"><a name="boost_numeric_odeint.concepts.state_algebra_operations.algebra.valid_expressions"></a></span><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.algebra.valid_expressions">Valid 468 Expressions</a> 469 </h6> 470<div class="informaltable"><table class="table"> 471<colgroup> 472<col> 473<col> 474<col> 475<col> 476</colgroup> 477<thead><tr> 478<th> 479 <p> 480 Name 481 </p> 482 </th> 483<th> 484 <p> 485 Expression 486 </p> 487 </th> 488<th> 489 <p> 490 Type 491 </p> 492 </th> 493<th> 494 <p> 495 Semantics 496 </p> 497 </th> 498</tr></thead> 499<tbody> 500<tr> 501<td> 502 <p> 503 Vector Operation with arity 2 504 </p> 505 </td> 506<td> 507 <p> 508 <code class="computeroutput"><span class="identifier">algebra</span><span class="special">.</span><span class="identifier">for_each2</span><span class="special">(</span> 509 <span class="identifier">y</span> <span class="special">,</span> 510 <span class="identifier">x</span> <span class="special">,</span> 511 <span class="identifier">operation2</span> <span class="special">)</span></code> 512 </p> 513 </td> 514<td> 515 <p> 516 void 517 </p> 518 </td> 519<td> 520 <p> 521 Calls <code class="computeroutput"><span class="identifier">operation2</span><span class="special">(</span> <span class="identifier">y_i</span> 522 <span class="special">,</span> <span class="identifier">x_i</span> 523 <span class="special">)</span></code> for each element <code class="computeroutput"><span class="identifier">y_i</span></code> of <code class="computeroutput"><span class="identifier">y</span></code> 524 and <code class="computeroutput"><span class="identifier">x_i</span></code> of <code class="computeroutput"><span class="identifier">x</span></code>. 525 </p> 526 </td> 527</tr> 528<tr> 529<td> 530 <p> 531 Vector Operation with arity 3 532 </p> 533 </td> 534<td> 535 <p> 536 <code class="computeroutput"><span class="identifier">algebra</span><span class="special">.</span><span class="identifier">for_each3</span><span class="special">(</span> 537 <span class="identifier">y</span> <span class="special">,</span> 538 <span class="identifier">x1</span> <span class="special">,</span> 539 <span class="identifier">x2</span> <span class="special">,</span> 540 <span class="identifier">operation3</span> <span class="special">)</span></code> 541 </p> 542 </td> 543<td> 544 <p> 545 void 546 </p> 547 </td> 548<td> 549 <p> 550 Calls <code class="computeroutput"><span class="identifier">operation3</span><span class="special">(</span> <span class="identifier">y_i</span> 551 <span class="special">,</span> <span class="identifier">x1_i</span> 552 <span class="special">,</span> <span class="identifier">x2_i</span> 553 <span class="special">)</span></code> for each element <code class="computeroutput"><span class="identifier">y_i</span></code> of <code class="computeroutput"><span class="identifier">y</span></code> 554 and <code class="computeroutput"><span class="identifier">x1_i</span></code> of 555 <code class="computeroutput"><span class="identifier">x1</span></code> and <code class="computeroutput"><span class="identifier">x2_i</span></code> of <code class="computeroutput"><span class="identifier">x2</span></code>. 556 </p> 557 </td> 558</tr> 559<tr> 560<td> 561 <p> 562 Vector Operation with arity <code class="literal"><span class="emphasis"><em>N</em></span></code> 563 </p> 564 </td> 565<td> 566 <p> 567 <code class="literal">algebra.for_each<span class="emphasis"><em>N</em></span>( y , x1 , ... 568 , xN , operation<span class="emphasis"><em>N</em></span> )</code> 569 </p> 570 </td> 571<td> 572 <p> 573 void 574 </p> 575 </td> 576<td> 577 <p> 578 Calls <code class="literal">operation<span class="emphasis"><em>N</em></span>( y_i , x1_i , 579 ... , xN_i )</code> for each element <code class="computeroutput"><span class="identifier">y_i</span></code> 580 of <code class="computeroutput"><span class="identifier">y</span></code> and <code class="computeroutput"><span class="identifier">x1_i</span></code> of <code class="computeroutput"><span class="identifier">x1</span></code> 581 and so on. <code class="literal"><span class="emphasis"><em>N</em></span></code> should be 582 replaced by a number between 1 and 14. 583 </p> 584 </td> 585</tr> 586</tbody> 587</table></div> 588</div> 589<div class="section"> 590<div class="titlepage"><div><div><h4 class="title"> 591<a name="boost_numeric_odeint.concepts.state_algebra_operations.pre_defined_implementations"></a><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.pre_defined_implementations" title="Pre-Defined implementations">Pre-Defined 592 implementations</a> 593</h4></div></div></div> 594<p> 595 As standard configuration odeint uses the <code class="computeroutput"><span class="identifier">range_algebra</span></code> 596 and <code class="computeroutput"><span class="identifier">default_operations</span></code> 597 which suffices most situations. However, a few more possibilities exist 598 either to gain better performance or to ensure interoperability with other 599 libraries. In the following we list the existing <code class="computeroutput"><span class="identifier">Algebra</span></code>/<code class="computeroutput"><span class="identifier">Operations</span></code> configurations that can be 600 used in the steppers. 601 </p> 602<div class="informaltable"><table class="table"> 603<colgroup> 604<col> 605<col> 606<col> 607<col> 608</colgroup> 609<thead><tr> 610<th> 611 <p> 612 <code class="computeroutput"><span class="identifier">State</span></code> 613 </p> 614 </th> 615<th> 616 <p> 617 <code class="computeroutput"><span class="identifier">Algebra</span></code> 618 </p> 619 </th> 620<th> 621 <p> 622 <code class="computeroutput"><span class="identifier">Operations</span></code> 623 </p> 624 </th> 625<th> 626 <p> 627 Remarks 628 </p> 629 </th> 630</tr></thead> 631<tbody> 632<tr> 633<td> 634 <p> 635 Anything supporting <a href="http://www.boost.org/doc/libs/release/libs/range/" target="_top">Boost.Range</a>, 636 like <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span></code>, 637 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code>,... based on a <code class="computeroutput"><span class="identifier">value_type</span></code> that supports operators 638 +,* (typically <code class="computeroutput"><span class="keyword">double</span></code>) 639 </p> 640 </td> 641<td> 642 <p> 643 <code class="computeroutput"><span class="identifier">range_algebra</span></code> 644 </p> 645 </td> 646<td> 647 <p> 648 <code class="computeroutput"><span class="identifier">default_operations</span></code> 649 </p> 650 </td> 651<td> 652 <p> 653 Standard implementation, applicable for most typical situations. 654 </p> 655 </td> 656</tr> 657<tr> 658<td> 659 <p> 660 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code> based on a <code class="computeroutput"><span class="identifier">value_type</span></code> that supports operators 661 +,* 662 </p> 663 </td> 664<td> 665 <p> 666 <code class="computeroutput"><span class="identifier">array_algebra</span></code> 667 </p> 668 </td> 669<td> 670 <p> 671 <code class="computeroutput"><span class="identifier">default_operations</span></code> 672 </p> 673 </td> 674<td> 675 <p> 676 Special implementation for boost::array with better performance 677 than <code class="computeroutput"><span class="identifier">range_algebra</span></code> 678 </p> 679 </td> 680</tr> 681<tr> 682<td> 683 <p> 684 Anything that defines operators + within itself and * with scalar 685 (Mathematically spoken, anything that is a vector space). 686 </p> 687 </td> 688<td> 689 <p> 690 <code class="computeroutput"><span class="identifier">vector_space_algebra</span></code> 691 </p> 692 </td> 693<td> 694 <p> 695 <code class="computeroutput"><span class="identifier">default_operations</span></code> 696 </p> 697 </td> 698<td> 699 <p> 700 For the use of <a class="link" href="controlled_stepper.html" title="Controlled Stepper">Controlled 701 Stepper</a>, the template <code class="computeroutput"><span class="identifier">vector_space_reduce</span></code> 702 has to be instantiated. 703 </p> 704 </td> 705</tr> 706<tr> 707<td> 708 <p> 709 <code class="computeroutput"><span class="identifier">thrust</span><span class="special">::</span><span class="identifier">device_vector</span></code>, <code class="computeroutput"><span class="identifier">thrust</span><span class="special">::</span><span class="identifier">host_vector</span></code> 710 </p> 711 </td> 712<td> 713 <p> 714 <code class="computeroutput"><span class="identifier">thrust_algebra</span></code> 715 </p> 716 </td> 717<td> 718 <p> 719 <code class="computeroutput"><span class="identifier">thrust_operations</span></code> 720 </p> 721 </td> 722<td> 723 <p> 724 For running odeint on CUDA devices by using <a href="http://code.google.com/p/thrust/" target="_top">Thrust</a> 725 </p> 726 </td> 727</tr> 728<tr> 729<td> 730 <p> 731 Any RandomAccessRange 732 </p> 733 </td> 734<td> 735 <p> 736 <code class="computeroutput"><span class="identifier">openmp_range_algebra</span></code> 737 </p> 738 </td> 739<td> 740 <p> 741 <code class="computeroutput"><span class="identifier">default_operations</span></code> 742 </p> 743 </td> 744<td> 745 <p> 746 OpenMP-parallelised range algebra 747 </p> 748 </td> 749</tr> 750<tr> 751<td> 752 <p> 753 <code class="computeroutput"><span class="identifier">openmp_state</span></code> 754 </p> 755 </td> 756<td> 757 <p> 758 <code class="computeroutput"><span class="identifier">openmp_algebra</span></code> 759 </p> 760 </td> 761<td> 762 <p> 763 <code class="computeroutput"><span class="identifier">default_operations</span></code> 764 </p> 765 </td> 766<td> 767 <p> 768 OpenMP-parallelised algebra for split data 769 </p> 770 </td> 771</tr> 772<tr> 773<td> 774 <p> 775 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code> or anything which allocates 776 the elements in a C-like manner 777 </p> 778 </td> 779<td> 780 <p> 781 <code class="computeroutput"><span class="identifier">vector_space_algebra</span></code> 782 </p> 783 </td> 784<td> 785 <p> 786 <code class="computeroutput"><span class="identifier">mkl_operations</span></code> 787 </p> 788 </td> 789<td> 790 <p> 791 Using the <a href="http://software.intel.com/en-us/articles/intel-mkl/" target="_top">Intel 792 Math Kernel Library</a> in odeint for maximum performance. 793 Currently, only the RK4 stepper is supported. 794 </p> 795 </td> 796</tr> 797</tbody> 798</table></div> 799</div> 800<div class="section"> 801<div class="titlepage"><div><div><h4 class="title"> 802<a name="boost_numeric_odeint.concepts.state_algebra_operations.example_expressions"></a><a class="link" href="state_algebra_operations.html#boost_numeric_odeint.concepts.state_algebra_operations.example_expressions" title="Example expressions">Example 803 expressions</a> 804</h4></div></div></div> 805<div class="informaltable"><table class="table"> 806<colgroup> 807<col> 808<col> 809<col> 810<col> 811</colgroup> 812<thead><tr> 813<th> 814 <p> 815 Name 816 </p> 817 </th> 818<th> 819 <p> 820 Expression 821 </p> 822 </th> 823<th> 824 <p> 825 Type 826 </p> 827 </th> 828<th> 829 <p> 830 Semantics 831 </p> 832 </th> 833</tr></thead> 834<tbody><tr> 835<td> 836 <p> 837 Vector operation 838 </p> 839 </td> 840<td> 841 <p> 842 <code class="computeroutput"><span class="identifier">algebra</span><span class="special">.</span><span class="identifier">for_each3</span><span class="special">(</span> 843 <span class="identifier">y</span> <span class="special">,</span> 844 <span class="identifier">x1</span> <span class="special">,</span> 845 <span class="identifier">x2</span> <span class="special">,</span> 846 <span class="identifier">Operations</span><span class="special">::</span><span class="identifier">scale_sum2</span><span class="special"><</span> 847 <span class="identifier">Value1</span> <span class="special">,</span> 848 <span class="identifier">Value2</span> <span class="special">>(</span> 849 <span class="identifier">a1</span> <span class="special">,</span> 850 <span class="identifier">a2</span> <span class="special">)</span> 851 <span class="special">)</span></code> 852 </p> 853 </td> 854<td> 855 <p> 856 void 857 </p> 858 </td> 859<td> 860 <p> 861 Calculates <span class="emphasis"><em><span class="bold"><strong>y</strong></span> = a1 862 <span class="bold"><strong>x1</strong></span> + a2 <span class="bold"><strong>x2</strong></span></em></span> 863 </p> 864 </td> 865</tr></tbody> 866</table></div> 867</div> 868</div> 869<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 870<td align="left"></td> 871<td align="right"><div class="copyright-footer">Copyright © 2009-2015 Karsten Ahnert and Mario Mulansky<p> 872 Distributed under the Boost Software License, Version 1.0. (See accompanying 873 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>) 874 </p> 875</div></td> 876</tr></table> 877<hr> 878<div class="spirit-nav"> 879<a accesskey="p" href="dense_output_stepper.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../concepts.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="state_wrapper.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 880</div> 881</body> 882</html> 883