Skip to content

Commit 531d925

Browse files
committed
KerrSchildX: Add example parameter files for stationary ks evolution
1 parent e958e9c commit 531d925

2 files changed

Lines changed: 474 additions & 0 deletions

File tree

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
# Schwarzschild black hole (M = 1) in Kerr-Schild coordinates, evolved with Z4c
2+
# in the integrated gauge so that the exterior stays manifestly stationary, on
3+
# a box-in-box grid with dx = 1/16 around the horizon, for 50 M.
4+
#
5+
# The Kerr-Schild slicing is horizon penetrating, so the grid contains the
6+
# singularity, which KerrSchildX replaces by a smooth "stuffed" interior. That
7+
# interior is not a solution and collapses; Z4c_Enforce bounds it (see the Z4c
8+
# section). The exact exterior never touches those bounds.
9+
#
10+
# Expected behaviour (one H200, ~2.9 h for 50 M): the exterior is stationary
11+
# to 1e-5 in the lapse for about 30 M, after which a shell of gauge pollution
12+
# of order 1e-3 forms within ~0.5 M outside the horizon and saturates; the
13+
# horizon's irreducible mass stays within 3.4e-5 of 1 for all 50 M (within
14+
# 1e-5 until 40 M); the outer boundary's error reaches r ~ 20 M by t = 50 M.
15+
# Without beta_max, gammat_max and chi_max the interior runs away between
16+
# t = 20 and 30 M and destroys the exterior. Details: Z4c/CODE.md, section P7.
17+
#
18+
# ks-amr64-a08-r32.par is the spinning (a = 0.8) companion.
19+
20+
ActiveThorns = "
21+
ADMBaseX
22+
AEILocalInterp
23+
AHFinderDirect
24+
BoxInBox
25+
CarpetX
26+
CoordinatesX
27+
Formaline
28+
IOUtil
29+
KerrSchildX
30+
ODESolvers
31+
SphericalSurface
32+
SystemTopology
33+
TmunuBaseX
34+
Z4c
35+
"
36+
37+
Cactus::cctk_show_schedule = yes
38+
39+
Cactus::presync_mode = "mixed-error"
40+
41+
Cactus::terminate = "iteration"
42+
Cactus::cctk_itlast = 3200 # dt = dtfac * dx_finest = 1/64, so t = 50 M
43+
44+
CarpetX::verbose = no
45+
CarpetX::poison_undefined_values = yes
46+
47+
# ---------------------------------------------------------------- grid --------
48+
49+
CarpetX::xmin = -64.0
50+
CarpetX::ymin = -64.0
51+
CarpetX::zmin = -64.0
52+
53+
CarpetX::xmax = +64.0
54+
CarpetX::ymax = +64.0
55+
CarpetX::zmax = +64.0
56+
57+
CarpetX::ncells_x = 64
58+
CarpetX::ncells_y = 64
59+
CarpetX::ncells_z = 64
60+
61+
# Coarse dx = 2. BoxInBox nests cubes of half-width 48, 24, 12, 6 and 3 around
62+
# the origin, so the finest level has dx = 1/16 and covers the horizon
63+
# (r_+ = 2) with a margin. The outer boundary at 64 M is far enough that its error (the robin
64+
# condition is only approximately consistent with the 1/r^2 terms of the data)
65+
# does not reach the horizon region before t ~ 50 M.
66+
#
67+
# With one box per level (max_grid_size >= the level's extent) CarpetX runs
68+
# about five times faster than with its default 32^3 boxes, for the same cells.
69+
# The initial hierarchy is built at start-up even with regrid_every = 0.
70+
CarpetX::max_num_levels = 6
71+
CarpetX::regrid_every = 0
72+
CarpetX::regrid_error_threshold = 0.9
73+
CarpetX::prolongation_type = "ddf"
74+
CarpetX::prolongation_order = 5
75+
CarpetX::max_grid_size_x = 128
76+
CarpetX::max_grid_size_y = 128
77+
CarpetX::max_grid_size_z = 128
78+
79+
BoxInBox::num_regions = 1
80+
BoxInBox::shape_1 = "cube"
81+
BoxInBox::num_levels_1 = 6
82+
BoxInBox::radius_1[1] = 48.0
83+
BoxInBox::radius_1[2] = 24.0
84+
BoxInBox::radius_1[3] = 12.0
85+
BoxInBox::radius_1[4] = 6.0
86+
BoxInBox::radius_1[5] = 3.0
87+
88+
CarpetX::ghost_size = 3
89+
90+
# Outer boundary. The default is "none", which never fills the outer boundary
91+
# and never marks it valid, so Z4c_Initial2 (which READS gamma_tilde
92+
# everywhere) aborts with "The outer boundary is invalid because:
93+
# MakeNewLevelFromScratch". The Z4c variables are stored as deviations that
94+
# fall off as 1/r, which is what "robin" assumes.
95+
CarpetX::boundary_x = "robin"
96+
CarpetX::boundary_y = "robin"
97+
CarpetX::boundary_z = "robin"
98+
CarpetX::boundary_upper_x = "robin"
99+
CarpetX::boundary_upper_y = "robin"
100+
CarpetX::boundary_upper_z = "robin"
101+
102+
# Must match AHFinderDirect::geometry_interpolator_pars below; CarpetX asserts
103+
# that the requested order equals this parameter.
104+
CarpetX::interpolation_order = 4
105+
106+
CarpetX::dtfac = 0.25
107+
ODESolvers::method = "RK4"
108+
109+
# ------------------------------------------------------- initial data --------
110+
111+
ADMBaseX::initial_data = "kerrschildx"
112+
ADMBaseX::initial_lapse = "kerrschildx"
113+
ADMBaseX::initial_shift = "kerrschildx"
114+
ADMBaseX::initial_dtlapse = "kerrschildx"
115+
ADMBaseX::initial_dtshift = "kerrschildx"
116+
117+
KerrSchildX::mass = 1.0
118+
KerrSchildX::spin = 0.0 # dimensional, in units of mass: |spin| < mass
119+
120+
# Replace the singularity by a smooth ("stuffed") interior for r < 1, well
121+
# inside r_+ = 2. These are the settings that par/ks-mclachlan.par
122+
# uses for the Carpet-era equivalent of this run. The stuffed region is not a
123+
# solution of the Einstein equations; see the Z4c clamps below.
124+
KerrSchildX::r_regularization = "parabolic"
125+
KerrSchildX::epsilon = 1.0
126+
KerrSchildX::power = 8
127+
128+
# ------------------------------------------------------------- Z4c -----------
129+
130+
Z4c::calc_ADM_vars = yes # required: AHFinderDirect reads ADMBaseX
131+
Z4c::calc_ADMRHS_vars = no
132+
Z4c::calc_constraints = yes
133+
134+
# Integrated gauge: A = d/dt alpha and B^i = d/dt beta^i are evolved and
135+
# initialised from ADMBaseX::dtlapse/dtshift, which vanish for Kerr-Schild data.
136+
# With the drivers at zero (their default) every right-hand side vanishes for
137+
# the exact data, so the exterior stays at rest up to truncation error.
138+
Z4c::evolveA = yes
139+
Z4c::evolveB = yes
140+
141+
# The stuffed interior collapses in finite coordinate time when the lapse does
142+
# not collapse with it (there d/dt K ~ alpha K^2 with K ~ 1/(alpha r_stuff)),
143+
# and once the lapse has reached its floor the shift-driven terms would still
144+
# run the conformal metric away. These bounds keep that region finite. They
145+
# act only where values are extreme, which for these data is inside the
146+
# horizon; the exact exterior never reaches them (there |Khat|, |Atilde|, |A|,
147+
# |B| < 1, |beta| < 1, |gamma_tilde - delta| < 3, 0.5 < chi < 1).
148+
Z4c::clamp_max = 20 # |Khat|, |Atilde_ij|, |Gamma_tilde^i|, |Theta|, |A|, |B^i|
149+
Z4c::alpha_max = 1.0
150+
Z4c::beta_max = 2.0
151+
Z4c::gammat_max = 10.0
152+
Z4c::chi_floor = 0.1
153+
Z4c::chi_max = 1.5
154+
Z4c::alphaG_floor = 1.0e-8
155+
156+
# Kreiss-Oliger dissipation, three times the Z4c default; it smooths the kinks
157+
# the clamps introduce.
158+
Z4c::epsdiss = 1.0
159+
160+
# ------------------------------------------------ apparent horizon -----------
161+
162+
AHFinderDirect::N_horizons = 1
163+
AHFinderDirect::find_every = 64 # every 1 M
164+
AHFinderDirect::move_origins = yes
165+
AHFinderDirect::verbose_level = "physics details"
166+
167+
# Also find the horizon at the initial time. Note that with refinement levels
168+
# this first find happens before the fine levels are filled and is inaccurate;
169+
# the values from t = 1 M on are the ones to trust.
170+
AHFinderDirect::run_at_CCTK_POSTINITIAL = yes
171+
172+
# "CarpetX" is the only geometry interpolator CarpetX accepts; the default
173+
# ("Hermite polynomial interpolation") aborts. The surface and interpatch
174+
# interpolators act on the angular grid and stay with AEILocalInterp.
175+
AHFinderDirect::geometry_interpolator_name = "CarpetX"
176+
AHFinderDirect::geometry_interpolator_pars = "order=4"
177+
AHFinderDirect::surface_interpolator_name = "Lagrange polynomial interpolation"
178+
AHFinderDirect::surface_interpolator_pars = "order=3"
179+
AHFinderDirect::interpatch_interpolator_name = "Lagrange polynomial interpolation"
180+
AHFinderDirect::interpatch_interpolator_pars = "order=3"
181+
182+
# AHFinderDirect knows the analytic Kerr-Schild horizon shape and can start
183+
# from the exact oblate ellipsoid. NOTE the different spin convention: this
184+
# parameter is the DIMENSIONLESS a = J/m^2, i.e. KerrSchildX::spin / mass.
185+
AHFinderDirect::initial_guess_method[1] = "Kerr/Kerr-Schild"
186+
AHFinderDirect::initial_guess__Kerr_KerrSchild__mass[1] = 1.0
187+
AHFinderDirect::initial_guess__Kerr_KerrSchild__spin[1] = 0.0
188+
AHFinderDirect::initial_guess__Kerr_KerrSchild__x_posn[1] = 0.0
189+
AHFinderDirect::initial_guess__Kerr_KerrSchild__y_posn[1] = 0.0
190+
AHFinderDirect::initial_guess__Kerr_KerrSchild__z_posn[1] = 0.0
191+
192+
AHFinderDirect::origin_x[1] = 0.0
193+
AHFinderDirect::origin_y[1] = 0.0
194+
AHFinderDirect::origin_z[1] = 0.0
195+
196+
AHFinderDirect::which_surface_to_store_info[1] = 0
197+
AHFinderDirect::reset_horizon_after_not_finding[1] = no
198+
AHFinderDirect::max_allowable_horizon_radius[1] = 4.0
199+
200+
# The ACCUMULATOR expression for max_N_zones_per_right_angle is commented out
201+
# in param.ccl, so both of these must be set by hand.
202+
AHFinderDirect::N_zones_per_right_angle[1] = 24
203+
AHFinderDirect::max_N_zones_per_right_angle = 24
204+
205+
AHFinderDirect::output_h_every = 1
206+
207+
SphericalSurface::nsurfaces = 1
208+
SphericalSurface::maxntheta = 66
209+
SphericalSurface::maxnphi = 124
210+
211+
SphericalSurface::ntheta [0] = 41
212+
SphericalSurface::nphi [0] = 80
213+
SphericalSurface::nghoststheta[0] = 2
214+
SphericalSurface::nghostsphi [0] = 2
215+
216+
# ----------------------------------------------------------- output ----------
217+
218+
IO::out_dir = $parfile
219+
IO::out_every = 64 # every 1 M
220+
221+
CarpetX::out_metadata = no
222+
223+
# 1D output along the coordinate axes. Comparing the it=N files against the
224+
# it=0 files measures the drift from the stationary solution.
225+
CarpetX::out_tsv_vars = "
226+
ADMBaseX::metric
227+
ADMBaseX::curv
228+
ADMBaseX::lapse
229+
ADMBaseX::shift
230+
ADMBaseX::dtlapse
231+
ADMBaseX::dtshift
232+
Z4c::allC
233+
Z4c::dtalphaG
234+
Z4c::dtbetaG
235+
"

0 commit comments

Comments
 (0)