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

689 lines
26 KiB
Fortran

#include "macrodef.fh"
!------------------------------------------------------------------------------
function omega_rhs(ex,crho,sigma,R,omega,RU,IU,omegarhs, &
quR1,quR2,quI1,quI2,gR,gI) result(gont)
implicit none
integer,intent(in) :: ex(3)
real*8,intent(in),dimension(ex(1))::crho
real*8,intent(in),dimension(ex(2))::sigma
real*8,intent(in),dimension(ex(3))::R
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: omega,RU,IU
real*8, dimension(ex(1),ex(2),ex(3)),intent(out) :: omegarhs
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: quR1,quR2,quI1,quI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: gR,gI
! gont = 0: success; gont = 1: something wrong
integer::gont
double complex, dimension(ex(1),ex(2),ex(3)) :: comega,eth_omega,U,eth_Ub
real*8 :: dR
integer :: k
!!! sanity check
dR = sum(omega)+sum(RU)+sum(IU)
if(dR.ne.dR) then
if(sum(omega).ne.sum(omega))write(*,*)"NullEvol_beta: find NaN in omega"
if(sum(RU).ne.sum(RU))write(*,*)"NullEvol_beta: find NaN in RU"
if(sum(IU).ne.sum(IU))write(*,*)"NullEvol_beta: find NaN in IU"
gont = 1
return
endif
comega = dcmplx(omega,0.d0)
U = dcmplx(RU,IU)
do k=1,ex(3)
call derivs_eth(ex(1:2),crho,sigma,comega(:,:,k),eth_omega(:,:,k),0,1, &
quR1(:,:,k),quR2(:,:,k),quI1(:,:,k),quI2(:,:,k),gR(:,:,k),gI(:,:,k))
call derivs_eth(ex(1:2),crho,sigma,U(:,:,k),eth_Ub(:,:,k),1,-1, &
quR1(:,:,k),quR2(:,:,k),quI1(:,:,k),quI2(:,:,k),gR(:,:,k),gI(:,:,k))
enddo
!!! The term * e^{-2beta} has been added so as to be consistent with HPN. Nigel
!omega_u = - dble(eth_omega * conjg(U) + 0.5d0 * omega * eth_Ub * exp(-2*beta))
!!! - update .. I thought this may have been wrong so I removed the
!!! e^{-2beta} for testing. Yosef
! omegarhs = - dreal(eth_omega * dconjg(U) + 0.5d0 * omega * eth_Ub)
omegarhs = - 0.5d0*dreal(eth_Ub)
gont = 0
return
end function omega_rhs
!---------------------------------------------------------------------------------------------------------
subroutine drive_null_news(ex,crho,sigma,R,RJ,IJ,RU,IU,RTheta,ITheta,omega,beta, &
qlR1,qlR2,qlI1,qlI2, &
quR1,quR2,quI1,quI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,RNews,INews,Rmin,sst)
implicit none
integer,intent(in) :: ex(3),sst
real*8,intent(in) :: Rmin
real*8,intent(in),dimension(ex(1))::crho
real*8,intent(in),dimension(ex(2))::sigma
real*8,intent(in),dimension(ex(3))::R
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: RJ,IJ,RU,IU,RTheta,ITheta,omega,beta
real*8, dimension(ex(1),ex(2),ex(3)),intent(out) :: RNews,INews
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: qlR1,qlR2,qlI1,qlI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: quR1,quR2,quI1,quI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: gR,gI
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: dquR1,dquR2,dquI1,dquI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: bdquR1,bdquR2,bdquI1,bdquI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: dgR,dgI,bdgR,bdgI
integer :: i,j,k
double complex, dimension(ex(1),ex(2),ex(3)) :: CJ,U,J_u,J_l,J_l_u,News
#if 0
call get_fake_Ju(ex,crho,sigma,R,RTheta,ITheta, &
quR1,quR2,quI1,quI2,qlR1,qlR2,qlI1,qlI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,dacos(-1.d0)/2,Rmin,sst)
#endif
CJ = dcmplx(RJ,IJ)
U = dcmplx(RU,IU)
J_u = dcmplx(RTheta,ITheta)
do j=1,ex(2)
do i=1,ex(1)
call cderivs_x(ex(3),R,CJ(i,j,:),J_l(i,j,:))
call cderivs_x(ex(3),R,J_u(i,j,:),J_l_u(i,j,:))
J_l(i,j,:) = -J_l(i,j,:)*Rmin*R**2
J_l_u(i,j,:) = -J_l_u(i,j,:)*Rmin*R**2
enddo
enddo
#if 0
if(sst == 0 .and. crho(1) < -dacos(-1.d0)/4 .and. sigma(1) < -dacos(-1.d0)/4)then
call get_exact_Jul(ex,crho,sigma,R,RNews,INews, &
quR1,quR2,quI1,quI2,qlR1,qlR2,qlI1,qlI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,dacos(-1.d0)/2,Rmin,sst)
write(*,*) J_u(ex(1)/2,ex(2)/2,ex(3)-1),J_u(ex(1)/2,ex(2)/2,ex(3))
write(*,*) RNews(ex(1)/2,ex(2)/2,ex(3)),INews(ex(1)/2,ex(2)/2,ex(3))
write(*,*) J_l_u(ex(1)/2,ex(2)/2,ex(3))
write(*,*)dcmplx(RNews(ex(1)/2,ex(2)/2,ex(3)),INews(ex(1)/2,ex(2)/2,ex(3)))/J_l_u(ex(1)/2,ex(2)/2,ex(3))
endif
stop
#endif
do k=1,ex(3)
call get_null_news(ex(1:2),crho,sigma,CJ(:,:,k),U(:,:,k),J_u(:,:,k),J_l(:,:,k),J_l_u(:,:,k),omega(:,:,k),beta(:,:,k), &
qlR1(:,:,k),qlR2(:,:,k),qlI1(:,:,k),qlI2(:,:,k), &
quR1(:,:,k),quR2(:,:,k),quI1(:,:,k),quI2(:,:,k), &
gR(:,:,k),gI(:,:,k), &
dquR1(:,:,k),dquR2(:,:,k),dquI1(:,:,k),dquI2(:,:,k), &
bdquR1(:,:,k),bdquR2(:,:,k),bdquI1(:,:,k),bdquI2(:,:,k), &
dgR(:,:,k),dgI(:,:,k),bdgR(:,:,k),bdgI(:,:,k),News(:,:,k))
enddo
RNews = dreal(News)
INews = dimag(News)
#if 0
if(sst ==0 .and. crho(1) < -dacos(-1.d0)/4 .and. sigma(1) < -dacos(-1.d0)/4)then
call get_exact_eth2omega(ex,crho,sigma,R,RNews,INews, &
quR1,quR2,quI1,quI2,qlR1,qlR2,qlI1,qlI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,dacos(-1.d0)/2,Rmin,sst)
write(*,*) RNews(ex(1)/2,ex(2)/2,ex(3)),INews(ex(1)/2,ex(2)/2,ex(3))
endif
stop
#endif
#if 0
! check orthornormality
RNews = RJ
INews = IJ
RNews = 0.5d0*dreal(J_l_u)
INews = 0.5d0*dimag(J_l_u)
#endif
call six2spher(ex,crho,sigma,R,RNews,INews,2,Rmin,sst)
return
end subroutine drive_null_news
!---------------------------------------------------------------------------------------------------------
subroutine drive_null_news_diff(ex,crho,sigma,R,RJ,IJ,RU,IU,RTheta,ITheta,omega,beta, &
qlR1,qlR2,qlI1,qlI2, &
quR1,quR2,quI1,quI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,RNews,INews,Rmin,sst,Time)
implicit none
integer,intent(in) :: ex(3),sst
real*8,intent(in) :: Rmin,Time
real*8,intent(in),dimension(ex(1))::crho
real*8,intent(in),dimension(ex(2))::sigma
real*8,intent(in),dimension(ex(3))::R
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: RJ,IJ,RU,IU,RTheta,ITheta,omega,beta
real*8, dimension(ex(1),ex(2),ex(3)),intent(out) :: RNews,INews
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: qlR1,qlR2,qlI1,qlI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: quR1,quR2,quI1,quI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: gR,gI
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: dquR1,dquR2,dquI1,dquI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: bdquR1,bdquR2,bdquI1,bdquI2
real*8, dimension(ex(1),ex(2),ex(3)),intent(in) :: dgR,dgI,bdgR,bdgI
integer :: i,j,k
double complex, dimension(ex(1),ex(2),ex(3)) :: CJ,U,J_u,J_l,J_l_u,News
#if 0
call get_fake_Ju(ex,crho,sigma,R,RTheta,ITheta, &
quR1,quR2,quI1,quI2,qlR1,qlR2,qlI1,qlI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,dacos(-1.d0)/2,Rmin,sst)
#endif
CJ = dcmplx(RJ,IJ)
U = dcmplx(RU,IU)
J_u = dcmplx(RTheta,ITheta)
do j=1,ex(2)
do i=1,ex(1)
call cderivs_x(ex(3),R,CJ(i,j,:),J_l(i,j,:))
call cderivs_x(ex(3),R,J_u(i,j,:),J_l_u(i,j,:))
J_l(i,j,:) = -J_l(i,j,:)*Rmin*R**2
J_l_u(i,j,:) = -J_l_u(i,j,:)*Rmin*R**2
enddo
enddo
#if 0
if(sst == 0 .and. crho(1) < -dacos(-1.d0)/4 .and. sigma(1) < -dacos(-1.d0)/4)then
call get_exact_Jul(ex,crho,sigma,R,RNews,INews, &
quR1,quR2,quI1,quI2,qlR1,qlR2,qlI1,qlI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,dacos(-1.d0)/2,Rmin,sst)
write(*,*) J_u(ex(1)/2,ex(2)/2,ex(3)-1),J_u(ex(1)/2,ex(2)/2,ex(3))
write(*,*) RNews(ex(1)/2,ex(2)/2,ex(3)),INews(ex(1)/2,ex(2)/2,ex(3))
write(*,*) J_l_u(ex(1)/2,ex(2)/2,ex(3))
write(*,*)dcmplx(RNews(ex(1)/2,ex(2)/2,ex(3)),INews(ex(1)/2,ex(2)/2,ex(3)))/J_l_u(ex(1)/2,ex(2)/2,ex(3))
endif
stop
#endif
do k=1,ex(3)
call get_null_news(ex(1:2),crho,sigma,CJ(:,:,k),U(:,:,k),J_u(:,:,k),J_l(:,:,k),J_l_u(:,:,k),omega(:,:,k),beta(:,:,k), &
qlR1(:,:,k),qlR2(:,:,k),qlI1(:,:,k),qlI2(:,:,k), &
quR1(:,:,k),quR2(:,:,k),quI1(:,:,k),quI2(:,:,k), &
gR(:,:,k),gI(:,:,k), &
dquR1(:,:,k),dquR2(:,:,k),dquI1(:,:,k),dquI2(:,:,k), &
bdquR1(:,:,k),bdquR2(:,:,k),bdquI1(:,:,k),bdquI2(:,:,k), &
dgR(:,:,k),dgI(:,:,k),bdgR(:,:,k),bdgI(:,:,k),News(:,:,k))
enddo
call get_exact_news(ex,crho,sigma,R,RNews,INews,sst,Rmin,Time)
RNews = dreal(News) - Rnews
INews = dimag(News) - INews
!this part is nonsence
RNews(:,:,1:ex(3)-1) = 0.d0
INews(:,:,1:ex(3)-1) = 0.d0
#if 0
if(sst ==0 .and. crho(1) < -dacos(-1.d0)/4 .and. sigma(1) < -dacos(-1.d0)/4)then
call get_exact_eth2omega(ex,crho,sigma,R,RNews,INews, &
quR1,quR2,quI1,quI2,qlR1,qlR2,qlI1,qlI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,dacos(-1.d0)/2,Rmin,sst)
write(*,*) RNews(ex(1)/2,ex(2)/2,ex(3)),INews(ex(1)/2,ex(2)/2,ex(3))
endif
stop
#endif
#if 0
! check orthornormality
RNews = RJ
INews = IJ
RNews = 0.5d0*dreal(J_l_u)
INews = 0.5d0*dimag(J_l_u)
#endif
call six2spher(ex,crho,sigma,R,RNews,INews,2,Rmin,sst)
return
end subroutine drive_null_news_diff
!------------------------------------------------------------------------------------------------------------
subroutine get_null_news(ex,crho,sigma,J,U,J_u,J_l,J_l_u,omega,beta, &
qlR1,qlR2,qlI1,qlI2, &
quR1,quR2,quI1,quI2, &
gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI,News)
implicit none
integer,intent(in) :: ex(2)
real*8,intent(in),dimension(ex(1))::crho
real*8,intent(in),dimension(ex(2))::sigma
double complex,dimension(ex(1),ex(2)),intent(in) :: J,U
double complex,dimension(ex(1),ex(2)),intent(in) :: J_u,J_l,J_l_u
real*8,dimension(ex(1),ex(2)),intent(in) :: omega,beta
real*8,dimension(ex(1),ex(2)),intent(in) :: qlR1,qlR2,qlI1,qlI2
real*8,dimension(ex(1),ex(2)),intent(in) :: quR1,quR2,quI1,quI2
real*8,dimension(ex(1),ex(2)),intent(in) :: gR,gI
real*8,dimension(ex(1),ex(2)),intent(in) :: dquR1,dquR2,dquI1,dquI2
real*8,dimension(ex(1),ex(2)),intent(in) :: bdquR1,bdquR2,bdquI1,bdquI2
real*8,dimension(ex(1),ex(2)),intent(in) :: dgR,dgI,bdgR,bdgI
double complex,dimension(ex(1),ex(2)),intent(out) :: News
! local variables
real*8,dimension(ex(1),ex(2)) :: K,K_u,K_l,K_l_u
real*8,dimension(ex(1),ex(2)) :: a
double complex,dimension(ex(1),ex(2)) :: Comega,Cbeta
double complex,dimension(ex(1),ex(2)) :: Jb,Ub
double complex,dimension(ex(1),ex(2)) :: eth_a,eth2_a,eth_ethb_a
double complex,dimension(ex(1),ex(2)) :: s1,s2,s3,s4,s5
double complex,dimension(ex(1),ex(2)) :: eth_U,ethb_U,eth_J,ethb_J
double complex,dimension(ex(1),ex(2)) :: eth_J_l,ethb_J_l,eth_K_l,eth_K
double complex,dimension(ex(1),ex(2)) :: eth_omega,eth_beta
double complex,dimension(ex(1),ex(2)) :: eth2_omega,eth2_beta
double complex,dimension(ex(1),ex(2)) :: eth_ethb_omega,eth_ethb_beta
Comega = dcmplx(omega,0.d0)
Cbeta = dcmplx(beta,0.d0)
call derivs_eth(ex,crho,sigma,Comega,eth_omega,0,1,quR1,quR2,quI1,quI2,gR,gI)
call derivs_eth(ex,crho,sigma,Cbeta,eth_beta,0,1,quR1,quR2,quI1,quI2,gR,gI)
call dderivs_eth(ex,crho,sigma,Comega,eth2_omega,0,1,1, &
quR1,quR2,quI1,quI2,gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI)
call dderivs_eth(ex,crho,sigma,Cbeta,eth2_beta,0,1,1, &
quR1,quR2,quI1,quI2,gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI)
call dderivs_eth(ex,crho,sigma,Comega,eth_ethb_omega,0,-1,1, &
quR1,quR2,quI1,quI2,gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI)
call dderivs_eth(ex,crho,sigma,Cbeta,eth_ethb_beta,0,-1,1, &
quR1,quR2,quI1,quI2,gR,gI, &
dquR1,dquR2,dquI1,dquI2, &
bdquR1,bdquR2,bdquI1,bdquI2, &
dgR,dgI,bdgR,bdgI)
call derivs_eth(ex,crho,sigma,U,eth_U,1,1,quR1,quR2,quI1,quI2,gR,gI)
call derivs_eth(ex,crho,sigma,U,ethb_U,1,-1,quR1,quR2,quI1,quI2,gR,gI)
call derivs_eth(ex,crho,sigma,J,eth_J,2,1,quR1,quR2,quI1,quI2,gR,gI)
call derivs_eth(ex,crho,sigma,J,ethb_J,2,-1,quR1,quR2,quI1,quI2,gR,gI)
call derivs_eth(ex,crho,sigma,J_l,eth_J_l,2,1,quR1,quR2,quI1,quI2,gR,gI)
call derivs_eth(ex,crho,sigma,J_l,ethb_J_l,2,-1,quR1,quR2,quI1,quI2,gR,gI)
Jb = dconjg(J)
Ub = dconjg(U)
K = dsqrt(1.0d0 + cdabs(J)**2)
! temp storage
Comega=dcmplx(K,0.d0)
call derivs_eth(ex,crho,sigma,Comega,eth_K,0,1,quR1,quR2,quI1,quI2,gR,gI)
K_u = dreal( J_u * Jb ) / K
K_l = dreal( J_l * Jb ) / K
! temp storage
Comega=dcmplx(K_l,0.d0)
call derivs_eth(ex,crho,sigma,Comega,eth_K_l,0,1,quR1,quR2,quI1,quI2,gR,gI)
K_l_u = dreal( J_u * dconjg(J_l) + J_l_u * Jb )/ K - K_l * K_u / K
a = omega * dexp(2.0d0 * beta)
eth_a = dexp(2.0d0 * beta) * ( eth_omega + 2.0d0 * omega * eth_beta )
eth2_a = dexp(2.0d0 * beta) * ( 4.0d0 * eth_beta * eth_omega &
+ 4.0d0 * omega * eth_beta**2 &
+ eth2_omega + 2.0d0 * omega * eth2_beta )
eth_ethb_a = dexp(2.0d0 * beta) * ( 4.0d0 * dreal(eth_beta * dconjg(eth_omega)) &
+ 4.0d0 * omega * eth_beta * dconjg(eth_beta) &
+ eth_ethb_omega + 2.0d0 * omega * eth_ethb_beta )
s1 = ( -2.0d0 * K_l_u * J * (K + 1.0d0) + J_l_u * (K + 1.0d0)**2 &
+ dconjg(J_l_u) * J**2 ) / (K + 1.0d0)
s2 = 0.5d0 / ( K + 1.0d0) * ( &
(K + 1.0d0)* (eth_J_l *Ub * (K+1.0d0) - 2.0d0* eth_K_l * J *Ub ) &
+ eth_U * (K+1.0d0)* ( -2.0d0 * J * dconjg(J_l) + K_l * 2.0d0 * (K+1.0d0) ) &
+ dconjg(ethb_U) * (K+1.0d0) * ( -2.0d0* J * K_l + J_l * 2.0d0 * (K+1.0d0) ) &
+ ethb_J_l * U * (K+1.0d0)**2 - dconjg(eth_K_l) * 2.0d0 * U * J * (K+1.0d0) &
+ ethb_U * 2.0d0 * J * ( J * dconjg(J_l) - (K+1.0d0) * K_l) &
+ J**2 * ( U * dconjg(eth_J_l) + dconjg(ethb_J_l * U) ) &
+ J * 2.0d0 * dconjg(eth_U) * ( J * K_l - J_l * (K+1.0d0) ) )
s3 = ( J_l * (K + 1.0d0)**2 -2.0d0 * K_l * J * (K + 1.0d0) &
+ dconjg(J_l) * J**2) / (K + 1.0d0)
s4 = 0.5d0 / ( K + 1.0d0) * ( eth_a * eth_omega * (K + 1.0d0)**2 &
- (K+1.0d0) * J * 2.0d0* dreal( eth_a * dconjg(eth_omega) ) &
+ J**2 * dconjg(eth_a * eth_omega) )
s5 = 0.25d0 / ( K + 1.0d0) * ( 2.0d0 * eth2_a * (K+1.0d0)**2 &
+ 2.0d0 * J**2 * dconjg(eth2_a) &
- 4.0d0 * eth_ethb_a * J * (K+1.0d0) &
+ Jb * eth_a * eth_J* (K+1.0d0)**2 &
+ J * eth_a * dconjg(ethb_J) * (K+1.0d0)**2 &
- eth_a * eth_K * 2.0d0 * (K+1.0d0) * ( J*Jb + (K+1.0d0) ) &
+ eth_a * ethb_J * (K+1.0d0) * ( -J*Jb + (K+1.0d0) ) &
- J**2 * eth_a * dconjg(eth_J) * K &
+ J**2 * Jb * 2.0d0* eth_a * dconjg(eth_K) &
- dconjg(eth_a) * eth_J * (K+1.0d0) * ( J*Jb + K+1.0d0 ) &
- dconjg(ethb_J) * dconjg(eth_a) * J**2 * ( K + 2.0d0) &
+ J * 2.0d0 * (K+1.0d0)**2 * eth_K * dconjg(eth_a) &
+ J**2 * Jb * ethb_J * dconjg(eth_a) &
+ J**3 * dconjg(eth_a * eth_J) &
- 2.0d0* J**2 *K*dconjg(eth_K * eth_a) )
! News = 0.25d0 * ( s1 + s2 + 0.5d0 * dble(ethb_U) * s3 &
! - 4.0d0 * s4 / omega**2 + 2.0d0 * s5 / omega ) / ( omega**2 * exp(2.0d0 * beta) )
! change sign of s3 to compensate for a bug in Eqs. 30, 37, and 38 of
! HPN
#if 1
News = 0.25d0 * ( s1 + s2 - 0.5d0 * dreal(ethb_U) * s3 &
- 4.0d0 * s4 / omega**2 + 2.0d0 * s5 / omega ) / ( omega**2 * dexp(2.0d0 * beta) )
#else
#if 0
if(crho(1) < -dacos(-1.d0)/4 .and. sigma(1) < -dacos(-1.d0)/4)then
write(*,*) eth2_omega(ex(1)/2,ex(2)/2)
endif
#endif
News = 0.5d0*J_l_u+eth2_beta+0.5d0*eth2_omega ! if given omega error is about 6e-9
! News = 0.5d0*J_l_u+eth2_beta-1.5d0*J ! error is about 6e-9
#endif
return
end subroutine get_null_news
!--------------------------------------------------------------------------------------------------
! change spin weighted function from 6 patches to spherical coordinate
subroutine six2spher(ex,crho,sigma,R,RU,IU,spin,Rmin,sst)
implicit none
!~~~~~~% Input parameters:
integer,intent(in) :: ex(3),sst,spin
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))::R
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout) :: RU,IU
integer :: i,j,k
real*8 ::x,y,z,hgr,gt,gp,tgrho,tgsigma,tc,ts,rf
double complex :: II,swtf,ff
II = dcmplx(0.d0,1.d0)
hgr = 1.d0
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
! hgr = R(k)*Rmin/(1.d0-R(k)) R is not invovled indeed, to avoid NaN, we set
! it to 1 above
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 = hgr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (1)
z = -hgr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = z*tgrho
y = z*tgsigma
case (2)
x = hgr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (3)
x = -hgr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
y = x*tgrho
z = x*tgsigma
case (4)
y = hgr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case (5)
y = -hgr/dsqrt(1+tgrho*tgrho+tgsigma*tgsigma)
x = y*tgrho
z = y*tgsigma
case default
write(*,*) "six2spher: not recognized sst = ",sst
return
end select
gt = dacos(z/hgr)
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
ff=dcmplx(RU(i,j,k),IU(i,j,k))/swtf**spin
RU(i,j,k) = dreal(ff)
IU(i,j,k) = dimag(ff)
enddo
enddo
enddo
return
end subroutine six2spher
!-------------------------------------------------------------
! Linear wave given in Eq.(27) of CQG 22, 2393 (2005)
!-------------------------------------------------------------
subroutine get_exact_omega(ex,crho,sigma,R,omega,sst,Rmin,T)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) :: Rmin,T
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::omega
integer :: i,j,k
real*8 ::x,y,z,gr,gt,gp,tgrho,tgsigma,tc,ts
double complex :: Yslm,II,Jr
double complex :: beta0,C1,C2
integer :: nu,m
double complex :: swtf,ff
call initial_null_paramter(beta0,C1,C2,nu,m)
II = dcmplx(0.d0,1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
!fake global coordinate is enough here
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_exact_omega: 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
gr = (1.d0-R(k))/R(k)/Rmin
Jr = (2.4d1*beta0+3.d0*II*nu*C1-II*nu**3*C2)/3.6d1+C1/4.d0*gr-C2/1.2d1*gr**3
gr = dreal(Jr*cdexp(II*nu*T))
Jr = Yslm(0,2,m,gt,gp)
omega(i,j,k) = 1.d0-2.d0*(2+1)/2.d0*gr*dreal(Jr)
enddo
enddo
enddo
return
end subroutine get_exact_omega
!-------------------------------------------------------------
! Linear wave given in Eq.(16) of CQG 24S327
!-------------------------------------------------------------
subroutine get_exact_news(ex,crho,sigma,R,RNews,INews,sst,Rmin,Time)
implicit none
! argument variables
integer, intent(in ):: ex(1:3),sst
real*8,intent(in) :: Rmin,Time
double precision,intent(in),dimension(ex(1))::crho
double precision,intent(in),dimension(ex(2))::sigma
double precision,intent(in),dimension(ex(3))::R
real*8,dimension(ex(1),ex(2),ex(3)),intent(out)::RNews,INews
integer :: i,j,k
real*8 ::x,y,z,gr,gt,gp,tgrho,tgsigma,tc,ts
double complex :: Yslm,II,Jr
double complex :: beta0,C1,C2
integer :: nu,m
double complex :: swtf,ff
call initial_null_paramter(beta0,C1,C2,nu,m)
II = dcmplx(0.d0,1.d0)
do i=1,ex(1)
do j=1,ex(2)
do k=1,ex(3)
!fake global coordinate is enough here
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_null: 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
Jr = II*nu**3*C2/dsqrt(2.4d1)
gr = dreal(Jr)
Jr = Yslm(2,2,m,gt,gp)
ff = gr*Jr*swtf**2
RNews(i,j,k) = dreal(ff)
INews(i,j,k) = dimag(ff)
enddo
enddo
enddo
return
end subroutine get_exact_news