// BH_diagnostics.hh -- header file for BH diagnostics // $Header$ // // prerequisites: // // "cctk.h" // // everything in this file is inside this namespace namespace AHFinderDirect { //****************************************************************************** // // This struct holds info for computing black hole diagnostics. // struct BH_diagnostics_info { enum patch::integration_method integral_method; }; //****************************************************************************** // // A struct BH_diagnostics holds all of our black hole diagnostics // for a single apparent horizon. These diagnostics are only meaningful // if the apparent horizon has indeed been found. // // Note that all the diagnostics are for the full apparent horizon, even // if we don't actually store all of it due to patch-system symmetries. // // All the "mean" quantities are computed via surface integrals using the // induced metric on the surface. // struct BH_diagnostics { public: // mean x,y,z fp centroid_x, centroid_y, centroid_z; // these are quadrupole moments about the centroid, i.e. // mean(xi*xj) - centroid_i*centroid_j fp quadrupole_xx, quadrupole_xy, quadrupole_xz, quadrupole_yy, quadrupole_yz, quadrupole_zz; // min,max,mean surface radius about local coordinate origin fp min_radius, max_radius, mean_radius; // xyz bounding box fp min_x, max_x, min_y, max_y, min_z, max_z; // proper circumference // (computed using induced metric along these local-coordinate planes) fp circumference_xy, circumference_xz, circumference_yz; // surface area (computed using induced metric) // and quantities derived from it fp area, irreducible_mass, areal_radius; public: // position of diagnostics in buffer and number of diagnostics enum { posn__centroid_x = 0, posn__centroid_y, posn__centroid_z, posn__quadrupole_xx, posn__quadrupole_xy, posn__quadrupole_xz, posn__quadrupole_yy, posn__quadrupole_yz, posn__quadrupole_zz, posn__min_radius, posn__max_radius, posn__mean_radius, posn__min_x, posn__max_x, posn__min_y, posn__max_y, posn__min_z, posn__max_z, posn__circumference_xy, posn__circumference_xz, posn__circumference_yz, posn__area, posn__irreducible_mass, posn__areal_radius, N_buffer // no comma // size of buffer }; // copy diagnostics to/from buffer void copy_to_buffer ( CCTK_REAL buffer[N_buffer]) const; void copy_from_buffer(const CCTK_REAL buffer[N_buffer]); public: // compute diagnostics (assuming that apparent horizon has been found) void compute(const patch_system& ps, const struct BH_diagnostics_info& BH_diagnostics_info); // print (CCTK_VInfo()) a line or two summarizing diagnostics void print(int N_horizons, int hn) const; // create/open output file and write header describing output() fields // ... stream is flushed after output to help with // looking at diagnostics while Cactus is still running FILE* setup_output_file(const struct IO_info& IO_info, int N_horizons, int hn) const; // output a (long) line of all the diagnostics, to a stdio stream // ... stream is flushed after output to help with // looking at diagnostics while Cactus is still running void output(FILE* fileptr, const struct IO_info& IO_info) const; // constructor initializes all diagnostics to 0.0 BH_diagnostics(); // no destructor needed, compiler-generated no-op is fine private: // helper function: compute surface integral of specified gridfn static fp surface_integral(const patch_system& ps, int src_gfn, bool src_gfn_is_even_across_xy_plane, bool src_gfn_is_even_across_xz_plane, bool src_gfn_is_even_across_yz_plane, enum patch::integration_method method); private: // we forbid copying and passing by value // by declaring the copy constructor and assignment operator // private, but never defining them BH_diagnostics(const BH_diagnostics& rhs); BH_diagnostics& operator=(const BH_diagnostics& rhs); }; //****************************************************************************** } // namespace AHFinderDirect