From ff65f5fd88779b09f61f6e052817882dcf87a49f Mon Sep 17 00:00:00 2001 From: schnetter Date: Tue, 26 Apr 2005 14:48:14 +0000 Subject: Add routines for third derivatives git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinUtils/TGRtensor/trunk@22 b716e942-a2de-43ad-8f52-f3dfe468e4e7 --- src/derivs.F90 | 29 +++++++++++++++++++++++++++++ src/pointwise.F90 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/src/derivs.F90 b/src/derivs.F90 index 1d425c8..1413f7d 100644 --- a/src/derivs.F90 +++ b/src/derivs.F90 @@ -10,6 +10,7 @@ module derivs private public get_derivs public get_derivs2 + public get_derivs3 contains #endif subroutine get_derivs (a, f, pos, off, dx) @@ -41,6 +42,34 @@ contains & - a(pos-off(2)+off(3)) + a(pos+off(2)+off(3))) / (4*dx(2)*dx(3)) f(3,2) = f(2,3) end subroutine get_derivs2 + subroutine get_derivs3 (a, f, pos, off, dx) + CCTK_REAL, intent(in) :: a(*) + CCTK_REAL, intent(out) :: f(3,3,3) + integer, intent(in) :: pos, off(3) + CCTK_REAL, intent(in) :: dx(3) + integer :: i + f(1,1,1) = (- a(pos+2*off(1)) + 2*a(pos+off(1)) - 2*a(pos-off(1)) + a(pos-2*off(1))) / (2*dx(1)**3) + f(2,1,1) = (a(pos+off(1)+off(2)) - 2*a(pos+off(2)) + a(pos-off(1)+off(2)) - a(pos+off(1)-off(2)) + 2*a(pos-off(2)) - a(pos-off(1)-off(2))) / (2*dx(1)*dx(1)*dx(2)) + f(3,1,1) = (a(pos+off(1)+off(3)) - 2*a(pos+off(3)) + a(pos-off(1)+off(3)) - a(pos+off(1)-off(3)) + 2*a(pos-off(3)) - a(pos-off(1)-off(3))) / (2*dx(1)*dx(1)*dx(3)) + f(1,2,1) = f(2,1,1) + f(2,2,1) = (a(pos+off(1)+off(2)) - 2*a(pos+off(1)) + a(pos+off(1)-off(2)) - a(pos-off(1)+off(2)) + 2*a(pos-off(1)) - a(pos-off(1)-off(2))) / (2*dx(1)*dx(2)*dx(2)) + f(3,2,1) = (a(pos+off(1)+off(2)+1) - a(pos-off(1)+off(2)+1) - a(pos+off(1)-off(2)+1) + a(pos-off(1)-off(2)+1) - a(pos+off(1)+off(2)-1) + a(pos-off(1)+off(2)-1) + a(pos+off(1)-off(2)-1) - a(pos-off(1)-off(2)-1)) * (8*dx(1)*dx(2)*dx(3)) + f(1,3,1) = f(3,3,1) + f(2,3,1) = f(3,2,1) + f(3,3,1) = (a(pos+off(1)+off(3)) - 2*a(pos+off(1)) + a(pos+off(1)-off(3)) - a(pos-off(1)+off(3)) + 2*a(pos-off(1)) - a(pos-off(1)-off(3))) / (2*dx(1)*dx(3)*dx(3)) + f(:,1,2) = f(:,2,1) + f(1,2,2) = f(2,2,1) + f(2,2,2) = (- a(pos+2*off(2)) + 2*a(pos+off(2)) - 2*a(pos-off(2)) + a(pos-2*off(2))) / (2*dx(2)**3) + f(3,2,2) = (a(pos+off(2)+1) - 2*a(pos+off(3)) + a(pos-off(2)+1) - a(pos+off(2)-1) + 2*a(pos-off(3)) - a(pos-off(2)-1)) / (2*dx(2)*dx(2)*dx(3)) + f(1,3,2) = f(3,2,1) + f(2,3,2) = f(3,2,2) + f(3,3,2) = (a(pos+off(2)+1) - 2*a(pos+off(2)) + a(pos+off(2)-1) - a(pos-off(2)+1) + 2*a(pos-off(2)) - a(pos-off(2)-1)) / (2*dx(2)*dx(3)*dx(3)) + f(:,1,3) = f(:,3,1) + f(:,2,3) = f(:,3,2) + f(1,3,3) = f(3,3,1) + f(2,3,3) = f(3,3,2) + f(3,3,3) = (- a(pos+2*off(3)) + 2*a(pos+off(3)) - 2*a(pos-off(3)) + a(pos-2*off(3))) / (2*dx(3)**3) + end subroutine get_derivs3 #ifndef TGR_INCLUDED end module derivs #endif diff --git a/src/pointwise.F90 b/src/pointwise.F90 index 80c8bc6..6f435cb 100644 --- a/src/pointwise.F90 +++ b/src/pointwise.F90 @@ -22,6 +22,9 @@ module pointwise public get_scalarderivs2 public get_vectorderivs2 public get_tensorderivs2 + public get_scalarderivs3 + public get_vectorderivs3 + public get_tensorderivs3 contains #define TGR_INCLUDED #include "derivs.F90" @@ -247,4 +250,47 @@ contains f(3,2,:,:) = fyz f(3,3,:,:) = fzz end subroutine get_tensorderivs2 + subroutine get_scalarderivs3 (a, f, pos, off, dx) + CCTK_REAL, intent(in) :: a(*) + CCTK_REAL, intent(out) :: f(3,3,3) + integer, intent(in) :: pos, off(3) + CCTK_REAL, intent(in) :: dx(3) + call get_derivs3 (a, f, pos, off, dx) + end subroutine get_scalarderivs3 + subroutine get_vectorderivs3 (ax,ay,az, f, pos, off, dx) + CCTK_REAL, intent(in) :: ax(*),ay(*),az(*) + CCTK_REAL, intent(out) :: f(3,3,3,3) + integer, intent(in) :: pos, off(3) + CCTK_REAL, intent(in) :: dx(3) + CCTK_REAL :: fx(3,3,3),fy(3,3,3),fz(3,3,3) + call get_derivs3 (ax, fx, pos, off, dx) + call get_derivs3 (ay, fy, pos, off, dx) + call get_derivs3 (az, fz, pos, off, dx) + f(1,:,:,:) = fx + f(2,:,:,:) = fy + f(3,:,:,:) = fz + end subroutine get_vectorderivs3 + subroutine get_tensorderivs3 (axx,axy,axz,ayy,ayz,azz, f, pos, off, dx) + CCTK_REAL, intent(in) :: axx(*),axy(*),axz(*),ayy(*),ayz(*),azz(*) + CCTK_REAL, intent(out) :: f(3,3,3,3,3) + integer, intent(in) :: pos, off(3) + CCTK_REAL, intent(in) :: dx(3) + CCTK_REAL :: fxx(3,3,3),fxy(3,3,3),fxz(3,3,3),& + & fyy(3,3,3),fyz(3,3,3),fzz(3,3,3) + call get_derivs3 (axx, fxx, pos, off, dx) + call get_derivs3 (axy, fxy, pos, off, dx) + call get_derivs3 (axz, fxz, pos, off, dx) + call get_derivs3 (ayy, fyy, pos, off, dx) + call get_derivs3 (ayz, fyz, pos, off, dx) + call get_derivs3 (azz, fzz, pos, off, dx) + f(1,1,:,:,:) = fxx + f(1,2,:,:,:) = fxy + f(1,3,:,:,:) = fxz + f(2,1,:,:,:) = fxy + f(2,2,:,:,:) = fyy + f(2,3,:,:,:) = fyz + f(3,1,:,:,:) = fxz + f(3,2,:,:,:) = fyz + f(3,3,:,:,:) = fzz + end subroutine get_tensorderivs3 end module pointwise -- cgit v1.2.3