LCOV - code coverage report
Current view: top level - vgen - mkgxyz3.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 140 140 100.0 %
Date: 2024-04-18 04:21:56 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_mkgxyz3
       7             :    USE m_judft
       8             :    !-----------------------------------------------------------------------------
       9             :    ! Using the cartesian components and derivatives of a charge density rho on
      10             :    ! the real space grid, make the following quantaties:
      11             :    !
      12             :    ! gr(js):      grad(rho_js)
      13             :    ! sigma:       |grad(rho)|^2 for jspins==1, otherwise three components, namely
      14             :    !              |grad(rho_up)|^2,grad(rho_up)*grad(rho_down),|grad(rho_down)|^2
      15             :    ! laplace(js): laplace(rho_js)
      16             :    !
      17             :    ! and these older components:
      18             :    ! agrt/u/d:    |grad(rho)| for total density/spin-up/spin-down
      19             :    ! g2rt/u/d:    laplace(rho)
      20             :    ! gggrt/u/d:   (grad(rho))*(grad(|grad(rho)|)) [scalar product]
      21             :    ! gzgr:        (grad(zeta))*(grad(rho)) for zeta=(rho_up-rho_down)/rho
      22             :    !
      23             :    ! which are used to calculate gradient contributions to the xc potential and
      24             :    ! energy.
      25             :    !
      26             :    ! vl is rho, dv[i][j] are the partial derivatives along one/two directions.
      27             :    !
      28             :    ! Modified so only allocated old quantities require calculations. A.N. 2019
      29             :    !
      30             :    ! Quantities fo libxc are calculated as well. D.W./M.R. 2018
      31             :    !
      32             :    ! Original script by T.A. 1996
      33             :    !-----------------------------------------------------------------------------
      34             : CONTAINS
      35        3691 :    SUBROUTINE mkgxyz3(vl,dvx,dvy,dvz,dvxx,dvyy,dvzz,dvyz,dvxz,dvxy,idx,grad)
      36             :       USE m_types
      37             :       IMPLICIT NONE
      38             :       REAL, INTENT (IN)                :: vl(:,:)
      39             :       REAL, INTENT (IN)                :: dvx(:,:),dvy(:,:),dvz(:,:)
      40             :       REAL, INTENT (IN)                :: dvxx(:,:),dvyy(:,:),dvzz(:,:)
      41             :       REAL, INTENT (IN)                :: dvyz(:,:),dvxz(:,:),dvxy(:,:)
      42             :       INTEGER ,intent(in)              :: idx
      43             :       TYPE(t_gradients), INTENT(INOUT) :: grad
      44             : 
      45             :       REAL vlt,dvxt,dvyt,dvzt,dvxxt,dvyyt,dvzzt,dvyzt,dvxzt,dvxyt, &
      46             :            vlu,dvxu,dvyu,dvzu,dvxxu,dvyyu,dvzzu,dvyzu,dvxzu,dvxyu, &
      47             :            vld,dvxd,dvyd,dvzd,dvxxd,dvyyd,dvzzd,dvyzd,dvxzd,dvxyd, &
      48             :            dagrxt,dagrxd,dagrxu,dagryt,dagryd,dagryu,dagrzt,dagrzd,&
      49             :            dagrzu,dzdx,dzdy,dzdz
      50             :       REAL, PARAMETER  :: sml = 1.e-14
      51             :       INTEGER i,js,jspins,nsp
      52             : 
      53        3691 :       nsp=SIZE(dvx,1)
      54        3691 :       jspins=SIZE(dvx,2)
      55             : 
      56             :       ! Gradients for libxc and sourcefree calculations.
      57        3691 :       IF (ALLOCATED(grad%gr)) THEN
      58          39 :          DO js=1,jspins
      59      135591 :             DO i=1,nsp
      60      542235 :                grad%gr(:,i+idx,js)=(/dvx(i,js),dvy(i,js),dvz(i,js)/)
      61             :             END DO
      62             :          END DO
      63             :          ! Use contracted gradients only for libxc.
      64          12 :          IF(ALLOCATED(grad%sigma)) THEN
      65          12 :             IF (jspins==1) THEN
      66       41475 :                DO i=1,nsp
      67       41475 :                   grad%sigma(1,i+idx) = dvx(i,1)*dvx(i,1) + dvy(i,1)*dvy(i,1) + dvz(i,1)*dvz(i,1)
      68             :                END DO
      69             :             ELSE
      70       35289 :                DO i=1,nsp
      71       35280 :                   grad%sigma(1,i+idx) = dvx(i,1)*dvx(i,1) + dvy(i,1)*dvy(i,1) + dvz(i,1)*dvz(i,1)
      72       35280 :                   grad%sigma(2,i+idx) = dvx(i,1)*dvx(i,2) + dvy(i,1)*dvy(i,2) + dvz(i,1)*dvz(i,2)
      73       35289 :                   grad%sigma(3,i+idx) = dvx(i,2)*dvx(i,2) + dvy(i,2)*dvy(i,2) + dvz(i,2)*dvz(i,2)
      74             :                END DO
      75             :             END IF
      76             :          END IF
      77          12 :          IF(ALLOCATED(grad%laplace)) THEN
      78          39 :             DO js=1,jspins
      79      135591 :                DO i=1,nsp
      80      135579 :                   grad%laplace(i+idx,js)= dvxx(i,js)+dvyy(i,js)+dvzz(i,js)
      81             :                END DO
      82             :             END DO
      83             :          END IF
      84          12 :          RETURN ! Do not calculate arrays for in-build GGA.
      85             :       END IF
      86             : 
      87       11037 :       IF (ANY(SHAPE(vl).NE.SHAPE(dvx))) CALL judft_error("Gradients for internal GGA called with inconsistent sizes",hint="This is a bug")
      88             : 
      89        3679 :            IF(ALLOCATED(grad%agrt)) THEN
      90    12324770 :          DO i = 1,nsp
      91    12321091 :             grad%agrt(idx+i)  = 0.0
      92    12321091 :             grad%agru(idx+i)  = 0.0
      93    12321091 :             grad%agrd(idx+i)  = 0.0
      94    12321091 :             grad%gggrt(idx+i) = 0.0
      95    12321091 :             grad%gggru(idx+i) = 0.0
      96    12321091 :             grad%gggrd(idx+i) = 0.0
      97    12321091 :             grad%gzgr(idx+i)  = 0.0
      98    12321091 :             grad%g2rt(idx+i)  = 0.0
      99    12321091 :             grad%g2ru(idx+i)  = 0.0
     100    12324770 :             grad%g2rd(idx+i)  = 0.0
     101             :          END DO
     102             : 
     103        3679 :          IF (jspins.eq.1) THEN
     104             : 
     105    11001332 :             DO i = 1,nsp
     106             : 
     107    10998195 :                vlu   = max(vl(i,1)/2,sml)
     108    10998195 :                dvxu  = dvx(i,1)/2
     109    10998195 :                dvyu  = dvy(i,1)/2
     110    10998195 :                dvzu  = dvz(i,1)/2
     111    10998195 :                dvxxu = dvxx(i,1)/2
     112    10998195 :                dvyyu = dvyy(i,1)/2
     113    10998195 :                dvzzu = dvzz(i,1)/2
     114    10998195 :                dvyzu = dvyz(i,1)/2
     115    10998195 :                dvxzu = dvxz(i,1)/2
     116    10998195 :                dvxyu = dvxy(i,1)/2
     117             : 
     118    10998195 :                vld   = vlu
     119    10998195 :                dvxd  = dvxu
     120    10998195 :                dvyd  = dvyu
     121    10998195 :                dvzd  = dvzu
     122    10998195 :                dvxxd = dvxxu
     123    10998195 :                dvyyd = dvyyu
     124    10998195 :                dvzzd = dvzzu
     125    10998195 :                dvyzd = dvyzu
     126    10998195 :                dvxzd = dvxzu
     127    10998195 :                dvxyd = dvxyu
     128             : 
     129    10998195 :                vlt = vlu + vld
     130    10998195 :                dvxt  = dvxu  + dvxd
     131    10998195 :                dvyt  = dvyu  + dvyd
     132    10998195 :                dvzt  = dvzu  + dvzd
     133    10998195 :                dvxxt = dvxxu + dvxxd
     134    10998195 :                dvyyt = dvyyu + dvyyd
     135    10998195 :                dvzzt = dvzzu + dvzzd
     136    10998195 :                dvyzt = dvyzu + dvyzd
     137    10998195 :                dvxzt = dvxzu + dvxzd
     138    10998195 :                dvxyt = dvxyu + dvxyd
     139             : 
     140    10998195 :                grad%agrt(idx+i) = max(sqrt(dvxt**2 + dvyt**2 + dvzt**2),sml)
     141    10998195 :                grad%agru(idx+i) = max(sqrt(dvxu**2 + dvyu**2 + dvzu**2),sml)
     142    10998195 :                grad%agrd(idx+i) = max(sqrt(dvxd**2 + dvyd**2 + dvzd**2),sml)
     143             : 
     144    10998195 :                dagrxt = (dvxt*dvxxt + dvyt*dvxyt + dvzt*dvxzt) / grad%agrt(idx+i)
     145    10998195 :                dagrxu = (dvxu*dvxxu + dvyu*dvxyu + dvzu*dvxzu) / grad%agru(idx+i)
     146    10998195 :                dagrxd = (dvxd*dvxxd + dvyd*dvxyd + dvzd*dvxzd) / grad%agrd(idx+i)
     147             : 
     148    10998195 :                dagryt = (dvxt*dvxyt + dvyt*dvyyt + dvzt*dvyzt) / grad%agrt(idx+i)
     149    10998195 :                dagryu = (dvxu*dvxyu + dvyu*dvyyu + dvzu*dvyzu) / grad%agru(idx+i)
     150    10998195 :                dagryd = (dvxd*dvxyd + dvyd*dvyyd + dvzd*dvyzd) / grad%agrd(idx+i)
     151             : 
     152    10998195 :                dagrzt = (dvxt*dvxzt + dvyt*dvyzt + dvzt*dvzzt) / grad%agrt(idx+i)
     153    10998195 :                dagrzu = (dvxu*dvxzu + dvyu*dvyzu + dvzu*dvzzu) / grad%agru(idx+i)
     154    10998195 :                dagrzd = (dvxd*dvxzd + dvyd*dvyzd + dvzd*dvzzd) / grad%agrd(idx+i)
     155             : 
     156    10998195 :                grad%gggrt(idx+i) = dvxt*dagrxt + dvyt*dagryt + dvzt*dagrzt
     157    10998195 :                grad%gggru(idx+i) = dvxu*dagrxu + dvyu*dagryu + dvzu*dagrzu
     158    10998195 :                grad%gggrd(idx+i) = dvxd*dagrxd + dvyd*dagryd + dvzd*dagrzd
     159             : 
     160    10998195 :                dzdx = (dvxu-dvxd)/vlt - (vlu-vld)*dvxt/vlt**2
     161    10998195 :                dzdy = (dvyu-dvyd)/vlt - (vlu-vld)*dvyt/vlt**2
     162    10998195 :                dzdz = (dvzu-dvzd)/vlt - (vlu-vld)*dvzt/vlt**2
     163             : 
     164    10998195 :                grad%gzgr(idx+i) = dzdx*dvxt + dzdy*dvyt + dzdz*dvzt
     165             : 
     166    10998195 :                grad%g2rt(idx+i) = dvxxt + dvyyt + dvzzt
     167    10998195 :                grad%g2ru(idx+i) = dvxxu + dvyyu + dvzzu
     168    11001332 :                grad%g2rd(idx+i) = dvxxd + dvyyd + dvzzd
     169             :             ENDDO
     170             :          ELSE
     171     1323438 :             DO i = 1,nsp
     172             : 
     173     1322896 :                vlu   = max(vl(i,1),sml)
     174     1322896 :                dvxu  = dvx(i,1)
     175     1322896 :                dvyu  = dvy(i,1)
     176     1322896 :                dvzu  = dvz(i,1)
     177     1322896 :                dvxxu = dvxx(i,1)
     178     1322896 :                dvyyu = dvyy(i,1)
     179     1322896 :                dvzzu = dvzz(i,1)
     180     1322896 :                dvyzu = dvyz(i,1)
     181     1322896 :                dvxzu = dvxz(i,1)
     182     1322896 :                dvxyu = dvxy(i,1)
     183             : 
     184     1322896 :                vld   = max(vl(i,jspins),sml)
     185     1322896 :                dvxd  = dvx(i,jspins)
     186     1322896 :                dvyd  = dvy(i,jspins)
     187     1322896 :                dvzd  = dvz(i,jspins)
     188     1322896 :                dvxxd = dvxx(i,jspins)
     189     1322896 :                dvyyd = dvyy(i,jspins)
     190     1322896 :                dvzzd = dvzz(i,jspins)
     191     1322896 :                dvyzd = dvyz(i,jspins)
     192     1322896 :                dvxzd = dvxz(i,jspins)
     193     1322896 :                dvxyd = dvxy(i,jspins)
     194             : 
     195     1322896 :                vlt = vlu + vld
     196             : 
     197     1322896 :                dvxt  = dvxu  + dvxd
     198     1322896 :                dvyt  = dvyu  + dvyd
     199     1322896 :                dvzt  = dvzu  + dvzd
     200     1322896 :                dvxxt = dvxxu + dvxxd
     201     1322896 :                dvyyt = dvyyu + dvyyd
     202     1322896 :                dvzzt = dvzzu + dvzzd
     203     1322896 :                dvyzt = dvyzu + dvyzd
     204     1322896 :                dvxzt = dvxzu + dvxzd
     205     1322896 :                dvxyt = dvxyu + dvxyd
     206             : 
     207     1322896 :                grad%agrt(idx+i) = max(sqrt(dvxt**2 + dvyt**2 + dvzt**2),sml)
     208     1322896 :                grad%agru(idx+i) = max(sqrt(dvxu**2 + dvyu**2 + dvzu**2),sml)
     209     1322896 :                grad%agrd(idx+i) = max(sqrt(dvxd**2 + dvyd**2 + dvzd**2),sml)
     210             : 
     211     1322896 :                dagrxt = (dvxt*dvxxt + dvyt*dvxyt + dvzt*dvxzt) / grad%agrt(idx+i)
     212     1322896 :                dagrxu = (dvxu*dvxxu + dvyu*dvxyu + dvzu*dvxzu) / grad%agru(idx+i)
     213     1322896 :                dagrxd = (dvxd*dvxxd + dvyd*dvxyd + dvzd*dvxzd) / grad%agrd(idx+i)
     214             : 
     215     1322896 :                dagryt = (dvxt*dvxyt + dvyt*dvyyt + dvzt*dvyzt) / grad%agrt(idx+i)
     216     1322896 :                dagryu = (dvxu*dvxyu + dvyu*dvyyu + dvzu*dvyzu) / grad%agru(idx+i)
     217     1322896 :                dagryd = (dvxd*dvxyd + dvyd*dvyyd + dvzd*dvyzd) / grad%agrd(idx+i)
     218             : 
     219     1322896 :                dagrzt = (dvxt*dvxzt + dvyt*dvyzt + dvzt*dvzzt) / grad%agrt(idx+i)
     220     1322896 :                dagrzu = (dvxu*dvxzu + dvyu*dvyzu + dvzu*dvzzu) / grad%agru(idx+i)
     221     1322896 :                dagrzd = (dvxd*dvxzd + dvyd*dvyzd + dvzd*dvzzd) / grad%agrd(idx+i)
     222             : 
     223     1322896 :                grad%gggrt(idx+i) = dvxt*dagrxt + dvyt*dagryt + dvzt*dagrzt
     224     1322896 :                grad%gggru(idx+i) = dvxu*dagrxu + dvyu*dagryu + dvzu*dagrzu
     225     1322896 :                grad%gggrd(idx+i) = dvxd*dagrxd + dvyd*dagryd + dvzd*dagrzd
     226             : 
     227     1322896 :                dzdx = (dvxu-dvxd)/vlt -  (vlu-vld)*dvxt/vlt**2
     228     1322896 :                dzdy = (dvyu-dvyd)/vlt -  (vlu-vld)*dvyt/vlt**2
     229     1322896 :                dzdz = (dvzu-dvzd)/vlt -  (vlu-vld)*dvzt/vlt**2
     230             : 
     231     1322896 :                grad%gzgr(idx+i) = dzdx*dvxt + dzdy*dvyt + dzdz*dvzt
     232             : 
     233     1322896 :                grad%g2rt(idx+i) = dvxxt + dvyyt + dvzzt
     234     1322896 :                grad%g2ru(idx+i) = dvxxu + dvyyu + dvzzu
     235     1323438 :                grad%g2rd(idx+i) = dvxxd + dvyyd + dvzzd
     236             : 
     237             :             END DO
     238             :          END IF
     239             :       END IF
     240             : 
     241             :    END SUBROUTINE mkgxyz3
     242             : END MODULE m_mkgxyz3

Generated by: LCOV version 1.14