RefillUMATandTMAT2D Subroutine

public subroutine RefillUMATandTMAT2D()

Arguments

None

Contents

Source Code


Source Code

    subroutine RefillUMATandTMAT2D()

        integer :: l, k, j, i, a, b, g, d, c, nBasis2, ierr
        integer(TagIntType) :: TMAT2DPartTag
        real(dp) :: NewTMAT
        real(dp), allocatable :: TMAT2DPart(:, :)
#ifdef CMPLX_
        call stop_all('RefillUMATandTMAT2D', 'Rotating orbitals not implemented for complex orbitals.')
#endif

        if (tStoreSpinOrbs) then
            allocate(TMAT2DPart((nBasis - NoFrozenVirt), nBasis), stat=ierr)
            call LogMemAlloc('TMAT2DPart', (nBasis - NoFrozenVirt) * nBasis, 8, 'RefillUMAT', TMAT2DPartTag, ierr)
            if (NoDumpTruncs > 1) then
                allocate(TMAT2DNew((nBasis - NoFrozenVirt), (nBasis - NoFrozenVirt)), stat=ierr)
                call LogMemAlloc('TMAT2DNew', (nBasis - NoFrozenVirt)**2, 8, 'RefillUMAT', TMAT2DNewTag, ierr)
                TMAT2DNew(:, :) = 0.0_dp
            end if
        else
            allocate(TMAT2DPart((nBasis - (NoFrozenVirt * 2)), nBasis), stat=ierr)
            call LogMemAlloc('TMAT2DPart', (nBasis - (NoFrozenVirt * 2)) * nBasis, 8, 'RefillUMAT', TMAT2DPartTag, ierr)
            if (NoDumpTruncs > 1) then
                allocate(TMAT2DNew((nBasis - NoFrozenVirt), (nBasis - NoFrozenVirt)), stat=ierr)
                call LogMemAlloc('TMAT2DNew', (nBasis - NoFrozenVirt)**2, 8, 'RefillUMAT', TMAT2DNewTag, ierr)
                TMAT2DNew(:, :) = 0.0_dp
            end if
        end if
        TMAT2DPart(:, :) = 0.0_dp

        RefillUMAT_Time%timer_name = 'RefillUMATandTMAT'
        call set_timer(RefillUMAT_Time, 30)

        do i = 1, nBasis
            write(stdout, *) SymLabelList2_rot(i), SymLabelList3_rot(i)
        end do

        ! Make the UMAT elements the four index integrals. These are calculated
        ! by transforming the HF orbitals using the coefficients that have been
        ! found.
        if (NoDumpTruncs <= 1) then
            do l = 1, (NoOrbs - (NoFrozenVirt))
                if (tTurnStoreSpinOff) then
                    d = CEILING(real(SymLabelList3_rot(l), dp) / 2.0_dp)
                else
                    d = SymLabelList3_rot(l)
                end if
                do k = 1, (NoOrbs - (NoFrozenVirt))

                    if (tTurnStoreSpinOff) then
                        g = CEILING(real(SymLabelList3_rot(k), dp) / 2.0_dp)
                    else
                        g = SymLabelList3_rot(k)
                    end if

                    do j = 1, (NoOrbs - (NoFrozenVirt))

                        if (tTurnStoreSpinOff) then
                            b = CEILING(real(SymLabelList3_rot(j), dp) / 2.0_dp)
                        else
                            b = SymLabelList3_rot(j)
                        end if
                        do i = 1, (NoOrbs - (NoFrozenVirt))

                            if (tTurnStoreSpinOff) then
                                a = CEILING(real(SymLabelList3_rot(i), dp) / 2.0_dp)
                            else
                                a = SymLabelList3_rot(i)
                            end if

                            if (tUseMP2VarDenMat .or. tFindCINatOrbs .or. tReadInCoeff) then
                                UMAT(UMatInd(a, b, g, d)) = (FourIndInts(i, k, j, l))
                            else
                                UMAT(UMatInd(a, b, g, d)) = (FourIndInts(i, j, k, l))
                            end if
                        end do
                    end do
                end do
            end do
        end if

        do a = 1, nBasis
            do k = 1, NoRotOrbs
                i = SymLabelList3_rot(k)
                NewTMAT = 0.0_dp
                do b = 1, NoOrbs
                    d = SymLabelList2_rot(b)
                    if (tStoreSpinOrbs) then
                        NewTMAT = NewTMAT + (CoeffT1(b, k) * real(TMAT2D(d, a), dp))
                    else
                        NewTMAT = NewTMAT + (CoeffT1(b, k) * real(TMAT2D(2 * d, a), dp))
                    end if
                end do
                if (tStoreSpinOrbs) then
                    TMAT2DPart(i, a) = NewTMAT
                else
                    TMAT2DPart(2 * i, a) = NewTMAT
                    TMAT2DPart(2 * i - 1, a) = NewTMAT
                end if
            end do
        end do

        if (tStoreSpinOrbs) then
            nBasis2 = nBasis - NoFrozenVirt
        else
            nBasis2 = nBasis - (NoFrozenVirt * 2)
        end if
        do k = 1, nBasis2
            do l = 1, NoRotOrbs
                j = SymLabelList3_rot(l)
                NewTMAT = 0.0_dp
                do a = 1, NoOrbs
                    c = SymLabelList2_rot(a)
                    if (tStoreSpinOrbs) then
                        NewTMAT = NewTMAT + (CoeffT1(a, l) * TMAT2DPart(k, c))
                    else
                        NewTMAT = NewTMAT + (CoeffT1(a, l) * TMAT2DPart(k, 2 * c))
                    end if
                end do
                if (tStoreSpinOrbs) then
                    if (NoDumpTruncs > 1) then
                        TMAT2DNew(k, j) = NewTMAT
                    else
                        TMAT2D(k, j) = (NewTMAT)
                    end if
                else
                    if (NoDumpTruncs > 1) then
                        TMAT2DNew(k, 2 * j) = NewTMAT
                        TMAT2DNew(k, 2 * j - 1) = NewTMAT
                    else
                        TMAT2D(k, 2 * j) = (NewTMAT)
                        TMAT2D(k, 2 * j - 1) = (NewTMAT)
                    end if
                end if
            end do
        end do

        deallocate(TMAT2DPart)
        call LogMemDeAlloc('RefillUMAT', TMAT2DPartTag)

        if (tROHistSingExc) call WriteSingHisttofile()

        call set_timer(RefillUMAT_Time, 30)

        if (tTurnStoreSpinOff) then
            tStoreSpinOrbs = .false.
            NoOrbs = nBasis / 2
        end if

        write(stdout, '(A, I5, A)') ' Printing the new ROFCIDUMP file for a truncation of ', NoFrozenVirt, ' orbitals.'
        if (tROFciDump .and. (NoDumpTruncs > 1)) then
            call PrintRepeatROFCIDUMP()
        else if (tROFciDUmp) then
            call PrintROFCIDUMP()
        end if

    end subroutine RefillUMATandTMAT2D