Files
AMSS-NCKU/AMSS_NCKU_source/initial_null2.f90
2026-01-13 15:01:15 +08:00

1321 lines
38 KiB
Fortran

#include "macrodef.fh"
subroutine get_RT_parameters(m0o,Pp0o,Pm0o,apo,amo,bpo,bmo,cpo,cmo,gamo)
implicit none
real*8,intent(out) :: m0o,Pp0o,Pm0o,apo,amo,bpo,bmo,cpo,cmo,gamo
real*8,parameter::m0=1.d0,Pp0=1.d0,Pm0=1.d0,ap=1.d0,am=1.d0
real*8,parameter::bp=0.d0,bm=0.d0,cp=0.d0,cm=0.d0
real*8,parameter::gam=0.5d0
m0o = m0
Pp0o = Pp0
Pm0o = Pm0
apo = ap
amo = am
bpo = bp
bmo = bm
cpo = cp
cmo = cm
gamo = gam
end subroutine get_RT_parameters
!!!---------------------------------------------------------------------------------------------
function boostbhP(P0,gam,a,b,c,gt,gp) result(gont)
implicit none
!~~~~~~> Input parameters:
real*8, intent(in ):: P0,gam,a,b,c,gt,gp
real*8::gont
gont = dcosh(gam)+a*dsinh(gam)*dcos(gt)+dsinh(gam)*dsin(gt)*(b*dcos(gp)+c*dsin(gp))
gont = P0*gont
end function boostbhP
!!!!-------------------------------------------------------------------------------------------
#if 1
!! RT ID
subroutine get_initial_null2(ex,crho,sigma,XX,g22,g23,g33,sst,Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::XX
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g22,g23,g33
double precision,dimension(ex(3))::R
real*8 :: sr,ss,cr,cs
real*8 :: sr2,ss2,cr2,cs2
integer :: i,j,k
real*8 :: ggr,tgrho,tgsigma
real*8 ::x,y,z,gr,gt,gp
real*8,dimension(ex(1),ex(2),ex(3))::P
real*8 :: PI
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
real*8::boostbhP
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = XX*Rmin/(1-XX)
PI = dacos(-1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
g22(i,j,k) = 1-sr2*ss2
g22(i,j,k) = 1/g22(i,j,k)/g22(i,j,k)
g23(i,j,k) = -sr*cr*ss*cs*g22(i,j,k)
g33(i,j,k) = cr2*g22(i,j,k)
g22(i,j,k) = cs2*g22(i,j,k)
! we want g_AB/r^2 instead of g_AB
! g22(i,j,k) = R(k)*R(k)*g22(i,j,k)
! g23(i,j,k) = R(k)*R(k)*g23(i,j,k)
! g33(i,j,k) = R(k)*R(k)*g33(i,j,k)
! here fake global coordinate is enough
gr = 1.d0
tgrho = dtan(crho(i))
tgsigma = dtan(sigma(j))
select case (sst)
case (0)
z = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (1)
z = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (2)
x = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (3)
x = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (4)
y = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case (5)
y = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case default
write(*,*) "get_initial_null2: not recognized sst = ",sst
return
end select
gt = dacos(z/gr)
gp = datan2(y,x)
P(i,j,k) = 1/(1/dsqrt(boostbhP(Pp0,gam,ap,bp,cp,gt,gp))+1/dsqrt(boostbhP(Pm0,gam,am,bm,cm,gt,gp)))**2
enddo
enddo
enddo
g22 = g22/P**2
g23 = g23/P**2
g33 = g33/P**2
return
end subroutine get_initial_null2
#else
!! fake RT for test
subroutine get_initial_null2(ex,crho,sigma,XX,g22,g23,g33,sst,Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::XX
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g22,g23,g33
double precision,dimension(ex(3))::R
real*8 :: sr,ss,cr,cs
real*8 :: sr2,ss2,cr2,cs2
integer :: i,j,k
real*8 :: ggr,tgrho,tgsigma
real*8 ::x,y,z,gr,gt,gp
real*8,dimension(ex(1),ex(2),ex(3))::P
real*8 :: PI
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
real*8::boostbhP
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = XX*Rmin/(1-XX)
PI = dacos(-1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
g22(i,j,k) = 1-sr2*ss2
g22(i,j,k) = 1/g22(i,j,k)/g22(i,j,k)
g23(i,j,k) = -sr*cr*ss*cs*g22(i,j,k)
g33(i,j,k) = cr2*g22(i,j,k)
g22(i,j,k) = cs2*g22(i,j,k)
! we want g_AB/r^2 instead of g_AB
! g22(i,j,k) = R(k)*R(k)*g22(i,j,k)
! g23(i,j,k) = R(k)*R(k)*g23(i,j,k)
! g33(i,j,k) = R(k)*R(k)*g33(i,j,k)
! here fake global coordinate is enough
gr = 1.d0
tgrho = dtan(crho(i))
tgsigma = dtan(sigma(j))
select case (sst)
case (0)
z = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (1)
z = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (2)
x = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (3)
x = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (4)
y = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case (5)
y = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case default
write(*,*) "get_initial_null2: not recognized sst = ",sst
return
end select
gt = dacos(z/gr)
gp = datan2(y,x)
P(i,j,k) = 1/(1/dsqrt(boostbhP(Pp0,gam,ap,bp,cp,gt,gp))+1/dsqrt(boostbhP(Pm0,gam,am,bm,cm,gt,gp)))**2
enddo
enddo
enddo
g22 = P
return
end subroutine get_initial_null2
#endif
!!------------------------------------------------------------------------------------------------------------
subroutine std_covdiff(rho,sigma,fs,fr,fss,frr,frs,covf)
implicit none
! argument variables
real*8,intent(in) :: rho,sigma,fs,fr,fss,frr,frs
real*8,intent(out):: covf
real*8 :: t1,t2,t3,t4,t5,t6,t7,t8,t11,t12,t13,t15,t16,t19,t20
real*8 :: t27,t28,t29,t32,t33,t34,t38,t39,t51,t54,t55,t58,t59
real*8 :: t62,t71,t72,t88,t90,t91,t92,t93,t94,t95,t97,t98,t99
real*8 :: t100,t104,t107,t108,t109,t112,t113,t117,t118,t121,t128,t132,t133,t136,t137,t140,t141
real*8 :: t144,t152,t153,t154,t155,t160,t166,t169,t172,t175,t178,t181,t187,t199,t204,t205,t208
real*8 :: t209,t216,t217,t223,t226,t227,t243,t250,t256,t267,t276,t284,t287,t290,t301,t303,t306
real*8 :: t307,t310,t313,t314,t316,t319,t323,t326,t329,t338,t346,t356,t359,t368,t371,t376,t377
real*8 :: t380,t385,t387,t391,t394,t398,t401,t404,t407,t412,t415,t420,t427,t450,t451,t456,t459
real*8 :: t486,t487,t511,t516,t522,t532,t537,t546,t575,t586,t591,t595,t599,t295,t298
t1 = cos(sigma);
t2 = t1*t1;
t3 = t2*t2;
t4 = t3*t2;
t5 = t4*fss;
t6 = 2.0*sigma;
t7 = cos(t6);
t8 = t7*t7;
t11 = cos(rho);
t12 = t11*t11;
t13 = t12*t11;
t15 = sin(rho);
t16 = fr*t15;
t19 = t12*t12;
t20 = t19*t13;
t27 = t19*t11;
t28 = t27*fr;
t29 = t15*t8;
t32 = 2.0*rho;
t33 = cos(t32);
t34 = t33*t33;
t38 = t11*fr;
t39 = t15*t3;
t51 = t19*frr;
t54 = t19*t12;
t55 = t54*frr;
t58 = -2.0*t5*t8-8.0*t2*t13*t16-64.0*t3*t20*t16+32.0*t4*t20*t16+4.0*t28*t29 &
+4.0*t28*t15*t34-4.0*t38*t39+8.0*t3*t13*t16+32.0*t4*t13*t16+8.0*t2*t27*t16 &
+4.0*t51*t2-2.0*t55*t34;
t59 = t3*fss;
t62 = t12*frr;
t71 = t19*t19;
t72 = t71*frr;
t88 = -32.0*t59*t54+2.0*t62*t3-2.0*t55*t8+64.0*t55*t4-2.0*t5*t34-32.0*t72*t2 &
+64.0*t72*t3-32.0*t72*t4-4.0*t55*t2-4.0*t51*t3-62.0*t55*t3+60.0*t3*t27*t16;
t90 = sin(t32);
t91 = sin(t6);
t92 = t90*t91;
t93 = t92*frs;
t94 = t3*t8;
t95 = t94*t34;
t97 = t3*t1;
t98 = t97*fs;
t99 = sin(sigma);
t100 = t98*t99;
t104 = t2*fss;
t107 = t54*fr;
t108 = t90*t33;
t109 = t108*t2;
t112 = t19*t8;
t113 = t112*t34;
t117 = t12*fr;
t118 = t108*t3;
t121 = t12*t3;
t128 = t19*t2;
t132 = t3*t3;
t133 = t132*fss;
t136 = t93*t95-4.0*t100-32.0*t51*t4+2.0*t104*t19+8.0*t107*t109+t93*t113-62.0*t5*t19 &
-4.0*t117*t118+2.0*t93*t121*t8+32.0*t2*t20*t16+2.0*t93*t128*t8-32.0*t133*t12;
t137 = t3*t19;
t140 = t2*t8;
t141 = t140*t34;
t144 = t8*t34;
t152 = t107*t91;
t153 = t90*t99;
t154 = t2*t1;
t155 = t153*t154;
t160 = t33*t3*t8;
t166 = frs*t19;
t169 = t19*fr;
t172 = frs*t3;
t175 = t107*t90;
t178 = -t93*t137*t8-4.0*t55*t141-2.0*t93*t128*t144+2.0*t62*t95+t93*t137*t144+16.0*t152*t155 &
+4.0*t117*t90*t160+4.0*t107*t108*t8-t92*t166*t8+8.0*t169*t118-t92*t172*t34+4.0*t175*t160;
t181 = t169*t90;
t187 = t33*t2*t8;
t199 = frs*t2;
t204 = fs*t3*t154;
t205 = t19*t99;
t208 = fs*t154;
t209 = t54*t99;
t216 = -8.0*t181*t160-4.0*t107*t118-8.0*t175*t187-t93*t137*t34+4.0*t51*t141+2.0*t93*t128*t34 &
-4.0*t51*t95+2.0*t92*t199*t12-64.0*t204*t205+32.0*t208*t209-64.0*t98*t209+32.0*t204*t209;
t217 = t99*t8;
t223 = t1*fs;
t226 = t4*fs;
t227 = t91*t7;
t243 = t12*t99;
t250 = 4.0*t98*t217+4.0*t98*t99*t34-4.0*t223*t205-4.0*t226*t227-64.0*t4*t27*t16+2.0*t93*t121*t34 &
-t92*t166*t34-2.0*t93*t121*t144+8.0*t208*t205+8.0*t98*t243+60.0*t98*t205+32.0*t204*t243;
t256 = t2*t34;
t267 = t3*t34;
t276 = -8.0*t208*t243+t92*t172+t92*t166-4.0*t51*t256-4.0*t51*t140+4.0*t51*t94+2.0*t55*t144 &
-2.0*t62*t94-2.0*t62*t267-2.0*t55*t94+4.0*t55*t140+4.0*t51*t267;
t284 = fs*t91*t33;
t287 = t243*t34;
t290 = t205*t34;
t295 = fs*t27*t15;
t298 = t92*t4;
t301 = t92*t3;
t303 = fs*t13*t15;
t306 = t208*t99;
t307 = t144*t12;
t310 = t227*t19;
t313 = t3*fs;
t314 = t313*t91;
t316 = t7*t19*t34;
t319 = 4.0*t55*t256-2.0*t55*t267+2.0*t55*t95-32.0*t137*t284-8.0*t98*t287+4.0*t98*t290 &
-8.0*t92*t2*t295-8.0*t298*t295-16.0*t301*t303-8.0*t306*t307-4.0*t226*t310-8.0*t314*t316;
t323 = t217*t12;
t326 = t227*t12;
t329 = t226*t91;
t338 = t7*t12*t34;
t346 = t2*fs;
t356 = 8.0*t208*t323+8.0*t226*t326+4.0*t329*t316+8.0*t208*t287+4.0*t226*t227*t34+8.0*t314*t338 &
-16.0*t92*t199*t54-8.0*t329*t338-4.0*t346*t310+8.0*t313*t310-8.0*t313*t326+4.0*t346*t91*t316;
t359 = t205*t8;
t368 = t153*t97;
t371 = t169*t91;
t376 = t13*fr;
t377 = t29*t2;
t380 = t376*t15;
t385 = t4*t12;
t387 = fr*t7*t90;
t391 = t15*t2*t34;
t394 = 8.0*t181*t187+4.0*t98*t359-8.0*t169*t109-8.0*t152*t153*t1-8.0*t117*t91*t368+16.0*t371*t368 &
-8.0*t152*t368+8.0*t376*t377-8.0*t380*t141-16.0*t371*t155-16.0*t385*t387+8.0*t376*t391;
t398 = t4*t54;
t401 = t3*t54;
t404 = t2*t54;
t407 = t4*t19;
t412 = t39*t8;
t415 = t28*t15;
t420 = t39*t34;
t427 = -32.0*t137*t387-16.0*t398*t387+32.0*t401*t387-16.0*t404*t387+32.0*t407*t387-8.0*t28*t377 &
-8.0*t376*t412-4.0*t415*t95+4.0*t28*t412+4.0*t38*t420+4.0*t28*t420-8.0*t28*t391;
t450 = t2*t12;
t451 = t450*t34;
t456 = -8.0*t376*t420+8.0*t415*t141+8.0*t380*t95-4.0*t28*t29*t34+4.0*t38*t412-8.0*t208*t290 &
+32.0*t92*t172*t54+32.0*t401*t284-4.0*t100*t113+4.0*t223*t290-2.0*t93*t451-16.0*t398*t284;
t459 = frs*t4;
t486 = -16.0*t92*t459*t12+32.0*t407*t284-4.0*t98*t217*t34+2.0*t55-16.0*t385*t284-16.0*t404*t284 &
-2.0*t104*t112-8.0*t208*t359-8.0*t98*t323-t92*t172*t8+4.0*t223*t359+32.0*t92*t459*t19;
t487 = t19*t34;
t511 = t140*t12;
t516 = 4.0*t59*t487+8.0*t306*t113+8.0*t100*t307-2.0*t5*t487-4.0*t223*t99*t113+16.0*t298*t303 &
-8.0*t298*fs*t11*t15+16.0*t301*t295+2.0*t104*t113+4.0*t59*t307-2.0*t93*t511-4.0*t59*t113;
t522 = t8*t12;
t532 = t144*t450;
t537 = t12*t34;
t546 = 2.0*t5*t113-4.0*t5*t307-4.0*t59*t522+2.0*t5-31.0*t92*t172*t19-2.0*t92*t199*t19+2.0*t93*t532 &
-2.0*t5*t112+4.0*t5*t537-4.0*t59*t537+2.0*t5*t144+4.0*t5*t522;
t575 = 4.0*t59*t112-2.0*t104*t487-4.0*t107*t108-4.0*t38*t15*t95-16.0*t92*t459*t54-2.0*t92*t172*t12 &
-4.0*t5*t12+4.0*t59*t12+64.0*t5*t54+64.0*t133*t19-32.0*t133*t54-4.0*t59*t19-4.0*t415;
t586 = t34*t34;
t591 = t8*t8;
t595 = 256.0*t137-32.0*t450+32.0*t451+32.0*t511-32.0*t532+1.0-2.0*t34+t586-2.0*t8+4.0*t144 &
-2.0*t8*t586+t591-2.0*t591*t34+t591*t586;
covf = -8.0*(t58+t88+t136+t178+t216+t250+t276+t319+t356+t394+t427+t456+t486+t516+t546+t575)/t595;
return
end subroutine std_covdiff
!!------------------------------------------------------------------------------------------------------------
!! input g_AB and Theta_AB are divided by r^2 indeed
!! input g_00 is also divided by r^2 indeed
! the output g00 is K
#if 1
subroutine get_gauge_g00_K(ex,crho,sigma,X,g22,g23,g33, &
Theta22,Theta23,Theta33, g00, Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3)
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::X
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::Theta22,Theta23,Theta33
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g00
double precision,dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3))::det,gup22,gup23,gup33,KK
real*8 :: sr,ss,cr,cs,sr2,ss2,cr2,cs2,tg22,tg23,tg33
real*8 :: fr,fs,frr,fss,frs,covf
integer :: i,j,k
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = X*Rmin/(1-X)
det = g22*g33-g23*g23
gup22 = g33/det
gup23 = -g23/det
gup33 = g22/det
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
tg22 = 1-sr2*ss2
tg22 = 1/tg22/tg22
tg23 = -sr*cr*ss*cs*tg22
tg33 = cr2*tg22
tg22 = cs2*tg22
! ghat/(g/r^4) indeed
det(i,j,k) = (tg22*tg33-tg23*tg23)/det(i,j,k)
enddo
enddo
enddo
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
call rderivs_x_point(ex(1),crho,det(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,det(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,det(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,det(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,det(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
KK(i,j,k) = dsqrt(det(i,j,k))*(1-0.25*covf/R(k)**2)
enddo
enddo
enddo
g00 = KK
return
end subroutine get_gauge_g00_K
! the input g00 is K
subroutine get_gauge_g00(ex,crho,sigma,X,g22,g23,g33, &
Theta22,Theta23,Theta33, g00, Rmin,fp)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),fp
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::X
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::Theta22,Theta23,Theta33
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g00
double precision,dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3))::det,gup22,gup23,gup33,KK
real*8 :: sr,ss,cr,cs,sr2,ss2,cr2,cs2,tg22,tg23,tg33
real*8 :: fr,fs,frr,fss,frs,covf
integer :: i,j,k
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = X*Rmin/(1-X)
det = g22*g33-g23*g23
gup22 = g33/det
gup23 = -g23/det
gup33 = g22/det
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
tg22 = 1-sr2*ss2
tg22 = 1/tg22/tg22
tg23 = -sr*cr*ss*cs*tg22
tg33 = cr2*tg22
tg22 = cs2*tg22
Theta22(i,j,k) = tg22/6/m0
Theta23(i,j,k) = tg23/6/m0
Theta33(i,j,k) = tg33/6/m0
enddo
enddo
enddo
KK = g00
if(fp == 0)then
k = 1
do i=1,ex(1)
do j=1,ex(2)
call rderivs_x_point(ex(1),crho,KK(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,KK(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,KK(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,KK(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,KK(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
Theta22(i,j,k) = covf*Theta22(i,j,k)
Theta23(i,j,k) = covf*Theta23(i,j,k)
Theta33(i,j,k) = covf*Theta33(i,j,k)
enddo
enddo
else
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
call rderivs_x_point(ex(1),crho,KK(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,KK(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,KK(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,KK(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,KK(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
Theta22(i,j,k) = covf*Theta22(i,j,k)
Theta23(i,j,k) = covf*Theta23(i,j,k)
Theta33(i,j,k) = covf*Theta33(i,j,k)
enddo
enddo
enddo
endif
return
end subroutine get_gauge_g00
#else
subroutine get_gauge_g00_K(ex,crho,sigma,X,g22,g23,g33, &
Theta22,Theta23,Theta33, g00, Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3)
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::X
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::Theta22,Theta23,Theta33
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g00
double precision,dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3))::det,gup22,gup23,gup33,KK
real*8 :: sr,ss,cr,cs,sr2,ss2,cr2,cs2,tg22,tg23,tg33
real*8 :: fr,fs,frr,fss,frs,covf
integer :: i,j,k
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = X*Rmin/(1-X)
! g22 is P
det = dlog(g22**2)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
call rderivs_x_point(ex(1),crho,det(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,det(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,det(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,det(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,det(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
KK(i,j,k) = covf
enddo
enddo
enddo
g00 = g22**2*(1+0.5*KK)
return
end subroutine get_gauge_g00_K
! the input g00 is K
subroutine get_gauge_g00(ex,crho,sigma,X,g22,g23,g33, &
Theta22,Theta23,Theta33, g00, Rmin,fp)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),fp
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::X
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::Theta22,Theta23,Theta33
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g00
double precision,dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3))::det,gup22,gup23,gup33,KK
real*8 :: sr,ss,cr,cs,sr2,ss2,cr2,cs2,tg22,tg23,tg33
real*8 :: fr,fs,frr,fss,frs,covf
integer :: i,j,k
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = X*Rmin/(1-X)
KK = g00
if(fp == 0)then
k = 1
do i=1,ex(1)
do j=1,ex(2)
call rderivs_x_point(ex(1),crho,KK(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,KK(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,KK(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,KK(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,KK(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
Theta22(i,j,k) = covf
enddo
enddo
else
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
call rderivs_x_point(ex(1),crho,KK(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,KK(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,KK(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,KK(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,KK(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
Theta22(i,j,k) = covf
enddo
enddo
enddo
endif
Theta22 = -Theta22/12/m0*g22**3
return
end subroutine get_gauge_g00
#endif
!!---------------------------------------------------------------------------
subroutine get_gauge_g00_real(ex,crho,sigma,X,g22,g23,g33, &
Theta22,Theta23,Theta33, g00, Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3)
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::X
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(in)::Theta22,Theta23,Theta33
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g00
double precision,dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3))::det,gup22,gup23,gup33,KK
real*8 :: sr,ss,cr,cs,sr2,ss2,cr2,cs2,tg22,tg23,tg33
real*8 :: fr,fs,frr,fss,frs,covf
integer :: i,j,k
real*8 :: m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam
call get_RT_parameters(m0,Pp0,Pm0,ap,am,bp,bm,cp,cm,gam)
R = X*Rmin/(1-X)
det = g22*g33-g23*g23
gup22 = g33/det
gup23 = -g23/det
gup33 = g22/det
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
tg22 = 1-sr2*ss2
tg22 = 1/tg22/tg22
tg23 = -sr*cr*ss*cs*tg22
tg33 = cr2*tg22
tg22 = cs2*tg22
! ghat/(g/r^4) indeed
det(i,j,k) = (tg22*tg33-tg23*tg23)/det(i,j,k)
enddo
enddo
enddo
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
call rderivs_x_point(ex(1),crho,det(:,j,k),fr,i)
call rderivs_x_point(ex(2),sigma,det(i,:,k),fs,j)
call rdderivs_xy_point(ex(1),ex(2),crho,sigma,det(:,:,k),frs,i,j)
call rdderivs_x_point(ex(1),crho,det(:,j,k),frr,i)
call rdderivs_x_point(ex(2),sigma,det(i,:,k),fss,j)
call std_covdiff(crho(i),sigma(j),fs,fr,fss,frr,frs,covf)
KK(i,j,k) = dsqrt(det(i,j,k))*(1-0.25*covf/R(k)**2)
g00(i,j,k) = 2*m0/R(k)**3-KK(i,j,k)/R(k)**2 &
-(gup22(i,j,k)*Theta22(i,j,k)+2*gup23(i,j,k)*Theta23(i,j,k)+gup33(i,j,k)*Theta33(i,j,k))/2/R(k)
enddo
enddo
enddo
return
end subroutine get_gauge_g00_real
!!------------------------------------------------------------------------------------------------------------
subroutine get_null_boundary2(ex,crho,sigma,X,g22,g23,g33, &
g01,p02,p03,g02,g03,Theta22,Theta23,Theta33, Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3)
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::X
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout)::g01,p02,p03,g02,g03
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout)::Theta22,Theta23,Theta33
#if 1
real*8 :: fact
!fact = X(1)/X(2)*((1-X(2))/(1-X(1)))
!fact = fact**2
! since we used gAB/r^2 instead of gAB, so fact = 1
fact = 1.d0
g22(:,:,1) = g22(:,:,2)*fact
g23(:,:,1) = g23(:,:,2)*fact
g33(:,:,1) = g33(:,:,2)*fact
g01(:,:,1) = -1.d0
p02(:,:,1) = 0.d0
p03(:,:,1) = 0.d0
g02(:,:,1) = 0.d0
g03(:,:,1) = 0.d0
! have done in get_gauge_g00
!Theta22(:,:,1) = Theta22(:,:,2)*fact
!Theta23(:,:,1) = Theta23(:,:,2)*fact
!Theta33(:,:,1) = Theta33(:,:,2)*fact
#else
g01 = -1
g02 = 0
g03 = 0
#endif
return
end subroutine get_null_boundary2
!!!--------------------------------------------------------------------------------------------------------------
subroutine get_initial_null3(ex,crho,sigma,XX,g22,g23,g33,sst,Rmin)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) :: Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::XX
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g22,g23,g33
double precision,dimension(ex(3))::R
real*8 :: sr,ss,cr,cs
real*8 :: sr2,ss2,cr2,cs2
integer :: i,j,k
real*8 :: ggr,tgrho,tgsigma
real*8 ::x,y,z,gr,gt,gp
real*8 :: gxx,gxy,gyy,tc,ts,PI
double complex :: Zslm,II,Jr,ctp
double complex :: swtf,z220
double complex :: beta0,C1,C2,mx,my,mlx,mly
integer :: nu,m
call initial_null_paramter(beta0,C1,C2,nu,m)
II = dcmplx(0.d0,1.d0)
R = XX*Rmin/(1-XX)
PI = dacos(-1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
gxx = 1-sr2*ss2
gxx = 1/gxx/gxx
gxy = -sr*cr*ss*cs*gxx
gyy = cr2*gxx
gxx = cs2*gxx
! here fake global coordinate is enough
gr = 1.d0
tgrho = dtan(crho(i))
tgsigma = dtan(sigma(j))
tc = dsqrt((1.d0-dsin(crho(i))*dsin(sigma(j)))/2.d0)
ts = dsqrt((1.d0+dsin(crho(i))*dsin(sigma(j)))/2.d0)
select case (sst)
case (0)
z = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (1)
z = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (2)
x = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (3)
x = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (4)
y = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case (5)
y = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case default
write(*,*) "get_initial_null2: not recognized sst = ",sst
return
end select
gt = dacos(z/gr)
gp = datan2(y,x)
swtf = 2.d0*tc*ts*(ts+II*tc)/dcos(sigma(j))
if(sst==1 .or. sst==3 .or. sst==4) swtf = dconjg(swtf)
select case (sst)
case (0,1)
swtf = swtf/(dcos(gp)+II*dcos(gt)*dsin(gp))*(dcos(gt)**2+dsin(gt)**2*dcos(gp)**2)
case (2,3)
swtf = II*swtf*dsin(gt)
case (4,5)
swtf = -II*swtf*dsin(gt)
end select
z220 = Zslm(2,2,m,gt,gp)*swtf**2
if(sst==1 .or. sst==3 .or. sst==4)then
mx = 2*tc*ts*(ts-II*tc)/dcos(sigma(j))
my = 2*tc*ts*(ts+II*tc)/dcos(crho(i))
else
mx = 2*tc*ts*(ts+II*tc)/dcos(sigma(j))
my = 2*tc*ts*(ts-II*tc)/dcos(crho(i))
endif
mlx = gxx*mx+gxy*my
mly = gxy*mx+gyy*my
Jr = (2.4d1*beta0+3.d0*II*nu*C1-II*nu**3*C2)/3.6d1+C1/4.d0/R(k)-C2/1.2d1/R(k)**3
Jr = dsqrt(dble((2-1)*2*(2+1)*(2+2)))*dreal(Jr)*z220
ctp = Jr*mlx*mlx+dsqrt(1+abs(Jr)**2)*dconjg(mlx)*mlx
g22(i,j,k) = dreal(ctp)
ctp = Jr*mlx*mly+dsqrt(1+abs(Jr)**2)*dconjg(mlx)*mly
g23(i,j,k) = dreal(ctp)
ctp = Jr*mly*mly+dsqrt(1+abs(Jr)**2)*dconjg(mly)*mly
g33(i,j,k) = dreal(ctp)
enddo
enddo
enddo
return
end subroutine get_initial_null3
!!!--------------------------------------------------------------------------------------------------------------
subroutine get_g00_with_t(time,ex,crho,sigma,XX,g00,Rmin,sst)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) :: time,Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::XX
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::g00
double precision,dimension(ex(3))::R
real*8 :: sr,ss,cr,cs
real*8 :: sr2,ss2,cr2,cs2
integer :: i,j,k
real*8 :: ggr,tgrho,tgsigma
real*8 ::x,y,z,gr,gt,gp
real*8 :: tc,ts,PI
double complex :: Zslm,II,Jr,Ur,Wr
double complex :: swtf,z020,z120,z220
double complex :: beta0,C1,C2
integer :: nu,m
call initial_null_paramter(beta0,C1,C2,nu,m)
II = dcmplx(0.d0,1.d0)
R = XX*Rmin/(1-XX)
PI = dacos(-1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
! here fake global coordinate is enough
gr = 1.d0
tgrho = dtan(crho(i))
tgsigma = dtan(sigma(j))
tc = dsqrt((1.d0-dsin(crho(i))*dsin(sigma(j)))/2.d0)
ts = dsqrt((1.d0+dsin(crho(i))*dsin(sigma(j)))/2.d0)
select case (sst)
case (0)
z = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (1)
z = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (2)
x = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (3)
x = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (4)
y = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case (5)
y = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case default
write(*,*) "get_g00_with_t: not recognized sst = ",sst
return
end select
gt = dacos(z/gr)
gp = datan2(y,x)
swtf = 2.d0*tc*ts*(ts+II*tc)/dcos(sigma(j))
if(sst==1 .or. sst==3 .or. sst==4) swtf = dconjg(swtf)
select case (sst)
case (0,1)
swtf = swtf/(dcos(gp)+II*dcos(gt)*dsin(gp))*(dcos(gt)**2+dsin(gt)**2*dcos(gp)**2)
case (2,3)
swtf = II*swtf*dsin(gt)
case (4,5)
swtf = -II*swtf*dsin(gt)
end select
z020 = Zslm(0,2,m,gt,gp)
z120 = Zslm(1,2,m,gt,gp)*swtf
z220 = Zslm(2,2,m,gt,gp)*swtf**2
Jr = (2.4d1*beta0+3.d0*II*nu*C1-II*nu**3*C2)/3.6d1+C1/4.d0/R(k)-C2/1.2d1/R(k)**3
Ur = (-24*II*nu*beta0+3*nu*nu*C1-nu**4*C2)/36+2*beta0/R(k)+C1/2/R(k)**2+ &
II*nu*C2/3/R(k)**3+C2/4/R(k)**4
Wr = (24*II*nu*beta0-2*nu*C1+nu**4*C2)/6+ &
(3*II*nu*C1-6*beta0-II*nu**3*C2)/3/R(k) - &
nu**2*C2/R(k)**2+II*nu*C2/R(k)**3+C2/2/R(k)**4
Jr = Jr*exp(II*nu*time)
Ur = Ur*exp(II*nu*time)
Wr = Wr*exp(II*nu*time)
g00(i,j,k) = 2*(2*(2+1)*dsqrt(dble((2-1)*2*(2+1)*(2+2)))*dreal(Ur)**2* &
dreal(Jr)*dreal(z120**2*dconjg(z220))+ &
2*(2+1)*dsqrt(1+(2-1)*2*(2+1)*(2+2)*dreal(Jr)**2*abs(z220)**2)* &
dreal(Ur)**2*abs(z120)**2)-(1/R(k)**2+dreal(z020*Wr)/R(k))* &
exp(2*dreal(z020*beta0*exp(II*nu*time)))
enddo
enddo
enddo
!if(sst==0 .and. crho(1) <-0.9 .and. sigma(1) <-0.9 .and. XX(1)<0.18182)write(*,*)"time = ",time,g00(1,1,1)
return
end subroutine get_g00_with_t
!!------------------------------------------------------------------------------------------------------------
subroutine get_null_boundary3(time,ex,crho,sigma,XX,g22,g23,g33, &
g01,p02,p03,g02,g03,Theta22,Theta23,Theta33, Rmin,sst)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) ::time,Rmin
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::XX
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout)::g22,g23,g33
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout)::g01,p02,p03,g02,g03
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout)::Theta22,Theta23,Theta33
double precision,dimension(ex(3))::R
real*8 :: sr,ss,cr,cs
real*8 :: sr2,ss2,cr2,cs2
integer :: i,j,k
real*8 :: ggr,tgrho,tgsigma
real*8 ::x,y,z,gr,gt,gp
real*8 :: gxx,gxy,gyy,tc,ts,PI
double complex :: Zslm,II,Jr,ctp,Jrp,Jrt,Ur,Urp,Wr
double complex :: swtf,z020,z120,z220
double complex :: beta0,C1,C2,mx,my,mlx,mly
integer :: nu,m
call initial_null_paramter(beta0,C1,C2,nu,m)
II = dcmplx(0.d0,1.d0)
R = XX*Rmin/(1-XX)
PI = dacos(-1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
sr = dsin(crho(i))
ss = dsin(sigma(j))
cr = dcos(crho(i))
cs = dcos(sigma(j))
sr2 = sr*sr
ss2 = ss*ss
cr2 = cr*cr
cs2 = cs*cs
gxx = 1-sr2*ss2
gxx = 1/gxx/gxx
gxy = -sr*cr*ss*cs*gxx
gyy = cr2*gxx
gxx = cs2*gxx
! here fake global coordinate is enough
gr = 1.d0
tgrho = dtan(crho(i))
tgsigma = dtan(sigma(j))
tc = dsqrt((1.d0-dsin(crho(i))*dsin(sigma(j)))/2.d0)
ts = dsqrt((1.d0+dsin(crho(i))*dsin(sigma(j)))/2.d0)
select case (sst)
case (0)
z = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (1)
z = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (2)
x = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (3)
x = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (4)
y = gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case (5)
y = -gr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case default
write(*,*) "get_null_boundary3: not recognized sst = ",sst
return
end select
gt = dacos(z/gr)
gp = datan2(y,x)
swtf = 2.d0*tc*ts*(ts+II*tc)/dcos(sigma(j))
if(sst==1 .or. sst==3 .or. sst==4) swtf = dconjg(swtf)
select case (sst)
case (0,1)
swtf = swtf/(dcos(gp)+II*dcos(gt)*dsin(gp))*(dcos(gt)**2+dsin(gt)**2*dcos(gp)**2)
case (2,3)
swtf = II*swtf*dsin(gt)
case (4,5)
swtf = -II*swtf*dsin(gt)
end select
z020 = Zslm(0,2,m,gt,gp)
z120 = Zslm(1,2,m,gt,gp)*swtf
z220 = Zslm(2,2,m,gt,gp)*swtf**2
if(sst==1 .or. sst==3 .or. sst==4)then
mx = 2*tc*ts*(ts-II*tc)/dcos(sigma(j))
my = 2*tc*ts*(ts+II*tc)/dcos(crho(i))
else
mx = 2*tc*ts*(ts+II*tc)/dcos(sigma(j))
my = 2*tc*ts*(ts-II*tc)/dcos(crho(i))
endif
mlx = gxx*mx+gxy*my
mly = gxy*mx+gyy*my
Jr = (2.4d1*beta0+3.d0*II*nu*C1-II*nu**3*C2)/3.6d1+C1/4.d0/R(k)-C2/1.2d1/R(k)**3
! Jrp = d Jr/d X instead of d Jr/d r
Jrp = -C1/4.d0/Rmin/XX(k)**2+C2/1.2d1*3/R(k)**2/Rmin/XX(k)**2
Ur = (-24*II*nu*beta0+3*nu*nu*C1-nu**4*C2)/36+2*beta0/R(k)+C1/2/R(k)**2+ &
II*nu*C2/3/R(k)**3+C2/4/R(k)**4
Urp = -2*beta0/Rmin/XX(k)**2-C1/R(k)/Rmin/XX(k)**2- &
II*nu*C2/R(k)**2/Rmin/XX(k)**2-C2/R(k)**3/Rmin/XX(k)**2
Wr = (24*II*nu*beta0-2*nu*C1+nu**4*C2)/6+ &
(3*II*nu*C1-6*beta0-II*nu**3*C2)/3/R(k) - &
nu**2*C2/R(k)**2+II*nu*C2/R(k)**3+C2/2/R(k)**4
Jr = Jr*exp(II*nu*time)
Jrp = Jrp*exp(II*nu*time)
Jrt = II*nu*Jr*exp(II*nu*time)
Ur = Ur*exp(II*nu*time)
Urp = Urp*exp(II*nu*time)
Wr = Wr*exp(II*nu*time)
Jr = dsqrt(dble((2-1)*2*(2+1)*(2+2)))*dreal(Jr)*z220
Jrt = dsqrt(dble((2-1)*2*(2+1)*(2+2)))*dreal(Jrt)*z220
Jrp = dsqrt(dble((2-1)*2*(2+1)*(2+2)))*dreal(Jrp)*z220
g01(i,j,k) = -dexp(2*dreal(z020*beta0*exp(II*nu*time)))
#if 1
g02(i,j,k) = -dsqrt(dble(2*(2+1)))*dreal(Ur)*dreal(mlx*(z120*dconjg(z220)* &
dconjg(Jr)+dsqrt(1+abs(Jr)**2)*dconjg(z120)))
g03(i,j,k) = -dsqrt(dble(2*(2+1)))*dreal(Ur)*dreal(mly*(z120*dconjg(z220)* &
dconjg(Jr)+dsqrt(1+abs(Jr)**2)*dconjg(z120)))
#elif 0
mlx = mlx/swtf
mly = mly/swtf
g02(i,j,k) = dreal(mlx)
g03(i,j,k) = dreal(mly)
!if(sst==0 .and. crho(1) <-0.9 .and. sigma(1) <-0.9 .and. XX(1)<0.18182)write(*,*)g02(i,j,k),g03(i,j,k)
!if(crho(1) <-0.9 .and. sigma(1) <-0.9 .and. XX(1)<0.18182)write(*,*)g02(i,j,k),g03(i,j,k)
#else
select case (sst)
case (0,1)
tc =-dcos(gp)/(dcos(gt)**2*dcos(gp)**2-dcos(gt)**2-dcos(gp)**2)
ts = dsin(gp)/(1-dsin(gt)**2*dcos(gp)**2)
case (2,3)
tc = 0
ts = dcos(gp)/(dcos(gt)**2*dcos(gp)**2-dcos(gt)**2-dcos(gp)**2)
case (4,5)
tc = 0
ts =-dsin(gp)/(1-dsin(gt)**2*dcos(gp)**2)
end select
g02(i,j,k) = gxx*tc+gxy*ts
g03(i,j,k) = gxy*tc+gyy*ts
!if(sst==0 .and. crho(1) <-0.9 .and. sigma(1) <-0.9 .and. XX(1)<0.18182)write(*,*)g02(i,j,k),g03(i,j,k)
if(crho(1) <-0.9 .and. sigma(1) <-0.9 .and. XX(1)<0.18182)write(*,*)g02(i,j,k),g03(i,j,k),sst
stop
#endif
p02(i,j,k) = -dsqrt(dble(2*(2+1)))*dreal(Urp)*dreal(mlx*(z120*dconjg(Jr)+ &
dsqrt(1+abs(Jr)**2)*dconjg(z120))) &
-dsqrt(dble(2*(2+1)))*dreal(Ur)*dreal(mlx*(z120*dconjg(Jrp)+ &
abs(Jrp)*abs(Jr)/dsqrt(1+abs(Jr)**2)*dconjg(z120)))
p03(i,j,k) = -dsqrt(dble(2*(2+1)))*dreal(Urp)*dreal(mly*(z120*dconjg(Jr)+ &
dsqrt(1+abs(Jr)**2)*dconjg(z120))) &
-dsqrt(dble(2*(2+1)))*dreal(Ur)*dreal(mly*(z120*dconjg(Jrp)+ &
abs(Jrp)*abs(Jr)/dsqrt(1+abs(Jr)**2)*dconjg(z120)))
ctp = dconjg(Jr)*mlx*mlx+dsqrt(1+abs(Jr)**2)*dconjg(mlx)*mlx
g22(i,j,k) = dreal(ctp)
ctp = dconjg(Jr)*mlx*mly+dsqrt(1+abs(Jr)**2)*dconjg(mlx)*mly
g23(i,j,k) = dreal(ctp)
ctp = dconjg(Jr)*mly*mly+dsqrt(1+abs(Jr)**2)*dconjg(mly)*mly
g33(i,j,k) = dreal(ctp)
ctp = dconjg(Jrt)*mlx*mlx+abs(Jr)*abs(Jrt)/dsqrt(1+abs(Jr)**2)*dconjg(mlx)*mlx
Theta22(i,j,k) = dreal(ctp)
ctp = dconjg(Jrt)*mlx*mly+abs(Jr)*abs(Jrt)/dsqrt(1+abs(Jr)**2)*dconjg(mlx)*mly
Theta23(i,j,k) = dreal(ctp)
ctp = dconjg(Jrt)*mly*mly+abs(Jr)*abs(Jrt)/dsqrt(1+abs(Jr)**2)*dconjg(mly)*mly
Theta33(i,j,k) = dreal(ctp)
enddo
enddo
enddo
return
end subroutine get_null_boundary3