constructBath Subroutine

private subroutine constructBath()

Arguments

None

Contents

Source Code


Source Code

    subroutine constructBath()
        ! This subroutine identifies the bath-sites for a given UMAT/TMAT
        logical :: isImp(nBasis)
        integer :: i, j, k, l
        character(*), parameter :: t_r = "constructBath"

        nImp = 0
        isImp = .false.
        do i = 1, nBasis
            ! for each orbital, check if it is in the bath, that is, check if there are
            ! UMAT entries for that orbital
            do j = i + 1, nBasis
                do k = 1, nBasis
                    do l = k + 1, nBasis
                        if (abs(get_umat_el(gtId(i), gtID(j), gtID(k), gtID(l))) > eps) then
                            ! as we know the first orbitals have to be the ImpuritySites,
                            ! the only information needed is their number
                            ! auxiliary flag for checking the correct ordering
                            isImp(i) = .true.
                            exit
                        end if
                        ! No double counting
                        if (isImp(i)) exit
                    end do
                    if (isImp(i)) exit
                end do
                if (isImp(i)) exit
            end do
        end do
        nImp = count(isImp)

        ! dummy array of impurity orbitals
        allocate(ImpuritySites(nImp))
        do i = 1, nImp
            ImpuritySites(i) = i
        end do

        ! do a quick check if the orbital ordering is correct
        do i = nImp + 1, nBasis
            if (isImp(i)) call stop_all(t_r, &
                                        "Incorrect orbital ordering. The first orbitals have to be the ImpuritySites")
        end do
    end subroutine constructBath