diff options
-rw-r--r-- | param.ccl | 40 | ||||
-rw-r--r-- | schedule.ccl | 12 | ||||
-rw-r--r-- | src/driver/driver.hh | 4 | ||||
-rw-r--r-- | src/driver/setup.cc | 121 |
4 files changed, 122 insertions, 55 deletions
@@ -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 + } + } +} + } + +//****************************************************************************** //****************************************************************************** //****************************************************************************** |