aboutsummaryrefslogtreecommitdiff
path: root/src/met_rad_der.F
diff options
context:
space:
mode:
Diffstat (limited to 'src/met_rad_der.F')
-rw-r--r--src/met_rad_der.F91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/met_rad_der.F b/src/met_rad_der.F
new file mode 100644
index 0000000..31821f0
--- /dev/null
+++ b/src/met_rad_der.F
@@ -0,0 +1,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
+
+
+
+
+
+