← Back to team overview

dolfin team mailing list archive

Re: ODE issue

 

On Wed, Feb 11, 2009 at 10:26:45AM +0100, Ola Skavhaug wrote:
> Sorry for cross posting.
> 
> The new ODECollection class in DOLFIN will enable batch processing of ODEs, and
> this is exactly what we need to solve the bidomain equations. However, the
> interaction with the ODEs are limited. The callback method update(ODE&, real*,
> uint) gives, in principle, the user an opportunity to interact with each ODE
> system before stepping forward in time. However, the interface of dolfin::ODE
> is too limited to really benefit from the callback. I suggest another callback,
> now at the ODE level, that can be called from a possible subclass of
> dolfin::ODECollection's update:
> 
> namespace paracardium
> {
> class CellCollection: public dolfin::ODECollection
> {
>   public:
> 
>       [...]
> 
>       virtual void update(ODE& ode, real* u, uint system)
>       {
>          ode.update(parameters[system]);
>       }
> 
>    private:
>       std::vector<real*> parameters; // parameters.size() == num_systems.
> 
> }; // End class
> 
> } // End namespace
> 
> Of course, we run the risk of the ode.update() call getting the wrong number of
> array components. I would argue that the need for speed is important enough to
> take this risk.

Since there may be very many different ways in which an ODE should be
updated in between calls (not necessarily with a single parameter
value) I think it's the responsibility of the ODE and ODECollection
subclasses to decide on how to interact.

The user will subclass both the ODE and ODECollection subclasses so
one may for example do the following:

class MyODE
{
public:

  void f();
  ...

  friend class MyODECollection;  

private:

  real a;
  real b;

};

class MyODECollection
{
public:

  MyODECollection(uint num_systems) : ODECollection(ode, num_systems) {}

  void update(real* u, uint system)
  {
    if (system == 0)
    {
      ode.a = 5.0;
      ode.b = 3.0;
    }
    else
    {
      ode.a = 3.0;
      ode.b = 5.0;
    }
  }

private:

  MyODE ode;

};

So my suggestion would be to remove the ODE argument to the update
function. Then a user must store the ODE (either as part of the class
or by reference) in the ODECollection subclass. Then the compiler will
know what kind of ODE it is so that one may set specific variables.

-- 
Anders

Attachment: signature.asc
Description: Digital signature


Follow ups

References