aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--param.ccl40
-rw-r--r--schedule.ccl12
-rw-r--r--src/driver/driver.hh4
-rw-r--r--src/driver/setup.cc121
4 files changed, 122 insertions, 55 deletions
diff --git a/param.ccl b/param.ccl
index 83d726a..e02767b 100644
--- a/param.ccl
+++ b/param.ccl
@@ -542,19 +542,23 @@ Boolean set_mask_for_individual_horizon[101] \
# the geometric mean of the base grid's x, y, and z Cactus grid spacings)
# (The "base grid" part here only matters if you're doing mesh refinement.)
#
-real mask_radius_multiplier \
- "radius multiplier to define the 'inside' mask region"
+real mask_radius_multiplier \
+ "radius multiplier to define the 'inside' mask region" \
+ STEERABLE=ALWAYS
{
-(0:*) :: \
+(0:*) :: \
"any positive real number; typically this will be slightly less than 1.0"
} 0.8
-real mask_radius_offset \
- "radius offset (in Cactus grid spacings) to define the 'inside' mask region"
+real mask_radius_offset \
+ "radius offset (in Cactus grid spacings) \
+ to define the 'inside' mask region" \
+ STEERABLE=ALWAYS
{
*:* :: "any real number; typically this will be negative"
} -5.0
-real mask_buffer_thickness \
- "thickness (in Cactus grid spacings) of the 'buffer' mask region"
+real mask_buffer_thickness \
+ "thickness (in Cactus grid spacings) of the 'buffer' mask region" \
+ STEERABLE=ALWAYS
{
*:* :: "any real number; typically this will be positive"
} 5.0
@@ -568,8 +572,9 @@ real mask_buffer_thickness \
# values independently at each time step, so all three regions can grow
# or shrink depending on the horizon positions/shapes.
#
-Boolean mask_is_noshrink \
- "should we prevent the inside & buffer regions from ever shrinking?"
+Boolean mask_is_noshrink \
+ "should we prevent the inside & buffer regions from ever shrinking?" \
+ STEERABLE=ALWAYS
{
} "true"
@@ -595,8 +600,9 @@ Boolean mask_is_noshrink \
# 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 r_inner >= this number of local grid spacings"
+real min_horizon_radius_points_for_mask \
+ "only set mask if min r_inner >= this number of local grid spacings" \
+ STEERABLE=ALWAYS
{
*:* :: "any real number"
} -1.0e10
@@ -617,12 +623,16 @@ real min_horizon_radius_points_for_mask \
# does horizon finding.]
# You can choose to set either (or even both!) of these.
#
-Boolean set_old_style_mask \
- "if we're setting a mask, should we set an old-style (CCTK_REAL) mask gridfn?"
+Boolean set_old_style_mask \
+ "if we're setting a mask, \
+ should we set an old-style (CCTK_REAL) mask gridfn?" \
+ STEERABLE = ALWAYS
{
} "true"
-Boolean set_new_style_mask \
- "if we're setting a mask, should we set an new-style (CCTK_INT) mask gridfn?"
+Boolean set_new_style_mask \
+ "if we're setting a mask, \
+ should we set an new-style (CCTK_INT) mask gridfn?" \
+ STEERABLE = ALWAYS
{
} "false"
diff --git a/schedule.ccl b/schedule.ccl
index 2365116..3cd6cb0 100644
--- a/schedule.ccl
+++ b/schedule.ccl
@@ -16,6 +16,12 @@ after SpatialCoordinates
#
if (run_at_CCTK_ANALYSIS != 0)
{
+ schedule AHFinderDirect_update at CCTK_ANALYSIS \
+ before AHFinderDirect_find_horizons
+ {
+ lang: C
+ options: global
+ } "update internal data structures from steerable parameters"
schedule AHFinderDirect_find_horizons at CCTK_ANALYSIS
{
lang: C
@@ -24,6 +30,12 @@ if (run_at_CCTK_ANALYSIS != 0)
}
if (run_at_CCTK_POSTSTEP != 0)
{
+ schedule AHFinderDirect_update at CCTK_POSTSTEP \
+ before AHFinderDirect_find_horizons
+ {
+ lang: C
+ options: global
+ } "update internal data structures from steerable parameters"
schedule AHFinderDirect_find_horizons at CCTK_POSTSTEP
{
lang: C
diff --git a/src/driver/driver.hh b/src/driver/driver.hh
index 1b19a7a..326cbc7 100644
--- a/src/driver/driver.hh
+++ b/src/driver/driver.hh
@@ -397,6 +397,10 @@ struct state
extern "C"
void AHFinderDirect_setup(CCTK_ARGUMENTS);
+// ... called from Cactus Scheduler
+extern "C"
+ void AHFinderDirect_setupupdate(CCTK_ARGUMENTS);
+
// find_horizons.cc
// ... called from Cactus Scheduler
extern "C"
diff --git a/src/driver/setup.cc b/src/driver/setup.cc
index e2507a0..51c5562 100644
--- a/src/driver/setup.cc
+++ b/src/driver/setup.cc
@@ -5,6 +5,9 @@
// <<<access to persistent data>>>
//
// AHFinderDirect_setup - top-level driver to setup persistent data structures
+// AHFinderDirect_update - top-level driver to update from steerable parameters
+//
+/// set_mask_pars - set internal data structures from mask parameters
///
/// decode_method - decode the method parameter
/// decode_verbose_level - decode the verbose_level parameter
@@ -64,6 +67,8 @@ using jtutil::error_exit;
//
namespace {
+void set_mask_pars(CCTK_ARGUMENTS);
+
enum method
decode_method(const char method_string[]);
enum verbose_level
@@ -97,9 +102,6 @@ extern struct state state;
// This function is called by the Cactus scheduler to set up all our
// persistent data structures. (These are stored in struct state .)
//
-// This function is the only one in this thorn which looks directly at
-// the Cactus parameters.
-//
extern "C"
void AHFinderDirect_setup(CCTK_ARGUMENTS)
{
@@ -322,45 +324,12 @@ mask_info.set_mask_for_this_horizon = new bool[N_horizons+1];
}
}
if (mask_info.set_mask_for_any_horizon)
- then {
- mask_info.radius_multiplier = mask_radius_multiplier;
- mask_info.radius_offset = mask_radius_offset;
- mask_info.buffer_thickness = mask_buffer_thickness;
- mask_info.mask_is_noshrink = mask_is_noshrink;
- mask_info.min_horizon_radius_points_for_mask
- = min_horizon_radius_points_for_mask;
- mask_info.set_old_style_mask = (set_old_style_mask != 0);
- mask_info.set_new_style_mask = (set_new_style_mask != 0);
- if (mask_info.set_old_style_mask)
- then {
- struct mask_info::old_style_mask_info& osmi
- = mask_info.old_style_mask_info;
- osmi.gridfn_name = old_style_mask_gridfn_name;
- osmi.gridfn_varindex = Cactus_gridfn_varindex(osmi.gridfn_name);
- osmi.gridfn_dataptr = NULL; // dummy value; fixup later
- osmi.inside_value = old_style_mask_inside_value;
- osmi.buffer_value = old_style_mask_buffer_value;
- osmi.outside_value = old_style_mask_outside_value;
- }
- if (mask_info.set_new_style_mask)
- then {
- struct mask_info::new_style_mask_info& nsmi
- = mask_info.new_style_mask_info;
- nsmi.gridfn_name = new_style_mask_gridfn_name;
- nsmi.gridfn_varindex = Cactus_gridfn_varindex(nsmi.gridfn_name);
- nsmi.gridfn_dataptr = NULL; // dummy value; fixup later
- nsmi.bitfield_name = new_style_mask_bitfield_name;
- nsmi.bitfield_bitmask = 0; // dummy value; fixup later
- nsmi.inside_value = new_style_mask_inside_value;
- nsmi.buffer_value = new_style_mask_buffer_value;
- nsmi.outside_value = new_style_mask_outside_value;
- nsmi.inside_bitvalue = 0; // dummy value; fixup later
- nsmi.buffer_bitvalue = 0; // dummy value; fixup later
- nsmi.outside_bitvalue = 0; // dummy value; fixup later
- }
- }
+ then set_mask_pars(CCTK_PASS_CTOC);
+//
+// announce parameters
+//
state.announce_centroid_flag = (which_horizon_to_announce_centroid != 0);
if (state.announce_centroid_flag)
then {
@@ -601,6 +570,78 @@ if (strlen(surface_interpolator_name) > 0)
}
//******************************************************************************
+
+//
+// This function is called by the Cactus scheduler to update some of our
+// persistent data structures (stored in struct state ) from parameters
+// which may have been steered. It is also called by AHFinderDirect_setup()
+// (above) as part of the initial setup of these data structures.
+//
+extern "C"
+ void AHFinderDirect_update(CCTK_ARGUMENTS)
+{
+set_mask_pars(CCTK_PASS_CTOC);
+}
+
+//******************************************************************************
+//******************************************************************************
+//******************************************************************************
+
+//
+// This function sets our internal data structures from the the mask
+// parameters.
+//
+namespace {
+void set_mask_pars(CCTK_ARGUMENTS)
+{
+DECLARE_CCTK_ARGUMENTS
+DECLARE_CCTK_PARAMETERS
+
+struct mask_info& mask_info = state.mask_info;
+mask_info.set_old_style_mask = (set_old_style_mask != 0);
+mask_info.set_new_style_mask = (set_new_style_mask != 0);
+if (mask_info.set_mask_for_any_horizon)
+ then {
+ mask_info.radius_multiplier = mask_radius_multiplier;
+ mask_info.radius_offset = mask_radius_offset;
+ mask_info.buffer_thickness = mask_buffer_thickness;
+ mask_info.mask_is_noshrink = mask_is_noshrink;
+ mask_info.min_horizon_radius_points_for_mask
+ = min_horizon_radius_points_for_mask;
+ mask_info.set_old_style_mask = (set_old_style_mask != 0);
+ mask_info.set_new_style_mask = (set_new_style_mask != 0);
+ if (mask_info.set_old_style_mask)
+ then {
+ struct mask_info::old_style_mask_info& osmi
+ = mask_info.old_style_mask_info;
+ osmi.gridfn_name = old_style_mask_gridfn_name;
+ osmi.gridfn_varindex = Cactus_gridfn_varindex(osmi.gridfn_name);
+ osmi.gridfn_dataptr = NULL; // dummy value; fixup later
+ osmi.inside_value = old_style_mask_inside_value;
+ osmi.buffer_value = old_style_mask_buffer_value;
+ osmi.outside_value = old_style_mask_outside_value;
+ }
+ if (mask_info.set_new_style_mask)
+ then {
+ struct mask_info::new_style_mask_info& nsmi
+ = mask_info.new_style_mask_info;
+ nsmi.gridfn_name = new_style_mask_gridfn_name;
+ nsmi.gridfn_varindex = Cactus_gridfn_varindex(nsmi.gridfn_name);
+ nsmi.gridfn_dataptr = NULL; // dummy value; fixup later
+ nsmi.bitfield_name = new_style_mask_bitfield_name;
+ nsmi.bitfield_bitmask = 0; // dummy value; fixup later
+ nsmi.inside_value = new_style_mask_inside_value;
+ nsmi.buffer_value = new_style_mask_buffer_value;
+ nsmi.outside_value = new_style_mask_outside_value;
+ nsmi.inside_bitvalue = 0; // dummy value; fixup later
+ nsmi.buffer_bitvalue = 0; // dummy value; fixup later
+ nsmi.outside_bitvalue = 0; // dummy value; fixup later
+ }
+ }
+}
+ }
+
+//******************************************************************************
//******************************************************************************
//******************************************************************************