| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | nI(nel) | |||
| type(Excite_0_t), | intent(in) | :: | exc |
pure function sltcnd_0_base(nI, exc) result(hel) ! Calculate the by the SlaterCondon Rules when the two ! determinants are the same (so we only need to specify one). integer, intent(in) :: nI(nel) type(Excite_0_t), intent(in) :: exc HElement_t(dp) :: hel, hel_sing, hel_doub, hel_tmp integer :: id(nel), i, j #ifdef WARNING_WORKAROUND_ associate(exc => exc); end associate #endif ! Sum in the one electron integrals (KE --> TMAT) hel_sing = sum(GetTMATEl(nI, nI)) ! Obtain the spatial rather than spin indices if required id = gtID(nI) ! Sum in the two electron contributions. hel_doub = h_cast(0._dp) do i = 1, nel - 1 hel_doub = hel_doub + sum(get_2el(id(i), id(i + 1 :), id(i), id(i + 1 :))) end do ! Exchange contribution only considered if tExch set. ! This is only separated from the above loop to keep "if (tExch)" out ! of the tight loop for efficiency. hel_tmp = h_cast(0._dp) if (tExch) then do i = 1, nel - 1 do j = i + 1, nel ! Exchange contribution is zero if I,J are alpha/beta if ((G1(nI(i))%Ms == G1(nI(j))%Ms) .or. tReltvy) then hel_tmp = hel_tmp - get_umat_el(id(i), id(j), id(j), id(i)) end if end do end do end if hel = hel_doub + hel_tmp + hel_sing end function sltcnd_0_base