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', &
EXPMID_EXTRAPOLATE = 'EXPMID_EXTRAPOLATE', &
EXPMID_PROPAGATE = 'EXPMID_PROPAGATE'
! 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
PUSH_SUB(propagator_exp_mid_constructor)
allocate(this)
this%predictor_corrector = .false.
this%start_operation = OP_EXPMID_START
this%final_operation = OP_EXPMID_FINISH
call this%add_operation(OP_EXPMID_EXTRAPOLATE)
call this%add_operation(OP_EXPMID_PROPAGATE)
call this%add_operation(OP_UPDATE_COUPLINGS)
call this%add_operation(OP_UPDATE_INTERACTIONS)
call this%add_operation(OP_ITERATION_DONE)
call this%add_operation(OP_REWIND_ALGORITHM)
this%algo_steps = 1
this%dt = dt
POP_SUB(propagator_exp_mid_constructor)
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.