calcFullStartFullStopAlike Subroutine

public subroutine calcFullStartFullStopAlike(ilut, csf_i, excitInfo, excitations)

Arguments

Type IntentOptional Attributes Name
integer(kind=n_int), intent(in) :: ilut(0:nifguga)
type(CSF_Info_t), intent(in) :: csf_i
type(ExcitationInformation_t), intent(in) :: excitInfo
integer(kind=n_int), intent(out), allocatable :: excitations(:,:)

Contents


Source Code

    subroutine calcFullStartFullStopAlike(ilut, csf_i, excitInfo, excitations)
        integer(n_int), intent(in) :: ilut(0:nifguga)
        type(CSF_Info_t), intent(in) :: csf_i
        type(ExcitationInformation_t), intent(in) :: excitInfo
        integer(n_int), intent(out), allocatable :: excitations(:, :)
        character(*), parameter :: this_routine = "calcFullStartFullStopAlike"

        integer :: ierr
        integer(n_int) :: t(0:nifguga)
        real(dp) :: nOpen
        ! full start full stop alike is pretty easy. actually there is only
        ! one possible excitation, and the matrix element sign, just depends
        ! on the number of open orbitals in the excitation range,
        ! so just count that and check if excitation is possible.

        ! assert again just to be save
        ASSERT(isZero(ilut, excitInfo%i))
        ASSERT(isThree(ilut, excitInfo%j))

        ! is only one excitation possible
        allocate(excitations(0:nifguga, 1), stat=ierr)

        ! where everything is the same as in ilut, except at full start and stop
        t = ilut

        ! change start/end depending on type of excitation
        set_orb(t, 2 * excitInfo%i)
        set_orb(t, 2 * excitInfo%i - 1)

        clr_orb(t, 2 * excitInfo%j)
        clr_orb(t, 2 * excitInfo%j - 1)

        ! matrix element deĆ¼ends only on the number of open orbitals in the
        ! excitaiton region
        nOpen = real(count_open_orbs_ij(csf_i, excitInfo%fullStart, excitInfo%fullEnd), dp)

        ! update! the sum over two-particle integrals involves a 1/2, which
        ! does not get compensated here by

        call encode_matrix_element(t, 0.0_dp, 2)
        call encode_matrix_element(t, 2.0_dp * (-1.0_dp)**nOpen, 1)

        if (tFillingStochRDMOnFly) then
            call encode_stochastic_rdm_info(GugaBits, t, rdm_ind= &
                                            contract_2_rdm_ind(excitInfo%i, excitInfo%j, excitInfo%k, excitInfo%l, &
                                                               excit_lvl=2, excit_typ=excitInfo%typ), x1=0.0_dp, &
                                            x0=extract_matrix_element(t, 1))
        end if

        excitations(:, 1) = t

    end subroutine calcFullStartFullStopAlike