create_sparse_ham_from_core Subroutine

public subroutine create_sparse_ham_from_core(rep)

Arguments

Type IntentOptional Attributes Name
type(core_space_t), intent(in) :: rep

Contents


Source Code

    subroutine create_sparse_ham_from_core(rep)
        type(core_space_t), intent(in) :: rep
        character(*), parameter :: t_r = "create_sparse_ham_from_core"
        integer :: ierr, i

        ! Create the arrays used by the Davidson routine.
        ! First, the whole Hamiltonian in sparse form.
        if (allocated(sparse_ham)) deallocate(sparse_ham)
        if (allocated(SparseHamilTags)) deallocate(SparseHamilTags)
        allocate(sparse_ham(rep%determ_sizes(iProcIndex)))
        allocate(SparseHamilTags(2, rep%determ_sizes(iProcIndex)))
        do i = 1, rep%determ_sizes(iProcIndex)
            call allocate_sparse_ham_row(sparse_ham, i, &
                rep%sparse_core_ham(i)%num_elements, "sparse_ham", SparseHamilTags(:, i))
            sparse_ham(i)%elements = rep%sparse_core_ham(i)%elements
            sparse_ham(i)%positions = rep%sparse_core_ham(i)%positions
            sparse_ham(i)%num_elements = rep%sparse_core_ham(i)%num_elements
        end do

        ! Next create the diagonal used by Davidson by copying the core one.
        if (allocated(hamil_diag)) deallocate(hamil_diag)
        allocate(hamil_diag(rep%determ_sizes(iProcIndex)), stat=ierr)
        call LogMemAlloc('hamil_diag', int(rep%determ_sizes(iProcIndex)), &
            8, t_r, HDiagTag, ierr)
        hamil_diag = rep%core_ham_diag

    end subroutine create_sparse_ham_from_core