diff options
-rw-r--r-- | par/bl-different-mask-min-radius-points=5.par | 113 | ||||
-rw-r--r-- | param.ccl | 22 | ||||
-rw-r--r-- | src/driver/mask.cc | 55 |
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 @@ -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 |