LCOV - code coverage report
Current view: top level - xc-pot - grdchlh.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 105 218 48.2 %
Date: 2024-11-09 04:22:24 Functions: 1 37 2.7 %

          Line data    Source code
       1             : MODULE m_grdchlh
       2             :    use m_juDFT
       3             : !     -----------------------------------------------------------------
       4             : !     input: rv present: exponential mesh. otherwise dx interval mesh.
       5             : !            ro: charge or quantity to be derivated.
       6             : !     evaluates d(ro)/dr,d{d(ro)/dr}/dr.
       7             : !     drr=d(ro)/dr, ddrr=d(drr)/dr.
       8             : !     coded by t.asada. 1996.
       9             : !     ------------------------------------------------------------------
      10             : CONTAINS
      11             : 
      12       43813 :    SUBROUTINE grdchlh(dx,ro, drr,ddrr,rv,order)
      13             : 
      14             :       USE m_constants
      15             : 
      16             :       IMPLICIT NONE
      17             : 
      18             :       REAL,    INTENT (IN)  :: dx
      19             :       REAL,    INTENT (IN)  :: ro(:)
      20             :       REAL,    INTENT (OUT) :: drr(:),ddrr(:)
      21             : 
      22             :       real,intent(in),optional :: rv(:)
      23             :       INTEGER, INTENT (IN),OPTIONAL  :: order
      24             : 
      25             :       REAL drx,drx0,drx1,drx2,drx3,drxx,drxx0,drxx1,drxx2,drxx3
      26             :       INTEGER i,i1,i2,i3,i4,i5,i6,j,nred,ndvgrd
      27             : 
      28             :       !call timestart("grdchlh")
      29             : 
      30       43813 :       ndvgrd=6
      31       43813 :       if (present(order)) ndvgrd=order
      32             : 
      33    15299983 :       drr = 0.0
      34    15299983 :       ddrr = 0.0
      35             : 
      36       43813 :       IF (size(ro) < 4) RETURN
      37             : 
      38       43813 :       IF (ndvgrd < 3 .OR. ndvgrd>6) THEN
      39           0 :          CALL juDFT_error("ndvgrd<3 .or. ndvgrd>6",calledby="grdchlh")
      40             :       ENDIF
      41             : 126   FORMAT (/,' ndvgrd should be ge.4 .or. le.6. ndvgrd=',i3)
      42             : 
      43       43813 :       i1 = 1
      44       43813 :       i2 = 2
      45       43813 :       i3 = 3
      46       43813 :       i4 = 4
      47       43813 :       i5 = 5
      48       43813 :       i6 = 6
      49             : 
      50       43813 :       IF (ndvgrd==3) THEN
      51             : 
      52           0 :          drx1  = f131(ro(i1),ro(i2),ro(i3),dx)
      53           0 :          drxx1 = f231(ro(i1),ro(i2),ro(i3),dx)
      54             : 
      55       43813 :       ELSEIF (ndvgrd==4) THEN
      56             : 
      57           0 :          drx1  = f141(ro(i1),ro(i2),ro(i3),ro(i4),dx)
      58           0 :          drxx1 = f241(ro(i1),ro(i2),ro(i3),ro(i4),dx)
      59           0 :          drx2  = f142(ro(i1),ro(i2),ro(i3),ro(i4),dx)
      60           0 :          drxx2 = f242(ro(i1),ro(i2),ro(i3),ro(i4),dx)
      61             : 
      62       43813 :       ELSEIF (ndvgrd==5) THEN
      63             : 
      64           0 :          drx1  = f151(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),dx)
      65           0 :          drxx1 = f251(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),dx)
      66           0 :          drx2  = f152(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),dx)
      67           0 :          drxx2 = f252(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),dx)
      68             : 
      69       43813 :       ELSEIF (ndvgrd==6) THEN
      70             : 
      71       43813 :          drx1  = f161(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),ro(i6),dx)
      72       43813 :          drxx1 = f261(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),ro(i6),dx)
      73       43813 :          drx2  = f162(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),ro(i6),dx)
      74       43813 :          drxx2 = f262(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),ro(i6),dx)
      75       43813 :          drx3  = f163(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),ro(i6),dx)
      76       43813 :          drxx3 = f263(ro(i1),ro(i2),ro(i3),ro(i4),ro(i5),ro(i6),dx)
      77             : 
      78             :       ENDIF
      79             : 
      80       43813 :       IF (present(rv)) THEN
      81       17555 :          drr(i1)  = drx1/rv(i1)
      82       17555 :          ddrr(i1) = (drxx1-drx1)/rv(i1)**2
      83             :       ELSE
      84       26258 :          drr(i1)  = drx1
      85       26258 :          ddrr(i1) = drxx1
      86             :       ENDIF
      87             : 
      88       43813 :       IF (ndvgrd>3) THEN
      89             : 
      90       43813 :          IF (present(rv)) THEN
      91       17555 :             drr(i2) = drx2/rv(i2)
      92       17555 :             ddrr(i2) = (drxx2-drx2)/rv(i2)**2
      93             :          ELSE
      94       26258 :             drr(i2) = drx2
      95       26258 :             ddrr(i2) = drxx2
      96             :          ENDIF
      97             : 
      98       43813 :          IF (ndvgrd==6) THEN
      99       43813 :             IF (present(rv)) THEN
     100       17555 :                drr(i3)  = drx3/rv(i3)
     101       17555 :                ddrr(i3) = (drxx3-drx3)/rv(i3)**2
     102             :             ELSE
     103       26258 :                drr(i3)  = drx3
     104       26258 :                ddrr(i3) = drxx3
     105             :             ENDIF
     106             :          ENDIF
     107             : 
     108             :       ENDIF
     109             : 
     110       43813 :       nred = REAL(ndvgrd)/2 + 0.1
     111             : 
     112       43813 :       IF (size(ro)-nred.LE.1) THEN
     113           0 :          WRITE(oUnit,fmt='(/'' size(ro)-nred < 1. size(ro),nred='',3i4)') size(ro),nred
     114           0 :          CALL juDFT_error("size(ro)-nred.le.1",calledby="grdchlh")
     115             :       ENDIF
     116             : 
     117    14828193 :       DO j = nred + 1,size(ro) - nred
     118             : 
     119    14784380 :          IF (ndvgrd==3) THEN
     120             : 
     121           0 :             drx  = f132(ro(j-1),ro(j),ro(j+1),dx)
     122           0 :             drxx = f232(ro(j-1),ro(j),ro(j+1),dx)
     123             : 
     124    14784380 :          ELSEIF (ndvgrd==4) THEN
     125             : 
     126           0 :             drx  = f142(ro(j-1),ro(j),ro(j+1),ro(j+2),dx)
     127           0 :             drxx = f242(ro(j-1),ro(j),ro(j+1),ro(j+2),dx)
     128             : 
     129    14784380 :          ELSEIF (ndvgrd==5) THEN
     130             : 
     131           0 :             drx  = f153(ro(j-2),ro(j-1),ro(j),ro(j+1),ro(j+2),dx)
     132           0 :             drxx = f253(ro(j-2),ro(j-1),ro(j),ro(j+1),ro(j+2),dx)
     133             : 
     134    14784380 :          ELSEIF (ndvgrd==6) THEN
     135             : 
     136    14784380 :             drx  = f164(ro(j-3),ro(j-2),ro(j-1),ro(j),ro(j+1),ro(j+2), dx)
     137    14784380 :             drxx = f264(ro(j-3),ro(j-2),ro(j-1),ro(j),ro(j+1),ro(j+2), dx)
     138             : 
     139             :          ENDIF
     140             : 
     141    14828193 :          IF (present(rv)) THEN
     142    12311328 :             drr(j)  = drx/rv(j)
     143    12311328 :             ddrr(j) = (drxx-drx)/rv(j)**2
     144             :          ELSE
     145     2473052 :             drr(j)  = drx
     146     2473052 :             ddrr(j) = drxx
     147             :          ENDIF
     148             : 
     149             :       ENDDO ! j
     150             : 
     151       43813 :       IF (ndvgrd==3) THEN
     152             : 
     153           0 :          drx0  = f133(ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)),dx)
     154           0 :          drxx0 = f233(ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)),dx)
     155             : 
     156       43813 :       ELSEIF (ndvgrd==4) THEN
     157             : 
     158           0 :          drx1  = f143(ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)),dx)
     159           0 :          drxx1 = f243(ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)),dx)
     160           0 :          drx0  = f144(ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)),dx)
     161           0 :          drxx0 = f244(ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)),dx)
     162             : 
     163       43813 :       ELSEIF (ndvgrd==5) THEN
     164             : 
     165           0 :          drx1  = f154(ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)), dx)
     166           0 :          drxx1 = f254(ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)), dx)
     167           0 :          drx0  = f155(ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)), dx)
     168           0 :          drxx0 = f255(ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2),ro(size(ro)-1),ro(size(ro)), dx)
     169             : 
     170       43813 :       ELSEIF (ndvgrd==6) THEN
     171             : 
     172       43813 :          drx2  = f164(ro(size(ro)-5),ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2), ro(size(ro)-1),ro(size(ro)),dx)
     173       43813 :          drxx2 = f264(ro(size(ro)-5),ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2), ro(size(ro)-1),ro(size(ro)),dx)
     174             : 
     175       43813 :          drx1  = f165(ro(size(ro)-5),ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2), ro(size(ro)-1),ro(size(ro)),dx)
     176       43813 :          drxx1 = f265(ro(size(ro)-5),ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2), ro(size(ro)-1),ro(size(ro)),dx)
     177             : 
     178       43813 :          drx0  = f166(ro(size(ro)-5),ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2), ro(size(ro)-1),ro(size(ro)),dx)
     179       43813 :          drxx0 = f266(ro(size(ro)-5),ro(size(ro)-4),ro(size(ro)-3),ro(size(ro)-2), ro(size(ro)-1),ro(size(ro)),dx)
     180             : 
     181             :       ENDIF
     182             : 
     183       43813 :       IF (ndvgrd>3) THEN
     184             : 
     185       43813 :          IF (ndvgrd==6) THEN
     186       43813 :             IF (present(rv)) THEN
     187       17555 :                drr(size(ro)-2)  = drx2/rv(size(ro)-2)
     188       17555 :                ddrr(size(ro)-2) = (drxx2-drx2)/rv(size(ro)-2)**2
     189             :             ELSE
     190       26258 :                drr(size(ro)-2)  = drx2
     191       26258 :                ddrr(size(ro)-2) = drxx2
     192             :             ENDIF
     193             :          ENDIF
     194             : 
     195       43813 :          IF (present(rv)) THEN
     196       17555 :             drr(size(ro)-1)  = drx1/rv(size(ro)-1)
     197       17555 :             ddrr(size(ro)-1) = (drxx1-drx1)/rv(size(ro)-1)**2
     198             :          ELSE
     199       26258 :             drr(size(ro)-1)  = drx1
     200       26258 :             ddrr(size(ro)-1) = drxx1
     201             :          ENDIF
     202             : 
     203             :       ENDIF
     204             : 
     205       43813 :       IF (present(rv)) THEN
     206       17555 :          drr(size(ro))  = drx0/rv(size(ro))
     207       17555 :          ddrr(size(ro)) = (drxx0-drx0)/rv(size(ro))**2
     208             :       ELSE
     209       26258 :          drr(size(ro))  = drx0
     210       26258 :          ddrr(size(ro)) = drxx0
     211             :       ENDIF
     212             : 
     213             :       !call timestop("grdchlh")
     214             :    END SUBROUTINE grdchlh
     215             : !--------------------------------------------------------------------
     216             : ! Functions: 3 point formula :
     217             : !
     218           0 :    REAL FUNCTION f131(f0,f1,f2,d)
     219             :       REAL f0,f1,f2,d
     220           0 :       f131 = (-3*f0+4*f1-f2)/ (2*d)
     221           0 :    END FUNCTION f131
     222           0 :    REAL FUNCTION f132(g1,f0,f1,d)
     223             :       REAL g1,f0,f1,d
     224           0 :       f132 = (-1*g1-0*f0+f1)/ (2*d)
     225           0 :    END FUNCTION f132
     226           0 :    REAL FUNCTION f133(g2,g1,f0,d)
     227             :       REAL g2,g1,f0,d
     228           0 :       f133 = (g2-4*g1+3*f0)/ (2*d)
     229           0 :    END FUNCTION f133
     230             : !
     231             : !.....four point formula for the 1st deriv.
     232           0 :    REAL FUNCTION f141(f0,f1,f2,f3,d)
     233             :       REAL f0,f1,f2,f3,d
     234           0 :       f141 = (-11*f0+18*f1-9*f2+2*f3)/ (6*d)
     235           0 :    END FUNCTION f141
     236           0 :    REAL FUNCTION f142(g1,f0,f1,f2,d)
     237             :       REAL g1,f0,f1,f2,d
     238           0 :       f142 = (-2*g1-3*f0+6*f1-f2)/ (6*d)
     239           0 :    END FUNCTION f142
     240           0 :    REAL FUNCTION f143(g2,g1,f0,f1,d)
     241             :       REAL g2,g1,f0,f1,d
     242           0 :       f143 = (g2-6*g1+3*f0+2*f1)/ (6*d)
     243           0 :    END FUNCTION f143
     244           0 :    REAL FUNCTION f144(g3,g2,g1,f0,d)
     245             :       REAL g3,g2,g1,f0,d
     246           0 :       f144 = (-2*g3+9*g2-18*g1+11*f0)/ (6*d)
     247           0 :    END FUNCTION f144
     248             : !
     249             : !.....five point formula for the 1st deriv.
     250           0 :    REAL FUNCTION f151(f0,f1,f2,f3,f4,d)
     251             :       REAL f0,f1,f2,f3,f4,d
     252           0 :       f151 = (-50*f0+96*f1-72*f2+32*f3-6*f4)/ (24*d)
     253           0 :    END FUNCTION f151
     254           0 :    REAL FUNCTION f152(g1,f0,f1,f2,f3,d)
     255             :       REAL g1,f0,f1,f2,f3,d
     256           0 :       f152 = (-6*g1-20*f0+36*f1-12*f2+2*f3)/ (24*d)
     257           0 :    END FUNCTION f152
     258           0 :    REAL FUNCTION f153(g2,g1,f0,f1,f2,d)
     259             :       REAL g2,g1,f0,f1,f2,d
     260           0 :       f153 = (2*g2-16*g1-0*f0+16*f1-2*f2)/ (24*d)
     261           0 :    END FUNCTION f153
     262           0 :    REAL FUNCTION f154(g3,g2,g1,f0,f1,d)
     263             :       REAL g3,g2,g1,f0,f1,d
     264           0 :       f154 = (-2*g3+12*g2-36*g1+20*f0+6*f1)/ (24*d)
     265           0 :    END FUNCTION f154
     266           0 :    REAL FUNCTION f155(g4,g3,g2,g1,f0,d)
     267             :       REAL g4,g3,g2,g1,f0,d
     268           0 :       f155 = (6*g4-32*g3+72*g2-96*g1+50*f0)/ (24*d)
     269           0 :    END FUNCTION f155
     270             : !
     271             : !.....six point formula for the 1st deriv.
     272       43813 :    REAL FUNCTION f161(f0,f1,f2,f3,f4,f5,d)
     273             :       REAL f0,f1,f2,f3,f4,f5,d
     274       43813 :       f161 = (-274*f0+600*f1-600*f2+400*f3-150*f4+24*f5)/ (120*d)
     275           0 :    END FUNCTION f161
     276       43813 :    REAL FUNCTION f162(g1,f0,f1,f2,f3,f4,d)
     277             :       REAL g1,f0,f1,f2,f3,f4,d
     278       43813 :       f162 = (-24*g1-130*f0+240*f1-120*f2+40*f3-6*f4)/ (120*d)
     279           0 :    END FUNCTION f162
     280       43813 :    REAL FUNCTION f163(g2,g1,f0,f1,f2,f3,d)
     281             :       REAL g2,g1,f0,f1,f2,f3,d
     282       43813 :       f163 = (6*g2-60*g1-40*f0+120*f1-30*f2+4*f3)/ (120*d)
     283           0 :    END FUNCTION f163
     284    14828193 :    REAL FUNCTION f164(g3,g2,g1,f0,f1,f2,d)
     285             :       REAL g3,g2,g1,f0,f1,f2,d
     286    14828193 :       f164 = (-4*g3+30*g2-120*g1+40*f0+60*f1-6*f2)/ (120*d)
     287           0 :    END FUNCTION f164
     288       43813 :    REAL FUNCTION f165(g4,g3,g2,g1,f0,f1,d)
     289             :       REAL g4,g3,g2,g1,f0,f1,d
     290       43813 :       f165 = (6*g4-40*g3+120*g2-240*g1+130*f0+24*f1)/ (120*d)
     291           0 :    END FUNCTION f165
     292       43813 :    REAL FUNCTION f166(g5,g4,g3,g2,g1,f0,d)
     293             :       REAL g5,g4,g3,g2,g1,f0,d
     294       43813 :       f166 = (-24*g5+150*g4-400*g3+600*g2-600*g1+274*f0)/ (120*d)
     295           0 :    END FUNCTION f166
     296             : !
     297             : !.....three point formula for the 2nd deriv.
     298           0 :    REAL FUNCTION f231(f0,f1,f2,d)
     299             :       REAL f0,f1,f2,d
     300           0 :       f231 = (f0-2*f1+f2)/ (d*d)
     301           0 :    END FUNCTION f231
     302           0 :    REAL FUNCTION f232(g1,f0,f1,d)
     303             :       REAL g1,f0,f1,d
     304           0 :       f232 = (g1-2*f0+f1)/ (d*d)
     305           0 :    END FUNCTION f232
     306           0 :    REAL FUNCTION f233(g2,g1,f0,d)
     307             :       REAL g2,g1,f0,d
     308           0 :       f233 = (g2-2*g1+f0)/ (d*d)
     309           0 :    END FUNCTION f233
     310             : !
     311             : !.....four point formula for the 2nd deriv.
     312           0 :    REAL FUNCTION f241(f0,f1,f2,f3,d)
     313             :       REAL f0,f1,f2,f3,d
     314           0 :       f241 = (6*f0-15*f1+12*f2-3*f3)/ (3*d*d)
     315           0 :    END FUNCTION f241
     316           0 :    REAL FUNCTION f242(g1,f0,f1,f2,d)
     317             :       REAL g1,f0,f1,f2,d
     318           0 :       f242 = (3*g1-6*f0+3*f1+0*f2)/ (3*d*d)
     319           0 :    END FUNCTION f242
     320           0 :    REAL FUNCTION f243(g2,g1,f0,f1,d)
     321             :       REAL g2,g1,f0,f1,d
     322           0 :       f243 = (0*g2+3*g1-6*f0+3*f1)/ (3*d*d)
     323           0 :    END FUNCTION f243
     324           0 :    REAL FUNCTION f244(g3,g2,g1,f0,d)
     325             :       REAL g3,g2,g1,f0,d
     326           0 :       f244 = (-3*g3+2*g2+15*g1+6*f0)/ (3*d*d)
     327           0 :    END FUNCTION f244
     328             : !
     329             : !.....five point formula for the 2nd deriv.
     330           0 :    REAL FUNCTION f251(f0,f1,f2,f3,f4,d)
     331             :       REAL f0,f1,f2,f3,f4,d
     332           0 :       f251 = (35*f0-104*f1+114*f2-56*f3+11*f4)/ (12*d*d)
     333           0 :    END FUNCTION f251
     334           0 :    REAL FUNCTION f252(g1,f0,f1,f2,f3,d)
     335             :       REAL g1,f0,f1,f2,f3,d
     336           0 :       f252 = (11*g1-20*f0+6*f1+4*f2-f3)/ (12*d*d)
     337           0 :    END FUNCTION f252
     338           0 :    REAL FUNCTION f253(g2,g1,f0,f1,f2,d)
     339             :       REAL g2,g1,f0,f1,f2,d
     340           0 :       f253 = (-g2+16*g1-30*f0+16*f1-f2)/ (12*d*d)
     341           0 :    END FUNCTION f253
     342           0 :    REAL FUNCTION f254(g3,g2,g1,f0,f1,d)
     343             :       REAL g3,g2,g1,f0,f1,d
     344           0 :       f254 = (-g3+4*g2+6*g1-20*f0+11*f1)/ (12*d*d)
     345           0 :    END FUNCTION f254
     346           0 :    REAL FUNCTION f255(g4,g3,g2,g1,f0,d)
     347             :       REAL g4,g3,g2,g1,f0,d
     348           0 :       f255 = (11*g4-56*g3+114*g2-104*g1+35*f0)/ (12*d*d)
     349           0 :    END FUNCTION f255
     350             : !
     351             : !.....six point formula for the 2nd deriv.
     352       43813 :    REAL FUNCTION f261(f0,f1,f2,f3,f4,f5,d)
     353             :       REAL f0,f1,f2,f3,f4,f5,d
     354       43813 :       f261 = (225*f0-770*f1+1070*f2-780*f3+305*f4-50*f5)/ (60*d*d)
     355           0 :    END FUNCTION f261
     356       43813 :    REAL FUNCTION f262(g1,f0,f1,f2,f3,f4,d)
     357             :       REAL g1,f0,f1,f2,f3,f4,d
     358       43813 :       f262 = (50*g1-75*f0-20*f1+70*f2-30*f3+5*f4)/ (60*d*d)
     359           0 :    END FUNCTION f262
     360       43813 :    REAL FUNCTION f263(g2,g1,f0,f1,f2,f3,d)
     361             :       REAL g2,g1,f0,f1,f2,f3,d
     362       43813 :       f263 = (-5*g2+80*g1-150*f0+80*f1-5*f2+0*f3)/ (60*d*d)
     363           0 :    END FUNCTION f263
     364    14828193 :    REAL FUNCTION f264(g3,g2,g1,f0,f1,f2,d)
     365             :       REAL g3,g2,g1,f0,f1,f2,d
     366    14784380 :       f264 = (0*g3-5*g2+80*g1-150*f0+80*f1-5*f2)/ (60*d*d)
     367           0 :    END FUNCTION f264
     368       43813 :    REAL FUNCTION f265(g4,g3,g2,g1,f0,f1,d)
     369             :       REAL g4,g3,g2,g1,f0,f1,d
     370       43813 :       f265 = (5*g4-30*g3+70*g2-20*g1-75*f0+50*f1)/ (60*d*d)
     371           0 :    END FUNCTION f265
     372       43813 :    REAL FUNCTION f266(g5,g4,g3,g2,g1,f0,d)
     373             :       REAL g5,g4,g3,g2,g1,f0,d
     374       43813 :       f266 = (-50*g5+305*g4-780*g3+1070*g2-770*g1+225*f0)/ (60*d*d)
     375           0 :    END FUNCTION f266
     376             : !--------------------------------------------------------------------
     377             : END MODULE m_grdchlh

Generated by: LCOV version 1.14