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
procedure(hamiltonian_update_span), deferred :: update_span
procedure(dhamiltonian_apply), deferred :: dapply
procedure(zhamiltonian_apply), deferred :: zapply
procedure(dhamiltonian_magnus_apply), deferred :: dmagnus_apply
procedure(zhamiltonian_magnus_apply), deferred :: zmagnus_apply
end type hamiltonian_abst_t
This abstract class is then specialized for the various systems: