aboutsummaryrefslogtreecommitdiff
path: root/src/met_rad_der.F
blob: 31821f05d31d1026bfd977a03d09df7abacb840e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "cctk.h"

c     ========================================================================

      SUBROUTINE met_rad_der(origin,Dx,Dy,Dz,x,y,z,g,dg)

c     ------------------------------------------------------------------------
c
c     Calculate isotropic radial derivative of unphysical metric,
c     component or conformal factor at each point on the 3D grid, 
c     using derivatives in the Cartesian directions.
c
c     ------------------------------------------------------------------------
      
      IMPLICIT NONE

c     Input variables
      CCTK_REAL,INTENT(IN) :: 
     &     Dx,Dy,Dz,origin(3)
      CCTK_REAL,DIMENSION(:),INTENT(IN) :: 
     &     x,y,z
      CCTK_REAL,DIMENSION(:,:,:),INTENT(IN) :: 
     &     g
      
c     Output variables
      CCTK_REAL,DIMENSION(:,:,:),INTENT(OUT) :: 
     &     dg
      
c     Local variables, here only
      INTEGER :: 
     &     i,j,k
      CCTK_REAL,PARAMETER ::
     &     zero = 0.0D0,
     &     half = 0.5D0
      CCTK_REAL :: 
     &     rad

c     ------------------------------------------------------------------------

      DO k = 2, SIZE(z)-1
         DO j = 2, SIZE(y)-1
            DO i = 2, SIZE(x)-1
               
               rad = SQRT((x(i)-origin(1))**2 
     &              +(y(j)-origin(2))**2
     &              +(z(k)-origin(3))**2)
               
               IF (rad.NE.0) THEN
                  
                  dg(i,j,k) = half/rad*
     &                 ((x(i)-origin(1))/Dx*(g(i+1,j,k)-g(i-1,j,k))
     &                 +(y(j)-origin(2))/Dy*(g(i,j+1,k)-g(i,j-1,k))
     &                 +(z(k)-origin(3))/Dz*(g(i,j,k+1)-g(i,j,k-1)))
                  
               ELSE
                  
                  dg(i,j,k) = zero
                  
               ENDIF

          ENDDO
        ENDDO
      ENDDO

c     This is needed when the grid is an octant, but it does not hurt
c     if it is not

      DO k = 2, size(z)-1
         DO j = 2, size(y)-1
            dg(1,j,k) = dg(2,j,k)
         ENDDO
      ENDDO
      DO k = 2, size(z)-1
         DO i = 1, size(x)-1
            dg(i,1,k) = dg(i,2,k)
         ENDDO
      ENDDO
      DO j = 1, size(y)-1
         DO i = 1, size(x)-1
            dg(i,j,1) = dg(i,j,2)
         ENDDO
      ENDDO

      END SUBROUTINE met_rad_der