| Home | Libraries | People | FAQ | More

### Symplectic System

##### Description

This concept describes how to define a symplectic system written with generalized coordinate `q` and generalized momentum `p`:

q'(t) = f(p)

p'(t) = g(q)

Such a situation is typically found for Hamiltonian systems with a separable Hamiltonian:

H(p,q) = Hkin(p) + V(q)

which gives the equations of motion:

q'(t) = dHkin / dp = f(p)

p'(t) = dV / dq = g(q)

The algorithmic implementation of this situation is described by a pair of callable objects for f and g with a specific parameter signature. Such a system should be implemented as a std::pair of functions or a functors. Symplectic systems are used in symplectic steppers like `symplectic_rkn_sb3a_mclachlan`.

##### Notation

`System`

  A type that is a model of SymplecticSystem

`Coor`

  The type of the coordinate q

`Momentum`

  The type of the momentum p

`CoorDeriv`

  The type of the derivative of coordinate q'

`MomentumDeriv`

  The type of the derivative of momentum p'

`sys`

  An object of the type `System`

`q`

  Object of type Coor

`p`

  Object of type Momentum

`dqdt`

  Object of type CoorDeriv

`dpdt`

  Object of type MomentumDeriv

##### Valid expressions

Name | Expression | Type | Semantics
--- | --- | --- | ---
Check for pair | `boost::is_pair< System >::type` | `std::integral_constant<bool, true>` | Check if System is a pair
Calculate dq/dt = f(p) | `sys.first( p , dqdt )` | `void` | Calculates f(p), the result is stored into `dqdt`
Calculate dp/dt = g(q) | `sys.second( q , dpdt )` | `void` | Calculates g(q), the result is stored into `dpdt`