Dear all,
I'm trying to solve a wave equation that describes radial oscillations
of a TOV star, depending on radius r and t in Llama multipatch
coordinates (Thornburg04).
The equation has a structure of
Ẍ=AX′+BX″+CX\ddot{X} = A X' + B X'' + C X
I rewrote it as set of coupled equations to evolve it with the MoL thorn:
X˙=Π
H˙=Π′\dot{H} = \Pi'
Π˙=AH+BH′+CX\dot{\Pi} = AH + B H' +C X
or as noted in my code as it is attached:
Pidot = A*H + B*drH + C*Xi
Hdot = drPi
Xidot = Pi
For MoL registered as evolved variables are Xi with rhs Xidot, Pi with
rhs Pidot and H with rhs Hdot.
The spatial derivatives drH and drPi are also calculated during the
schedule of MoL_CalcRHS in my thorn.
Boundary conditions are applied for r>R and an interval near the TOV
radius r=R.
if (grid_r(i,j,k) >= (TOV_surface - rprec) .AND. grid_r(i,j,k) <=
(TOV_surface + rprec) )then
H(i,j,k) = 0
drPi(i,j,k) = 0
else if ( grid_r(i,j,k) > (TOV_surface + rprec) ) then
Xi(i,j,k) = 0
Pi(i,j,k) = 0
H(i,j,k) = 0
end if
if (grid_r(i,j,k) > (TOV_surface + rprec) )then
Xidot(i,j,k) = 0
Hdot(i,j,k) = 0
Pidot(i,j,k) = 0
else if (grid_r(i,j,k) >= (TOV_surface - rprec) .AND.
grid_r(i,j,k) <= (TOV_surface + rprec) )then
Hdot(i,j,k) = 0
Pidot(i,j,k) = B(i,j,k)*drH(i,j,k) + C(i,j,k)*Xi(i,j,k)
end if
Problems occur close to the surface of the star. My evolved variables
start do diverge close to the surface after a few iterations. Looking at
the data it seems that the divergence is founded by the values of H. I
tried following things to encircle the issues:
* If I put Pidot = B*drH + C*Xi the values seem to be ok, whereas for
Pidot = A*H the divergence appears. The A-factor only amplifies this
behavior. If I put Pidot = H it behaves the same, but much slower.
* If I use drXi instead of H (as it is commented out), it does not
make any difference.
* If I enlarge the size of the interval (e.g. TOV_surface + 5*rprec)
the same divergence appears, but shifted towards grid points next to
the interval. Also the divergence appears a few iterations later.
* If I change the drXi or H values close to the surface manually (e.g.
using a backsided differentiation, or put specific values by hand)
it also shifts the divergence (like above).
So far I don't know how to remedy this issue, but maybe I'm overlooking
something obvious.
Does anyone have an idea on what I could try?
Thanks a lot!
Best regards and merry Christmas,
Severin Frank
#===============================================================
# Testing SWTNS on a static TOV star
#
# Severin Frank
#===============================================================
#################### Thorns ####################################
ActiveThorns = "Time MoL"
ActiveThorns = "TOVSolver ADMBase HydroBase Constants StaticConformal SpaceMask"
ActiveThorns = "CoordBase CartGrid3D SymBase InitBase Boundary"
ActiveThorns = "LocalInterp AEILocalInterp LoopControl Carpet"
ActiveThorns = "IOUtil CarpetIOASCII CarpetIOScalar CarpetIOHDF5 CarpetIOBasic"
ActiveThorns = "NaNChecker CarpetReduce"
ActiveThorns = "Coordinates Interpolate2 CarpetInterp2 GlobalDerivative SWTNS"
#CoordinatesSymmetry
#################### Terminate #################################
Cactus::terminate = "time"
Cactus::cctk_final_time = 2
#################### Time Integration ##########################
Time::timestep_method = "given"
Time::timestep = 0.09
MoL::ODE_Method = "Generic"
MoL::Generic_Type = "RK"
MoL::MoL_Intermediate_Steps = 4
MoL::MoL_Num_Scratch_Levels = 3
MoL::verbose = "extreme"
#################### Grid Setup ################################
Carpet::domain_from_multipatch = yes
CartGrid3D::type = "multipatch"
CartGrid3D::set_coordinate_ranges_on = "all maps"
Coordinates::coordinate_system = "Thornburg04"
Coordinates::h_cartesian = 0.1
Coordinates::h_radial = 0.1
SWTNS::rprec = 0.1
TOVSolver::tovrprec = 0.1
SWTNS::SWTNS_amplitude = 0.001 #0.0031830989
Coordinates::sphere_inner_radius = 2 #
Coordinates::sphere_outer_radius = 8 #7.5284600798562327 #100
Coordinates::n_angular = 9
Driver::ghost_size = 3
Coordinates::patch_boundary_size = 3
Coordinates::outer_boundary_size = 3
Coordinates::additional_overlap_size = 3
#stagger_patch_boundaries
Interpolate2::interpolator_order = 4
Interpolate2::continue_if_selftest_fails = no
#Interpolate2::verbose = yes
Coordinates::store_inverse_jacobian = "yes"
#################### Initial Data ##############################
InitBase::initial_data_setup_method = "init_some_levels"
HydroBase::timelevels = 1
ADMBase::metric_type = "physical"
ADMBase::initial_data = "tov"
ADMBase::initial_lapse = "tov"
ADMBase::initial_shift = "tov"
ADMBase::initial_dtlapse = "zero"
ADMBase::initial_dtshift = "zero"
SpaceMask::use_mask = "yes"
TOVSolver::TOV_Rho_Central[0] = 1.62e-3 #1e-3 1.62e-3 3.24e-3 1.24e-3
TOVSolver::TOV_Gamma = 2.0
SWTNS::TOV_Gamma = 2.0
TOVSolver::TOV_K = 100.0
SWTNS::TOV_K = 100.0
#TOVSolver::TOV_Num_Radial = 10000
#################### Finite Differencing ########################
SummationByParts::order = 2
SummationByParts::use_dissipation = no
SummationByParts::onesided_interpatch_boundaries = no
SummationByParts::onesided_outer_boundaries = yes
SummationByParts::sbp_upwind_deriv = yes
SummationByParts::sbp_1st_deriv = yes
SummationByParts::sbp_2nd_deriv = yes
#################### NaN Checker ################################
NaNChecker::check_every = 1
NaNChecker::action_if_found = "just warn" #"terminate", "just warn", "abort"
NaNChecker::check_vars = "HydroBase::rho HydroBase::press TOVSolver::TOV_mr
SWTNS::TOV_surface SWTNS::PHI SWTNS::drPHI
SWTNS::LAMBDA
SWTNS::drLAMBDA SWTNS::drpress SWTNS::drrho
SWTNS::A SWTNS::B SWTNS::C SWTNS::omega
SWTNS::Hdot SWTNS::drH SWTNS::drPi SWTNS::H
SWTNS::Xi SWTNS::Xidot SWTNS::Pi SWTNS::Pidot
SWTNS::Xeta #SWTNS::drXi SWTNS::param_dr
SWTNS::deriv_error"
#################### Output #####################################
IOBasic::outInfo_every = 1
IOBasic::outInfo_vars = "
#HydroBase::rho
#HydroBase::press
#SWTNS::gappa
SWTNS::Xi
#SWTNS::Xeta
#SWTNS::drXi
SWTNS::H
SWTNS::drH
#SWTNS::omega
#SWTNS::deriv_error
#SWTNS::TOV_surface
#TOVSolver::TOV_mr
#SWTNS::drPHI
#SWTNS::Xidot
#SWTNS::Pi
#SWTNS::Pidot
#SWTNS::PHI
#SWTNS::LAMBDA
#TOVSolver::TOV_PHI
#TOVSolver::TOV_R
"
#CarpetIOASCII::out1d_vars = "SWTNS::Xi"
#CarpetIOASCII::out1d_z = yes
IOASCII::compact_format = yes
# IOASCII::use_grid_coordinates = yes
#IOASCII::separate_grids = no
# IOASCII::one_file_per_group =yes
# IOASCII::out0D_every = 1
# IOASCII::out0D_point_x = 0
# IOASCII::out0D_point_y = 0
# IOASCII::out0D_point_z = 2
# IOASCII::out0D_vars ="
#
grid::coordinates{out_every=1000000000}
# SWTNS::Xeta
# SWTNS::Xi
# SWTNS::TOV_surface
#
#SWTNS::PHI{out_every=100000000000000}
#
#SWTNS::LAMBDA{out_every=100000000000000}
# SWTNS::Xidot
# SWTNS::Pi
# SWTNS::Pidot
#
#HydroBase::rho{out_every=1000000000}
#
#HydroBase::press{out_every=1000000000}
# "
IOHDF5::out_every = 1
IOHDF5::out_vars = "
grid::coordinates{out_every=100000000000}
Coordinates::patchnumber{out_every=100000000000000}
HydroBase::rho{out_every=1000000000000000}
HydroBase::press{out_every=100000000000000}
SWTNS::A{out_every=100000000000000}
SWTNS::B{out_every=100000000000000}
SWTNS::C{out_every=100000000000000}
SWTNS::omega{out_every=100000000000000}
SWTNS::drpress{out_every=100000000000000}
SWTNS::drrho{out_every=100000000000000}
SWTNS::dxdr{out_every=100000000000000}
SWTNS::dydr{out_every=100000000000000}
SWTNS::dzdr{out_every=100000000000000}
SWTNS::Xi
SWTNS::Xeta
SWTNS::Xidot
SWTNS::Pi
SWTNS::drPi
SWTNS::Pidot
SWTNS::drXi
SWTNS::drH
SWTNS::H
SWTNS::Hdot
SWTNS::grid_r{out_every=1000000000000000}
SWTNS::param_dr{out_every=1000000000000000}
SWTNS::deriv_error{out_every=1000000000000000}
TOVSolver::TOV_mr{out_every=100000000000000}
SWTNS::PHI{out_every=100000000000000}
SWTNS::drPHI{out_every=100000000000000}
SWTNS::LAMBDA{out_every=100000000000000}
SWTNS::drLAMBDA{out_every=100000000000000}
"
# This Thorn is based on LlamaWaveToy and SevesWaveToy
# Interface definition for thorn SWTNS
IMPLEMENTS: SWTNS
INHERITS: grid, Coordinates, GlobalDerivative, SummationByParts, Interpolate,
ADMBase, HydroBase, Constants, StaticConformal, TOVSolver
USES INCLUDE: constants.h
CCTK_INT FUNCTION \
MultiPatch_GetMap \
(CCTK_POINTER_TO_CONST IN cctkGH)
REQUIRES FUNCTION MultiPatch_GetMap
CCTK_INT FUNCTION \
MultiPatch_GetBbox \
(CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN size, \
CCTK_INT OUT ARRAY bbox)
REQUIRES FUNCTION MultiPatch_GetBbox
SUBROUTINE globalDiff_gv ( CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN dir, \
CCTK_REAL IN ARRAY var, \
CCTK_REAL OUT ARRAY dvar, \
CCTK_REAL IN ARRAY J_dxda, \
CCTK_REAL IN ARRAY J_dxdb, \
CCTK_REAL IN ARRAY J_dxdc, \
CCTK_REAL IN ARRAY J_dyda, \
CCTK_REAL IN ARRAY J_dydb, \
CCTK_REAL IN ARRAY J_dydc, \
CCTK_REAL IN ARRAY J_dzda, \
CCTK_REAL IN ARRAY J_dzdb, \
CCTK_REAL IN ARRAY J_dzdc, \
CCTK_INT IN table_handle )
USES FUNCTION globalDiff_gv
SUBROUTINE globalDiff2_gv( CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN dir1, \
CCTK_INT IN dir2, \
CCTK_REAL IN ARRAY var, \
CCTK_REAL OUT ARRAY dvar, \
CCTK_REAL IN ARRAY J_dadx, \
CCTK_REAL IN ARRAY J_dbdx, \
CCTK_REAL IN ARRAY J_dcdx, \
CCTK_REAL IN ARRAY J_dady, \
CCTK_REAL IN ARRAY J_dbdy, \
CCTK_REAL IN ARRAY J_dcdy, \
CCTK_REAL IN ARRAY J_dadz, \
CCTK_REAL IN ARRAY J_dbdz, \
CCTK_REAL IN ARRAY J_dcdz, \
CCTK_REAL IN ARRAY dJ_dadxdx, \
CCTK_REAL IN ARRAY dJ_dbdxdx, \
CCTK_REAL IN ARRAY dJ_dcdxdx, \
CCTK_REAL IN ARRAY dJ_dadxdy, \
CCTK_REAL IN ARRAY dJ_dbdxdy, \
CCTK_REAL IN ARRAY dJ_dcdxdy, \
CCTK_REAL IN ARRAY dJ_dadxdz, \
CCTK_REAL IN ARRAY dJ_dbdxdz, \
CCTK_REAL IN ARRAY dJ_dcdxdz, \
CCTK_REAL IN ARRAY dJ_dadydy, \
CCTK_REAL IN ARRAY dJ_dbdydy, \
CCTK_REAL IN ARRAY dJ_dcdydy, \
CCTK_REAL IN ARRAY dJ_dadydz, \
CCTK_REAL IN ARRAY dJ_dbdydz, \
CCTK_REAL IN ARRAY dJ_dcdydz, \
CCTK_REAL IN ARRAY dJ_dadzdz, \
CCTK_REAL IN ARRAY dJ_dbdzdz, \
CCTK_REAL IN ARRAY dJ_dcdzdz, \
CCTK_INT IN table_handle )
USES FUNCTION globalDiff2_gv
CCTK_INT FUNCTION \
MoLRegisterEvolvedGroup \
(CCTK_INT IN EvolvedIndex, \
CCTK_INT IN RHSIndex)
REQUIRES FUNCTION MoLRegisterEvolvedGroup
CCTK_INT FUNCTION \
MoLRegisterEvolved \
(CCTK_INT IN EvolvedIndex, \
CCTK_INT IN RHSIndex)
REQUIRES FUNCTION MoLRegisterEvolved
CCTK_INT FUNCTION \
Boundary_SelectGroupForBC \
(CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN faces, \
CCTK_INT IN boundary_width, \
CCTK_INT IN table_handle, \
CCTK_STRING IN group_name, \
CCTK_STRING IN bc_name)
REQUIRES FUNCTION Boundary_SelectGroupForBC
CCTK_INT FUNCTION \
Boundary_SelectVarForBC \
(CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN faces, \
CCTK_INT IN boundary_width, \
CCTK_INT IN table_handle, \
CCTK_STRING IN var_name, \
CCTK_STRING IN bc_name)
REQUIRES FUNCTION Boundary_SelectVarForBC
CCTK_INT FUNCTION \
Boundary_SelectedGVs \
(CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN array_size, \
CCTK_INT ARRAY OUT var_indicies, \
CCTK_INT ARRAY OUT faces, \
CCTK_INT ARRAY OUT boundary_widths, \
CCTK_INT ARRAY OUT table_handles, \
CCTK_STRING IN bc_name)
REQUIRES FUNCTION Boundary_SelectedGVs
CCTK_INT FUNCTION \
SymmetryTableHandleForGrid (CCTK_POINTER_TO_CONST IN cctkGH)
REQUIRES FUNCTION SymmetryTableHandleForGrid
CCTK_POINTER_TO_CONST FUNCTION SymmetryNameOfHandle (CCTK_INT IN sym_handle)
REQUIRES FUNCTION SymmetryNameOfHandle
CCTK_INT FUNCTION SymmetryHandleOfName (CCTK_STRING IN sym_name)
REQUIRES FUNCTION SymmetryHandleOfName
CCTK_REAL FUNCTION GetScalProdCoeff ()
USES FUNCTION GetScalProdCoeff
SUBROUTINE Diff_gv ( CCTK_POINTER_TO_CONST IN cctkGH, \
CCTK_INT IN dir, \
CCTK_REAL IN ARRAY var, \
CCTK_REAL OUT ARRAY dvar, \
CCTK_INT IN table_handle )
USES FUNCTION Diff_gv
REAL pressuredensity TYPE=gf TAGS='tensortypealias="scalar"'
{
gappa
} "gamma=(rho+p)/p*dp/drho"
REAL tovsurface TYPE=scalar
{
TOV_surface
} "TOV_R+Xi(TOV_R)"
REAL metricpots TYPE=gf TAGS='tensortypealias="scalar"'
{
PHI, LAMBDA, drPHI, drLAMBDA, A, B, C, drrho, drpress
} "metric potentials: ds^2= -exp(2*PHI) dt^2 + exp(2*LAMBDA)dr^2 + ... and
depending quantities,"
REAL trafo TYPE=gf TAGS='tensortypealias="scalar"'
{
dxdr, dydr, dzdr, grid_r
} "coordiante transformation for derivatives... dxdrr, dydrr, dzdrr and
griddpoint radius"
REAL paramcheck TYPE=gf TAGS='tensortypealias="scalar"'
{
param_dr, deriv_error
} "to check accuracy derivatives"
REAL scalar TYPE=gf TIMELEVELS=2 TAGS='tensortypealias="scalar"'
{
Xi
} "The scalar of the scalar wave equation fame"
REAL fluidscalar TYPE=gf
{
Xeta
} "fluid element displ."
REAL frequency TYPE=gf
{
omega, omegasquare
} "initial frequency"
REAL density TYPE=gf TIMELEVELS=2 TAGS='tensortypealias="scalar"'
{
Pi
} "Time derivative of Xi"
REAL drscalar TYPE=gf TIMELEVELS=2 TAGS='tensortypealias="scalar"'
{
drXi
} "Spatial derivatives of Xi"
REAL drdensity TYPE=gf TIMELEVELS=2 TAGS='tensortypealias="scalar"'
{
drPi
} "Time derivative of Xi"
REAL scalardot TYPE=gf TAGS='tensortypealias="scalar" Prolongation="None"'
{
Xidot
} "RHS of Xi"
REAL densitydot TYPE=gf TAGS='tensortypealias="scalar" Prolongation="None"'
{
Pidot
} "RHS of Pi"
REAL velocity TYPE=gf TIMELEVELS=2 TAGS='tensortypealias="scalar"'
{
H
} "H=drXi"
REAL drvelocity TYPE=gf TIMELEVELS=2 TAGS='tensortypealias="scalar"'
{
drH
} "Spatial derivatives of Xi"
REAL velocitydot TYPE=gf TAGS='tensortypealias="scalar" Prolongation="None"'
{
Hdot
} "RHS of H"
# Schedule definitions for thorn SWTNS
# Evolved variables
STORAGE: pressuredensity
STORAGE: metricpots
STORAGE: trafo
STORAGE: paramcheck
STORAGE: scalar[2] density[2] velocity[2]
STORAGE: drscalar[2] drvelocity[2]
STORAGE: drdensity[2]
STORAGE: tovradius
STORAGE: scalardot densitydot velocitydot
STORAGE: tovsurface
STORAGE: fluidscalar
STORAGE: frequency
#################################################
# Startup and initial
#################################################
SCHEDULE SWTNS_startup AT startup
{
LANG: C
OPTIONS: meta
} "Register banner with Cactus"
SCHEDULE SWTNS_register_MoL IN MoL_Register
{
LANG: C
OPTIONS: meta
} "Register variables with MoL"
SCHEDULE SWTNS_init AT initial AFTER TOV_C_Exact
{
LANG: Fortran
} "Initialise the system"
##################################################
# Calculate the RHS
##################################################
SCHEDULE SWTNS_calc_rhs IN MoL_CalcRHS
{
LANG: Fortran
} "Calculate the RHS"
#SCHEDULE SWTNS_surface IN MoL_CalcRHS AFTER SWTNS_calc_rhs
#{
# LANG: Fortran
#} "Calculate TOV radius"
##################################################
# Apply the boundary conditions
##################################################
SCHEDULE SWTNS_outerboundary IN MoL_PostStep
{
LANG: Fortran
} "Apply outer boundaries"
SCHEDULE SWTNS_RHS_outerboundary IN MoL_RHSBoundaries
{
LANG: Fortran
} "Apply MoL RHS outer boundaries (TOV_surface)"
SCHEDULE SWTNS_boundaries IN MoL_PostStep AFTER SWTNS_outerboundary
{
LANG: Fortran
OPTIONS: level
SYNC: scalar density drscalar scalardot densitydot velocity velocitydot
drvelocity drdensity
} "Select the boundary condition"
SCHEDULE GROUP ApplyBCs AS SWTNS_ApplyBCs IN MoL_PostStep AFTER SWTNS_boundaries
{
} "Apply boundary conditions"
##################################################
# Analysis: Frequencies, speed of sound?
##################################################
#if (recalculate_rhs)
#{
# SCHEDULE SWTNS_calc_rhs AT analysis
# {
# LANG: Fortran
# SYNC: scalardot densitydot
# STORAGE: scalardot densitydot
# TRIGGERS: scalardot densitydot
# } "Calculate the RHS"
#}
#todo
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
#include "cctk_Functions.h"
subroutine SWTNS_outerboundary (CCTK_ARGUMENTS)
implicit none
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_FUNCTIONS
DECLARE_CCTK_PARAMETERS
integer :: i, j, k, spec_i, spec_j, spec_k
do k = 1, cctk_lsh(3)
do j = 1, cctk_lsh(2)
do i = 1, cctk_lsh(1)
if (grid_r(i,j,k) >= (TOV_surface - rprec) .AND. grid_r(i,j,k) <= (TOV_surface + rprec) )then
H(i,j,k) = 0
!drXi(i,j,k) = 0
drPi(i,j,k) = 0
else if ( grid_r(i,j,k) > (TOV_surface + rprec) ) then
Xi(i,j,k) = 0
Pi(i,j,k) = 0
H(i,j,k) = 0
end if
end do
end do
end do
end subroutine SWTNS_outerboundary
subroutine SWTNS_RHS_outerboundary (CCTK_ARGUMENTS)
implicit none
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_FUNCTIONS
DECLARE_CCTK_PARAMETERS
integer :: i, j, k, spec_i, spec_j, spec_k
do k = 1, cctk_lsh(3)
do j = 1, cctk_lsh(2)
do i = 1, cctk_lsh(1)
if (grid_r(i,j,k) > (TOV_surface + rprec) )then
Xidot(i,j,k) = 0
Hdot(i,j,k) = 0
Pidot(i,j,k) = 0
else if (grid_r(i,j,k) >= (TOV_surface - rprec) .AND. grid_r(i,j,k) <= (TOV_surface + rprec) )then
Hdot(i,j,k) = 0
! drXi(i,j,k) = 0
Pidot(i,j,k) = B(i,j,k)*drH(i,j,k) + C(i,j,k)*Xi(i,j,k)
end if
end do
end do
end do
end subroutine SWTNS_RHS_outerboundary
subroutine SWTNS_boundaries (CCTK_ARGUMENTS)
implicit none
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_FUNCTIONS
DECLARE_CCTK_PARAMETERS
character :: fbound*1000
integer :: fboundlen
integer :: ierr
!write(*,*) "SWTNS_boundaries"
call CCTK_FortranString (fboundlen, bound, fbound)
if (fboundlen > len(fbound)) call CCTK_WARN (0, "internal error")
ierr = Boundary_SelectGroupForBC &
(cctkGH, CCTK_ALL_FACES, +1, -1, "SWTNS::scalar", fbound)
if (ierr/=0) call CCTK_WARN (0, "internal error")
ierr = Boundary_SelectGroupForBC &
(cctkGH, CCTK_ALL_FACES, +1, -1, "SWTNS::density", fbound)
if (ierr/=0) call CCTK_WARN (0, "internal error")
ierr = Boundary_SelectGroupForBC &
(cctkGH, CCTK_ALL_FACES, +1, -1, "SWTNS::velocity", fbound)
if (ierr/=0) call CCTK_WARN (0, "internal error")
end subroutine SWTNS_boundaries
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Functions.h"
#include "cctk_Parameters.h"
subroutine SWTNS_init (CCTK_ARGUMENTS)
implicit none
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_FUNCTIONS
DECLARE_CCTK_PARAMETERS
integer :: i, j, k
!CCTK_REAL :: TOV_R global
CCTK_REAL :: pio, helper
pio = acos(-1.0d0)
TOV_surface = TOV_R
write(*,*)"Check if TOV_R is global..."
write(*,*)"Radius = ", TOV_R
write(*,*) "Surface = " , TOV_surface
write(*,*) "precission limit for grid points = " , rprec
! write(*,*) "grid boundary = " , gridboundary
write(*,*)"start initial"
!$OMP PARALLEL DO private(i,j,k)
do k=1,cctk_lsh(3)
do j=1,cctk_lsh(2)
do i=1,cctk_lsh(1) !coordinate transformation factors
grid_r(i,j,k) = r(i,j,k)
if(patchnumber(i,j,k) > 0) then
dxdr(i,j,k) = iJ13(i,j,k)
dydr(i,j,k) = iJ23(i,j,k)
dzdr(i,j,k) = iJ33(i,j,k)
else if (patchnumber(i,j,k) == 0 .AND. grid_r(i,j,k) > 0) then
dxdr(i,j,k) = x(i,j,k)/sqrt(x(i,j,k)**2+y(i,j,k)**2+z(i,j,k)**2)
dydr(i,j,k) = y(i,j,k)/sqrt(x(i,j,k)**2+y(i,j,k)**2+z(i,j,k)**2)
dzdr(i,j,k) = z(i,j,k)/sqrt(x(i,j,k)**2+y(i,j,k)**2+z(i,j,k)**2)
end if
if(grid_r(i,j,k) == 0) then
dxdr(i,j,k) = 0
dydr(i,j,k) = 0
dzdr(i,j,k) = 0 !filling initial data starts here
PHI(i,j,k) = TOV_PHI(i,j,k)
drPHI(i,j,k) = 0
LAMBDA(i,j,k) = 0
drLAMBDA(i,j,k) = 0
drpress(i,j,k) = 0
drrho(i,j,k) = 0
A(i,j,k) = 0
B(i,j,k) = TOV_Gamma*press(i,j,k)/rho(i,j,k)*exp(2*PHI(i,j,k)-2*LAMBDA(i,j,k))
C(i,j,k) = 0
Xi(i,j,k) = (sin(pio*r(i,j,k)/TOV_surface)*cos(pio*r(i,j,k)/TOV_surface)-pio*r(i,j,k)/TOV_surface)*SWTNS_amplitude
Xeta(i,j,k) = 0
drXi(i,j,k) = pio * SWTNS_amplitude *(cos(2*pio*r(i,j,k)/TOV_surface)-1)/TOV_surface
H(i,j,k) = drXi(i,j,k)
drH(i,j,k) = -(2*pio**2*SWTNS_amplitude*sin(2*pio*r(i,j,k)/TOV_surface))/(TOV_surface**2)
omega(i,j,k) = 0
Pi(i,j,k) = 0
drPi(i,j,k) = 0
Xidot(i,j,k) = 0
Pidot(i,j,k) = 0
Hdot(i,j,k) = 0
else if (press(i,j,k) == 0 .OR. rho(i,j,k) == 0) then !outside the star
PHI(i,j,k) = TOV_PHI(i,j,k)
drPHI(i,j,k) = (TOV_mr(i,j,k) + 4*pio*r(i,j,k)**3 * press(i,j,k))/(r(i,j,k)*(r(i,j,k)-2*TOV_mr(i,j,k)))
LAMBDA(i,j,k) = -0.5*log(1-2*TOV_mr(i,j,k)/r(i,j,k))
drLAMBDA(i,j,k) = (4*pio*r(i,j,k)**3 * rho(i,j,k)-TOV_mr(i,j,k))/(r(i,j,k)*(r(i,j,k)-2*TOV_mr(i,j,k)))
drpress(i,j,k) = -(rho(i,j,k) + press(i,j,k))*(TOV_mr(i,j,k)+4*pio*r(i,j,k)**3+press(i,j,k))/(r(i,j,k)*(r(i,j,k)-2*TOV_mr(i,j,k)))
drrho(i,j,k) = 0 !manual approximation
A(i,j,k) = 0 !manual
B(i,j,k) = 0 !manual
C(i,j,k) = exp(2*PHI(i,j,k)-2*LAMBDA(i,j,k))*(drPHI(i,j,k)**2+4*drPHI(i,j,k)/r(i,j,k)-8*pio*exp(2*LAMBDA(i,j,k))*press(i,j,k) )
Xi(i,j,k) = 0
Xeta(i,j,k) = 0
drXi(i,j,k) = 0
H(i,j,k) = 0
drH(i,j,k) = 0
omega(i,j,k) = 0
Pi(i,j,k) = 0
drPi(i,j,k) = 0
Xidot(i,j,k) = 0
Pidot(i,j,k) = 0
Hdot(i,j,k) = 0
else
PHI(i,j,k) = TOV_PHI(i,j,k)
drPHI(i,j,k) = (TOV_mr(i,j,k) + 4*pio*r(i,j,k)**3 * press(i,j,k))/(r(i,j,k)*(r(i,j,k)-2*TOV_mr(i,j,k)))
LAMBDA(i,j,k) = -0.5*log(1-2*TOV_mr(i,j,k)/r(i,j,k))
drLAMBDA(i,j,k) = (4*pio*r(i,j,k)**3 * rho(i,j,k)-TOV_mr(i,j,k))/(r(i,j,k)*(r(i,j,k)-2*TOV_mr(i,j,k)))
drpress(i,j,k) = -(rho(i,j,k) + press(i,j,k))*(TOV_mr(i,j,k)+4*pio*r(i,j,k)**3+press(i,j,k))/(r(i,j,k)*(r(i,j,k)-2*TOV_mr(i,j,k)))
drrho(i,j,k) = drpress(i,j,k)*rho(i,j,k)/(TOV_Gamma*press(i,j,k))
A(i,j,k) = (exp(2*PHI(i,j,k)-2*LAMBDA(i,j,k))/rho(i,j,k))*(TOV_Gamma*press(i,j,k)*(drLAMBDA(i,j,k) + 3*drPHI(i,j,k)) &
-(TOV_Gamma-1)*press(i,j,k)*drPHI(i,j,k)+TOV_Gamma*drpress(i,j,k) -2*TOV_Gamma*press(i,j,k)/r(i,j,k) )
B(i,j,k) = exp(2*PHI(i,j,k)-2*LAMBDA(i,j,k))*TOV_Gamma*press(i,j,k)/rho(i,j,k)
C(i,j,k) = exp(2*PHI(i,j,k)-2*LAMBDA(i,j,k))*(drPHI(i,j,k)**2+4*drPHI(i,j,k)/r(i,j,k)-8*pio*exp(2*LAMBDA(i,j,k))*press(i,j,k) )
Xi(i,j,k) = (sin(pio*r(i,j,k)/TOV_surface)*cos(pio*r(i,j,k)/TOV_surface)-pio*r(i,j,k)/TOV_surface)*SWTNS_amplitude
Xeta(i,j,k) = Xi(i,j,k)*exp(LAMBDA(i,j,k)+PHI(i,j,k))/(r(i,j,k)**2)
drXi(i,j,k) = pio * SWTNS_amplitude *(cos(2*pio*r(i,j,k)/TOV_surface)-1)/TOV_surface
H(i,j,k) = drXi(i,j,k)
drH(i,j,k) = -(2*pio**2*SWTNS_amplitude*sin(2*pio*r(i,j,k)/TOV_surface))/(TOV_surface**2)
omegasquare(i,j,k) = 0!(-1)*(A(i,j,k)*drXi(i,j,k)/Xi(i,j,k) + B(i,j,k)*drH(i,j,k)/Xi(i,j,k)+C(i,j,k))
if(omegasquare(i,j,k) <= 0) then
omega(i,j,k) = 0
Pi(i,j,k) = 0
drPi(i,j,k) = 0
Xidot(i,j,k) = 0
Pidot(i,j,k) = 0
Hdot(i,j,k) = 0
else
omega(i,j,k) = sqrt(omegasquare(i,j,k))
Pi(i,j,k) = Xi(i,j,k)*omega(i,j,k)
drPi(i,j,k) = drXi(i,j,k)*omega(i,j,k)
Xidot(i,j,k) = Xi(i,j,k)*omega(i,j,K)
Hdot(i,j,k) = drXi(i,j,k)*omega(i,j,k)
Pidot(i,j,k) = -Xi(i,j,k)*omegasquare(i,j,k)
end if
end if
end do
end do
end do
!$OMP END PARALLEL DO
write(*,*) "Coordinate transformation factors for spatial derivatives have been prepared for Thornburg04 and Thornburg04nc."
write(*,*) "Calculated metric potentials, derivatives and coefficients A,B,C"
write(*,*)"done initial!"
call SWTNS_drparainit(CCTK_ARGUMENTS)
end subroutine SWTNS_init
subroutine SWTNS_drparainit (CCTK_ARGUMENTS)
implicit none
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_FUNCTIONS
DECLARE_CCTK_PARAMETERS
CCTK_INT, parameter :: izero = 0
! CCTK_INT :: i, j, k
integer, parameter :: ik = kind (izero)
integer :: na, nb, nc
CCTK_REAL, dimension(:,:,:), allocatable &
:: param_dx, param_dy, param_dz
na = cctk_lsh(1); nb = cctk_lsh(2); nc = cctk_lsh(3)
allocate( param_dx(na,nb,nc), &
param_dy(na,nb,nc), &
param_dz(na,nb,nc) )
!check derivative algorithem with drPHI
call globalDiff_gv (cctkGH, 0_ik, PHI, param_dx, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
call globalDiff_gv (cctkGH, 1_ik, PHI, param_dy, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
call globalDiff_gv (cctkGH, 2_ik, PHI, param_dz, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
param_dr = dxdr * param_dx + dydr * param_dy + dzdr * param_dz
deriv_error = drPHI - param_dr
deallocate (param_dx, param_dy,param_dz)
!write(*,*) "Calculated drP"
end subroutine SWTNS_drparainit
#include <assert.h>
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
int
SWTNS_startup (void)
{
int ierr;
ierr = CCTK_RegisterBanner ("SWTNS");
assert (! ierr);
return 0;
}
void
SWTNS_register_MoL (CCTK_ARGUMENTS)
{
DECLARE_CCTK_ARGUMENTS;
DECLARE_CCTK_PARAMETERS;
int evolved_group, rhs_group;
int ierr;
evolved_group = CCTK_GroupIndex ("SWTNS::scalar");
assert (evolved_group >= 0);
rhs_group = CCTK_GroupIndex ("SWTNS::scalardot");
assert (rhs_group >= 0);
ierr = MoLRegisterEvolvedGroup (evolved_group, rhs_group);
assert (! ierr);
evolved_group = CCTK_GroupIndex ("SWTNS::velocity");
assert (evolved_group >= 0);
rhs_group = CCTK_GroupIndex ("SWTNS::velocitydot");
assert (rhs_group >= 0);
ierr = MoLRegisterEvolvedGroup (evolved_group, rhs_group);
assert (! ierr);
evolved_group = CCTK_GroupIndex ("SWTNS::density");
assert (evolved_group >= 0);
rhs_group = CCTK_GroupIndex ("SWTNS::densitydot");
assert (rhs_group >= 0);
ierr = MoLRegisterEvolvedGroup (evolved_group, rhs_group);
assert (! ierr);
}
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
#include "cctk_Functions.h"
subroutine SWTNS_calc_rhs (CCTK_ARGUMENTS)
implicit none
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_FUNCTIONS
DECLARE_CCTK_PARAMETERS
CCTK_INT, parameter :: izero = 0
CCTK_INT :: i, j, k, spec_i, spec_j, spec_k
CCTK_REAL :: pio
integer, parameter :: ik = kind (izero)
integer :: na, nb, nc
CCTK_REAL, dimension(:,:,:), allocatable &
:: TOVold, dxXi, dyXi, dzXi, &
dxPi, dyPi, dzPi, dxH, dyH, dzH
na = cctk_lsh(1); nb = cctk_lsh(2); nc = cctk_lsh(3)
! write(*,*)"allocate RHS..."
pio=acos(-1.0d0)
!write(*,*) "Surface = " , TOV_surface
allocate( dxXi(na, nb, nc), &
dyXi(na, nb, nc), &
dzXi(na, nb, nc), &
dxPi(na, nb, nc), &
dyPi(na, nb, nc), &
dzPi(na, nb, nc), &
dxH(na, nb, nc), &
dyH(na, nb, nc), &
dzH(na, nb, nc) )
!call SWTNS_derivatives (CCTK_ARGUMENTS)
!!! Wave Eq.
! Xidot = Pi
! Hdot = drPi
! Pidot = A*H + B*drH + C*Xi
!write(*,*) "Define Xeta"
!Boundary Xi(r=0) = 0
do k = 1, cctk_lsh(3)
do j = 1, cctk_lsh(2)
do i = 1, cctk_lsh(1)
if (grid_r(i,j,k) == 0 ) then
Xi(i,j,k) = 0
Xeta(i,j,k) = 0
else
Xeta(i,j,k) = Xi(i,j,k)*exp(PHI(i,j,k))/(r(i,j,k)**2)
end if
end do
end do
end do
!updating TOV surface in PostStep
!Updating TOV_surface
surfaceloop: do k=1,cctk_lsh(3)
do j=1,cctk_lsh(2)
do i=1,cctk_lsh(1)
if(patchnumber(i,j,k) == 1) then
if (grid_r(i,j,k) >= (TOV_surface - rprec) .AND. grid_r(i,j,k) <= (TOV_surface) .AND. Xi(i,j,k) /= 0) then
TOV_surface = TOV_R + Xeta(i,j,k) !or Xi
exit surfaceloop
end if
else
exit surfaceloop
end if
end do
end do
end do surfaceloop
!Ableitung drXi
! call globalDiff_gv (cctkGH, 0_ik, Xi, dxXi, J11, J21, J31, &
! J12, J22, J32, J13, J23, J33,-1_ik)
! call globalDiff_gv (cctkGH, 1_ik, Xi, dyXi, J11, J21, J31, &
! J12, J22, J32, J13, J23, J33, -1_ik)
! call globalDiff_gv (cctkGH, 2_ik, Xi, dzXi, J11, J21, J31, &
! J12, J22, J32, J13, J23, J33, -1_ik)
! drXi = dxXi*dxdr + dyXi*dydr + dzXi*dzdr
!Ableitung drPi
call globalDiff_gv (cctkGH, 0_ik, Pi, dxPi, J11, J21, J31, &
J12, J22, J32, J13, J23, J33,-1_ik)
call globalDiff_gv (cctkGH, 1_ik, Pi, dyPi, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
call globalDiff_gv (cctkGH, 2_ik, Pi, dzPi, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
drPi = dxPi*dxdr + dyPi*dydr + dzPi*dzdr
!Ableitung drH
call globalDiff_gv (cctkGH, 0_ik, H, dxH, J11, J21, J31, &
J12, J22, J32, J13, J23, J33,-1_ik)
call globalDiff_gv (cctkGH, 1_ik, H, dyH, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
call globalDiff_gv (cctkGH, 2_ik, H, dzH, J11, J21, J31, &
J12, J22, J32, J13, J23, J33, -1_ik)
drH = dxH*dxdr + dyH*dydr + dzH*dzdr
!!! Wave Eq.
Pidot = A*H + B*drH + C*Xi
Hdot = drPi
Xidot = Pi
deallocate ( dxXi, dyXi, dzXi, dxPi, dyPi, dzPi, dxH, dyH, dzH)
end subroutine SWTNS_calc_rhs
_______________________________________________
Users mailing list
[email protected]
http://lists.einsteintoolkit.org/mailman/listinfo/users