1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
// BH_diagnostics.hh -- header file for BH diagnostics
// $Header$
//
// prerequisites:
// <stdio.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.
//
struct BH_diagnostics
{
public:
fp centroid_x, centroid_y, centroid_z;
fp min_radius, max_radius, mean_radius;
// xyz bounding box
fp min_x, max_x, min_y, max_y, min_z, max_z;
fp circumference_xy, circumference_xz, circumference_yz;
fp area;
fp m_irreducible;
public:
// position of diagnostics in buffer and number of diagnostics
enum {
posn__centroid_x = 0, posn__centroid_y, posn__centroid_z,
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__m_irreducible,
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
|