aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--par/bl-different-mask-min-radius-points=5.par113
-rw-r--r--param.ccl22
-rw-r--r--src/driver/mask.cc55
3 files changed, 176 insertions, 14 deletions
diff --git a/par/bl-different-mask-min-radius-points=5.par b/par/bl-different-mask-min-radius-points=5.par
new file mode 100644
index 0000000..581efab
--- /dev/null
+++ b/par/bl-different-mask-min-radius-points=5.par
@@ -0,0 +1,113 @@
+# This parameter file sets up Brill-Lindquist initial data and finds the
+# apparent horizons in it with AHFinderDirect.
+
+########################################
+
+#
+# ***** grid *****
+#
+
+ActiveThorns = "CoordBase CartGrid3D PUGH"
+
+Driver::global_nx = 52
+Driver::global_ny = 52
+Driver::global_nz = 102
+PUGH::ghost_size = 2
+
+Grid::domain = "full"
+Grid::type = "byspacing"
+Grid::dxyz = 0.04
+Grid::avoid_origin = "true"
+
+########################################
+
+#
+# physics
+#
+
+ActiveThorns = "ADMBase ADMCoupling CoordGauge StaticConformal SpaceMask"
+ActiveThorns = "IDAnalyticBH"
+
+ADMBase::initial_data = "bl_bh"
+IDAnalyticBH::bl_nbh = 2
+
+IDAnalyticBH::bl_m_1 = 1.0
+IDAnalyticBH::bl_x0_1 = 0.0
+IDAnalyticBH::bl_y0_1 = 0.0
+IDAnalyticBH::bl_z0_1 = 1.0
+
+IDAnalyticBH::bl_m_2 = 0.5
+IDAnalyticBH::bl_x0_2 = 0.0
+IDAnalyticBH::bl_y0_2 = 0.0
+IDAnalyticBH::bl_z0_2 = -1.0
+
+SpaceMask::use_mask = "true"
+
+########################################
+
+#
+# numerical methods
+#
+
+Cactus::cctk_itlast = 0
+ADMBase::metric_type = "static conformal"
+StaticConformal::conformal_storage = "factor+derivs+2nd derivs"
+ADMBase::evolution_method = "none"
+ADMBase::initial_lapse = "Cadez"
+ADMBase::lapse_evolution_method = "static"
+ADMBase::initial_shift = "zero"
+ADMBase::shift_evolution_method = "static"
+
+########################################
+
+ActiveThorns = "PUGHSlab IOBasic IOUtil IOASCII"
+IO::parfile_write = "no"
+IO::out_dir = "bl-different-mask-min-radius-points=5"
+IOASCII::out2D_every = 1
+IOASCII::out2D_style = "gnuplot f(x,y)"
+IOASCII::out2D_vars = "SpaceMask::emask"
+
+########################################
+
+#
+# AHFinderDirect
+#
+
+ActiveThorns = "always AEILocalInterp PUGHInterp PUGHReduce AHFinderDirect"
+
+AHFinderDirect::print_timing_stats = "true"
+AHFinderDirect::verbose_level = "algorithm details"
+
+AHFinderDirect::h_base_file_name = "bl-different-mask-min-radius-points=5.h"
+AHFinderDirect::BH_diagnostics_base_file_name = "bl-different-mask-min-radius-points=5.BH_diagnostics"
+
+AHFinderDirect::set_mask = "true"
+AHFinderDirect::set_old_style_mask = "true"
+# inside = horizon - 5 grid points
+# buffer = from there out to horizon
+AHFinderDirect::mask_radius_multiplier = 1.0
+AHFInderDirect::mask_radius_offset = -5.0
+AHFInderDirect::mask_buffer_thickness = 5.0
+AHFinderDirect::mask_is_noshrink = "true"
+
+AHFinderDirect::min_horizon_radius_points_for_mask = 5.0 # grid points
+
+AHFinderDirect::N_horizons = 2
+
+AHFinderDirect::origin_x[1] = 0.0
+AHFinderDirect::origin_y[1] = 0.0
+AHFinderDirect::origin_z[1] = +1.0
+AHFinderDirect::initial_guess_method[1] = "coordinate sphere"
+AHFinderDirect::initial_guess__coord_sphere__x_center[1] = 0.0
+AHFinderDirect::initial_guess__coord_sphere__y_center[1] = 0.0
+AHFinderDirect::initial_guess__coord_sphere__z_center[1] = +1.0
+AHFinderDirect::initial_guess__coord_sphere__radius[1] = 0.5
+
+AHFinderDirect::origin_x[2] = 0.0
+AHFinderDirect::origin_y[2] = 0.0
+AHFinderDirect::origin_z[2] = -1.0
+AHFinderDirect::initial_guess_method[2] = "coordinate sphere"
+AHFinderDirect::initial_guess__coord_sphere__x_center[2] = 0.0
+AHFinderDirect::initial_guess__coord_sphere__y_center[2] = 0.0
+AHFinderDirect::initial_guess__coord_sphere__z_center[2] = -1.0
+AHFinderDirect::initial_guess__coord_sphere__radius[2] = 0.25
diff --git a/param.ccl b/param.ccl
index ffb3d3f..aa31186 100644
--- a/param.ccl
+++ b/param.ccl
@@ -536,16 +536,24 @@ boolean mask_is_noshrink \
#
# So... This parameter may be used to specify that the mask not be set
# for a given horizon (just as if that horizon wasn't found) on any grid
-# where the ratio
-# BH_diagnostics.min_radius / max(Delta_x,Delta_y,Delta_z)
-# (where Delta_[xyz] are the *LOCAL* grid spacings on the current grid)
-# is too small (in particular, < this parameter).
+# where the inner mask radius r_inner is < this many grid spacings.
+# More precisely, we skip masking for any horizon where
+# r_inner,min < min_horizon_radius_points_for_mask * Delta_x_current,max
+# where
+# r_inner,min = the minimum over all angles of the inner mask radius
+# r_inner
+# Delta_x_current,max = the maximum of the x,y,and z grid spacings
+# in the *current* Cactus grid
+#
+# Note that since r_inner can be negative (if mask_radius_offset < 0 ),
+# the default setting for this parameter is effectively -infinity, to
+# excise any horizon.
#
real min_horizon_radius_points_for_mask \
- "only set mask if min horizon radius >= this number of local grid spacings"
+ "only set mask if min r_inner >= this number of local grid spacings"
{
-0.0:* :: "any real number >= 0.0"
-} 0.0
+*:* :: "any real number"
+} -1.0e10
#
# This thorn supports two types of mask grid functions:
diff --git a/src/driver/mask.cc b/src/driver/mask.cc
index 03f55aa..bacddfc 100644
--- a/src/driver/mask.cc
+++ b/src/driver/mask.cc
@@ -10,6 +10,8 @@
/// set_mask_gridfn - set mask gridfn(s) based on each horizon's shape
/// set_mask_gridfn_to_outside_value - ... "outside" value
/// set_mask_gridfn_to_inside_and_buffer_values - "inside"/"buffer" values
+/// inner_mask_radius - compute inner mask radius r_inner given r_horizon
+/// outer_mask_radius - compute outer mask radius r_outer given r_inner
//
#include <stdio.h>
@@ -151,6 +153,12 @@ void set_mask_gridfn_to_inside_and_buffer_values
const struct mask_info& mask_info,
const patch_system& ps,
const struct verbose_info& verbose_info);
+fp inner_mask_radius(const struct mask_grid_info& mgi,
+ const struct mask_info& mask_info,
+ fp r_horizon);
+fp outer_mask_radius(const struct mask_grid_info& mgi,
+ const struct mask_info& mask_info,
+ fp r_inner);
}
//******************************************************************************
@@ -414,13 +422,15 @@ set_mask_gridfn_to_outside_value(mgi,
//
// skip this horizon if it's too small
//
- if (BH_diagnostics.min_radius
+ const fp r_inner_min
+ = inner_mask_radius(mgi, mask_info, BH_diagnostics.min_radius);
+ if (r_inner_min
< mask_info.min_horizon_radius_points_for_mask*mgi.max_coord_delta)
then {
if (verbose_info.print_algorithm_details)
then CCTK_VInfo(CCTK_THORNSTRING,
- " min_radius=%g < %g grid points ==> skipping mask for horizon %d",
- BH_diagnostics.min_radius,
+ " r_inner_min=%g < %g grid points ==> skipping mask for horizon %d",
+ r_inner_min,
mask_info.min_horizon_radius_points_for_mask,
hn);
continue; // *** LOOP CONTROL ***
@@ -614,7 +624,6 @@ const bool set_old_style_mask = mask_info.set_old_style_mask;
const bool set_new_style_mask = mask_info.set_new_style_mask;
const struct mask_info::old_style_mask_info& osmi = mask_info.old_style_mask_info;
const struct mask_info::new_style_mask_info& nsmi = mask_info.new_style_mask_info;
-const fp Cactus_dx = mgi.base_grid_mean_coord_delta;
long inside_count = 0;
long buffer_count = 0;
@@ -645,9 +654,8 @@ long buffer_count = 0;
(gfns::gfn__h,
local_x, local_y, local_z);
- const fp r_inner = mask_info.radius_multiplier*r_horizon
- + mask_info.radius_offset*Cactus_dx;
- const fp r_outer = r_inner + mask_info.buffer_thickness*Cactus_dx;
+ const fp r_inner = inner_mask_radius(mgi, mask_info, r_horizon);
+ const fp r_outer = outer_mask_radius(mgi, mask_info, r_inner);
if (r <= r_inner)
then {
@@ -711,4 +719,37 @@ if (verbose_info.print_algorithm_details)
//******************************************************************************
+//
+// This function computes the inner mask radius r_inner for a given
+// horizon radius r_horizon .
+//
+namespace {
+fp inner_mask_radius(const struct mask_grid_info& mgi,
+ const struct mask_info& mask_info,
+ fp r_horizon)
+{
+const fp Cactus_dx = mgi.base_grid_mean_coord_delta;
+return mask_info.radius_multiplier*r_horizon
+ + mask_info.radius_offset*Cactus_dx;
+}
+ }
+
+//******************************************************************************
+
+//
+// This function computes the outer mask radius r_outer for a given
+// inner mask radius r_inner .
+//
+namespace {
+fp outer_mask_radius(const struct mask_grid_info& mgi,
+ const struct mask_info& mask_info,
+ fp r_inner)
+{
+const fp Cactus_dx = mgi.base_grid_mean_coord_delta;
+return r_inner + mask_info.buffer_thickness*Cactus_dx;
+}
+ }
+
+//******************************************************************************
+
} // namespace AHFinderDirect