aboutsummaryrefslogtreecommitdiff
path: root/src/qlm_newman_penrose.F90
diff options
context:
space:
mode:
Diffstat (limited to 'src/qlm_newman_penrose.F90')
-rw-r--r--src/qlm_newman_penrose.F90156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/qlm_newman_penrose.F90 b/src/qlm_newman_penrose.F90
new file mode 100644
index 0000000..b6cc742
--- /dev/null
+++ b/src/qlm_newman_penrose.F90
@@ -0,0 +1,156 @@
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Functions.h"
+#include "cctk_Parameters.h"
+
+
+
+subroutine qlm_calc_newman_penrose (CCTK_ARGUMENTS, hn)
+ use adm_metric
+ use cctk
+ use classify
+ use constants
+ use qlm_boundary
+ use qlm_derivs
+ use qlm_variables
+ use ricci4
+ use tensor
+ use tensor4
+ implicit none
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_FUNCTIONS
+ DECLARE_CCTK_PARAMETERS
+ integer :: hn
+
+ CCTK_REAL, parameter :: zero=0, one=1, two=2, half=1/two
+ CCTK_REAL :: ll(0:3), nn(0:3)
+ CCTK_COMPLEX :: mm(0:3)
+ CCTK_REAL :: nabla_ll(0:3,0:3), nabla_nn(0:3,0:3)
+ CCTK_COMPLEX :: nabla_mm(0:3,0:3)
+
+ CCTK_REAL :: t0, t1, t2
+ logical :: ce0, ce1, ce2
+ CCTK_REAL :: delta_space(2)
+
+ integer :: i, j
+ integer :: a, b
+ CCTK_REAL :: theta, phi
+
+ if (veryverbose/=0) then
+ call CCTK_INFO ("Calculating Newman-Penrose quantities")
+ end if
+
+ t0 = qlm_time(hn)
+ t1 = qlm_time_p(hn)
+ t2 = qlm_time_p_p(hn)
+
+ ce0 = qlm_have_valid_data(hn) == 0
+ ce1 = qlm_have_valid_data_p(hn) == 0
+ ce2 = qlm_have_valid_data_p_p(hn) == 0
+
+ delta_space(:) = (/ qlm_delta_theta(hn), qlm_delta_phi(hn) /)
+
+ if (qlm_nghoststheta(hn)<2 .or. qlm_nghostsphi(hn)<2) call CCTK_WARN (0, "internal error")
+
+ ! Calculate the coordinates
+ do j = 1+qlm_nghostsphi(hn), qlm_nphi(hn)-qlm_nghostsphi(hn)
+ do i = 1+qlm_nghoststheta(hn), qlm_ntheta(hn)-qlm_nghoststheta(hn)
+ theta = qlm_origin_theta(hn) + (i-1)*qlm_delta_theta(hn)
+ phi = qlm_origin_phi(hn) + (j-1)*qlm_delta_phi(hn)
+
+ ! Get the stuff from the arrays
+ ll(0) = qlm_l0(i,j,hn)
+ ll(1) = qlm_l1(i,j,hn)
+ ll(2) = qlm_l2(i,j,hn)
+ ll(3) = qlm_l3(i,j,hn)
+
+ nn(0) = qlm_n0(i,j,hn)
+ nn(1) = qlm_n1(i,j,hn)
+ nn(2) = qlm_n2(i,j,hn)
+ nn(3) = qlm_n3(i,j,hn)
+
+ mm(0) = qlm_m0(i,j,hn)
+ mm(1) = qlm_m1(i,j,hn)
+ mm(2) = qlm_m2(i,j,hn)
+ mm(3) = qlm_m3(i,j,hn)
+
+ nabla_ll(:,:) = qlm_tetrad_derivs(i,j)%nabla_ll(:,:)
+ nabla_nn(:,:) = qlm_tetrad_derivs(i,j)%nabla_nn(:,:)
+ nabla_mm(:,:) = qlm_tetrad_derivs(i,j)%nabla_mm(:,:)
+
+
+
+ ! kappa = - m^a l^b D_b l_a
+ ! tau = - m^a n^b D_b l_a
+ ! sigma = - m^a m^b D_b l_a
+ ! rho = - m^a ~m^b D_b l_a [ ~m = congj(m) ]
+ qlm_npkappa (i,j,hn) = 0
+ qlm_nptau (i,j,hn) = 0
+ qlm_npsigma (i,j,hn) = 0
+ qlm_nprho (i,j,hn) = 0
+ ! epsilon = - 1/2 ( n^a l^b D_b l_a - ~m^a l^b D_b m_a )
+ ! gamma = - 1/2 ( n^a n^b D_b l_a - ~m^a n^b D_b m_a )
+ ! beta = - 1/2 ( n^a m^b D_b l_a - ~m^a m^b D_b m_a )
+ ! alpha = - 1/2 ( n^a ~m^b D_b l_a - ~m^a ~m^b D_b m_a )
+ qlm_npepsilon(i,j,hn) = 0
+ qlm_npgamma (i,j,hn) = 0
+ qlm_npbeta (i,j,hn) = 0
+ qlm_npalpha (i,j,hn) = 0
+ ! pi = ~m^a l^b D_b n_a
+ ! nu = ~m^a n^b D_b n_a
+ ! mu = ~m^a m^b D_b n_a
+ ! lambda = ~m^a ~m^b D_b n_a
+ qlm_nppi (i,j,hn) = 0
+ qlm_npnu (i,j,hn) = 0
+ qlm_npmu (i,j,hn) = 0
+ qlm_nplambda (i,j,hn) = 0
+
+!!$ qlm_lie_l_npsigma(i,j,hn) = 0
+!!$ qlm_lie_n_npsigma(i,j,hn) = 0
+
+!!$ ! Theta is the expansion
+!!$ ! Theta_(l) is (- 2 Re rho)
+!!$ ! Theta_(n) is (+ 2 Re mu)
+!!$ ! Theta_(T) is [Theta_(l) + Theta_(n)] / sqrt(2)
+!!$ ! Theta_(S) is [Theta_(l) - Theta_(n)] / sqrt(2)
+
+!!$ qlm_lie_l_theta_l(i,j,hn) = 0
+!!$ qlm_lie_l_theta_n(i,j,hn) = 0
+!!$ qlm_lie_n_theta_l(i,j,hn) = 0
+!!$ qlm_lie_n_theta_n(i,j,hn) = 0
+
+ do a=0,3
+ do b=0,3
+ qlm_npkappa (i,j,hn) = qlm_npkappa (i,j,hn) - mm(a) * ll(b) * nabla_ll(a,b)
+ qlm_nptau (i,j,hn) = qlm_nptau (i,j,hn) - mm(a) * nn(b) * nabla_ll(a,b)
+ qlm_npsigma (i,j,hn) = qlm_npsigma (i,j,hn) - mm(a) * mm(b) * nabla_ll(a,b)
+ qlm_nprho (i,j,hn) = qlm_nprho (i,j,hn) - mm(a) * conjg(mm(b)) * nabla_ll(a,b)
+ qlm_npepsilon(i,j,hn) = qlm_npepsilon(i,j,hn) - half * (nn(a) * ll(b) * nabla_ll(a,b) - conjg(mm(a)) * ll(b) * nabla_mm(a,b))
+ qlm_npgamma (i,j,hn) = qlm_npgamma (i,j,hn) - half * (nn(a) * nn(b) * nabla_ll(a,b) - conjg(mm(a)) * nn(b) * nabla_mm(a,b))
+ qlm_npbeta (i,j,hn) = qlm_npbeta (i,j,hn) - half * (nn(a) * mm(b) * nabla_ll(a,b) - conjg(mm(a)) * mm(b) * nabla_mm(a,b))
+ qlm_npalpha (i,j,hn) = qlm_npalpha (i,j,hn) - half * (nn(a) * conjg(mm(b)) * nabla_ll(a,b) - conjg(mm(a)) * conjg(mm(b)) * nabla_mm(a,b))
+ qlm_nppi (i,j,hn) = qlm_nppi (i,j,hn) + conjg(mm(a)) * ll(b) * nabla_nn(a,b)
+ qlm_npnu (i,j,hn) = qlm_npnu (i,j,hn) + conjg(mm(a)) * nn(b) * nabla_nn(a,b)
+ qlm_npmu (i,j,hn) = qlm_npmu (i,j,hn) + conjg(mm(a)) * mm(b) * nabla_nn(a,b)
+ qlm_nplambda (i,j,hn) = qlm_nplambda (i,j,hn) + conjg(mm(a)) * conjg(mm(b)) * nabla_nn(a,b)
+
+ end do
+ end do
+
+ end do
+ end do
+
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npkappa (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_nptau (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npsigma (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_nprho (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npepsilon(:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npgamma (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npbeta (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npalpha (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_nppi (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npnu (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_npmu (:,:,hn), +1)
+ call set_boundary (CCTK_PASS_FTOF, hn, qlm_nplambda (:,:,hn), +1)
+
+end subroutine qlm_calc_newman_penrose