Exponential Midpoint

For the exponential midpoint propagator, we need to define the following operations:

  ! Specific exponential mid-point propagation operations identifiers
  character(len=ALGO_LABEL_LEN), public, parameter :: &
    EXPMID_START        = 'EXPMID_START',             &
    EXPMID_FINISH       = 'EXPMID_FINISH',            &

  ! Specific exponential mid-point propagation operations
  type(algorithmic_operation_t), public, parameter :: &
    OP_EXPMID_START        = algorithmic_operation_t(EXPMID_START,        'Starting exponential midpoint'),  &
    OP_EXPMID_FINISH       = algorithmic_operation_t(EXPMID_FINISH,       'Finishing exponential midpoint'), &
    OP_EXPMID_EXTRAPOLATE  = algorithmic_operation_t(EXPMID_EXTRAPOLATE,  'Extrapolate to dt/2 for exponential midpoint'), &
    OP_EXPMID_PROPAGATE    = algorithmic_operation_t(EXPMID_PROPAGATE,    'Propagation step for exponential midpoint')

These are used to define the algorithm, which is done in the constructor of the propagator:

  function propagator_exp_mid_constructor(dt) result(this)
    FLOAT,                  intent(in) :: dt
    type(propagator_exp_mid_t), pointer   :: this



    this%predictor_corrector = .false.
    this%start_step = OP_EXPMID_START
    this%final_step = OP_EXPMID_FINISH

    call this%add_operation(OP_EXPMID_EXTRAPOLATE)
    call this%add_operation(OP_EXPMID_PROPAGATE)
    call this%add_operation(OP_UPDATE_INTERACTIONS)
    call this%add_operation(OP_STEP_DONE)
    call this%add_operation(OP_REWIND_ALGORITHM)

    this%algo_steps = 1
    this%dt = dt

  end function propagator_exp_mid_constructor

The timeline explained

This graph illustrates how the state machine is stepping through the algorithm. Each system is picking the next algorithmic step from the propagator. For the containers (i.e. ‘‘root’’ and ‘‘earth’'), the only steps are ‘‘Updating interactions’’ and ‘‘Finished’’. The real systems, on the other hand, are progressing orderly through the operations, defined in the propagator.