## Expand description

Configurable ODE solver

### Design

When we try to solve initial value problem (IVP) of an ordinal differential equation (ODE), we have to specify

- the model space. Writing the ODE as a form $dx/dt = f(x)$, the linear space where $x$ belong to, e.g. $\mathbb{R}^n$ or $\mathbb{C}^n$ is called model space, and represented by ModelSpec trait.
- the equation, i.e. $f$ of $dx/dt = f(x)$, e.g. Lorenz three variable equation, single or multiple pendulum and so on.
- the scheme, i.e. how to solve given ODE, e.g. explicit Euler, Runge-Kutta, symplectic Euler, and so on.

Some equations requires some schemes. For example, Hamilton systems require symplectic schemes, or stiff equations require semi- or full-implicit schemes. We would like to implement these schemes without fixing ODE, but its abstraction depends on each scheme. Explicit schemes assumes the ODE is in a form $$ \frac{dx}{dt} = f(x, t) $$ and hope to abstract $f$, but symplectic schemes assumes the ODE must be defined with Hamiltonian $H$ $$ \frac{\partial p}{\partial t} = -\frac{\partial H}{\partial q}, \frac{\partial q}{\partial t} = \frac{\partial H}{\partial p}. $$ Some equation may be compatible several abstractions. Hamiltonian systems can be integrated with explicit schemes by ignoring phase-space volume contraction, or stiff systems can be integrated with explicit schemes with very small time steps.

This crate introduces traits for each abstractions, e.g. Explicit or SemiImplicit, which are implemented for each equations corresponds to ODE itself, e.g. ode::Lorenz63. Schemes, e.g. explicit::Euler, use this traits as type-bound.

## Modules

- Utilities for adopting to Rust fashon
- explicit schemes
- Lyapunov Analysis for time-evolution operators
- Example nonlinear ODEs
- Example nonlinear PDEs with spectral (Fourier-Galerkin) method
- semi-implicit schemes

## Traits

- Abstraction for implementing explicit schemes
- Model space, the linear space where the system state is represented.
- Time evolution schemes
- Abstraction for implementing semi-implicit schemes for stiff equations
- Time-evolution operator
- Interface for set/get time step for integration