sltcnd_1_tc Function

private function sltcnd_1_tc(nI, ex, tSign, assert_occupation) result(hel)

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nI(nel)
type(Excite_1_t), intent(in) :: ex
logical, intent(in) :: tSign
logical, intent(in), optional :: assert_occupation

Return Value real(kind=dp)


Contents

Source Code


Source Code

    function sltcnd_1_tc(nI, ex, tSign, assert_occupation) result(hel)
        integer, intent(in) :: nI(nel)
        type(Excite_1_t), intent(in) :: ex
        logical, intent(in) :: tSign
        logical, intent(in), optional :: assert_occupation
        HElement_t(dp) :: hel
        debug_function_name("sltcnd_1_tc")
        integer :: i, j
#ifdef DEBUG_
    block
        use constants, only: stderr
        use util_mod, only: stop_all
        logical :: test_occupation

        if (present(assert_occupation)) then
            test_occupation = assert_occupation
        else
            test_occupation = .true.
        end if

        if (test_occupation) then
            if (.not. occupation_allowed(nI, ex)) then
                write(stderr, *) 'src', ex%val(1, :)
                write(stderr, *) 'tgt', ex%val(2, :)
                write(stderr, *) 'nI', nI
                call stop_all(this_routine, "Not allowed by occupation.")
            end if
        end if
    end block
#endif

        ! start with the normal matrix element
        hel = sltcnd_1_kernel(nI, ex)

        ! then add the 3-body correction
        if(t_use_tchint_lib) then
            hel = hel + external_lMat_matel(nI, reshape(ex%val,(/2,1/)))
        else
            do i = 1, nel - 1
                do j = i + 1, nel
                    if (ex%val(1, 1) /= nI(i) .and. ex%val(1, 1) /= nI(j)) then
                        hel = hel + get_lmat_el(ex%val(1, 1), nI(i), nI(j), ex%val(2, 1), nI(i), nI(j))
                    end if
                end do
            end do
        end if
        ! take fermi sign into account
        if (tSign) hel = -hel
    end function sltcnd_1_tc