aboutsummaryrefslogtreecommitdiff
path: root/src/driver/find_horizons.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/driver/find_horizons.cc')
-rw-r--r--src/driver/find_horizons.cc84
1 files changed, 54 insertions, 30 deletions
diff --git a/src/driver/find_horizons.cc b/src/driver/find_horizons.cc
index 3f3279e..0739a3c 100644
--- a/src/driver/find_horizons.cc
+++ b/src/driver/find_horizons.cc
@@ -4,6 +4,9 @@
// <<<access to persistent data>>>
// <<<prototypes for functions local to this file>>>
// AHFinderDirect_find_horizons - top-level driver to find apparent horizons
+// find_horizon - find a horizon
+// BH_diagnostics - compute BH diagnostics for a horizon
+// surface_integral - compute surface integral of a gridfn over the horizon
//
#include <stdio.h>
@@ -24,14 +27,14 @@
#include "../jtutil/linear_map.hh"
using jtutil::error_exit;
-#include "../util/coords.hh"
-#include "../util/grid.hh"
-#include "../util/fd_grid.hh"
-#include "../util/patch.hh"
-#include "../util/patch_edge.hh"
-#include "../util/patch_interp.hh"
-#include "../util/ghost_zone.hh"
-#include "../util/patch_system.hh"
+#include "../patch/coords.hh"
+#include "../patch/grid.hh"
+#include "../patch/fd_grid.hh"
+#include "../patch/patch.hh"
+#include "../patch/patch_edge.hh"
+#include "../patch/patch_interp.hh"
+#include "../patch/ghost_zone.hh"
+#include "../patch/patch_system.hh"
#include "../elliptic/Jacobian.hh"
@@ -64,6 +67,8 @@ bool find_horizon(enum method method,
void BH_diagnostics(enum patch::integration_method surface_integral_method,
const struct verbose_info& verbose_info,
struct AH_info& AH_info);
+fp surface_integral(const patch_system& ps, int src_gfn,
+ enum patch::integration_method method);
};
//******************************************************************************
@@ -105,7 +110,7 @@ if (state.timer_handle >= 0)
if (verbose_info.print_physics_details)
then CCTK_VInfo(CCTK_THORNSTRING,
- "AH found: A=%g m=%g at (%g,%g,%g)",
+ "AH found: A=%.10g m=%.10g at (%g,%g,%g)",
double(AH_info.area), double(AH_info.mass),
double(AH_info.centroid_x),
double(AH_info.centroid_y),
@@ -172,9 +177,10 @@ case method__horizon_function:
then CCTK_VInfo(CCTK_THORNSTRING,
" H(h) rms-norm %.2e, infinity-norm %.2e",
H_norms.rms_norm(), H_norms.infinity_norm());
- output_gridfn(ps, gfns::gfn__H,
- IO_info, IO_info.H_base_file_name,
- hn, true);
+ if (IO_info.output_H)
+ then output_gridfn(ps, gfns::gfn__H,
+ IO_info, IO_info.H_base_file_name,
+ hn, true);
return true; // *** NORMAL RETURN ***
}
@@ -249,12 +255,14 @@ case method__Newton_solve:
if (! status)
then return false; // *** ERROR RETURN ***
- output_gridfn(ps, gfns::gfn__h,
- IO_info, IO_info.h_base_file_name,
- hn, verbose_info.print_algorithm_details);
- output_gridfn(ps, gfns::gfn__H,
- IO_info, IO_info.H_base_file_name,
- hn, verbose_info.print_algorithm_details);
+ if (IO_info.output_h)
+ then output_gridfn(ps, gfns::gfn__h,
+ IO_info, IO_info.h_base_file_name,
+ hn, verbose_info.print_algorithm_details);
+ if (IO_info.output_H)
+ then output_gridfn(ps, gfns::gfn__H,
+ IO_info, IO_info.H_base_file_name,
+ hn, verbose_info.print_algorithm_details);
return true; // *** NORMAL RETURN ***
}
@@ -292,18 +300,14 @@ const patch_system& ps = * AH_info.ps_ptr;
//
// compute raw surface integrals
//
-fp integral_one = ps.integrate_gridfn(gfns::gfn__one,
- true, // area weighting
- surface_integral_method);
-fp integral_x = ps.integrate_gridfn(gfns::gfn__global_x,
- true, // area weighting
- surface_integral_method);
-fp integral_y = ps.integrate_gridfn(gfns::gfn__global_y,
- true, // area weighting
- surface_integral_method);
-fp integral_z = ps.integrate_gridfn(gfns::gfn__global_z,
- true, // area weighting
- surface_integral_method);
+fp integral_one = surface_integral(ps, gfns::gfn__one,
+ surface_integral_method);
+fp integral_x = surface_integral(ps, gfns::gfn__global_x,
+ surface_integral_method);
+fp integral_y = surface_integral(ps, gfns::gfn__global_y,
+ surface_integral_method);
+fp integral_z = surface_integral(ps, gfns::gfn__global_z,
+ surface_integral_method);
//
// adjust integrals to take into account patch system not covering full sphere
@@ -353,3 +357,23 @@ AH_info.centroid_y = integral_y / integral_one;
AH_info.centroid_z = integral_z / integral_one;
}
}
+
+//******************************************************************************
+
+//
+// This function computes the surface integral of a gridfn over the
+// horizon.
+//
+namespace {
+fp surface_integral(const patch_system& ps, int src_gfn,
+ enum patch::integration_method method)
+{
+return ps.integrate_gridfn
+ (src_gfn,
+ gfns::gfn__h,
+ gfns::gfn__g_dd_11, gfns::gfn__g_dd_12, gfns::gfn__g_dd_13,
+ gfns::gfn__g_dd_22, gfns::gfn__g_dd_23,
+ gfns::gfn__g_dd_33,
+ method);
+}
+ }