Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r58941 - in sandbox/odeint: boost/numeric/odeint libs/numeric/odeint/doc libs/numeric/odeint/doc/html libs/numeric/odeint/doc/html/odeint libs/numeric/odeint/examples
From: mario.mulansky_at_[hidden]
Date: 2010-01-12 09:41:44


Author: mariomulansky
Date: 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
New Revision: 58941
URL: http://svn.boost.org/trac/boost/changeset/58941

Log:
bugfixes in adaptive_integration
Added:
   sandbox/odeint/libs/numeric/odeint/doc/html/odeint/
   sandbox/odeint/libs/numeric/odeint/doc/html/odeint/quick_guide.html (contents, props changed)
Text files modified:
   sandbox/odeint/boost/numeric/odeint/controlled_stepper_standard.hpp | 9 ++++---
   sandbox/odeint/boost/numeric/odeint/integrator_adaptive_stepsize.hpp | 41 ++++++++++++++++----------------
   sandbox/odeint/boost/numeric/odeint/observer.hpp | 36 ++++++++++------------------
   sandbox/odeint/libs/numeric/odeint/doc/html/index.html | 40 ++++++++++++++++++++++++++-----
   sandbox/odeint/libs/numeric/odeint/doc/html/standalone_HTML.manifest | 1
   sandbox/odeint/libs/numeric/odeint/doc/odeint.qbk | 50 +++++++++++++++++++++++++++++++++++++++
   sandbox/odeint/libs/numeric/odeint/examples/Jamfile | 2 +
   7 files changed, 124 insertions(+), 55 deletions(-)

Modified: sandbox/odeint/boost/numeric/odeint/controlled_stepper_standard.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/controlled_stepper_standard.hpp (original)
+++ sandbox/odeint/boost/numeric/odeint/controlled_stepper_standard.hpp 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -15,6 +15,7 @@
 #define BOOST_NUMERIC_ODEINT_CONTROLLED_STEPPER_STANDARD_HPP
 
 #include <cmath> // for pow( ) and abs()
+#include <algorithm>
 #include <complex>
 
 #include <boost/concept_check.hpp>
@@ -107,7 +108,7 @@
                 err = m_eps_abs + m_eps_rel * (
                     m_a_x * std::abs(*x_start++) +
                     m_a_dxdt * dt * std::abs(*dxdt_start++) );
- max_rel_err = max( std::abs(*x_err_start++)/err , max_rel_err );
+ max_rel_err = std::max( std::abs(*x_err_start++)/err , max_rel_err );
             }
             return max_rel_err;
         }
@@ -160,8 +161,8 @@
             {
                 // error too large - decrease dt
                 // limit scaling factor to 0.2
- dt *= max( 0.9*pow(max_rel_err , -1.0/(m_stepper.order_error()-1.0)),
- 0.2 );
+ dt *= std::max( 0.9*pow(max_rel_err , -1.0/(m_stepper.order_error()-1.0)),
+ 0.2 );
 
                 // reset state
                 x = m_x_tmp;
@@ -174,7 +175,7 @@
                     //error too small - increase dt and keep the evolution
                     t += dt;
                     // limit scaling factor to 5.0
- dt *= min( 0.9*pow(max_rel_err , -1.0/m_stepper.order()), 5.0 );
+ dt *= std::min( 0.9*pow(max_rel_err , -1.0/m_stepper.order()), 5.0 );
                     return step_size_increased;
                 }
                 else

