# Deterministic and stochastic differential equations in walker

This page collects some notes on the requirements and software design of the main ingredient of walker, the differential equations classes.

## General requirements

Numerical time integration of ordinary and stochastic differential equations (ODEs, SDEs) is probably the single most important ingredient of a continuum-realm particle-solver. This must be:

- High-performance,
- Easy to maintain,
- The design must scale well with adding new functionality, i.e., adding new equations and/or new models for already implemented equations should require as little code as possible,
- Should easily accommodate various advancement algorithms on different hardware end/or using various parallelization strategies.

There should be a possibility to quickly prototype a new equation, e.g., in a test-bed class. This would be used to:

- Verify its invariant probability density function (PDF),
- Explore the behavior of its statistics,
- Integrate multiple variables (coupled or non-coupled).

Questions:

- Should a base class hold a single random number generation (RNG) used by all specific (derived) SDEs or different SDEs should be able to instantiate and use their own (possibly different) RNGs?

## Requirements on a generic differential equation base class

ODEs and SDEs should inherit from a base class (if a multiple-policy design is adopted) that should have generic data and member functions, which facilitates code-reuse.

The base class should work for both *N* = 1 or *N* > 1, i.e., single-variate or multi-variate equation classes.

The differential equation base class should have pure virtual interfaces for:

- Setting initial conditions on the particles at
*t*= 0, e.g.,`initialize()`

- Advancing the particles in time, e.g.,
`advance()`

## Possible policies of a differential equation base class

Specific equation types (e.g., Ornstein-Uhlenbeck, Dirichlet, skew-normal, etc.), should derive from a base class, forwarding base class policies, i.e., a specific SDE class should not hard-code any base class policy.

Specific SDE classes may have their own policies (specific to the given SDE).

### Initialization policy

Specifies how the initialization of the particles happen at *t* = 0. Possible initialization policies:

- Do nothing: leave memory associated to particle data uninitialized
- Zero: zero particle properties
- Fill with one given constant: single-delta-spike PDF
- Fill with different constants given per variable
- Sample from given PDF,
*N*= 1 - Sample from different PDF given per variable,
*N*> 1 (independent) - Sample from given JPDF,
*N*> 1 (possibly non-independent) - Pre-cycle properties using a given equation and its constant coefficients for:
- a given time period
- a given number of time steps
- until convergence is reached for given statistics and convergence criteria

### Coefficients policy

Specifies how the differential equation coefficients, e.g., *b*, *S*, and for the Dirichlet SDE, are used by the equation. Possible coefficients policies:

*Constant:*initialized once, used for all*t*> 0*Functional:*`advance()`

algorithm queries coefficients at every update via coefficients-policy functions, e.g., time, various statistics

### Time-integration policy

Specifies what time-integrator to use when advancing particles. Possible time-integration policies:

- Euler-Maruyama
- Milstein
- Runge-Kutta (with various orders)
- Various other explicit and implicit integrators, see Kloeden & Platen

Questions

- What new requirements and constraints does spatial inhomogeneity entail?