aboutsummaryrefslogtreecommitdiff
path: root/src/driver/BH_diagnostics.hh
blob: 0d368e808f1668101738ee5a2a43257a0fbc08d7 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// BH_diagnostics.hh -- header file for BH diagnostics
// $Header$

//
// prerequisites:
//	<stdio.h>
//	"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