LCOV - code coverage report
Current view: top level - wannier/uhu - wann_uHu_tlo.F (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 0 324 0.0 %
Date: 2024-04-18 04:21:56 Functions: 0 1 0.0 %

          Line data    Source code
       1             : c****************************************c
       2             : c   Muffin tin contribution to uHu       c
       3             : c  < u_{k+b1} | H_{k}^{mt} | u_{k+b2} >  c
       4             : c****************************************c
       5             : c   Routine to set up T(lm,lmp) for all  c
       6             : c   pairs (b1,b2) and every atom n       c
       7             : c   due to local orbitals                c
       8             : c                                        c
       9             : c****************************************c
      10             : c               J.-P. Hanke, Dec. 2015   c
      11             : c****************************************c
      12             :       MODULE m_wann_uHu_tlo
      13             :       CONTAINS
      14           0 :       SUBROUTINE wann_uHu_tlo(
      15             :      >             memd,nlhd,ntypsd,jmtd,lmaxd,
      16           0 :      >             dx,rmsh,jri,lmax,ntypsy,natd,
      17           0 :      >             lnonsph,lmd,lmplmd,clnu,mlh,nmem,llh,nlh,
      18           0 :      >             irank,vr,nlod,llod,loplod,ello,llo,nlo,lo1l,l_dulo,
      19           0 :      >             ulo_der,f,g,flo,f_b,g_b,flo_b,vr0,epar,
      20             :      >             l_skip_sph,l_nns,
      21           0 :      >             rk1,rk2,invsfct,yl1,yl2,jj1,jj2,p,dp,p_b,dp_b,
      22           0 :      >             q,dq,q_b,dq_b,
      23           0 :      >             tuulo,tdulo,tulou,tulod,tuloulo)
      24             : 
      25             :       USE m_intgr, ONLY : intgr3
      26             :       USE m_radflo
      27             :       USE m_radfun
      28             :       USE m_tlo
      29             :       USE m_sphbes
      30             :       USE m_ylm
      31             :       USE m_gaunt, ONLY: gaunt1
      32             :       USE m_wann_uHu_radintsra3
      33             :       USE m_wann_uHu_radintsra5
      34             :       USE m_constants
      35             :       USE m_dujdr
      36             : #if (defined(CPP_MPI) && !defined(CPP_T90))
      37             :       use mpi 
      38             : #endif
      39             :       IMPLICIT NONE
      40             : C     ..
      41             : C     .. Scalar Arguments ..
      42             :       REAL,    INTENT (IN) :: rk1,rk2,invsfct
      43             :       INTEGER, INTENT (IN) :: memd,nlhd,ntypsd,jmtd,lmaxd
      44             :       INTEGER, INTENT (IN) :: lmd,lmplmd,irank
      45             :       INTEGER, INTENT (IN) :: nlod,llod,loplod,natd
      46             :       LOGICAL, INTENT (IN) :: l_skip_sph,l_nns
      47             : C     ..
      48             : C     .. Array Arguments ..
      49             :       COMPLEX, INTENT (OUT):: tdulo(0:lmd,nlod,-llod:llod)
      50             :       COMPLEX, INTENT (OUT):: tuulo(0:lmd,nlod,-llod:llod)
      51             :       COMPLEX, INTENT (OUT):: tulod(0:lmd,nlod,-llod:llod)
      52             :       COMPLEX, INTENT (OUT):: tulou(0:lmd,nlod,-llod:llod)
      53             :       COMPLEX, INTENT (OUT):: tuloulo(nlod,-llod:llod,nlod,-llod:llod)
      54             :       COMPLEX, INTENT (IN) :: clnu(memd,0:nlhd,ntypsd)
      55             :       COMPLEX, INTENT (IN) :: yl1((lmaxd+1)**2),yl2((lmaxd+1)**2)
      56             :       INTEGER, INTENT (IN) :: llo(nlod),nlo
      57             :       INTEGER, INTENT (IN) :: lo1l(0:llod)
      58             :       INTEGER, INTENT (IN) :: mlh(memd,0:nlhd,ntypsd),nlh(ntypsd)
      59             :       INTEGER, INTENT (IN) :: nmem(0:nlhd,ntypsd),llh(0:nlhd,ntypsd)
      60             :       INTEGER, INTENT (IN) :: jri,lmax,ntypsy(natd)
      61             :       INTEGER, INTENT (IN) :: lnonsph,ulo_der(nlod)
      62             :       REAL,    INTENT (IN) :: dx,rmsh(jmtd)
      63             :       REAL,    INTENT (IN) :: vr(jmtd,0:nlhd)
      64             :       REAL,    INTENT (IN) :: ello(nlod)
      65             :       REAL,    INTENT (IN) :: epar(0:lmaxd)
      66             :       REAL,    INTENT (IN) :: vr0(jmtd)
      67             :       REAL,    INTENT (IN) :: f  (jmtd,2,0:lmaxd),
      68             :      >                        g  (jmtd,2,0:lmaxd),
      69             :      >                        f_b(jmtd,2,0:lmaxd),
      70             :      >                        g_b(jmtd,2,0:lmaxd),
      71             :      >                        flo  (jmtd,2,nlod),
      72             :      >                        flo_b(jmtd,2,nlod)
      73             :       REAL,    INTENT (IN) :: p(jmtd,2,0:lmaxd,0:lmaxd),
      74             :      >                        q(jmtd,2,0:lmaxd,0:lmaxd),
      75             :      >                        dp(jmtd,2,0:lmaxd,0:lmaxd),
      76             :      >                        dq(jmtd,2,0:lmaxd,0:lmaxd),
      77             :      >                        p_b(jmtd,2,0:lmaxd,0:lmaxd),
      78             :      >                        q_b(jmtd,2,0:lmaxd,0:lmaxd),
      79             :      >                        dp_b(jmtd,2,0:lmaxd,0:lmaxd),
      80             :      >                        dq_b(jmtd,2,0:lmaxd,0:lmaxd)
      81             :       REAL,    INTENT (IN) :: jj1(0:lmaxd,jmtd),jj2(0:lmaxd,jmtd)
      82             :       LOGICAL, INTENT (IN) :: l_dulo(nlod)
      83             : C     ..
      84             : C     .. Local Scalars ..
      85             :       COMPLEX cil,cil2
      86             :       INTEGER i,l,l2,lamda,lh,lm,lmin,lmp,lp
      87             :       INTEGER lp1,lpl,m,mem,mems,mp,mu,n,nh,noded,nodeu,nrec,nsym,na,ne
      88             :       INTEGER ljj1,ljj2,mjj1,mjj2,lo,lop
      89             :       INTEGER ltil1,ltil2,mtil1,mtil2
      90             :       INTEGER mlo, mlolo, iu
      91             :       INTEGER :: lmini,lmini2,lmini3
      92             :       INTEGER :: lmaxi,lmaxi2,lmaxi3
      93             :       INTEGER :: ll,llp,lljj1,lljj2,lmjj1,lmjj2
      94             :       INTEGER :: ikpt_b,ikpt_b2
      95             :       INTEGER :: lwn
      96             :       REAL gc1,gc2,gc3,e,sy1,sy2
      97             :       REAL t1,t0,t_sphbes,t_ylm,t_radint,t_gggint,t_sphint
      98             :       LOGICAL :: L_oldsym
      99             : C     ..
     100             : C     .. Local Arrays .. 
     101           0 :       REAL, ALLOCATABLE :: ulovulo_sph(:,:,:,:,:)
     102           0 :       REAL, ALLOCATABLE :: ulovulo_non(:,:,:,:,:)
     103           0 :       REAL, ALLOCATABLE :: ulovu_sph(:,:,:,:,:),ulovu_non(:,:,:,:,:)
     104           0 :       REAL, ALLOCATABLE :: ulovd_sph(:,:,:,:,:),ulovd_non(:,:,:,:,:)
     105           0 :       REAL, ALLOCATABLE :: uvulo_sph(:,:,:,:,:),uvulo_non(:,:,:,:,:)
     106           0 :       REAL, ALLOCATABLE :: dvulo_sph(:,:,:,:,:),dvulo_non(:,:,:,:,:)
     107           0 :       REAL, ALLOCATABLE :: plo(:,:,:,:),dplo(:,:,:,:)
     108           0 :       REAL, ALLOCATABLE :: plo_b(:,:,:,:),dplo_b(:,:,:,:)
     109           0 :       REAL, ALLOCATABLE :: x(:)
     110             : 
     111             : 
     112             : #if (defined(CPP_MPI) && !defined(CPP_T90))
     113             :       INTEGER ierr(3)
     114             : #endif
     115             : C     .. Intrinsic Functions ..
     116             :       INTRINSIC abs,cmplx,max,mod
     117             : C     ..
     118             : 
     119           0 :       l_oldsym=.false.
     120             :       sy1=1.0
     121             :       sy2=0.0
     122             :       if(l_oldsym) then
     123             :        sy1=0.5
     124             :        sy2=0.5
     125             :       endif
     126             : 
     127           0 :       t_sphbes = 0.
     128           0 :       t_ylm    = 0.
     129           0 :       t_radint = 0.
     130           0 :       t_sphint = 0.
     131           0 :       t_gggint = 0.
     132             : 
     133           0 :       lwn = lmax
     134           0 :       tdulo(:,:,:) = cmplx(0.0,0.0)
     135           0 :       tuulo(:,:,:) = cmplx(0.0,0.0)
     136           0 :       tulod(:,:,:) = cmplx(0.0,0.0)
     137           0 :       tulou(:,:,:) = cmplx(0.0,0.0)
     138           0 :       tuloulo(:,:,:,:) = cmplx(0.0,0.0)
     139             : 
     140           0 :       allocate( ulovulo_sph(0:lmaxd,0:lmaxd,0:lmaxd,nlod,nlod) )
     141           0 :       allocate( ulovu_sph(0:lmaxd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     142           0 :       allocate( ulovd_sph(0:lmaxd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     143           0 :       allocate( uvulo_sph(0:lmaxd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     144           0 :       allocate( dvulo_sph(0:lmaxd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     145           0 :       allocate( ulovulo_non(1:nlhd,0:lmaxd,0:lmaxd,nlod,nlod) )
     146           0 :       allocate( ulovu_non(1:nlhd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     147           0 :       allocate( ulovd_non(1:nlhd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     148           0 :       allocate( uvulo_non(1:nlhd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     149           0 :       allocate( dvulo_non(1:nlhd,0:lmaxd,0:lmaxd,0:lmaxd,nlod) )
     150           0 :       allocate( x(jmtd) )
     151           0 :       allocate( plo(jmtd,2,0:lmaxd,nlod), plo_b(jmtd,2,0:lmaxd,nlod) )
     152           0 :       allocate( dplo(jmtd,2,0:lmaxd,nlod) )
     153           0 :       allocate( dplo_b(jmtd,2,0:lmaxd,nlod) )
     154             : 
     155           0 :         DO lo = 1,nlo
     156           0 :          DO ljj1=0, lwn
     157           0 :           DO i=1,jri
     158           0 :            plo(i,:,ljj1,lo) = flo(i,:,lo)*jj1(ljj1,i)
     159           0 :            plo_b(i,:,ljj1,lo) = flo_b(i,:,lo)*jj2(ljj1,i)
     160             :           ENDDO
     161             :           CALL dujdr(jmtd,jri,rmsh(1),dx,flo(:,:,lo),
     162           0 :      >               jj1,rk1,ljj1,lmaxd,dplo(:,:,ljj1,lo))
     163             :           CALL dujdr(jmtd,jri,rmsh(1),dx,flo_b(:,:,lo),
     164           0 :      >               jj2,rk2,ljj1,lmaxd,dplo_b(:,:,ljj1,lo))
     165             :          ENDDO
     166             :         ENDDO
     167             : 
     168             : c****************************************************c
     169             : c   compute radial integrals                         c
     170             : c   <u(l')jj1(ljj1) | v(lamda,nu) | u(l)jj2(ljj2)>   c
     171             : c   where v(lamda,nu) ~ V^{sph} + V^{non-sph}        c
     172             : c****************************************************c
     173             : ! lo - lo
     174           0 :         do lop = 1,nlo
     175           0 :          lp = llo(lop)
     176           0 :          do lo = 1,nlo
     177           0 :           l = llo(lo)
     178           0 :           do ljj1=0, lwn
     179           0 :            do ljj2=0, lwn
     180             : 
     181           0 :             if(l_skip_sph) GOTO 1232
     182           0 :             do lh=0,lwn
     183           0 :               lmini = abs(lp-ljj1)
     184           0 :               lmini2= abs(lh-ljj2)
     185           0 :               lmaxi = lp+ljj1
     186           0 :               lmaxi2= lh+ljj2
     187             :               if((lmini.gt.lh) .or. (lmaxi.lt.lh).or.
     188             :      >           (lmini2.gt.l) .or. (lmaxi2.lt.l).or.
     189           0 :      >           (mod(lp+lh+ljj1,2).eq.1).or.
     190           0 :      >           (mod( l+lh+ljj2,2).eq.1)) then
     191           0 :                ulovulo_sph(lh,ljj2,ljj1,lo,lop) = 0.
     192             :               else
     193           0 :                 e = (ello(lo)+ello(lop))/2.0!epar(lh)
     194             :                 if(.not.l_oldsym) then
     195             :                 call wann_uHu_radintsra5(jmtd,jri,rmsh(1),dx,
     196             :      >            e,vr0(1),plo(:,:,ljj1,lop),plo_b(:,:,ljj2,lo),
     197             :      >            dplo(:,:,ljj1,lop),dplo_b(:,:,ljj2,lo),lmaxd,lh,
     198           0 :      >            ulovulo_sph(lh,ljj2,ljj1,lo,lop),irank)
     199             :                 else
     200             :                 call wann_uHu_radintsra3(jmtd,jri,rmsh(1),dx,
     201             :      >            ello(lo),vr0(1),plo(:,:,ljj1,lop),plo_b(:,:,ljj2,lo),
     202             :      >            dplo_b(:,:,ljj2,lo),lmaxd,lh,
     203             :      >            ulovulo_sph(lh,ljj2,ljj1,lo,lop))
     204             :                 endif
     205             :               endif 
     206             :             enddo
     207             :  1232       continue
     208             : 
     209           0 :             if(l_nns) GOTO 1230
     210           0 :             do lh = 1, nh
     211           0 :              do i = 1,jri
     212             :               x(i) = (  plo(i,1,ljj1,lop)*plo_b(i,1,ljj2,lo)
     213             :      >                + plo(i,2,ljj1,lop)*plo_b(i,2,ljj2,lo) )
     214           0 :      >             * vr(i,lh)
     215             :              enddo
     216             :              CALL intgr3(x(1:jri),rmsh(1),dx,jri,
     217           0 :      >                   ulovulo_non(lh,ljj2,ljj1,lo,lop))
     218             :             enddo
     219           0 :  1230       continue
     220             :            enddo
     221             :           enddo
     222             :          enddo
     223             :         enddo
     224             : 
     225             : ! apw - lo
     226           0 :          do lop = 1,nlo
     227           0 :           lp = llo(lop)
     228           0 :           do ljj1 = 0,lwn
     229           0 :            do ljj2 = 0,lwn
     230           0 :             do l = 0,lwn
     231             : 
     232           0 :             if(l_skip_sph) GOTO 1233
     233           0 :             do lh=0,lwn
     234           0 :               lmini = abs(lp-ljj1)
     235           0 :               lmini2= abs(lh-ljj2)
     236           0 :               lmaxi = lp+ljj1
     237           0 :               lmaxi2= lh+ljj2
     238             :               if((lmini.gt.lh) .or. (lmaxi.lt.lh).or.
     239             :      >           (lmini2.gt.l) .or. (lmaxi2.lt.l).or.
     240           0 :      >           (mod(lp+lh+ljj1,2).eq.1).or.
     241             :      >           (mod( l+lh+ljj2,2).eq.1)) then
     242           0 :                ulovu_sph(lh,l,ljj2,ljj1,lop) = 0.
     243           0 :                ulovd_sph(lh,l,ljj2,ljj1,lop) = 0.
     244             :               else
     245           0 :                 e = (ello(lop)+epar(l))/2.0!epar(lh)
     246             :                 if(.not.l_oldsym) then
     247             :                 call wann_uHu_radintsra5(jmtd,jri,rmsh(1),dx,
     248             :      >            e,vr0(1),plo(:,:,ljj1,lop),p_b(:,:,l,ljj2),
     249             :      >            dplo(:,:,ljj1,lop),dp_b(:,:,l,ljj2),lmaxd,lh,
     250           0 :      >            ulovu_sph(lh,l,ljj2,ljj1,lop),irank)
     251             :                 call wann_uHu_radintsra5(jmtd,jri,rmsh(1),dx,
     252             :      >            e,vr0(1),plo(:,:,ljj1,lop),q_b(:,:,l,ljj2),
     253             :      >            dplo(:,:,ljj1,lop),dq_b(:,:,l,ljj2),lmaxd,lh,
     254           0 :      >            ulovd_sph(lh,l,ljj2,ljj1,lop),irank)
     255             :                 else
     256             :                 call wann_uHu_radintsra3(jmtd,jri,rmsh(1),dx,
     257             :      >            epar(l),vr0(1),plo(:,:,ljj1,lop),p_b(:,:,l,ljj2),
     258             :      >            dp_b(:,:,l,ljj2),lmaxd,lh,
     259             :      >            ulovu_sph(lh,l,ljj2,ljj1,lop))
     260             :                 call wann_uHu_radintsra3(jmtd,jri,rmsh(1),dx,
     261             :      >            epar(l),vr0(1),plo(:,:,ljj1,lop),q_b(:,:,l,ljj2),
     262             :      >            dq_b(:,:,l,ljj2),lmaxd,lh,
     263             :      >            ulovd_sph(lh,l,ljj2,ljj1,lop))
     264             :                 endif
     265             :               endif 
     266             : 
     267           0 :               lmini = abs(l-ljj1)
     268           0 :               lmini2= abs(lh-ljj2)
     269           0 :               lmaxi = l+ljj1
     270           0 :               lmaxi2= lh+ljj2
     271             :               if((lmini.gt.lh) .or. (lmaxi.lt.lh).or.
     272             :      >           (lmini2.gt.lp) .or. (lmaxi2.lt.lp).or.
     273           0 :      >           (mod(l+lh+ljj1,2).eq.1).or.
     274           0 :      >           (mod(lp+lh+ljj2,2).eq.1)) then
     275           0 :                uvulo_sph(lh,l,ljj2,ljj1,lop) = 0.
     276           0 :                dvulo_sph(lh,l,ljj2,ljj1,lop) = 0.
     277             :               else
     278           0 :                 e=(ello(lop)+epar(l))/2.0!epar(lh)
     279             :                 if(.not.l_oldsym) then
     280             :                 call wann_uHu_radintsra5(jmtd,jri,rmsh(1),dx,
     281             :      >            e,vr0(1),p(:,:,l,ljj1),plo_b(:,:,ljj2,lop),
     282             :      >            dp(:,:,l,ljj1),dplo_b(:,:,ljj2,lop),lmaxd,lh,
     283           0 :      >            uvulo_sph(lh,l,ljj2,ljj1,lop),irank)
     284             :                 call wann_uHu_radintsra5(jmtd,jri,rmsh(1),dx,
     285             :      >            e,vr0(1),q(:,:,l,ljj1),plo_b(:,:,ljj2,lop),
     286             :      >            dq(:,:,l,ljj1),dplo_b(:,:,ljj2,lop),lmaxd,lh,
     287           0 :      >            dvulo_sph(lh,l,ljj2,ljj1,lop),irank)
     288             :                 else
     289             :                 call wann_uHu_radintsra3(jmtd,jri,rmsh(1),dx,
     290             :      >            ello(lop),vr0(1),p(:,:,l,ljj1),plo_b(:,:,ljj2,lop),
     291             :      >            dplo_b(:,:,ljj2,lop),lmaxd,lh,
     292             :      >            uvulo_sph(lh,l,ljj2,ljj1,lop))
     293             :                 call wann_uHu_radintsra3(jmtd,jri,rmsh(1),dx,
     294             :      >            ello(lop),vr0(1),q(:,:,l,ljj1),plo_b(:,:,ljj2,lop),
     295             :      >            dplo_b(:,:,ljj2,lop),lmaxd,lh,
     296             :      >            dvulo_sph(lh,l,ljj2,ljj1,lop))
     297             :                 endif
     298             :               endif 
     299             :             enddo
     300             :  1233       continue
     301             : 
     302           0 :             if(l_nns) GOTO 1231
     303           0 :             do lh = 1, nh
     304           0 :              do i = 1,jri
     305             :               x(i) = (  plo(i,1,ljj1,lop)*p_b(i,1,l,ljj2)
     306             :      >                + plo(i,2,ljj1,lop)*p_b(i,2,l,ljj2) )
     307           0 :      >             * vr(i,lh)
     308             :              enddo
     309             :              CALL intgr3(x(1:jri),rmsh(1),dx,jri,
     310           0 :      >                   ulovu_non(lh,l,ljj2,ljj1,lop))
     311           0 :              do i = 1,jri
     312             :               x(i) = (  plo(i,1,ljj1,lop)*q_b(i,1,l,ljj2)
     313             :      >                + plo(i,2,ljj1,lop)*q_b(i,2,l,ljj2) )
     314           0 :      >             * vr(i,lh)
     315             :              enddo
     316             :              CALL intgr3(x(1:jri),rmsh(1),dx,jri,
     317           0 :      >                   ulovd_non(lh,l,ljj2,ljj1,lop))
     318           0 :              do i = 1,jri
     319             :               x(i) = (  p(i,1,l,ljj1)*plo_b(i,1,ljj2,lop)
     320             :      >                + p(i,2,l,ljj1)*plo_b(i,2,ljj2,lop) )
     321           0 :      >             * vr(i,lh)
     322             :              enddo
     323             :              CALL intgr3(x(1:jri),rmsh(1),dx,jri,
     324           0 :      >                   uvulo_non(lh,l,ljj2,ljj1,lop))
     325           0 :              do i = 1,jri
     326             :               x(i) = (  q(i,1,l,ljj1)*plo_b(i,1,ljj2,lop)
     327             :      >                + q(i,2,l,ljj1)*plo_b(i,2,ljj2,lop) )
     328           0 :      >             * vr(i,lh)
     329             :              enddo
     330             :              CALL intgr3(x(1:jri),rmsh(1),dx,jri,
     331           0 :      >                   dvulo_non(lh,l,ljj2,ljj1,lop))
     332             :             enddo
     333           0 :  1231       continue
     334             :            enddo
     335             :           enddo
     336             :          enddo
     337             :         enddo
     338             : 
     339           0 :        if(l_skip_sph) GOTO 444
     340             : c************** SPHERICAL CONTRIBUTION *******************c
     341             : c   compute product of the two Gaunt coefficients         c
     342             : c   with the radial integrals (+prefactors)               c
     343             : c*********************************************************c
     344             : c   We deal with two Gaunt coefficients:                  c
     345             : c  G1 = G( (ltil1,mtil1), (ljj1,mjj1) , ( lp, mp) )       c
     346             : c  G2 = G( (l , m)      , (ljj2, mjj2), (ltil1, mtil1) )  c
     347             : c*********************************************************c
     348             : c   use Gaunt conditions to reduce number of operations.  c
     349             : c   coefficient G(L1,L2,L3) only nonzero if               c
     350             : c       a)  l1 + l2 + l3 = even                           c
     351             : c       b)  |l2-l3| <= l1 <= l2+l3                        c
     352             : c       c)  m1 = m2 + m3                                  c
     353             : c*********************************************************c
     354             : 
     355             : ! lo-lo
     356           0 :        DO lop=1,nlo
     357           0 :         lp = llo(lop)
     358           0 :         DO mp=-lp,lp
     359           0 :          DO ltil1=0,lwn
     360           0 :           DO mtil1=-ltil1,ltil1
     361           0 :            mjj1=mtil1-mp
     362           0 :            DO ljj1=0,lwn
     363           0 :             lljj1 = ljj1 * (ljj1 + 1)
     364           0 :             lmjj1 = lljj1 + mjj1
     365           0 :             lmini = abs(ljj1-lp)
     366           0 :             lmaxi = ljj1+lp
     367             :             ! Gaunt conditions (G1):
     368             :             if((lmini.gt.ltil1).or.(lmaxi.lt.ltil1).or.
     369           0 :      >         (mod(lp+ltil1+ljj1,2).ne.0).or.
     370             :      >         (abs(mjj1).gt.ljj1)) cycle
     371             : 
     372             :              gc1 = gaunt1(ltil1, ljj1, lp, 
     373           0 :      >                    mtil1, mjj1, mp, lmaxd)
     374             : 
     375           0 :          DO lo=1,nlo
     376           0 :           l = llo(lo)
     377           0 :           DO m=-l,l
     378           0 :            mjj2=m-mtil1
     379           0 :            DO ljj2=0,lwn
     380           0 :             lljj2 = ljj2 * (ljj2 + 1)
     381           0 :             lmjj2 = lljj2 + mjj2
     382           0 :             lmini2 = abs(ltil1-ljj2)
     383           0 :             lmaxi2 = ltil1+ljj2
     384             :              ! Gaunt conditions (G2):
     385             :              if((lmini2.gt.l).or.(lmaxi2.lt.l).or.
     386           0 :      >          (mod(l+ltil1+ljj2,2).ne.0).or.
     387             :      >          (abs(mjj2).gt.ljj2)) cycle
     388             : 
     389             :              gc2 = gaunt1( l, ljj2, ltil1,
     390           0 :      >                     m, mjj2, mtil1, lmaxd)
     391             : 
     392             :              ! set up prefactor
     393             :              cil =   ( ImagUnit ** (lp - l + ljj1 + ljj2) ) 
     394             :      +              *( (-1.0) **ljj1 )
     395             :      +              * gc1 * gc2
     396             :      +              * conjg( yl1(lmjj1 + 1) )
     397           0 :      +              * conjg( yl2(lmjj2 + 1) )
     398             : 
     399             :              ! additional factor from symmetrization (below)
     400             : c             cil = 0.5 * cil
     401             : 
     402             :              ! compute T-coefficients
     403             :              ! using symmetrized uvu,uvd,dvu,dvd integrals
     404             :              tuloulo(lo, m, lop, mp)
     405             :      >         = tuloulo(lo, m, lop, mp)
     406             :      >         + cil * ( sy1*ulovulo_sph(ltil1, ljj2, ljj1, lo, lop) 
     407           0 :      >                 + sy2*ulovulo_sph(ltil1, ljj1, ljj2, lop, lo) ) 
     408             : 
     409             :            ENDDO!ljj2
     410             :           ENDDO!m
     411             :          ENDDO!l
     412             :            ENDDO!ljj1
     413             :           ENDDO!mp
     414             :          ENDDO!lp
     415             :         ENDDO!mtil1
     416             :        ENDDO!ltil1
     417             : 
     418             : ! apw-lo
     419           0 :        DO lop=1,nlo
     420           0 :         lp = llo(lop)
     421           0 :         DO mp=-lp,lp
     422           0 :          DO ltil1=0,lwn
     423           0 :           DO mtil1=-ltil1,ltil1
     424           0 :            mjj1=mtil1-mp
     425           0 :            DO ljj1=0,lwn
     426           0 :             lljj1 = ljj1 * (ljj1 + 1)
     427           0 :             lmjj1 = lljj1 + mjj1
     428           0 :             lmini = abs(ljj1-lp)
     429           0 :             lmaxi = ljj1+lp
     430             :             ! Gaunt conditions (G1):
     431             :             if((lmini.gt.ltil1).or.(lmaxi.lt.ltil1).or.
     432           0 :      >         (mod(lp+ltil1+ljj1,2).ne.0).or.
     433             :      >         (abs(mjj1).gt.ljj1)) cycle
     434             : 
     435             :              gc1 = gaunt1(ltil1, ljj1, lp, 
     436           0 :      >                    mtil1, mjj1, mp, lmaxd)
     437             : 
     438           0 :          DO l=0,lwn
     439           0 :           ll = l*(l+1)
     440           0 :           DO m=-l,l
     441           0 :            lm = ll+m
     442           0 :            mjj2=m-mtil1
     443           0 :            DO ljj2=0,lwn
     444           0 :             lljj2 = ljj2 * (ljj2 + 1)
     445           0 :             lmjj2 = lljj2 + mjj2
     446           0 :             lmini2 = abs(ltil1-ljj2)
     447           0 :             lmaxi2 = ltil1+ljj2
     448             :              ! Gaunt conditions (G2):
     449             :              if((lmini2.gt.l).or.(lmaxi2.lt.l).or.
     450           0 :      >          (mod(l+ltil1+ljj2,2).ne.0).or.
     451             :      >          (abs(mjj2).gt.ljj2)) cycle
     452             : 
     453             :              gc2 = gaunt1( l, ljj2, ltil1,
     454           0 :      >                     m, mjj2, mtil1, lmaxd)
     455             : 
     456             :              ! set up prefactor
     457             :              cil =   ( ImagUnit ** (lp - l + ljj1 + ljj2) ) 
     458             :      +              *( (-1.0) **ljj1 )
     459             :      +              * gc1 * gc2
     460             :      +              * conjg( yl1(lmjj1 + 1) )
     461           0 :      +              * conjg( yl2(lmjj2 + 1) )
     462             : 
     463             :              ! additional factor from symmetrization (below)
     464             : c             cil = 0.5 * cil
     465             : 
     466             :              ! compute T-coefficients
     467             :              ! using symmetrized uvu,uvd,dvu,dvd integrals
     468             :              tulou(lm, lop, mp)
     469             :      >         = tulou(lm, lop, mp)
     470             :      >         + cil * ( sy1*ulovu_sph(ltil1, l, ljj2, ljj1, lop) 
     471           0 :      >                 + sy2*uvulo_sph(ltil1, l, ljj1, ljj2, lop) ) 
     472             : 
     473             :              tulod(lm, lop, mp)
     474             :      >         = tulod(lm, lop, mp)
     475             :      >         + cil * ( sy1*ulovd_sph(ltil1, l, ljj2, ljj1, lop) 
     476           0 :      >                 + sy2*dvulo_sph(ltil1, l, ljj1, ljj2, lop) ) 
     477             : 
     478             :            ENDDO!ljj2
     479             :           ENDDO!m
     480             :          ENDDO!l
     481             :            ENDDO!ljj1
     482             :           ENDDO!mp
     483             :          ENDDO!lp
     484             :         ENDDO!mtil1
     485             :        ENDDO!ltil1
     486             : 
     487           0 :        DO ltil1=0,lwn
     488           0 :         DO mtil1=-ltil1,ltil1
     489           0 :          DO l=0,lwn
     490           0 :           ll = l*(l+1)
     491           0 :           DO m=-l,l
     492           0 :            lm = ll+m
     493           0 :            mjj1=mtil1-m
     494           0 :            DO ljj1=0,lwn
     495           0 :             lljj1 = ljj1 * (ljj1 + 1)
     496           0 :             lmjj1 = lljj1 + mjj1
     497           0 :             lmini = abs(ljj1-l)
     498           0 :             lmaxi = ljj1+l
     499             :             ! Gaunt conditions (G1):
     500             :             if((lmini.gt.ltil1).or.(lmaxi.lt.ltil1).or.
     501           0 :      >         (mod(l+ltil1+ljj1,2).ne.0).or.
     502             :      >         (abs(mjj1).gt.ljj1)) cycle
     503             : 
     504             :              gc1 = gaunt1(ltil1, ljj1, l, 
     505           0 :      >                    mtil1, mjj1, m, lmaxd)
     506             : 
     507           0 :          DO lop=1,nlo
     508           0 :           lp = llo(lop)
     509           0 :           DO mp=-lp,lp
     510           0 :            mjj2=mp-mtil1
     511           0 :            DO ljj2=0,lwn
     512           0 :             lljj2 = ljj2 * (ljj2 + 1)
     513           0 :             lmjj2 = lljj2 + mjj2
     514           0 :             lmini2 = abs(ltil1-ljj2)
     515           0 :             lmaxi2 = ltil1+ljj2
     516             :              ! Gaunt conditions (G2):
     517             :              if((lmini2.gt.lp).or.(lmaxi2.lt.lp).or.
     518           0 :      >          (mod(lp+ltil1+ljj2,2).ne.0).or.
     519             :      >          (abs(mjj2).gt.ljj2)) cycle
     520             : 
     521             :              gc2 = gaunt1( lp, ljj2, ltil1,
     522           0 :      >                     mp, mjj2, mtil1, lmaxd)
     523             : 
     524             :              ! set up prefactor
     525             :              cil =   ( ImagUnit ** (l - lp + ljj1 + ljj2) )
     526             :      +              *( (-1.0) **ljj1 )
     527             :      +              * gc1 * gc2
     528             :      +              * conjg( yl1(lmjj1 + 1) )
     529           0 :      +              * conjg( yl2(lmjj2 + 1) )
     530             : 
     531             :              ! additional factor from symmetrization (below)
     532             : c             cil = 0.5 * cil
     533             : 
     534             :              ! compute T-coefficients
     535             :              ! using symmetrized uvu,uvd,dvu,dvd integrals
     536             :              tuulo(lm, lop, mp)
     537             :      >         = tuulo(lm, lop, mp)
     538             :      >         + cil * ( sy1*uvulo_sph(ltil1, l, ljj2, ljj1, lop) 
     539           0 :      >                 + sy2*ulovu_sph(ltil1, l, ljj1, ljj2, lop) ) 
     540             : 
     541             :              tdulo(lm, lop, mp)
     542             :      >         = tdulo(lm, lop, mp)
     543             :      >         + cil * ( sy1*dvulo_sph(ltil1, l, ljj2, ljj1, lop) 
     544           0 :      >                 + sy2*ulovd_sph(ltil1, l, ljj1, ljj2, lop) ) 
     545             : 
     546             :            ENDDO!ljj2
     547             :           ENDDO!m
     548             :          ENDDO!l
     549             :            ENDDO!ljj1
     550             :           ENDDO!mp
     551             :          ENDDO!lp
     552             :         ENDDO!mtil1
     553             :        ENDDO!ltil1
     554             : 
     555             :   444  CONTINUE
     556           0 :        call cpu_time(t1)
     557           0 :        t_sphint = t_sphint + t1-t0
     558             :  
     559           0 :        IF( l_nns ) GOTO 555
     560             : c************** NON-SPHERICAL CONTRIBUTION ***************c
     561             : c   compute product of the three Gaunt coefficients       c
     562             : c   with the radial integrals (+prefactors)               c
     563             : c*********************************************************c
     564             : c   We deal with three Gaunt coefficients:                c
     565             : c  G1 = G( (ltil1,mtil1) , (lamda,mu)  , (ltil2,mtil2) )  c
     566             : c  G2 = G( (ltil1,mtil1) , (ljj1,mjj1) , (lp,mp)       )  c
     567             : c  G3 = G( (l,m)         , (ljj2,mjj2) , (ltil2,mtil2) )  c
     568             : c*********************************************************c
     569             : c   use Gaunt conditions to reduce number of operations.  c
     570             : c   coefficient G(L1,L2,L3) only nonzero if               c
     571             : c       a)  l1 + l2 + l3 = even                           c
     572             : c       b)  |l2-l3| <= l1 <= l2+l3                        c
     573             : c       c)  m1 = m2 + m3                                  c
     574             : c*********************************************************c
     575             : 
     576             : ! lo-lo
     577           0 :        DO ltil1 = 0, lwn
     578           0 :         DO mtil1 = -ltil1, ltil1
     579           0 :          DO 120 lh = 1, nh
     580           0 :             lamda = llh(lh,nsym)
     581           0 :             mems = nmem(lh,nsym)
     582           0 :             DO 110 mem = 1, mems
     583           0 :                mu = mlh(mem,lh,nsym)
     584           0 :                mtil2 = mtil1-mu
     585           0 :                DO 1111 ltil2 = 0, lwn         
     586           0 :                lmini = abs(ltil2 - lamda)
     587           0 :                lmaxi = ltil2 + lamda
     588             : 
     589             :                ! Gaunt conditions (G1):
     590             :                if((lmini.gt.ltil1).or.(lmaxi.lt.ltil1).or.
     591           0 :      >            (mod(ltil1+ltil2+lamda,2).ne.0).or.
     592             :      >            (abs(mtil2).gt.ltil2)) cycle
     593             : 
     594             :                   gc1 = gaunt1(ltil1, lamda, ltil2, 
     595           0 :      >                         mtil1,    mu, mtil2, lmaxd)
     596             : 
     597           0 :          DO 1001 lop = 1,nlo
     598           0 :             lp = llo(lop)
     599           0 :             if(lp.GT.lnonsph) cycle
     600           0 :             DO mp = -lp, lp
     601           0 :                mjj1 = mtil1 - mp
     602           0 :                DO 140 ljj1 = 0, lwn
     603           0 :                   lljj1 = ljj1 * (ljj1 + 1)
     604           0 :                   lmjj1 = lljj1 + mjj1
     605           0 :                   lmini2 = abs(lp-ljj1)
     606           0 :                   lmaxi2 = lp+ljj1
     607             : 
     608             :                   ! Gaunt conditions (G2):
     609             :                   if((lmini2.gt.ltil1).or.(lmaxi2.lt.ltil1).or.
     610           0 :      >               (mod(lp+ltil1+ljj1,2).ne.0).or.
     611             :      >               (abs(mjj1).gt.ljj1)) cycle
     612             : 
     613             :                   gc2 = gaunt1(ltil1,  ljj1,  lp,
     614           0 :      >                         mtil1,  mjj1,  mp, lmaxd)
     615             : 
     616           0 :          DO 100 lo = 1,nlo
     617           0 :             l = llo(lo)
     618           0 :             if(l.GT.lnonsph) cycle
     619           0 :             DO m = -l, l
     620           0 :                mjj2 = m - mtil2 
     621           0 :                DO 901 ljj2 = 0, lwn
     622           0 :                   lljj2 = ljj2 * (ljj2 + 1)
     623           0 :                   lmjj2 = lljj2 + mjj2
     624           0 :                   lmini3 = abs(ltil2 - ljj2)
     625           0 :                   lmaxi3 = ltil2 + ljj2
     626             : 
     627             :                   ! Gaunt conditions (G3):
     628             :                   if((lmini3.gt.l).or.(lmaxi3.lt.l).or.
     629           0 :      >               (mod(l+ltil2+ljj2,2).ne.0).or.
     630             :      >               (abs(mjj2).gt.ljj2)) cycle
     631             : 
     632             :                   gc3 = gaunt1(l,  ljj2,  ltil2,
     633           0 :      >                         m,  mjj2,  mtil2, lmaxd)
     634             : 
     635             :                   ! set up prefactor
     636             :                   cil =   ( ImagUnit ** (lp - l + ljj1 + ljj2) )
     637             :      +                   * conjg(clnu(mem,lh,nsym))
     638             :      +                   *( (-1.0) ** ljj1 )
     639             :      +                   * gc1 * gc2 * gc3
     640             :      +                   * conjg( yl1(lmjj1 + 1) )
     641             :      +                   * conjg( yl2(lmjj2 + 1) )
     642           0 :      +                   * invsfct
     643             : 
     644             :                   ! compute T-coefficients
     645             :                   tuloulo(lo, m, lop, mp)
     646             :      >              = tuloulo(lo, m, lop, mp)
     647           0 :      >              + cil * ulovulo_non(lh, ljj2, ljj1, lo, lop)
     648             : 
     649           0 :   901          CONTINUE !l
     650             :             ENDDO !mjj2
     651           0 :   100    CONTINUE !ljj2
     652           0 :   140          CONTINUE !lp
     653             :             ENDDO !mjj1
     654           0 :  1001    CONTINUE !mjj1
     655           0 :  1111          CONTINUE !ltil1
     656           0 :   110       CONTINUE !mem
     657           0 :   120    CONTINUE !lh
     658             :         ENDDO !mtil2
     659             :        ENDDO !ltil2
     660             : 
     661             : ! apw-lo
     662           0 :        DO ltil1 = 0, lwn
     663           0 :         DO mtil1 = -ltil1, ltil1
     664           0 :          DO lh = 1, nh
     665           0 :             lamda = llh(lh,nsym)
     666           0 :             mems = nmem(lh,nsym)
     667           0 :             DO mem = 1, mems
     668           0 :                mu = mlh(mem,lh,nsym)
     669           0 :                mtil2 = mtil1-mu
     670           0 :                DO ltil2 = 0, lwn         
     671           0 :                lmini = abs(ltil2 - lamda)
     672           0 :                lmaxi = ltil2 + lamda
     673             : 
     674             :                ! Gaunt conditions (G1):
     675             :                if((lmini.gt.ltil1).or.(lmaxi.lt.ltil1).or.
     676           0 :      >            (mod(ltil1+ltil2+lamda,2).ne.0).or.
     677             :      >            (abs(mtil2).gt.ltil2)) cycle
     678             : 
     679             :                   gc1 = gaunt1(ltil1, lamda, ltil2, 
     680           0 :      >                         mtil1,    mu, mtil2, lmaxd)
     681             : 
     682           0 :          DO lop = 1,nlo
     683           0 :             lp = llo(lop)
     684           0 :             if(lp.GT.lnonsph) cycle
     685           0 :             DO mp = -lp, lp
     686           0 :                mjj1 = mtil1 - mp
     687           0 :                DO ljj1 = 0, lwn
     688           0 :                   lljj1 = ljj1 * (ljj1 + 1)
     689           0 :                   lmjj1 = lljj1 + mjj1
     690           0 :                   lmini2 = abs(lp-ljj1)
     691           0 :                   lmaxi2 = lp+ljj1
     692             : 
     693             :                   ! Gaunt conditions (G2):
     694             :                   if((lmini2.gt.ltil1).or.(lmaxi2.lt.ltil1).or.
     695           0 :      >               (mod(lp+ltil1+ljj1,2).ne.0).or.
     696             :      >               (abs(mjj1).gt.ljj1)) cycle
     697             : 
     698             :                   gc2 = gaunt1(ltil1,  ljj1,  lp,
     699           0 :      >                         mtil1,  mjj1,  mp, lmaxd)
     700             : 
     701           0 :          DO l = 0,lnonsph
     702           0 :             ll = l*(l+1)
     703           0 :             DO m = -l, l
     704           0 :                lm = ll+m
     705           0 :                mjj2 = m - mtil2 
     706           0 :                DO ljj2 = 0, lwn
     707           0 :                   lljj2 = ljj2 * (ljj2 + 1)
     708           0 :                   lmjj2 = lljj2 + mjj2
     709           0 :                   lmini3 = abs(ltil2 - ljj2)
     710           0 :                   lmaxi3 = ltil2 + ljj2
     711             : 
     712             :                   ! Gaunt conditions (G3):
     713             :                   if((lmini3.gt.l).or.(lmaxi3.lt.l).or.
     714           0 :      >               (mod(l+ltil2+ljj2,2).ne.0).or.
     715             :      >               (abs(mjj2).gt.ljj2)) cycle
     716             : 
     717             :                   gc3 = gaunt1(l,  ljj2,  ltil2,
     718           0 :      >                         m,  mjj2,  mtil2, lmaxd)
     719             : 
     720             :                   ! set up prefactor
     721             :                   cil =   ( ImagUnit ** (lp - l + ljj1 + ljj2) )
     722             :      +                   * conjg(clnu(mem,lh,nsym))
     723             :      +                   *( (-1.0) ** ljj1 )
     724             :      +                   * gc1 * gc2 * gc3
     725             :      +                   * conjg( yl1(lmjj1 + 1) )
     726             :      +                   * conjg( yl2(lmjj2 + 1) )
     727           0 :      +                   * invsfct
     728             : 
     729             :                   ! compute T-coefficients
     730             :                   tulou(lm, lop, mp)
     731             :      >              = tulou(lm, lop, mp)
     732           0 :      >              + cil * ulovu_non(lh, l, ljj2, ljj1, lop)
     733             : 
     734             :                   tulod(lm, lop, mp)
     735             :      >              = tulod(lm, lop, mp)
     736           0 :      >              + cil * ulovd_non(lh, l, ljj2, ljj1, lop)
     737             : 
     738             :                ENDDO !l
     739             :             ENDDO !mjj2
     740             :          ENDDO !ljj2
     741             :                ENDDO !lp
     742             :             ENDDO !mjj1
     743             :          ENDDO !mjj1
     744             : 
     745           0 :          DO l = 0,lnonsph
     746           0 :             ll = l*(l+1)
     747           0 :             DO m = -l, l
     748           0 :                lm = ll+m
     749           0 :                mjj1 = mtil1 - m
     750           0 :                DO ljj1 = 0, lwn
     751           0 :                   lljj1 = ljj1 * (ljj1 + 1)
     752           0 :                   lmjj1 = lljj1 + mjj1
     753           0 :                   lmini2 = abs(l-ljj1)
     754           0 :                   lmaxi2 = l+ljj1
     755             : 
     756             :                   ! Gaunt conditions (G2):
     757             :                   if((lmini2.gt.ltil1).or.(lmaxi2.lt.ltil1).or.
     758           0 :      >               (mod(l+ltil1+ljj1,2).ne.0).or.
     759             :      >               (abs(mjj1).gt.ljj1)) cycle
     760             : 
     761             :                   gc2 = gaunt1(ltil1,  ljj1,  l,
     762           0 :      >                         mtil1,  mjj1,  m, lmaxd)
     763             : 
     764           0 :          DO lop = 1,nlo
     765           0 :             lp = llo(lop)
     766           0 :             if(lp.GT.lnonsph) cycle
     767           0 :             DO mp = -lp, lp
     768           0 :                mjj2 = mp - mtil2 
     769           0 :                DO ljj2 = 0, lwn
     770           0 :                   lljj2 = ljj2 * (ljj2 + 1)
     771           0 :                   lmjj2 = lljj2 + mjj2
     772           0 :                   lmini3 = abs(ltil2 - ljj2)
     773           0 :                   lmaxi3 = ltil2 + ljj2
     774             : 
     775             :                   ! Gaunt conditions (G3):
     776             :                   if((lmini3.gt.lp).or.(lmaxi3.lt.lp).or.
     777           0 :      >               (mod(lp+ltil2+ljj2,2).ne.0).or.
     778             :      >               (abs(mjj2).gt.ljj2)) cycle
     779             : 
     780             :                   gc3 = gaunt1(lp,  ljj2,  ltil2,
     781           0 :      >                         mp,  mjj2,  mtil2, lmaxd)
     782             : 
     783             :                   ! set up prefactor
     784             :                   cil =   ( ImagUnit ** (l - lp + ljj1 + ljj2) )
     785             :      +                   * conjg(clnu(mem,lh,nsym))
     786             :      +                   *( (-1.0) ** ljj1 )
     787             :      +                   * gc1 * gc2 * gc3
     788             :      +                   * conjg( yl1(lmjj1 + 1) )
     789             :      +                   * conjg( yl2(lmjj2 + 1) )
     790           0 :      +                   * invsfct
     791             : 
     792             :                   ! compute T-coefficients
     793             :                   tuulo(lm, lop, mp)
     794             :      >              = tuulo(lm, lop, mp)
     795           0 :      >              + cil * uvulo_non(lh, l, ljj2, ljj1, lop)
     796             : 
     797             :                   tdulo(lm, lop, mp)
     798             :      >              = tdulo(lm, lop, mp)
     799           0 :      >              + cil * dvulo_non(lh, l, ljj2, ljj1, lop)
     800             : 
     801             :                ENDDO !l
     802             :             ENDDO !mjj2
     803             :          ENDDO !ljj2
     804             :                ENDDO !lp
     805             :             ENDDO !mjj1
     806             :          ENDDO !mjj1
     807             : 
     808             :                ENDDO !ltil2
     809             :             ENDDO !mem
     810             :          ENDDO !lh
     811             :         ENDDO !mtil1
     812             :        ENDDO !ltil1
     813             : 
     814             :   555  CONTINUE
     815           0 :        call cpu_time(t0)
     816           0 :        t_gggint = t_gggint + t0-t1
     817             : 
     818             : #if (defined(CPP_MPI) && !defined(CPP_T90))
     819           0 :       CALL MPI_BARRIER(MPI_COMM_WORLD,ierr(1))
     820             : #endif
     821             : 
     822           0 :       deallocate( ulovulo_sph, ulovulo_non)
     823           0 :       deallocate( ulovu_sph, uvulo_sph, ulovd_sph, dvulo_sph )
     824           0 :       deallocate( ulovu_non, uvulo_non, ulovd_non, dvulo_non )
     825           0 :       deallocate( plo, dplo, plo_b, dplo_b )
     826           0 :       deallocate( x )
     827             : 
     828             : 
     829           0 :       END SUBROUTINE wann_uHu_tlo
     830             :       END MODULE m_wann_uHu_tlo

Generated by: LCOV version 1.14