CalcPotentials Subroutine

public subroutine CalcPotentials()

Arguments

None

Contents

Source Code


Source Code

    subroutine CalcPotentials()

        ! Only temporarily like this, can tidy it up majorly

        integer :: i, j, k, l, Starti, Finishi
        real(dp) :: MaxTerm

        l = 0
        if (tERLocalization .and. (.not. tStoreSpinOrbs)) then
            ERPotEnergy = 0.0_dp
            if (tRotateVirtOnly) then
                Starti = NoOcc + 1
                Finishi = NoOrbs
            else if (tRotateOccOnly) then
                Starti = 1
                Finishi = NoOcc
            else
                Starti = 1
                Finishi = NoOrbs
            end if
            CoulPotEnergy = 0.0_dp
            OffDiagPotEnergy = 0.0_dp
            do i = Starti, Finishi
                ERPotEnergy = ERPotEnergy + FourIndIntsER(i)
                if (FourIndIntsER(i) < 0) then
                    call neci_flush(stdout)
                    call Stop_All('CalcPotentials', 'A <ii|ii> value is less than 0.')
                end if
                PotEnergy = PotEnergy + FourIndIntsER(i)
                TwoEInts = TwoEInts + FourIndIntsER(i)
                PEInts = PEInts + FourIndIntsER(i)
            end do
        else if (tERLocalization) then
            ERPotEnergy = 0.0_dp
            PotEnergy = 0.0_dp
            if (tRotateVirtOnly) then
                Starti = NoOcc + 1
                Finishi = NoOrbs
            else if (tRotateOccOnly) then
                Starti = 1
                Finishi = NoOcc
            else
                Starti = 1
                Finishi = NoOrbs
            end if
            do i = Starti, Finishi
                if (tStoreSpinOrbs) then
                    if (MOD(i, 2) == 0) then
                        j = i - 1
                    else
                        j = i + 1
                    end if
                    ERPotEnergy = ERPotEnergy + FourIndInts(i, j, i, j)
                    if ((FourIndInts(i, j, i, j) < 0) .or. (FourIndInts(j, i, j, i) < 0)) then
                        call neci_flush(stdout)
                        call Stop_All('CalcPotentials', 'A <ii|ii> value is less than 0.')
                    end if
                    PotEnergy = PotEnergy + FourIndInts(i, j, i, j)
                    TwoEInts = TwoEInts + FourIndInts(i, j, i, j)
                    PEInts = PEInts + FourIndInts(i, j, i, j)
                else
                    ERPotEnergy = ERPotEnergy + FourIndInts(i, i, i, i)
                    if ((FourIndInts(i, i, i, i) < 0)) then
                        call neci_flush(stdout)
                        call Stop_All('CalcPotentials', 'A <ii|ii> value is less than 0.')
                    end if
                    PotEnergy = PotEnergy + FourIndInts(i, i, i, i)
                    TwoEInts = TwoEInts + FourIndInts(i, i, i, i)
                    PEInts = PEInts + FourIndInts(i, i, i, i)
                end if
            end do
        end if

        if (tOffDiagSqrdMin .or. tOffDiagSqrdMax .or. tOffDiagMin .or. tOffdiagMax) then
            do l = 1, NoOrbs
                do j = 1, l - 1
                    do k = 1, j - 1
                        do i = 1, k - 1
                            if (tOffDiagSqrdMin .or. tOffDiagSqrdMax) then
                                if (((i /= j) .and. (j /= l)) .and. ((i /= k) .or. (j /= l))) then
                                    PotEnergy = PotEnergy + (FourIndInts(i, j, k, l)**2)
                                    TwoEInts = TwoEInts + (FourIndInts(i, j, k, l)**2)
                                    PEInts = PEInts + (FourIndInts(i, j, k, l)**2)
                                end if
                            end if
                            if (tOffDiagMin .or. tOffDiagMax) then
                                if (.not. ((k == i) .or. (j == l))) then
                                    PotEnergy = PotEnergy + FourIndInts(i, j, k, l)
                                    TwoEInts = TwoEInts + FourIndInts(i, j, k, l)
                                    PEInts = PEInts + FourIndInts(i, j, k, l)
                                end if
                            end if
                        end do
                    end do
                end do
            end do
        end if

        if (tDoubExcMin) then
            do i = 1, NoOrbs
                do j = 1, NoOrbs
                    do k = 1, i - 1
                        if ((k == l) .and. (k == i)) cycle
                        do l = 1, j - 1
                            if ((j == k) .and. (j == l)) cycle
                            if ((j == k) .and. (j == i)) cycle
                            if ((j == l) .and. (j == i)) cycle
                            PotEnergy = PotEnergy + (FourIndInts(i, j, k, l)) - FourIndInts(i, j, l, k)
                            TwoEInts = TwoEInts + (FourIndInts(i, j, k, l)) - FourIndInts(i, j, l, k)
                            PEInts = PEInts + (FourIndInts(i, j, k, l)) - FourIndInts(i, j, l, k)
                        end do
                    end do
                end do
            end do
        end if

        if (tOnePartOrbEnMax .or. tOneElIntMax) then
            do i = NoOcc + 1, NoOrbs
                MaxTerm = 0.0_dp
                MaxTerm = TMAT2DRot(i, i)
                if (tOnePartOrbEnMax) then
                    do j = 1, NoOcc
                        MaxTerm = MaxTerm + (2 * FourIndInts(i, j, i, j)) - FourIndInts(i, j, j, i)
                    end do
                    MaxTerm = MaxTerm - EpsilonMin
                    MaxTerm = MaxTerm**OrbEnMaxAlpha
                end if
                PotEnergy = PotEnergy + MaxTerm
            end do
        end if

        if (tHijSqrdMin) then
            HijSqrdPotEnergy = 0.0_dp
            do i = NoOcc + 1, NoOrbs
                do j = NoOcc + 1, NoOrbs
                    if (j > i) then
                        PotEnergy = PotEnergy + (TMAT2DRot(i, j)**2)
                        HijSqrdPotEnergy = HijSqrdPotEnergy + (TMAT2DRot(i, j)**2)
                    end if
                end do
            end do
        end if

        if (tVirtCoulombMax) then
            ERPotEnergy = 0.0_dp
            ijOccVirtPotEnergy = 0.0_dp
            do i = 1, NoOrbs
                if (i <= NoOcc) then
                    do j = NoOcc + 1, NoOrbs
                        ijOccVirtPotEnergy = ijOccVirtPotEnergy + FourIndInts(i, j, i, j)
                    end do
                end if
                if (i > NoOcc) then
                    ERPotEnergy = ERPotEnergy + FourIndInts(i, i, i, i)
                    do j = NoOcc + 1, NoOrbs
                        if (j <= i) cycle
                        PotEnergy = PotEnergy + FourIndInts(i, j, i, j)
                        TwoEInts = TwoEInts + FourIndInts(i, j, i, j)
                    end do
                end if
            end do
        end if

        if (tHFSingDoubExcMax) then
            do i = 1, NoOcc
                do j = 1, NoOcc
                    do k = NoOcc + 1, NoOrbs
                        do l = NoOcc + 1, NoOrbs
                            PotEnergy = PotEnergy + (FourIndInts(i, j, k, l)**2)
                        end do

                        ! Sing excitations <ij|ik> where i and j are occ, k virt.
                        PotEnergy = PotEnergy + (FourIndInts(i, j, i, k)**2)
                    end do
                end do
            end do
        end if

    end subroutine CalcPotentials