LCOV - code coverage report
Current view: top level - global - checkdop.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 51 107 47.7 %
Date: 2024-05-01 04:44:11 Functions: 1 1 100.0 %

          Line data    Source code
       1             :       MODULE m_checkdop
       2             :       CONTAINS
       3          24 :         SUBROUTINE checkdop(p,np,n,na,ivac,iflag,jsp,atoms,sphhar,stars,sym,&
       4             :                             vacuum,cell,potden,potdenIm)
       5             :           ! ************************************************************
       6             :           !     subroutines checks the continuity of coulomb           *
       7             :           !     potential or valence charge density                    *
       8             :           !     across the m.t. and vacuum boundaries                  *
       9             :           !                                     c.l.fu                 *
      10             :           !     (unifies vcheck and cdnchk      g.b.                   *
      11             :           ! YM:  this routine doesn't really work in the vacuum in 1D case yet
      12             :           ! ************************************************************
      13             : 
      14             :           USE m_types
      15             :           USE m_constants
      16             :           USE m_juDFT
      17             :           USE m_starf, ONLY : starf2,starf3
      18             :           USE m_angle
      19             :           USE m_ylm
      20             :           USE m_fitchk
      21             : 
      22             :           IMPLICIT NONE
      23             : 
      24             :           !     ..
      25             :           !     .. Scalar Arguments ..
      26             :           
      27             :           type(t_sphhar),intent(in)    :: sphhar
      28             :           TYPE(t_stars),INTENT(IN)     :: stars
      29             :           TYPE(t_atoms),INTENT(IN)     :: atoms
      30             :           TYPE(t_sym),INTENT(IN)       :: sym
      31             :           TYPE(t_vacuum),INTENT(IN)    :: vacuum
      32             :           TYPE(t_cell),INTENT(IN)      :: cell
      33             :           TYPE(t_potden),INTENT(IN)    :: potden
      34             :           TYPE(t_potden),INTENT(IN), OPTIONAL    :: potdenIm
      35             :           INTEGER, INTENT (IN) :: iflag,ivac,n,na,np,jsp
      36             :           !-odim
      37             :           !+odim
      38             :           !     .. Array Arguments ..
      39             :           REAL,    INTENT (IN) :: p(:,:)!(3,DIMENSION%nspd)
      40             :           !     ..
      41             :           !     .. Local Scalars ..
      42             :           REAL av,dms,rms,s,ir2,help,phi,helpIm
      43             :           INTEGER i,j,k,lh,mem,nd,lm,ll1,nopa ,gz,m
      44             :           COMPLEX ic
      45             :           LOGICAL l_cdn, l_dfpt
      46             :           !     ..
      47             :           !     .. Local Arrays ..
      48          24 :           COMPLEX sf2(stars%ng2),sf3(stars%ng3),ylm( (atoms%lmaxd+1)**2 )
      49          24 :           REAL rcc(3),v1(SIZE(p,2)),v2(SIZE(p,2)),x(3),ri(3), v1Im(SIZE(p,2)), v2Im(SIZE(p,2))
      50             :           l_dfpt = .FALSE.
      51          24 :           l_dfpt = PRESENT(potdenIm)
      52          24 :           l_cdn = .FALSE. ! By default we assume that the input is a potential.
      53          24 :           IF (potden%potdenType.LE.0) CALL juDFT_error('unknown potden type', calledby='checkdop')
      54          24 :           IF (potden%potdenType.GT.1000) l_cdn = .TRUE. ! potdenTypes > 1000 are reserved for densities
      55             : 
      56             : 
      57             :           !     ..
      58             :           !     ..
      59             : #ifdef  __TOS_BGQ__
      60             :           RETURN
      61             : #endif
      62          24 :           ic = CMPLX(0.,1.)
      63          24 :           IF (.NOT.iflag.LT.0) THEN
      64             :              !     ---> Interstitial part
      65           0 :              DO j = 1,np
      66           0 :                 rcc=MATMUL(cell%bmat,p(:,j))/tpi_const
      67           0 :                 IF (l_dfpt) THEN 
      68           0 :                   CALL starf3(sym%nop,stars%ng3,sym%symor,stars%kv3,sym%mrot,sym%tau,p(:,j),sym%invtab,sf3,stars%center) ! Stars shifted by q
      69             :                 ELSE
      70           0 :                   CALL starf3(sym%nop,stars%ng3,sym%symor,stars%kv3,sym%mrot,sym%tau,p(:,j),sym%invtab,sf3) 
      71             :                 END IF
      72             :                !
      73           0 :                 v1(j) = 0.0
      74           0 :                 v1Im(j)=0.0
      75             :                 If (l_dfpt) v1Im(j) = 0.0 
      76           0 :                 DO k = 1,stars%ng3
      77           0 :                    v1(j) = v1(j) + REAL(potden%pw(k,jsp)*sf3(k))*stars%nstr(k)
      78           0 :                    IF (l_dfpt) v1Im(j) = v1Im(j) + AIMAG(potden%pw(k,jsp)*sf3(k))*stars%nstr(k)
      79             :                 ENDDO
      80             :              ENDDO
      81             :              !     ---> vacuum part
      82           0 :              IF (l_cdn) THEN
      83           0 :                IF (l_dfpt) THEN
      84           0 :                   WRITE (oUnit,FMT=9005) ivac
      85             :                 ELSE 
      86           0 :                   WRITE (oUnit,FMT=9000) ivac
      87             :                 END IF
      88             :              ELSE
      89           0 :                 IF (l_dfpt) THEN
      90           0 :                   WRITE (oUnit,FMT=8005) ivac
      91             :                 ELSE 
      92           0 :                   WRITE (oUnit,FMT=8000) ivac
      93             :                 END IF
      94             :              ENDIF
      95           0 :              DO  j = 1,np
      96           0 :                    IF (l_dfpt) THEN
      97           0 :                         CALL starf2(sym%nop2,stars%ng2,stars%kv2,sym%mrot,sym%symor,sym%tau,p(1:3,j),sym%invtab,sf2,stars%center)
      98             :                    ELSE
      99           0 :                         CALL starf2(sym%nop2,stars%ng2,stars%kv2,sym%mrot,sym%symor,sym%tau,p(1:3,j),sym%invtab,sf2)
     100             :                    END IF 
     101           0 :                    v2(j)=0.0
     102           0 :                    v2Im(j)=0.0
     103           0 :                    IF ((norm2(stars%center)<1e-8)) THEN 
     104           0 :                      v2(j) = REAL(potden%vac(1,1,ivac,jsp))
     105           0 :                      IF (l_dfpt) v2Im(j)=AIMAG(potden%vac(1,1,ivac,jsp)) !(l_dfpt Gamma Point)
     106           0 :                      DO  k = 2,stars%ng2
     107           0 :                        v2(j) = v2(j) + REAL(potden%vac(1,k,ivac,jsp)*sf2(k))*stars%nstr2(k)
     108           0 :                        IF (l_dfpt) v2Im(j) = v2Im(j) + AIMAG(potden%vac(1,k,ivac,jsp)*sf2(k))*stars%nstr2(k)
     109             :                      END DO 
     110             :                    ELSE ! (l_dfpt)
     111           0 :                      DO  k = 1,stars%ng2
     112           0 :                         v2(j) = v2(j) + REAL(potden%vac(1,k,ivac,jsp)*sf2(k))*stars%nstr2(k)
     113           0 :                         v2Im(j) = v2Im(j) + AIMAG(potden%vac(1,k,ivac,jsp)*sf2(k))*stars%nstr2(k)
     114             :                      ENDDO
     115             :                   END IF 
     116           0 :                    rcc=MATMUL(cell%amat,p(:,j))
     117           0 :                    IF (l_dfpt) THEN 
     118           0 :                      WRITE (oUnit,FMT=8025) (p(i,j),i=1,3),rcc, v1(j),v1Im(j),v2(j),v2Im(j)
     119             :                    ELSE
     120           0 :                      WRITE (oUnit,FMT=8020) (p(i,j),i=1,3),rcc, v1(j),v2(j)
     121             :                    END IF
     122             :              END DO
     123           0 :              CALL fitchk(v1(:np),v2(:np),av,rms,dms)
     124           0 :              WRITE (oUnit,FMT=8030) av,rms,dms
     125           0 :              IF (l_dfpt) THEN
     126           0 :                CALL fitchk(v1Im(:np),v2Im(:np),av,rms,dms)
     127           0 :                WRITE (oUnit,*) "Imaginary Part:"
     128           0 :                WRITE (oUnit,FMT=8030) av,rms,dms
     129             :              END IF 
     130           0 :              RETURN
     131             :           ENDIF
     132             :           !      ----> interstitial part
     133        8424 :           DO j = 1,np
     134      134400 :              rcc=MATMUL(cell%bmat,p(:,j))/tpi_const
     135        8400 :              IF (l_dfpt) THEN
     136           0 :                CALL starf3(sym%nop,stars%ng3,sym%symor,stars%kv3,sym%mrot,sym%tau,rcc,sym%invtab,sf3,stars%center)
     137             :              ELSE
     138        8400 :                CALL starf3(sym%nop,stars%ng3,sym%symor,stars%kv3,sym%mrot,sym%tau,rcc,sym%invtab,sf3)
     139             :              END IF 
     140             :              !
     141        8400 :              v1(j) = 0.0
     142        8400 :              IF (l_dfpt) v1Im(j) = 0.0 
     143     5594424 :              DO k = 1,stars%ng3
     144     5586000 :                 v1(j) = v1(j) + REAL(potden%pw(k,jsp)*sf3(k))*stars%nstr(k)
     145     5594400 :                 IF (l_dfpt) v1Im(j) = v1Im(j) + AIMAG(potden%pw(k,jsp)*sf3(k))*stars%nstr(k)
     146             :              ENDDO
     147             :           ENDDO
     148             :           !     ----> m.t. part
     149          24 :           IF (l_cdn) THEN
     150           8 :             IF (l_dfpt) THEN
     151           0 :                WRITE (oUnit,FMT=9015) n
     152             :              ELSE
     153           8 :                WRITE (oUnit,FMT=9010) n
     154             :              END IF 
     155             :           ELSE
     156          16 :              IF (l_dfpt) THEN
     157           0 :                WRITE (oUnit,FMT=8015) n
     158             :              ELSE
     159          16 :                WRITE (oUnit,FMT=8010) n
     160             :              END IF 
     161             :           ENDIF
     162          24 :           ir2 = 1.0
     163          24 :           IF (l_cdn) ir2 = 1.0 / ( atoms%rmt(n)*atoms%rmt(n) )
     164          24 :           nd = sym%ntypsy(na)
     165          24 :           nopa = sym%ngopr(na)
     166        8424 :           DO j = 1,np
     167       33600 :              DO i = 1,3
     168       33600 :                 x(i) = p(i,j) - atoms%pos(i,na)
     169             :              ENDDO
     170             :              ! new
     171        8400 :              IF (nopa.NE.1) THEN
     172           0 :                 rcc=MATMUL(cell%bmat,x)/tpi_const
     173             : 
     174           0 :                 DO i = 1,3               ! rotate into representative
     175           0 :                    ri(i) = 0.
     176           0 :                    DO k = 1,3
     177           0 :                          ri(i) = ri(i) + sym%mrot(i,k,nopa)*rcc(k)
     178             :                    ENDDO
     179             :                 ENDDO
     180           0 :                 x=MATMUL(cell%amat,ri)
     181             : 
     182             :              END IF
     183             :              ! new
     184        8400 :              CALL ylm4(atoms%lmax(n),x,ylm)
     185        8400 :              help = 0.0
     186        8400 :              helpIm= 0.0 
     187      142800 :              DO lh = 0,sphhar%nlh(nd)
     188      134400 :                 s = 0.0
     189      134400 :                 ll1 = sphhar%llh(lh,nd) * ( sphhar%llh(lh,nd) + 1 ) + 1
     190      344400 :                 DO mem = 1,sphhar%nmem(lh,nd)
     191      210000 :                    lm = ll1 + sphhar%mlh(mem,lh,nd)
     192      344400 :                    s = s + REAL( sphhar%clnu(mem,lh,nd)* ylm(lm) )
     193             :                 ENDDO
     194      134400 :                 help = help + potden%mt(atoms%jri(n),lh,n,jsp) * s
     195      142800 :                 IF (l_dfpt) helpIm=helpIm + potdenIm%mt(atoms%jri(n),lh,n,jsp) * s
     196             :              ENDDO
     197        8400 :              v2(j) = help * ir2
     198        8400 :              IF (l_dfpt) v2Im(j) = helpIm * ir2
     199        8424 :              IF (j.LE.8) THEN
     200        3072 :                 rcc=MATMUL(cell%bmat,p(:,j))/tpi_const
     201             : 
     202         192 :                 IF (l_dfpt) THEN 
     203           0 :                   WRITE (oUnit,FMT=8025) rcc, (p(i,j),i=1,3),v1(j),v1Im(j),v2(j),v2Im(j)
     204             :                 ELSE
     205         192 :                   WRITE (oUnit,FMT=8020) rcc, (p(i,j),i=1,3),v1(j),v2(j)
     206             :                 END IF
     207             :              END IF
     208             :          END DO 
     209          24 :           CALL fitchk(v1(:np),v2(:np),av,rms,dms)
     210          24 :           WRITE (oUnit,FMT=8030) av,rms,dms
     211          24 :           IF (l_dfpt) THEN
     212           0 :                CALL fitchk(v1Im(:np),v2Im(:np),av,rms,dms)
     213           0 :                WRITE (oUnit,*) "Imaginary Part:"
     214           0 :                WRITE (oUnit,FMT=8030) av,rms,dms
     215             :           END IF 
     216             : 8000      FORMAT (/,'    int.-vac. boundary (potential): ivac=',i2,/,t10,&
     217             :                &       'int-coord',t36,'cart-coord',t57,' inter. ',t69,' vacuum ')
     218             : 8005      FORMAT (/,'    int.-vac. boundary (potential): ivac=',i2,/,t10,&
     219             :                &       'int-coord',t36,'cart-coord',t64,' inter. ',t87,' vacuum ')
     220             : 8010      FORMAT (/,'    int.-m.t. boundary (potential): atom type=',i2,/,&
     221             :                &       t10,'int-coord',t36,'cart-coord',t57,' inter. ',t69,&
     222             :                &       '  m. t. ')
     223             : 8015      FORMAT (/,'    int.-m.t. boundary (potential): atom type=',i2,/,&
     224             :                &       t10,'int-coord',t36,'cart-coord',t64,' inter. ',t87,&
     225             :                &       '  m. t. ')
     226             : 8020      FORMAT (1x,2 (3f8.3,2x),2f12.6)
     227             : 8025      FORMAT (1x,2 (3f8.3,2x),4f12.6) !;_dfpt
     228             : 8030      FORMAT (/,10x,'average value = ',f12.6,/,t11,'rms,dmx=',2f10.3,&
     229             :                &       ' per cent')
     230             : 9000      FORMAT (/,'    int.-vac. boundary (density): ivac=',i2,/,t10,&
     231             :                &       'int-coord',t36,'cart-coord',t57,' inter. ',t69,' vacuum ')
     232             : 9005      FORMAT (/,'    int.-vac. boundary (density): ivac=',i2,/,t10,&
     233             :                &       'int-coord',t36,'cart-coord',t64,' inter. ',t87,' vacuum ')
     234             : 9010      FORMAT (/,'    int.-m.t. boundary (density): atom type=',i2,/,t10,&
     235             :                &       'int-coord',t36,'cart-coord',t57,' inter. ',t69,'  m. t. ')
     236             : 9015      FORMAT (/,'    int.-m.t. boundary (density): atom type=',i2,/,t10,&
     237             :                &       'int-coord',t36,'cart-coord',t64,' inter. ',t87,'  m. t. ')
     238             :           RETURN
     239             :         END SUBROUTINE checkdop
     240             :       END MODULE m_checkdop

Generated by: LCOV version 1.14