Modified: sandbox/odeint/boost/numeric/odeint/integrator_adaptive_stepsize.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/integrator_adaptive_stepsize.hpp (original)
+++ sandbox/odeint/boost/numeric/odeint/integrator_adaptive_stepsize.hpp 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -75,7 +75,7 @@
     {
         return integrate_adaptive(
                 stepper, system ,
- state, start_time , end_time,
+ state, start_time , end_time, dt,
                 do_nothing_observer<
                     typename ControlledStepper::time_type ,
                     typename ControlledStepper::container_type ,
@@ -102,25 +102,23 @@
     template<
         class ControlledStepper,
         class DynamicalSystem,
- class TimeSequence,
- class InsertIterator
+ class TimeInsertIterator,
+ class StateInsertIterator
>
     size_t integrate(
             ControlledStepper &stepper,
             DynamicalSystem &system,
             typename ControlledStepper::container_type &state,
- TimeSequence &times,
+ typename ControlledStepper::time_type start,
+ typename ControlledStepper::time_type end,
             typename ControlledStepper::time_type dt,
- InsertIterator state_inserter)
+ TimeInsertIterator time_inserter,
+ StateInsertIterator state_inserter)
     {
- if( times.empty() ) return 0;
- else
- {
- state_copy_observer<InsertIterator, TimeSequence>
- observer(times, state_inserter);
- return integrate_adaptive(stepper, system, state,
- times.front() , times.back(), dt , observer);
- }
+ state_copy_observer<TimeInsertIterator, StateInsertIterator>
+ observer(time_inserter, state_inserter);
+ return integrate_adaptive(stepper, system, state,
+ start , end, dt , observer);
     }
 
 
@@ -133,15 +131,17 @@
     template<
             class DynamicalSystem,
             class ContainerType,
- class InsertIterator,
- class TimeSequence,
+ class TimeInsertIterator,
+ class StateInsertIterator,
             class T
>
     size_t integrate(
             DynamicalSystem &system,
- ContainerType &x,
- TimeSequence &times,
- InsertIterator state_inserter,
+ ContainerType &x,
+ T start ,
+ T end ,
+ TimeInsertIterator time_inserter,
+ StateInsertIterator state_inserter,
             T dt = 1E-4,
             T eps_abs = 1E-6,
             T eps_rel = 1E-7,
@@ -149,7 +149,7 @@
             T a_dxdt = 1.0
                      )
     {
- typedef stepper_euler< ContainerType , T > stepper_type;
+ typedef stepper_rk5_ck< ContainerType , T > stepper_type;
         // we use cash karp stepper as base stepper
         stepper_type stepper_cash_karp;
         // we use the standard controller for this adaptive integrator
@@ -158,7 +158,8 @@
         // initialized with values from above
         
         // call the normal integrator
- return integrate(controlled_stepper, system, x, times, dt, state_inserter);
+ return integrate(controlled_stepper, system, x,
+ start, end, dt, time_inserter, state_inserter);
     }
     
 

Modified: sandbox/odeint/boost/numeric/odeint/observer.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/observer.hpp (original)
+++ sandbox/odeint/boost/numeric/odeint/observer.hpp 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -20,47 +20,37 @@
 namespace odeint {
 
 
- template< class Time , class Container , class System >
+ template< class Time, class Container , class System >
     inline void do_nothing_observer( Time , Container& , System& )
     {
     }
     
 
 
- template< class InsertIterator, class TimeSequence = std::vector<double> >
+ template< class TimeInsertIterator, class StateInsertIterator >
     class state_copy_observer
     {
         
     private:
 
- TimeSequence &m_times;
- InsertIterator m_state_inserter;
- typename TimeSequence::iterator m_time_iter;
-
- typedef typename TimeSequence::value_type time_type;
-
+ TimeInsertIterator m_time_inserter;
+ StateInsertIterator m_state_inserter;
 
     public:
 
- state_copy_observer( TimeSequence &times ,
- InsertIterator state_inserter )
- : m_times(times),
- m_state_inserter(state_inserter),
- m_time_iter(m_times.begin())
+ state_copy_observer( TimeInsertIterator time_inserter ,
+ StateInsertIterator state_inserter )
+ : m_time_inserter(time_inserter),
+ m_state_inserter(state_inserter)
         { }
 
- void reset( void ) { m_time_iter = m_times.begin(); }
+ void reset( void ) { }
         
- template< class Container, class System >
- void operator () (time_type t, Container &state, System &system )
+ template< class Time, class Container, class System >
+ void operator () (Time t, Container &state, System &system )
         {
- if( ( m_time_iter != m_times.end() ) &&
- ( t >= *m_time_iter ) )
- {
- // we've reached the next time point
- *m_state_inserter++ = state; // insert the state
- m_time_iter++; // next time point
- }
+ *m_time_inserter++ = t; // insert time
+ *m_state_inserter++ = state; // insert state
         }
     };
 

Modified: sandbox/odeint/libs/numeric/odeint/doc/html/index.html
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/doc/html/index.html (original)
+++ sandbox/odeint/libs/numeric/odeint/doc/html/index.html 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -5,6 +5,7 @@
 <link rel="stylesheet" href="boostbook.css" type="text/css">
 <meta name="generator" content="DocBook XSL Stylesheets V1.73.2">
 <link rel="start" href="index.html" title="Chapter 1. boost.sandbox.numeric.odeint">
+<link rel="next" href="odeint/quick_guide.html" title="Quick Guide">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table cellpadding="2" width="100%"><tr>
@@ -16,7 +17,7 @@
 <td align="center">More</td>
 </tr></table>
 <hr>
-<div class="spirit-nav"></div>
+<div class="spirit-nav"><a accesskey="n" href="odeint/quick_guide.html"><img src="../../doc/html/images/next.png" alt="Next"></a></div>
 <div class="chapter" lang="en">
 <div class="titlepage"><div>
 <div><h2 class="title">
@@ -29,7 +30,7 @@
 </h3></div></div>
 <div><p class="copyright">Copyright © 2009 Karsten Ahnert and Mario Mulansky</p></div>
 <div><div class="legalnotice">
-<a name="id325363"></a><p>
+<a name="id357869"></a><p>
         Distributed under the Boost Software License, Version 1.0. (See accompanying
         file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       </p>
@@ -37,7 +38,10 @@
 </div></div>
 <div class="toc">
 <p><b>Table of Contents</b></p>
-<dl><dt><span class="section">Overview</span></dt></dl>
+<dl>
+<dt><span class="section">Overview</span></dt>
+<dt><span class="section">Quick Guide</span></dt>
+</dl>
 </div>
 <div class="section" lang="en">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -57,7 +61,7 @@
       for real life problems and serves just as illustrative example. In <span class="bold"><strong>odeint</strong></span>, the following algorithms are implemented:
     </p>
 <div class="table">
-<a name="id326850"></a><p class="title"><b>Table 1.1. Stepper Algorithms</b></p>
+<a name="id326900"></a><p class="title"><b>Table 1.1. Stepper Algorithms</b></p>
 <div class="table-contents"><table class="table" summary="Stepper Algorithms">
 <colgroup>
 <col>
@@ -172,7 +176,7 @@
           </td>
 <td>
           <p>
- Yes (Order 5)
+ Yes (Order 8)
           </p>
           </td>
 </tr>
@@ -198,6 +202,28 @@
           </p>
           </td>
 </tr>
+<tr>
+<td>
+ <p>
+ Bulirsch-Stoer
+ </p>
+ </td>
+<td>
+ <p>
+ controlled_stepper_bs
+ </p>
+ </td>
+<td>
+ <p>
+ variable
+ </p>
+ </td>
+<td>
+ <p>
+ Controlled
+ </p>
+ </td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -205,10 +231,10 @@
 </div>
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: January 03, 2010 at 17:51:02 GMT</small></p></td>
+<td align="left"><p><small>Last revised: January 12, 2010 at 14:09:33 GMT</small></p></td>
 <td align="right"><div class="copyright-footer"></div></td>
 </tr></table>
 <hr>
-<div class="spirit-nav"></div>
+<div class="spirit-nav"><a accesskey="n" href="odeint/quick_guide.html"><img src="../../doc/html/images/next.png" alt="Next"></a></div>
 </body>
 </html>

Added: sandbox/odeint/libs/numeric/odeint/doc/html/odeint/quick_guide.html
==============================================================================
--- (empty file)
+++ sandbox/odeint/libs/numeric/odeint/doc/html/odeint/quick_guide.html 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -0,0 +1,132 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Quick Guide</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.73.2">
+<link rel="start" href="../index.html" title="Chapter 1. boost.sandbox.numeric.odeint">
+<link rel="up" href="../index.html" title="Chapter 1. boost.sandbox.numeric.odeint">
+<link rel="prev" href="../index.html" title="Chapter 1. boost.sandbox.numeric.odeint">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/html/images/home.png" alt="Home"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="odeint.quick_guide"></a><a class="link" href="quick_guide.html" title="Quick Guide">Quick Guide</a>
+</h2></div></div></div>
+<p>
+ This section gives a quick introduction to the most important features of the
+ library using a number of instructive examples. Image, for example, you want
+ to numerically integrate a harmonic oscillator with friction. The equations
+ of motion are given by x'' = -x + gamma x'. This can be transformed to a system
+ of two first-order differential equations with new variables x and p=x'. To
+ apply numerical integration one first has to design the right hand side of
+ the equation w' = f(w) where in this case w = (x,p):
+ </p>
+<p>
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="comment">/* The type of container used to hold the state vector */</span>
+<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">state_type</span><span class="special">;</span>
+
+<span class="keyword">const</span> <span class="keyword">double</span> <span class="identifier">gam</span> <span class="special">=</span> <span class="number">0.15</span><span class="special">;</span>
+
+<span class="comment">/* The rhs of x' = f(x) */</span>
+<span class="keyword">void</span> <span class="identifier">harmonic_oscillator</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">state_type</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>
+<span class="special">{</span>
+ <span class="identifier">dxdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">x</span><span class="special">[</span><span class="number">1</span><span class="special">];</span>
+ <span class="identifier">dxdt</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">-</span> <span class="identifier">gam</span><span class="special">*</span><span class="identifier">x</span><span class="special">[</span><span class="number">1</span><span class="special">];</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ </p>
+<p>
+ Here we chose <span class="bold"><strong>vector&lt;double&gt;</strong></span> as the
+ state type, but others are also possible, for example <span class="bold"><strong>tr1/array&lt;double,2&gt;</strong></span>.
+ Odeint is designed in such a way that it works with basically any container
+ that can be accessed via iterators. The parameter structure of the function
+ is crucial: the integration methods will always call them iin the form <span class="bold"><strong>f(x, dxdt, t)</strong></span>. So even if there is no explicit time
+ dependence, one has to define <span class="bold"><strong>t</strong></span> as a function
+ parameter.
+ </p>
+<p>
+ Now, we have to define the initial state from which the integration should
+ start:
+ </p>
+<p>
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="identifier">state_type</span> <span class="identifier">x</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
+<span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">1.0</span><span class="special">;</span> <span class="comment">// start at x=1.0, p=0.0
+</span><span class="identifier">x</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ </p>
+<p>
+ For the integration itself we'll use the <code class="computeroutput">integrate</code>
+ function, which is a convenient way to get quick results. It is based on the
+ error-controlled <code class="computeroutput">runge_kutta_rk5_ck</code>
+ stepper (5th order) and uses adaptive stepsize. The results are stored into
+ two InsertIterators (time and state) that must be provided.
+ </p>
+<p>
+ </p>
+<p>
+
+</p>
+<pre class="programlisting"><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">times</span><span class="special">;</span>
+<span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">state_type</span><span class="special">&gt;</span> <span class="identifier">x_t_vec</span><span class="special">;</span>
+
+<span class="identifier">size_t</span> <span class="identifier">steps</span> <span class="special">=</span> <span class="identifier">integrate</span><span class="special">(</span> <span class="identifier">harmonic_oscillator</span> <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="number">10.0</span> <span class="special">,</span>
+ <span class="identifier">back_inserter</span><span class="special">(</span> <span class="identifier">times</span> <span class="special">)</span> <span class="special">,</span>
+ <span class="identifier">back_inserter</span><span class="special">(</span> <span class="identifier">x_t_vec</span> <span class="special">)</span> <span class="special">);</span>
+</pre>
+<p>
+ </p>
+<p>
+ </p>
+<p>
+ The integrate function expects as parameters the rhs of the ode as defined
+ above, the initial state x, the start- and end-time of the integration and
+ two InsertIterators for the times and states where the current time and the
+ current state after each timestep is stored. Note, that <code class="computeroutput">integrate</code>
+ uses an adaptive stepsize during the integration steps so the time points will
+ not be equally spaced. The integration returns the number of steps that were
+ applied. Note, that in total steps+1 elements will be inserted into times and
+ x_t_vec as the initial time and state are inserted before the first step.
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2009 Karsten Ahnert and Mario Mulansky<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/html/images/home.png" alt="Home"></a>
+</div>
+</body>
+</html>

Modified: sandbox/odeint/libs/numeric/odeint/doc/html/standalone_HTML.manifest
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/doc/html/standalone_HTML.manifest (original)
+++ sandbox/odeint/libs/numeric/odeint/doc/html/standalone_HTML.manifest 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -1 +1,2 @@
 index.html
+odeint/quick_guide.html

Modified: sandbox/odeint/libs/numeric/odeint/doc/odeint.qbk
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/doc/odeint.qbk (original)
+++ sandbox/odeint/libs/numeric/odeint/doc/odeint.qbk 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -36,8 +36,56 @@
   [[Euler] [stepper_euler] [1] [No]]
   [[Runge-Kutta 4] [stepper_rk4] [4] [No]]
   [[Runge-Kutta Cash-Karp] [stepper_rk5_ck] [5] [Yes (Order 4)]]
- [[Runge-Kutta Fehlberg] [stepper_rk78_fehlberg] [7] [Yes (Order 5)]]
+ [[Runge-Kutta Fehlberg] [stepper_rk78_fehlberg] [7] [Yes (Order 8)]]
   [[Midpoint] [stepper_midpoint] [variable] [No]]
+ [[Bulirsch-Stoer] [controlled_stepper_bs] [variable] [Controlled]]
 ]
 
 [endsect]
+
+[section Quick Guide]
+This section gives a quick introduction to the most important features of the
+library using a number of instructive examples.
+Image, for example, you want to numerically integrate a harmonic oscillator
+with friction. The equations of motion are given by x'' = -x + gamma x'.
+This can be transformed to a system of two first-order differential equations
+with new variables x and p=x'. To apply numerical integration one first has to
+design the right hand side of the equation w' = f(w) where in this case
+w = (x,p):
+
+[import ../examples/doc_harm_osc.cpp]
+[rhs_function]
+
+Here we chose [*vector<double>] as the state type, but others are also possible,
+for example [*tr1/array<double,2>]. Odeint is designed in such a way that it
+works with basically any container that can be accessed via iterators.
+The parameter structure of the function is crucial: the integration methods will
+always call them iin the form [*f(x, dxdt, t)]. So even if there is no explicit
+time dependence, one has to define [*t] as a function parameter.
+
+Now, we have to define the initial state from which the integration should start:
+
+[state_initialization]
+
+For the integration itself we'll use the
+[funcref boost::numeric::odeint::integrate integrate] function, which is a
+convenient way to get quick results. It is based on the error-controlled
+[classref boost::numeric::odeint::runge_kutta_rk5_ck runge_kutta_rk5_ck] stepper
+(5th order) and uses adaptive stepsize.
+The results are stored into two InsertIterators (time and state) that must be
+provided.
+
+[integration]
+
+The integrate function expects as parameters the rhs of the ode as defined
+above, the initial state x, the start- and end-time of the integration and two
+InsertIterators for the times and states where the current time and the current
+state after each timestep is stored.
+Note, that [funcref boost::numeric::odeint::integrate integrate] uses an
+adaptive stepsize during the integration steps so the time points will not be
+equally spaced.
+The integration returns the number of steps that were applied.
+Note, that in total steps+1 elements will be inserted into times and x_t_vec as
+the initial time and state are inserted before the first step.
+
+[endsect]
\ No newline at end of file

Modified: sandbox/odeint/libs/numeric/odeint/examples/Jamfile
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/examples/Jamfile (original)
+++ sandbox/odeint/libs/numeric/odeint/examples/Jamfile 2010-01-12 09:41:42 EST (Tue, 12 Jan 2010)
@@ -25,3 +25,5 @@
 exe lorenz_stepper : lorenz_stepper.cpp ;
 exe pendulum_vibrating_pivot : pendulum_vibrating_pivot.cpp ;
 exe dnls_stepper_compare : dnls_stepper_compare.cpp ;
+
+exe doc_harm_osc : doc_harm_osc.cpp ;
\ No newline at end of file


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk