aboutsummaryrefslogtreecommitdiff
path: root/src/qlm_killing_gradient.F90
diff options
context:
space:
mode:
Diffstat (limited to 'src/qlm_killing_gradient.F90')
-rw-r--r--src/qlm_killing_gradient.F90169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/qlm_killing_gradient.F90 b/src/qlm_killing_gradient.F90
new file mode 100644
index 0000000..fe970b5
--- /dev/null
+++ b/src/qlm_killing_gradient.F90
@@ -0,0 +1,169 @@
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Functions.h"
+#include "cctk_Parameters.h"
+
+
+
+subroutine qlm_killing_gradient (CCTK_ARGUMENTS, hn)
+ use cctk
+ use constants
+ use qlm_boundary
+ use qlm_derivs
+ use tensor2
+ implicit none
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_FUNCTIONS
+ DECLARE_CCTK_PARAMETERS
+ integer :: hn
+
+ CCTK_REAL, parameter :: two=2, half=1/two
+ CCTK_REAL :: qq(2,2), dqq(2,2,2), dtq, qu(2,2), dqu(2,2,2)
+ CCTK_REAL :: dpsi2(2), ddpsi2(2,2), ndpsi2, dndpsi2(2)
+ CCTK_REAL :: xi(2), dxi(2,2), chi
+ integer :: i, j
+ integer :: a, b
+ CCTK_REAL :: delta_space(2)
+
+ delta_space(:) = (/ qlm_delta_theta(hn), qlm_delta_phi(hn) /)
+
+ ! Calculate the gradient of a scalar
+ do j = 1+qlm_nghostsphi(hn), qlm_nphi(hn)-qlm_nghostsphi(hn)
+ do i = 1+qlm_nghoststheta(hn), qlm_ntheta(hn)-qlm_nghoststheta(hn)
+
+ ! 2-metric on the horizon
+ qq(1,1) = qlm_qtt(i,j,hn)
+ qq(1,2) = qlm_qtp(i,j,hn)
+ qq(2,2) = qlm_qpp(i,j,hn)
+ qq(2,1) = qq(1,2)
+
+#if 0
+ dqq(1,1,1) = qlm_dqttt(i,j,hn)
+ dqq(1,1,2) = qlm_dqttp(i,j,hn)
+ dqq(1,2,1) = qlm_dqtpt(i,j,hn)
+ dqq(1,2,2) = qlm_dqtpp(i,j,hn)
+ dqq(2,2,1) = qlm_dqppt(i,j,hn)
+ dqq(2,2,2) = qlm_dqppp(i,j,hn)
+ dqq(2,1,:) = dqq(1,2,:)
+#endif
+
+ call calc_2det (qq, dtq)
+#if 0
+ call calc_2inv (qq, dtq, qu)
+ call calc_2invderiv (qu, dqq, dqu)
+#endif
+
+ dpsi2(1) = (abs2(qlm_psi2(i+1,j,hn)) - abs2(qlm_psi2(i-1,j,hn))) / (2*qlm_delta_theta(hn))
+ dpsi2(2) = (abs2(qlm_psi2(i,j+1,hn)) - abs2(qlm_psi2(i,j-1,hn))) / (2*qlm_delta_phi(hn))
+
+#if 0
+ ddpsi2(1,1) = (abs2(qlm_psi2(i+1,j,hn)) - 2*abs2(qlm_psi2(i,j,hn)) + abs2(qlm_psi2(i-1,j,hn))) / qlm_delta_theta(hn)**2
+ ddpsi2(2,2) = (abs2(qlm_psi2(i,j+1,hn)) - 2*abs2(qlm_psi2(i,j,hn)) + abs2(qlm_psi2(i,j-1,hn))) / qlm_delta_phi(hn)**2
+ ddpsi2(1,1) = (abs2(qlm_psi2(i-1,j-1,hn)) - abs2(qlm_psi2(i+1,j-1,hn)) - abs2(qlm_psi2(i-1,j+1,hn)) + abs2(qlm_psi2(i+1,j+1,hn))) / (4*qlm_delta_theta(hn)*qlm_delta_phi(hn))
+ ddpsi2(2,1) = ddpsi2(1,2)
+
+ ! ndpsi2 = ||grad |Psi_2|^2||
+ ndpsi2 = 0
+ do a=1,2
+ do b=1,2
+ ndpsi2 = ndpsi2 + qu(a,b) * dpsi2(a) * dpsi2(b)
+ end do
+ end do
+ ndpsi2 = sqrt(ndpsi2)
+
+ ! dndpsi2 = grad ||grad |Psi_2|^2||
+ do a=1,2
+ dndpsi2(a) = 0
+ do b=1,2
+ do c=1,2
+ dndpsi2(a) = dndpsi2(a) + 1 / (2*ndpsi2) * (qu(b,c) * ddpsi2(b,a) * dpsi2(c) + qu(b,c) * dpsi2(b) * ddpsi2(c,a) + dqu(b,c,a) * dpsi2(b) * dpsi2(c))
+ end do
+ end do
+ end do
+#endif
+
+ ! xi^a = eps^ab D_b |Psi_2|^2
+ do a=1,2
+ xi(a) = 0
+ do b=1,2
+ xi(a) = xi(a) + sqrt(dtq) * epsilon2(a,b) * dpsi2(b)
+ end do
+ end do
+
+ qlm_xi_t(i,j,hn) = xi(1)
+ qlm_xi_p(i,j,hn) = xi(2)
+
+#if 0
+ ! xi^a = eps^ab D_b ||D_c |Psi_2|^2||
+ do a=1,2
+ xi(a) = 0
+ do b=1,2
+ xi(a) = xi(a) + sqrt(dtq) * epsilon2(a,b) * dndpsi2(b)
+ end do
+ end do
+
+ qlm_xi_t(i,j,hn) = xi(1)
+ qlm_xi_p(i,j,hn) = xi(2)
+#endif
+
+ end do
+ end do
+
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_xi_t(:,:,hn), -1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_xi_p(:,:,hn), -1)
+
+
+
+ ! fix up xi (which must not be zero)
+ do j = 1+qlm_nghostsphi(hn), qlm_nphi(hn)-qlm_nghostsphi(hn)
+ do i = 1+qlm_nghoststheta(hn), qlm_ntheta(hn)-qlm_nghoststheta(hn)
+
+ xi(1) = qlm_xi_t(i,j,hn)
+ xi(2) = qlm_xi_p(i,j,hn)
+
+ if (sum(xi**2) < 1.0d-4**2) then
+
+ qlm_xi_t(i,j,hn) = sum(qlm_xi_t(i:i+1,j:j+1,hn)) / 4
+ qlm_xi_p(i,j,hn) = sum(qlm_xi_p(i:i+1,j:j+1,hn)) / 4
+
+ end if
+
+ end do
+ end do
+
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_xi_t(:,:,hn), -1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_xi_p(:,:,hn), -1)
+
+
+
+ ! set up the derivative of xi (which is not really needed)
+ do j = 1+qlm_nghostsphi(hn), qlm_nphi(hn)-qlm_nghostsphi(hn)
+ do i = 1+qlm_nghoststheta(hn), qlm_ntheta(hn)-qlm_nghoststheta(hn)
+
+ ! 2-metric on the horizon
+ qq(1,1) = qlm_qtt(i,j,hn)
+ qq(1,2) = qlm_qtp(i,j,hn)
+ qq(2,2) = qlm_qpp(i,j,hn)
+ qq(2,1) = qq(1,2)
+ call calc_2det (qq, dtq)
+
+ dxi(1,1:2) = deriv (qlm_xi_t(:,:,hn), i, j, delta_space)
+ dxi(2,1:2) = deriv (qlm_xi_p(:,:,hn), i, j, delta_space)
+
+ ! eps_ab sqrt(q) chi = D_b xi_a
+ ! sqrt(q) chi = -1/2 eps^ab D_a xi_b
+ chi = 0
+ do a=1,2
+ do b=1,2
+ chi = chi - half * sqrt(dtq) * epsilon2(a,b) * dxi(b,a)
+ end do
+ end do
+
+ qlm_chi(i,j,hn) = chi
+
+ end do
+ end do
+
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_chi (:,:,hn), +1)
+
+end subroutine qlm_killing_gradient