Abstract Hamiltonian class

This abstract class does not contains any real data or computational terms, but rather defines the abstract interface, which is inherited by the specific Hamiltonian classes, and some information, which is common to all systems, such as whether the Hamiltonian is Hermitian, and some variables describing the spectral range.

  type, abstract :: hamiltonian_abst_t
    !> Spectral range
    FLOAT :: spectral_middle_point
    FLOAT :: spectral_half_span

  contains
    procedure(is_hermitian),              deferred :: is_hermitian  !< @copydoc is_hermitian
    procedure(hamiltonian_update_span),   deferred :: update_span   !< @copydoc hamiltonian_update_span
    procedure(dhamiltonian_apply),        deferred :: dapply        !< @copydoc dhamiltonian_apply
    procedure(zhamiltonian_apply),        deferred :: zapply        !< @copydoc zhamiltonian_apply
    procedure(dhamiltonian_magnus_apply), deferred :: dmagnus_apply !< @copydoc dhamiltonian_magnus_apply
    procedure(zhamiltonian_magnus_apply), deferred :: zmagnus_apply !< @copydoc zhamiltonian_magnus_apply
  end type hamiltonian_abst_t

This abstract class is then specialized for the various systems: