subroutine multiply_hamil_and_vector_real(this, input_vector, output_vector)
type(HamiltonianCalcType), intent(inout) :: this
real(dp), intent(in) :: input_vector(:)
real(dp), intent(out) :: output_vector(:)
associate(hamil_type => this%hamil_type)
if (hamil_type == full_hamil_type) then
call multiply_hamil_and_vector_full(this, input_vector, output_vector)
else if (hamil_type == sparse_hamil_type) then
call mult_hamil_vector_sparse(this, input_vector, output_vector)
else if (hamil_type == parallel_sparse_hamil_type) then
call mult_hamil_vector_par_sparse(this, input_vector, output_vector)
else if (hamil_type == direct_ci_type) then
call mult_hamil_vector_direct_ci(input_vector, output_vector)
end if
end associate
end subroutine multiply_hamil_and_vector_real