|
| 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