pnstmat.f Source File


Source Code

      MODULE mod_pnstmat
      CONTAINS
      SUBROUTINE PNSTMAT(DRDI,EK,ICST,PZ,QZ,FZ,SZ,PNS,TMATLL,VINS,IPAN,
     +                   IRCUT,NSRA,CLEB,ICLEB,IEND,LOFLM,NCLEB,TMAT,
     +                   LKONV,IDOLDAU,LOPT,LMLO,LMHI,WLDAU,WLDAUAV,
     +                   CUTOFF,NRMAX, NRMIN_NS,
     +                   LMAXATOM,MMAXATOM,LMMAXATOM,LMPOTATOM)
      USE mod_vllns
      USE mod_wftsca
      USE mod_regns

      IMPLICIT NONE
C     .. Parameters ..
!       INCLUDE 'inc.p'
C
C *********************************************************************
C * For KREL = 1 (relativistic mode)                                  *
C *                                                                   *
C *  NPOTD = 2 * NATYPD                                               *
C *  LMMAXATOM = 2 * (LMAXATOM+1)^2                                         *
C *  NSPIND = 1                                                       *
C *                                                                   *
C *  LDA+U implementation     Mar. 2002-Dec.2004                      *
C *                           ph.mavropoulos, h. ebert, v. popescu    *
C *                                                                   *
C *********************************************************************
C
!       INTEGER NRMIN_NS
!       PARAMETER (NRMIN_NS=NRMAX-IRNSD)
!       INTEGER MMAXATOM
!       PARAMETER (MMAXATOM=2*LMAXATOM+1)
!       INTEGER LMMAXATOM
!       PARAMETER (LMMAXATOM= (KREL+1) * (LMAXATOM+1)**2)
!       INTEGER LMPOTATOM
!       PARAMETER (LMPOTATOM= (LPOTD+1)**2)
C     ..
C     .. Scalar Arguments ..
      INTEGER NRMAX, NRMIN_NS,LMAXATOM,MMAXATOM,LMMAXATOM,
     +        LMPOTATOM,NCLEB
      DOUBLE COMPLEX EK
      INTEGER ICST,IDOLDAU,IEND,IPAN,LKONV,LOPT,NSRA,LMLO,LMHI
      DOUBLE PRECISION WLDAUAV
C     ..
C     .. Array Arguments ..
      DOUBLE COMPLEX FZ(NRMAX,0:LMAXATOM),
     +               PNS(LMMAXATOM,LMMAXATOM,NRMIN_NS:NRMAX,2),
     +               PZ(NRMAX,0:LMAXATOM),QZ(NRMAX,0:LMAXATOM),
     +               SZ(NRMAX,0:LMAXATOM),
     +               TMAT(0:LMAXATOM),TMATLL(LMMAXATOM,LMMAXATOM)
      DOUBLE PRECISION CLEB(NCLEB,2),DRDI(NRMAX),
     +                 VINS(NRMIN_NS:NRMAX,LMPOTATOM)
      DOUBLE PRECISION WLDAU(MMAXATOM,MMAXATOM),CUTOFF(NRMAX)
      INTEGER ICLEB(NCLEB,4),IRCUT(0:IPAN),LOFLM(:)
C     ..
C     .. Local Scalars ..
      INTEGER I,IR,LM1,LM2,LMMKONV,M1,M2
C     ..
C     .. Local Arrays ..
      DOUBLE COMPLEX AR(LMMAXATOM,LMMAXATOM),CMAT(LMMAXATOM,
     +               LMMAXATOM,NRMIN_NS:NRMAX),
     +               DMAT(LMMAXATOM,LMMAXATOM,NRMIN_NS:NRMAX),
     +               EFAC(LMMAXATOM),
     +               PZEKDR(LMMAXATOM,NRMIN_NS:NRMAX,2),
     +               PZLM(LMMAXATOM,NRMIN_NS:NRMAX,2),
     +               QZEKDR(LMMAXATOM,NRMIN_NS:NRMAX,2),
     +               QZLM(LMMAXATOM,NRMIN_NS:NRMAX,2)
      DOUBLE PRECISION VNSPLL(LMMAXATOM,LMMAXATOM,NRMIN_NS:NRMAX)
C     ..
C     .. External Subroutines ..
!       EXTERNAL REGNS,VLLNS,WFTSCA
C     ..
!       DO LM1=1,LMPOTATOM
!            write(*,*) 'lm ',lm1
!            write(*,*) 'lm ',vins(:,lm1)
!       END DO


      CALL VLLNS(VNSPLL,VINS,CLEB,ICLEB,IEND,
     +           NCLEB,LMAXATOM,LMMAXATOM,LMPOTATOM,NRMIN_NS,NRMAX )
      IF (LKONV.NE.LMAXATOM) THEN
        LMMKONV = (LKONV+1)* (LKONV+1)
        DO LM1 = 1,LMMAXATOM
          DO LM2 = LMMKONV + 1,LMMAXATOM
            DO I = NRMIN_NS,NRMAX
              VNSPLL(LM2,LM1,I) = 0.0D0
              VNSPLL(LM1,LM2,I) = 0.0D0
            END DO
          END DO
        END DO
      ELSE
        LMMKONV = LMMAXATOM
      END IF
C ======================================================================
C LDA+U
C Add WLDAU to non-spherical porential VINS in case of LDA+U
C Use the average wldau (=wldauav) and calculate the deviation
C of wldau from this. Use the deviation in the Born series
C for the non-spherical wavefunction, while the average is
C used for the spherical wavefunction.
C
      IF ( IDOLDAU.EQ.1.AND.LOPT.GE.0 ) THEN
         DO IR = NRMIN_NS,NRMAX
C
C -> First add wldau to all elements ...
C
            DO LM2 = LMLO,LMHI
               M2 = LM2 - LMLO + 1
               DO LM1 = LMLO,LMHI
                  M1 = LM1 - LMLO + 1
                  VNSPLL(LM1,LM2,IR) =  VNSPLL(LM1,LM2,IR)
     &                            + WLDAU(M1,M2) * CUTOFF(IR)
               ENDDO
C
C ... and then subtract average from diag. elements
C
               VNSPLL(LM2,LM2,IR) =  VNSPLL(LM2,LM2,IR)
     &                            - WLDAUAV * CUTOFF(IR)
            ENDDO
         ENDDO
      END IF
C
C LDA+U
C ======================================================================
c
c---> get wfts of same magnitude by scaling with efac
c
      CALL WFTSCA(DRDI,EFAC,PZ,QZ,FZ,SZ,NSRA,PZLM,QZLM,PZEKDR,QZEKDR,
     +              EK,LOFLM,NRMIN_NS,NRMAX,LMAXATOM,LMMAXATOM)
c
c---> determine the regular non sph. wavefunction
c
      CALL REGNS(AR,TMATLL,EFAC,PNS,VNSPLL,ICST,IPAN,IRCUT,PZLM,QZLM,
     +             PZEKDR,QZEKDR,EK,PNS(1,1,NRMIN_NS,1),CMAT,
     +             PNS(1,1,NRMIN_NS,2),DMAT,NSRA,NRMIN_NS,NRMAX,IPAN,
     +             LMMAXATOM)
c

      DO LM1 = 1,LMMKONV
        TMATLL(LM1,LM1) = TMATLL(LM1,LM1) + TMAT(LOFLM(LM1))
      END DO

      RETURN
      END SUBROUTINE
      END MODULE mod_pnstmat