LCOV - code coverage report
Current view: top level - vgen - mkgylm.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 189 189 100.0 %
Date: 2024-04-26 04:44:34 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------
       2             : ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
       3             : ! This file is part of FLEUR and available as free software under the conditions
       4             : ! of the MIT license as expressed in the LICENSE file in more detail.
       5             : !--------------------------------------------------------------------------------
       6             : MODULE m_mkgylm
       7             :    !-----------------------------------------------------------------------------
       8             :    ! Using the components and derivatives of a charge density rho in spherical
       9             :    ! coordinates on the real space grid, make the following quantaties:
      10             :    ! 
      11             :    ! gr(js):      [partial_r (rho),partial_theta (rho),partial_phi (rho)]
      12             :    ! sigma:       |grad(rho)|^2 for jspins==1, otherwise three components, namely
      13             :    !              |grad(rho_up)|^2,grad(rho_up)*grad(rho_down),|grad(rho_down)|^2 
      14             :    ! laplace(js): laplace(rho_js)
      15             :    ! 
      16             :    ! and these older components:
      17             :    ! agrt/u/d:    |grad(rho)| for total density/spin-up/spin-down
      18             :    ! g2rt/u/d:    laplace(rho)
      19             :    ! gggrt/u/d:   (grad(rho))*(grad(|grad(rho)|)) [scalar product]
      20             :    ! gzgr:        (grad(zeta))*(grad(rho)) for zeta=(rho_up-rho_down)/rho 
      21             :    ! 
      22             :    ! which are used to calculate gradient contributions to the xc potential and
      23             :    ! energy.
      24             :    ! 
      25             :    ! rh is rho, rhd[i][j] are the partial derivatives along one/two directions.
      26             :    ! rv and thet are the radius and polar angles and t/f in derivatives stand for
      27             :    ! theta/phi.
      28             :    ! 
      29             :    ! Modified so only allocated old quantities require calculations. A.N. 2019
      30             :    ! 
      31             :    ! Quantities fo libxc are calculated as well. D.W./M.R. 2018
      32             :    ! 
      33             :    ! Original script by T.A. 1996
      34             :    !-----------------------------------------------------------------------------
      35             : CONTAINS
      36      344117 :    SUBROUTINE mkgylm(jspins,rv,thet,nsp, rh,rhdr,rhdt,rhdf,rhdrr,rhdtt,rhdff, rhdtf,rhdrt,rhdrf,grad,kt)
      37             :       USE m_types
      38             :       IMPLICIT NONE
      39             :       REAL, INTENT (IN)                :: rv
      40             :       REAL, INTENT (IN)                :: thet(:)
      41             :       REAL, INTENT (IN)                :: rh(:,:)
      42             :       REAL, INTENT (IN)                :: rhdr(:,:),rhdt(:,:),rhdf(:,:)
      43             :       REAL, INTENT (IN)                :: rhdrr(:,:),rhdtt(:,:),rhdff(:,:)
      44             :       REAL, INTENT (IN)                :: rhdtf(:,:),rhdrf(:,:),rhdrt(:,:)
      45             :       TYPE(t_gradients), INTENT(INOUT) :: grad
      46             :       INTEGER, INTENT(IN)              :: jspins,nsp
      47             :       INTEGER, INTENT(IN)              :: kt !index of first point to use in gradients
      48             : 
      49             :       REAL dagrf,dagrfd,dagrfu,dagrr,dagrrd,dagrru,dagrt, &
      50             :            dagrtd,dagrtu,drdr,dzdfs,dzdr,dzdtr,grf,grfd,grfu,grr, &
      51             :            grrd,grru,grt,grtd,grtu,rdf,rdfd,rdff,rdffd,rdffu,rdfu, &
      52             :            rdr,rdrd,rdrf,rdrfd,rdrfu,rdrrd,rdrru,rdrt,rdrtd,rdrtu, &
      53             :            rdru,rdt,rdtd,rdtf,rdtfd,rdtfu,rdtt,rdttd,rdttu,rdtu, &
      54             :            ro,ro2,rod,rou,rv1,rv2,rv3,rvsin1,sint1,sint2,tant1
      55             :       REAL, PARAMETER  :: chsml = 1.e-10
      56             :       INTEGER i,js,fac
      57             : 
      58      344117 :       rv1 = rv
      59      344117 :       rv2 = rv1**2
      60      344117 :       rv3 = rv1**3
      61             : 
      62             :       ! Gradients for libxc calculations.
      63      344117 :       IF (ALLOCATED(grad%gr)) THEN
      64       42252 :          DO js=1,jspins
      65     5521002 :             DO i=1,nsp
      66    21944601 :                grad%gr(:,kt+i,js)=[rhdr(i,js),rhdt(i,js)/rv1,rhdf(i,js)/(rv1*sin(thet(i)))]
      67             :             END DO
      68             :          END DO
      69             :          ! Use contracted gradients only for libxc.
      70       12651 :          IF (ALLOCATED(grad%sigma)) THEN
      71        4217 :             IF (jspins==1) THEN
      72      290277 :                DO i=1,nsp
      73     1158627 :                   grad%sigma(1,kt+i)= dot_PRODUCT(grad%gr(:,kt+i,1),grad%gr(:,kt+i,1))
      74             :                END DO
      75             :             ELSE
      76      579690 :                DO i=1,nsp
      77     2305200 :                   grad%sigma(1,kt+i)= dot_PRODUCT(grad%gr(:,kt+i,1),grad%gr(:,kt+i,1))
      78     2305200 :                   grad%sigma(2,kt+i)= dot_PRODUCT(grad%gr(:,kt+i,1),grad%gr(:,kt+i,2))
      79     2308590 :                   grad%sigma(3,kt+i)= dot_PRODUCT(grad%gr(:,kt+i,2),grad%gr(:,kt+i,2))
      80             :                END DO
      81             :             END IF
      82             :          END IF
      83       12651 :          IF (ALLOCATED(grad%laplace)) THEN
      84             :             !Lapacian of density
      85             :             !fac=MERGE(2,1,jspins==1)
      86             :             fac=1
      87       11824 :             DO js=1,jspins
      88     1453874 :                DO i=1,nsp
      89             :                   grad%laplace(kt+i,js) = (rhdrr(i,js) + 2.e0*rhdr(i,js)/rv1 +&
      90     1449657 :                                            (rhdtt(i,js)+rhdt(i,js)/TAN(thet(i))+rhdff(i,js)/SIN(thet(i))**2)/rv2)/fac
      91             :                ENDDO
      92             :             ENDDO
      93             :          ENDIF
      94             :          ! Cartesian components of the gradient for sourcefree calculations. TODO: Need phi here as well.
      95             :          !IF (ALLOCATED(grad%grxyz)) THEN
      96             :          !   grad%grxyz=SIN(th)*COS(ph)*grad%gr(1,kt+k,1) + COS(th)*COS(ph)*grad%gr(2,kt+k,1)/r - SIN(ph)*grad%gr(3,kt+k,1)/(r*SIN(th))
      97             :          !END IF
      98       12651 :          RETURN ! Do not calculate arrays for in-build GGA.
      99             :       END IF
     100             : 
     101             :       IF (ALLOCATED(grad%gr)) THEN
     102             :          
     103             :       END IF
     104             :       !     Old code for in-build xcpots
     105      331466 :       IF(allocated(grad%agrt)) THEN
     106      331466 :          IF (jspins==1) THEN
     107             : 
     108    34990836 :             points_1 : DO i = 1,nsp
     109             : 
     110    34814212 :                grad%agrt(kt+i)  = 0.0
     111    34814212 :                grad%agru(kt+i)  = 0.0
     112    34814212 :                grad%agrd(kt+i)  = 0.0
     113    34814212 :                grad%g2rt(kt+i)  = 0.0
     114    34814212 :                grad%g2ru(kt+i)  = 0.0
     115    34814212 :                grad%g2rd(kt+i)  = 0.0
     116    34814212 :                grad%gggrt(kt+i) = 0.0
     117    34814212 :                grad%gggru(kt+i) = 0.0
     118    34814212 :                grad%gggrd(kt+i) = 0.0
     119    34814212 :                grad%grgru(kt+i) = 0.0
     120    34814212 :                grad%grgrd(kt+i) = 0.0
     121    34814212 :                grad%gzgr(kt+i)  = 0.0
     122             : 
     123    34814212 :                ro = rh(i,1)
     124             : 
     125    34814212 :                IF (ro<chsml) CYCLE points_1
     126    34814212 :                sint1 = sin(thet(i))
     127    34814212 :                sint2 = sint1**2
     128    34814212 :                tant1 = tan(thet(i))
     129    34814212 :                rvsin1 = rv1*sint1
     130             : 
     131    34814212 :                rou   = ro/2
     132    34814212 :                rdru  = rhdr(i,1)/2
     133    34814212 :                rdtu  = rhdt(i,1)/2
     134    34814212 :                rdfu  = rhdf(i,1)/2
     135    34814212 :                rdrru = rhdrr(i,1)/2
     136    34814212 :                rdttu = rhdtt(i,1)/2
     137    34814212 :                rdffu = rhdff(i,1)/2
     138    34814212 :                rdtfu = rhdtf(i,1)/2
     139    34814212 :                rdrtu = rhdrt(i,1)/2
     140    34814212 :                rdrfu = rhdrf(i,1)/2
     141             : 
     142    34814212 :                rod   = rou
     143    34814212 :                rdrd  = rdru
     144    34814212 :                rdtd  = rdtu
     145    34814212 :                rdfd  = rdfu
     146    34814212 :                rdrrd = rdrru
     147    34814212 :                rdttd = rdttu
     148    34814212 :                rdffd = rdffu
     149    34814212 :                rdtfd = rdtfu
     150    34814212 :                rdrtd = rdrtu
     151    34814212 :                rdrfd = rdrfu
     152             : 
     153    34814212 :                rdr  = rdru  + rdrd
     154    34814212 :                rdt  = rdtu  + rdtd
     155    34814212 :                rdf  = rdfu  + rdfd
     156    34814212 :                drdr = rdrru + rdrrd
     157    34814212 :                rdtt = rdttu + rdttd
     158    34814212 :                rdff = rdffu + rdffd
     159    34814212 :                rdtf = rdtfu + rdtfd
     160    34814212 :                rdrt = rdrtu + rdrtd
     161    34814212 :                rdrf = rdrfu + rdrfd
     162             : 
     163    34814212 :                ro2 = ro**2
     164             : 
     165    34814212 :                grr = rdr
     166    34814212 :                grt = rdt/rv1
     167    34814212 :                grf = rdf/rvsin1
     168             : 
     169    34814212 :                grad%agrt(kt+i) = sqrt(grr**2+grt**2+grf**2)
     170             : 
     171    34814212 :                IF (grad%agrt(kt+i)<chsml) CYCLE points_1
     172             : 
     173             :                dagrr = (rdr*drdr*rv3+rdt* (rdrt*rv1-rdt)+ &
     174    34814212 :                         rdf* (rdrf*rv1-rdf)/sint2)/grad%agrt(kt+i)/rv3
     175             : 
     176             :                dagrt =(rdr*rdrt*rv2+rdt*rdtt+rdf* (-rdf/tant1+rdtf)/sint2)/&
     177    34814212 :                        (grad%agrt(kt+i)*rv3)
     178             : 
     179             :                dagrf = (rdr*rdrf*rv2+rdt*rdtf+rdf*rdff/sint2)/&
     180    34814212 :                        (grad%agrt(kt+i)*rv3*sint1)
     181             : 
     182             :                grad%g2rt(kt+i)=drdr+2.0*rdr/rv1+&
     183    34814212 :                                 (rdtt+rdt/tant1+rdff/sint2)/rv2
     184             : 
     185    34814212 :                dzdr = ((rdru-rdrd)*ro- (rou-rod)*rdr)/ro2
     186             : 
     187             :                !--   >      dzdtr,dzdfs vanish by definition.
     188             : 
     189    34814212 :                dzdtr = 0.0
     190    34814212 :                dzdfs = 0.0
     191             : 
     192    34814212 :                grad%gggrt(kt+i) = grr*dagrr + grt*dagrt + grf*dagrf
     193             : 
     194    34814212 :                grad%gzgr(kt+i) = dzdr*grr + dzdtr*grt + dzdfs*grf
     195             : 
     196    34814212 :                grru = rdru
     197    34814212 :                grtu = rdtu/rv1
     198    34814212 :                grfu = rdfu/rvsin1
     199             : 
     200    34814212 :                grad%agru(kt+i) = sqrt(grru**2+grtu**2+grfu**2)
     201             : 
     202             :                dagrru = (rdru*rdrru*rv3+rdtu* (rdrtu*rv1-rdtu)+&
     203    34814212 :                          rdfu* (rdrfu*rv1-rdfu)/sint2)/grad%agru(kt+i)/rv3
     204             : 
     205             :                dagrtu = (rdru*rdrtu*rv2+rdtu*rdttu+&
     206    34814212 :                          rdfu* (-rdfu/tant1+rdtfu)/sint2)/ (grad%agru(kt+i)*rv3)
     207             : 
     208             :                dagrfu = (rdru*rdrfu*rv2+rdtu*rdtfu+rdfu*rdffu/sint2)/&
     209    34814212 :                         (grad%agru(kt+i)*rv3*sint1)
     210             : 
     211             :                grad%g2ru(kt+i) = rdrru + 2.e0*rdru/rv1 +&
     212    34814212 :                                  (rdttu+rdtu/tant1+rdffu/sint2)/rv2
     213             : 
     214    34814212 :                grad%gggru(kt+i) = grru*dagrru + grtu*dagrtu + grfu*dagrfu
     215             : 
     216    34814212 :                grad%grgru(kt+i) = grr*grru + grt*grtu + grf*grfu
     217             : 
     218    34814212 :                grrd = rdrd
     219    34814212 :                grtd = rdtd/rv1
     220    34814212 :                grfd = rdfd/rvsin1
     221             : 
     222    34814212 :                grad%agrd(kt+i) = sqrt(grrd**2+grtd**2+grfd**2)
     223             : 
     224             :                dagrrd = (rdrd*rdrrd*rv3+rdtd* (rdrtd*rv1-rdtd)+&
     225    34814212 :                          rdfd* (rdrfd*rv1-rdfd)/sint2)/grad%agrd(kt+i)/rv3
     226             : 
     227             :                dagrtd = (rdrd*rdrtd*rv2+rdtd*rdttd+&
     228    34814212 :                          rdfd* (-rdfd/tant1+rdtfd)/sint2)/ (grad%agrd(kt+i)*rv3)
     229             : 
     230             :                dagrfd = (rdrd*rdrfd*rv2+rdtd*rdtfd+rdfd*rdffd/sint2)/&
     231    34814212 :                         (grad%agrd(kt+i)*rv3*sint1)
     232             : 
     233             :                grad%g2rd(kt+i) = rdrrd + 2*rdrd/rv1 +&
     234    34814212 :                                  (rdttd+rdtd/tant1+rdffd/sint2)/rv2
     235             : 
     236    34814212 :                grad%gggrd(kt+i) = grrd*dagrrd + grtd*dagrtd + grfd*dagrfd
     237             : 
     238    34990836 :                grad%grgrd(kt+i) = grr*grrd + grt*grtd + grf*grfd
     239             : 
     240             :             ENDDO points_1
     241             : 
     242             :          ELSE
     243             : 
     244    29781844 :             points_2 : DO i = 1,nsp
     245             : 
     246    29627002 :                grad%agrt(kt+i)  = 0.0
     247    29627002 :                grad%agru(kt+i)  = 0.0
     248    29627002 :                grad%agrd(kt+i)  = 0.0
     249    29627002 :                grad%g2rt(kt+i)  = 0.0
     250    29627002 :                grad%g2ru(kt+i)  = 0.0
     251    29627002 :                grad%g2rd(kt+i)  = 0.0
     252    29627002 :                grad%gggrt(kt+i) = 0.0
     253    29627002 :                grad%gggru(kt+i) = 0.0
     254    29627002 :                grad%gggrd(kt+i) = 0.0
     255    29627002 :                grad%grgru(kt+i) = 0.0
     256    29627002 :                grad%grgrd(kt+i) = 0.0
     257    29627002 :                grad%gzgr(kt+i)  = 0.0
     258             : 
     259    29627002 :                ro = rh(i,1) + rh(i,jspins)
     260             : 
     261    29627002 :                IF (ro<chsml) CYCLE points_2
     262             : 
     263    29627002 :                sint1 = sin(thet(i))
     264    29627002 :                sint2 = sint1**2
     265    29627002 :                tant1 = tan(thet(i))
     266    29627002 :                rvsin1 = rv1*sint1
     267             : 
     268    29627002 :                rou   = rh(i,1)
     269    29627002 :                rdru  = rhdr(i,1)
     270    29627002 :                rdtu  = rhdt(i,1)
     271    29627002 :                rdfu  = rhdf(i,1)
     272    29627002 :                rdrru = rhdrr(i,1)
     273    29627002 :                rdttu = rhdtt(i,1)
     274    29627002 :                rdffu = rhdff(i,1)
     275    29627002 :                rdtfu = rhdtf(i,1)
     276    29627002 :                rdrtu = rhdrt(i,1)
     277    29627002 :                rdrfu = rhdrf(i,1)
     278             : 
     279    29627002 :                rod   = rh(i,jspins)
     280    29627002 :                rdrd  = rhdr(i,jspins)
     281    29627002 :                rdtd  = rhdt(i,jspins)
     282    29627002 :                rdfd  = rhdf(i,jspins)
     283    29627002 :                rdrrd = rhdrr(i,jspins)
     284    29627002 :                rdttd = rhdtt(i,jspins)
     285    29627002 :                rdffd = rhdff(i,jspins)
     286    29627002 :                rdtfd = rhdtf(i,jspins)
     287    29627002 :                rdrtd = rhdrt(i,jspins)
     288    29627002 :                rdrfd = rhdrf(i,jspins)
     289             : 
     290    29627002 :                rdr   = rdru  + rdrd
     291    29627002 :                rdt   = rdtu  + rdtd
     292    29627002 :                rdf   = rdfu  + rdfd
     293    29627002 :                drdr  = rdrru + rdrrd
     294    29627002 :                rdtt  = rdttu + rdttd
     295    29627002 :                rdff  = rdffu + rdffd
     296    29627002 :                rdtf  = rdtfu + rdtfd
     297    29627002 :                rdrt  = rdrtu + rdrtd
     298    29627002 :                rdrf  = rdrfu + rdrfd
     299             : 
     300    29627002 :                ro2 = ro**2
     301             : 
     302    29627002 :                grr = rdr
     303    29627002 :                grt = rdt/rv1
     304    29627002 :                grf = rdf/rvsin1
     305             : 
     306    29627002 :                grad%agrt(kt+i) = sqrt(grr**2+grt**2+grf**2)
     307             : 
     308    29627002 :                IF (grad%agrt(kt+i)<chsml) CYCLE points_2
     309             : 
     310    29627002 :                dagrr = (rdr*drdr*rv3+rdt* (rdrt*rv1-rdt)+ rdf* (rdrf*rv1-rdf)/sint2)/grad%agrt(kt+i)/rv3
     311             : 
     312    29627002 :                dagrt =(rdr*rdrt*rv2+rdt*rdtt+rdf* (-rdf/tant1+rdtf)/sint2)/ (grad%agrt(kt+i)*rv3)
     313             : 
     314    29627002 :                dagrf = (rdr*rdrf*rv2+rdt*rdtf+rdf*rdff/sint2)/(grad%agrt(kt+i)*rv3*sint1)
     315             : 
     316    29627002 :                grad%g2rt(kt+i)= drdr+2.0*rdr/rv1+(rdtt+rdt/tant1+rdff/sint2)/rv2
     317             : 
     318    29627002 :                dzdr = ((rdru-rdrd)*ro- (rou-rod)*rdr)/ro2
     319             : 
     320             :                !     dzdtr,dzdfs vanish by definition.
     321    29627002 :                dzdtr = 0.0
     322    29627002 :                dzdfs = 0.0
     323             : 
     324    29627002 :                grad%gggrt(kt+i) = grr*dagrr + grt*dagrt + grf*dagrf
     325             : 
     326    29627002 :                grad%gzgr(kt+i) = dzdr*grr + dzdtr*grt + dzdfs*grf
     327             : 
     328    29627002 :                grru = rdru
     329    29627002 :                grtu = rdtu/rv1
     330    29627002 :                grfu = rdfu/rvsin1
     331             : 
     332    29627002 :                grad%agru(kt+i) = sqrt(grru**2+grtu**2+grfu**2)
     333             : 
     334             :                dagrru = (rdru*rdrru*rv3+rdtu* (rdrtu*rv1-rdtu)+&
     335    29627002 :                          rdfu* (rdrfu*rv1-rdfu)/sint2)/grad%agru(kt+i)/rv3
     336             : 
     337    29627002 :                dagrtu = (rdru*rdrtu*rv2+rdtu*rdttu+ rdfu* (-rdfu/tant1+rdtfu)/sint2)/ (grad%agru(kt+i)*rv3)
     338             : 
     339    29627002 :                dagrfu = (rdru*rdrfu*rv2+rdtu*rdtfu+rdfu*rdffu/sint2)/ (grad%agru(kt+i)*rv3*sint1)
     340             : 
     341    29627002 :                grad%g2ru(kt+i) = rdrru + 2.e0*rdru/rv1 + (rdttu+rdtu/tant1+rdffu/sint2)/rv2
     342             : 
     343    29627002 :                grad%gggru(kt+i) = grru*dagrru + grtu*dagrtu + grfu*dagrfu
     344             : 
     345    29627002 :                grad%grgru(kt+i) = grr*grru + grt*grtu + grf*grfu
     346             : 
     347    29627002 :                grrd = rdrd
     348    29627002 :                grtd = rdtd/rv1
     349    29627002 :                grfd = rdfd/rvsin1
     350             : 
     351    29627002 :                grad%agrd(kt+i) = sqrt(grrd**2+grtd**2+grfd**2)
     352             : 
     353    29627002 :                dagrrd = (rdrd*rdrrd*rv3+rdtd* (rdrtd*rv1-rdtd)+ rdfd* (rdrfd*rv1-rdfd)/sint2)/grad%agrd(kt+i)/rv3
     354             : 
     355    29627002 :                dagrtd = (rdrd*rdrtd*rv2+rdtd*rdttd+ rdfd* (-rdfd/tant1+rdtfd)/sint2)/ (grad%agrd(kt+i)*rv3)
     356             : 
     357    29627002 :                dagrfd = (rdrd*rdrfd*rv2+rdtd*rdtfd+rdfd*rdffd/sint2)/ (grad%agrd(kt+i)*rv3*sint1)
     358             : 
     359    29627002 :                grad%g2rd(kt+i) = rdrrd + 2*rdrd/rv1 + (rdttd+rdtd/tant1+rdffd/sint2)/rv2
     360             : 
     361    29627002 :                grad%gggrd(kt+i) = grrd*dagrrd + grtd*dagrtd + grfd*dagrfd
     362             : 
     363    29781844 :                grad%grgrd(kt+i) = grr*grrd + grt*grtd + grf*grfd
     364             : 
     365             :             ENDDO points_2
     366             : 
     367             :          ENDIF
     368             :       ENDIF
     369             :    END SUBROUTINE mkgylm
     370             : END MODULE m_mkgylm

Generated by: LCOV version 1.14