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
real(real64) :: spectral_middle_point
real(real64) :: 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: