diff options
Diffstat (limited to 'src/qlm_multipoles.F90')
-rw-r--r-- | src/qlm_multipoles.F90 | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/src/qlm_multipoles.F90 b/src/qlm_multipoles.F90 new file mode 100644 index 0000000..79b75d5 --- /dev/null +++ b/src/qlm_multipoles.F90 @@ -0,0 +1,323 @@ +#include "cctk.h" +#include "cctk_Arguments.h" +#include "cctk_Functions.h" +#include "cctk_Parameters.h" + + + +subroutine qlm_multipoles (CCTK_ARGUMENTS, hn) + use cctk + use constants + use qlm_boundary + use qlm_derivs + use qlm_variables + use ricci2 + use tensor2 + implicit none + DECLARE_CCTK_ARGUMENTS + DECLARE_CCTK_FUNCTIONS + DECLARE_CCTK_PARAMETERS + integer :: hn + + CCTK_REAL, parameter :: one=1, two=2 + CCTK_REAL, parameter :: half=one/2, fourth=one/4, eighth=one/8 + CCTK_REAL, parameter :: sixteenth=one/16 + CCTK_REAL, parameter :: o128=one/128 + + CCTK_REAL :: qq(2,2), dtq, rsc + CCTK_REAL :: ee(3,2) + CCTK_REAL :: kk(3,3) + CCTK_REAL :: ll(0:3), nn(0:3), ss(0:3) + CCTK_COMPLEX :: psi2 + CCTK_REAL :: zz, dzz(2) + CCTK_REAL :: area, mass, spin + + CCTK_REAL :: delta_space(2) + + integer :: i, j +!!$ integer :: a, b, c, d + + if (veryverbose/=0) then + call CCTK_INFO ("Calculating multipole moments") + end if + + delta_space(:) = (/ qlm_delta_theta(hn), qlm_delta_phi(hn) /) + + qlm_mp_m0(hn) = 0 + qlm_mp_m1(hn) = 0 + qlm_mp_m2(hn) = 0 + qlm_mp_m3(hn) = 0 + qlm_mp_m4(hn) = 0 + qlm_mp_m5(hn) = 0 + qlm_mp_m6(hn) = 0 + qlm_mp_m7(hn) = 0 + qlm_mp_m8(hn) = 0 + + qlm_mp_j0(hn) = 0 + qlm_mp_j1(hn) = 0 + qlm_mp_j2(hn) = 0 + qlm_mp_j3(hn) = 0 + qlm_mp_j4(hn) = 0 + qlm_mp_j5(hn) = 0 + qlm_mp_j6(hn) = 0 + qlm_mp_j7(hn) = 0 + qlm_mp_j8(hn) = 0 + + 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) + + ee(1,1:2) = deriv (qlm_x(:,:,hn), i, j, delta_space) + ee(2,1:2) = deriv (qlm_y(:,:,hn), i, j, delta_space) + ee(3,1:2) = deriv (qlm_z(:,:,hn), i, j, delta_space) + + kk(1,1) = qlm_kxx(i,j) + kk(1,2) = qlm_kxy(i,j) + kk(1,3) = qlm_kxz(i,j) + kk(2,2) = qlm_kyy(i,j) + kk(2,3) = qlm_kyz(i,j) + kk(3,3) = qlm_kzz(i,j) + kk(2,1) = kk(1,2) + kk(3,1) = kk(1,3) + kk(3,2) = kk(2,3) + + 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) + + ss = (ll - nn) / sqrt(two) + + rsc = qlm_rsc(i,j,hn) + psi2 = qlm_psi2(i,j,hn) + + zz = qlm_inv_z(i,j,hn) + + dzz(:) = deriv (qlm_inv_z(:,:,hn), i, j, delta_space) + + area = sqrt(dtq) * qlm_delta_theta(hn) * qlm_delta_phi(hn) + + mass = fourth * rsc + + qlm_mp_m0(hn) = qlm_mp_m0(hn) + mass * p0(zz) * dzz(1) * area + qlm_mp_m1(hn) = qlm_mp_m1(hn) + mass * p1(zz) * dzz(1) * area + qlm_mp_m2(hn) = qlm_mp_m2(hn) + mass * p2(zz) * dzz(1) * area + qlm_mp_m3(hn) = qlm_mp_m3(hn) + mass * p3(zz) * dzz(1) * area + qlm_mp_m4(hn) = qlm_mp_m4(hn) + mass * p4(zz) * dzz(1) * area + qlm_mp_m5(hn) = qlm_mp_m5(hn) + mass * p5(zz) * dzz(1) * area + qlm_mp_m6(hn) = qlm_mp_m6(hn) + mass * p6(zz) * dzz(1) * area + qlm_mp_m7(hn) = qlm_mp_m7(hn) + mass * p7(zz) * dzz(1) * area + qlm_mp_m8(hn) = qlm_mp_m8(hn) + mass * p8(zz) * dzz(1) * area + + spin = - aimag(psi2) + + qlm_mp_j0(hn) = qlm_mp_j0(hn) + spin * p0(zz) * dzz(1) * area + qlm_mp_j1(hn) = qlm_mp_j1(hn) + spin * p1(zz) * dzz(1) * area + qlm_mp_j2(hn) = qlm_mp_j2(hn) + spin * p2(zz) * dzz(1) * area + qlm_mp_j3(hn) = qlm_mp_j3(hn) + spin * p3(zz) * dzz(1) * area + qlm_mp_j4(hn) = qlm_mp_j4(hn) + spin * p4(zz) * dzz(1) * area + qlm_mp_j5(hn) = qlm_mp_j5(hn) + spin * p5(zz) * dzz(1) * area + qlm_mp_j6(hn) = qlm_mp_j6(hn) + spin * p6(zz) * dzz(1) * area + qlm_mp_j7(hn) = qlm_mp_j7(hn) + spin * p7(zz) * dzz(1) * area + qlm_mp_j8(hn) = qlm_mp_j8(hn) + spin * p8(zz) * dzz(1) * area + +!!$ spin = 0 +!!$ do a=1,2 +!!$ do b=1,2 +!!$ do c=1,3 +!!$ do d=1,3 +!!$ spin = spin - half * area * epsilon2(a,b) * dzz(b) * ee(d,a) * kk(d,c) * ss(c) +!!$ end do +!!$ end do +!!$ end do +!!$ end do +!!$ +!!$ qlm_mp_j0(hn) = qlm_mp_j0(hn) + spin * dp0(zz) * area +!!$ qlm_mp_j1(hn) = qlm_mp_j1(hn) + spin * dp1(zz) * area +!!$ qlm_mp_j2(hn) = qlm_mp_j2(hn) + spin * dp2(zz) * area +!!$ qlm_mp_j3(hn) = qlm_mp_j3(hn) + spin * dp3(zz) * area +!!$ qlm_mp_j4(hn) = qlm_mp_j4(hn) + spin * dp4(zz) * area +!!$ qlm_mp_j5(hn) = qlm_mp_j5(hn) + spin * dp5(zz) * area +!!$ qlm_mp_j6(hn) = qlm_mp_j6(hn) + spin * dp6(zz) * area +!!$ qlm_mp_j7(hn) = qlm_mp_j7(hn) + spin * dp7(zz) * area +!!$ qlm_mp_j8(hn) = qlm_mp_j8(hn) + spin * dp8(zz) * area + + end do + end do + + ! Normalise + +!!$ ! This is the normalisation for I_n and L_n +!!$ qlm_mp_m0(hn) = qlm_mp_m0(hn) / sqrt(4*pi/ 1) +!!$ qlm_mp_m1(hn) = qlm_mp_m1(hn) / sqrt(4*pi/ 3) +!!$ qlm_mp_m2(hn) = qlm_mp_m2(hn) / sqrt(4*pi/ 5) +!!$ qlm_mp_m3(hn) = qlm_mp_m3(hn) / sqrt(4*pi/ 7) +!!$ qlm_mp_m4(hn) = qlm_mp_m4(hn) / sqrt(4*pi/ 9) +!!$ qlm_mp_m5(hn) = qlm_mp_m5(hn) / sqrt(4*pi/11) +!!$ qlm_mp_m6(hn) = qlm_mp_m6(hn) / sqrt(4*pi/13) +!!$ qlm_mp_m7(hn) = qlm_mp_m7(hn) / sqrt(4*pi/15) +!!$ qlm_mp_m8(hn) = qlm_mp_m8(hn) / sqrt(4*pi/17) +!!$ +!!$ qlm_mp_j0(hn) = qlm_mp_j0(hn) / sqrt(4*pi/ 1) +!!$ qlm_mp_j1(hn) = qlm_mp_j1(hn) / sqrt(4*pi/ 3) +!!$ qlm_mp_j2(hn) = qlm_mp_j2(hn) / sqrt(4*pi/ 5) +!!$ qlm_mp_j3(hn) = qlm_mp_j3(hn) / sqrt(4*pi/ 7) +!!$ qlm_mp_j4(hn) = qlm_mp_j4(hn) / sqrt(4*pi/ 9) +!!$ qlm_mp_j5(hn) = qlm_mp_j5(hn) / sqrt(4*pi/11) +!!$ qlm_mp_j6(hn) = qlm_mp_j6(hn) / sqrt(4*pi/13) +!!$ qlm_mp_j7(hn) = qlm_mp_j7(hn) / sqrt(4*pi/15) +!!$ qlm_mp_j8(hn) = qlm_mp_j8(hn) / sqrt(4*pi/17) + + ! This is the normalisation for M_n and J_n + qlm_mp_m0(hn) = qlm_mp_m0(hn) * qlm_mass(hn) * qlm_radius(hn)**0 / (2*pi) + qlm_mp_m1(hn) = qlm_mp_m1(hn) * qlm_mass(hn) * qlm_radius(hn)**1 / (2*pi) + qlm_mp_m2(hn) = qlm_mp_m2(hn) * qlm_mass(hn) * qlm_radius(hn)**2 / (2*pi) + qlm_mp_m3(hn) = qlm_mp_m3(hn) * qlm_mass(hn) * qlm_radius(hn)**3 / (2*pi) + qlm_mp_m4(hn) = qlm_mp_m4(hn) * qlm_mass(hn) * qlm_radius(hn)**4 / (2*pi) + qlm_mp_m5(hn) = qlm_mp_m5(hn) * qlm_mass(hn) * qlm_radius(hn)**5 / (2*pi) + qlm_mp_m6(hn) = qlm_mp_m6(hn) * qlm_mass(hn) * qlm_radius(hn)**6 / (2*pi) + qlm_mp_m7(hn) = qlm_mp_m7(hn) * qlm_mass(hn) * qlm_radius(hn)**7 / (2*pi) + qlm_mp_m8(hn) = qlm_mp_m8(hn) * qlm_mass(hn) * qlm_radius(hn)**8 / (2*pi) + + qlm_mp_j0(hn) = qlm_mp_j0(hn) * qlm_radius(hn)**1 / (4*pi) + qlm_mp_j1(hn) = qlm_mp_j1(hn) * qlm_radius(hn)**2 / (4*pi) + qlm_mp_j2(hn) = qlm_mp_j2(hn) * qlm_radius(hn)**3 / (4*pi) + qlm_mp_j3(hn) = qlm_mp_j3(hn) * qlm_radius(hn)**4 / (4*pi) + qlm_mp_j4(hn) = qlm_mp_j4(hn) * qlm_radius(hn)**5 / (4*pi) + qlm_mp_j5(hn) = qlm_mp_j5(hn) * qlm_radius(hn)**6 / (4*pi) + qlm_mp_j6(hn) = qlm_mp_j6(hn) * qlm_radius(hn)**7 / (4*pi) + qlm_mp_j7(hn) = qlm_mp_j7(hn) * qlm_radius(hn)**8 / (4*pi) + qlm_mp_j8(hn) = qlm_mp_j8(hn) * qlm_radius(hn)**9 / (4*pi) + +contains + + ! Legendre polynomials + + function p0 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p0 + p0 = 1 + end function p0 + + function p1 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p1 + p1 = z + end function p1 + + function p2 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p2 + p2 = 3*half * z**2 - half + end function p2 + + function p3 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p3 + p3 = 5*half * z**3 - 3*half * z + end function p3 + + function p4 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p4 + p4 = 35*eighth * z**4 - 15*fourth * z**2 + 3*eighth + end function p4 + + function p5 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p5 + p5 = 63*eighth * z**5 - 35*fourth * z**3 + 15*eighth * z + end function p5 + + function p6 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p6 + p6 = 231*sixteenth * z**6 - 315*sixteenth * z**4 + 105*sixteenth * z**2 & + - 5*sixteenth + end function p6 + + function p7 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p7 + p7 = 429*sixteenth * z**7 - 693*sixteenth * z**5 + 315*sixteenth * z**3 & + - 35*sixteenth * z + end function p7 + + function p8 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: p8 + p8 = 6435*o128 * z**8 - 12012*o128 * z**6 + 6930*o128 * z**4 & + - 1260*o128 * z**2 + 35*o128 + end function p8 + + ! Derivatives of the Legendre polynomials + + function dp0 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp0 + dp0 = 0 + end function dp0 + + function dp1 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp1 + dp1 = 1 + end function dp1 + + function dp2 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp2 + dp2 = 3 * z + end function dp2 + + function dp3 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp3 + dp3 = 15*half * z**2 - 3*half + end function dp3 + + function dp4 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp4 + dp4 = 35*half * z**3 - 15*half*z + end function dp4 + + function dp5 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp5 + dp5 = 315*eighth * z**4 - 105*fourth * z**2 - 15*eighth + end function dp5 + + function dp6 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp6 + dp6 = 693*eighth * z**5 - 315*fourth * z**3 + 105*eighth * z + end function dp6 + + function dp7 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp7 + dp7 = 3003*sixteenth * z**6 - 3465*sixteenth * z**4 + 945*sixteenth * z**2 & + - 35*sixteenth + end function dp7 + + function dp8 (z) + CCTK_REAL, intent(in) :: z + CCTK_REAL :: dp8 + dp8 = 51480*o128 * z**7 - 72072*o128 * z**5 + 27720*o128 * z**3 & + - 2520*o128 * z + end function dp8 + +end subroutine qlm_multipoles |