aboutsummaryrefslogtreecommitdiff
path: root/src/tensor2.F90
diff options
context:
space:
mode:
Diffstat (limited to 'src/tensor2.F90')
-rw-r--r--src/tensor2.F90107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/tensor2.F90 b/src/tensor2.F90
new file mode 100644
index 0000000..b02cd06
--- /dev/null
+++ b/src/tensor2.F90
@@ -0,0 +1,107 @@
+! $Header$
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+
+module tensor2
+ implicit none
+ DECLARE_CCTK_PARAMETERS
+ private
+
+ public calc_2trace
+
+ public calc_2det
+ public calc_2detderiv
+ public calc_2detdot
+
+ public calc_2inv
+ public calc_2invderiv
+ public calc_2invdot
+
+contains
+
+ subroutine calc_2trace (kk, gu, trk)
+ CCTK_REAL, intent(in) :: kk(2,2)
+ CCTK_REAL, intent(in) :: gu(2,2)
+ CCTK_REAL, intent(out) :: trk
+ integer :: i,j
+ trk = 0
+ do i=1,2
+ do j=1,2
+ trk = trk + gu(i,j) * kk(i,j)
+ end do
+ end do
+ end subroutine calc_2trace
+
+
+
+ subroutine calc_2det (gg, dtg)
+ CCTK_REAL, intent(in) :: gg(2,2)
+ CCTK_REAL, intent(out) :: dtg
+ dtg = gg(1,1) * gg(2,2) - gg(1,2)**2
+ end subroutine calc_2det
+
+ subroutine calc_2pdet (gg, pgg, pdtg)
+ CCTK_REAL, intent(in) :: gg(2,2), pgg(2,2)
+ CCTK_REAL, intent(out) :: pdtg
+ pdtg = pgg(1,1) * gg(2,2) + gg(1,1) * pgg(2,2) - 2 * gg(1,2) * pgg(1,2)
+ end subroutine calc_2pdet
+
+ subroutine calc_2detderiv (gg, dgg, ddtg)
+ CCTK_REAL, intent(in) :: gg(2,2), dgg(2,2,2)
+ CCTK_REAL, intent(out) :: ddtg(2)
+ integer :: i
+ do i=1,2
+ call calc_2pdet (gg, dgg(:,:,i), ddtg(i))
+ end do
+ end subroutine calc_2detderiv
+
+ subroutine calc_2detdot (gg, gg_dot, dtg_dot)
+ CCTK_REAL, intent(in) :: gg(2,2), gg_dot(2,2)
+ CCTK_REAL, intent(out) :: dtg_dot
+ call calc_2pdet (gg, gg_dot, dtg_dot)
+ end subroutine calc_2detdot
+
+
+
+ subroutine calc_2inv (gg, dtg, gu)
+ CCTK_REAL, intent(in) :: gg(2,2), dtg
+ CCTK_REAL, intent(out) :: gu(2,2)
+ gu(1,1) = gg(2,2) / dtg
+ gu(2,2) = gg(1,1) / dtg
+ gu(1,2) = gg(1,2) / dtg
+ gu(2,1) = gu(1,2)
+ end subroutine calc_2inv
+
+ subroutine calc_2pinv (gu, pgg, pgu)
+ CCTK_REAL, intent(in) :: gu(2,2), pgg(2,2)
+ CCTK_REAL, intent(out) :: pgu(2,2)
+ integer :: i,j,k,l
+ do i=1,2
+ do j=1,2
+ pgu(i,j) = 0
+ do k=1,2
+ do l=1,2
+ pgu(i,j) = pgu(i,j) - gu(i,k) * gu(j,l) * pgg(k,l)
+ end do
+ end do
+ end do
+ end do
+ end subroutine calc_2pinv
+
+ subroutine calc_2invderiv (gu, dgg, dgu)
+ CCTK_REAL, intent(in) :: gu(2,2), dgg(2,2,2)
+ CCTK_REAL, intent(out) :: dgu(2,2,2)
+ integer :: i
+ do i=1,2
+ call calc_2pinv (gu, dgg(:,:,i), dgu(:,:,i))
+ end do
+ end subroutine calc_2invderiv
+
+ subroutine calc_2invdot (gu, gg_dot, gu_dot)
+ CCTK_REAL, intent(in) :: gu(2,2), gg_dot(2,2)
+ CCTK_REAL, intent(out) :: gu_dot(2,2)
+ call calc_2pinv (gu, gg_dot, gu_dot)
+ end subroutine calc_2invdot
+
+end module tensor2