% *======================================================================*
%  Cactus Thorn template for ThornGuide documentation
%  Author: Ian Kelley
%  Date: Sun Jun 02, 2002
%  $Header$
%
%  Thorn documentation in the latex file doc/documentation.tex
%  will be included in ThornGuides built with the Cactus make system.
%  The scripts employed by the make system automatically include
%  pages about variables, parameters and scheduling parsed from the
%  relevant thorn CCL files.
%
%  This template contains guidelines which help to assure that your
%  documentation will be correctly added to ThornGuides. More
%  information is available in the Cactus UsersGuide.
%
%  Guidelines:
%   - Do not change anything before the line
%       % START CACTUS THORNGUIDE",
%     except for filling in the title, author, date, etc. fields.
%        - Each of these fields should only be on ONE line.
%        - Author names should be separated with a \\ or a comma.
%   - You can define your own macros, but they must appear after
%     the START CACTUS THORNGUIDE line, and must not redefine standard
%     latex commands.
%   - To avoid name clashes with other thorns, 'labels', 'citations',
%     'references', and 'image' names should conform to the following
%     convention:
%       ARRANGEMENT_THORN_LABEL
%     For example, an image wave.eps in the arrangement CactusWave and
%     thorn WaveToyC should be renamed to CactusWave_WaveToyC_wave.eps
%   - Graphics should only be included using the graphicx package.
%     More specifically, with the "\includegraphics" command.  Do
%     not specify any graphic file extensions in your .tex file. This
%     will allow us to create a PDF version of the ThornGuide
%     via pdflatex.
%   - References should be included with the latex "\bibitem" command.
%   - Use \begin{abstract}...\end{abstract} instead of \abstract{...}
%   - Do not use \appendix, instead include any appendices you need as
%     standard sections.
%   - For the benefit of our Perl scripts, and for future extensions,
%     please use simple latex.
%
% *======================================================================*
%
% Example of including a graphic image:
%    \begin{figure}[ht]
% 	\begin{center}
%    	   \includegraphics[width=6cm]{/home/runner/work/tests/tests/arrangements/WVUThorns_Diagnostics/VolumeIntegrals_vacuum/doc/MyArrangement_MyThorn_MyFigure}
% 	\end{center}
% 	\caption{Illustration of this and that}
% 	\label{MyArrangement_MyThorn_MyLabel}
%    \end{figure}
%
% Example of using a label:
%   \label{MyArrangement_MyThorn_MyLabel}
%
% Example of a citation:
%    \cite{MyArrangement_MyThorn_Author99}
%
% Example of including a reference
%   \bibitem{MyArrangement_MyThorn_Author99}
%   {J. Author, {\em The Title of the Book, Journal, or periodical}, 1 (1999),
%   1--16. {\tt http://www.nowhere.com/}}
%
% *======================================================================*

% If you are using CVS use this line to give version information
% $Header$

\documentclass{article}

% Use the Cactus ThornGuide style file
% (Automatically used from Cactus distribution, if you have a
%  thorn without the Cactus Flesh download this from the Cactus
%  homepage at www.cactuscode.org)
\usepackage{../../../../../doc/latex/cactus}
%% \usepackage{cactus}

\newlength{\tableWidth} \newlength{\maxVarWidth} \newlength{\paraWidth} \newlength{\descWidth} \begin{document}

% The author of the documentation
\author{Zachariah B.~Etienne \textless zachetie *at* gmail *dot* com \textgreater\\
  Leonardo R.~Werneck \textless wernecklr *at* gmail *dot* com \textgreater\\
  Ian Ruchlin \textless ianruchlin *at* gmail *dot* com \textgreater
}

% The title of the document (not necessarily the name of the Thorn)
\title{\texttt{VolumeIntegrals\_vacuum}: An Einstein Toolkit thorn for volume integrations in vacuum spacetimes}

% the date your document was last changed, if your document is in CVS,
% please use:
\date{July 27, 2023}

\maketitle

% Do not delete next line
% START CACTUS THORNGUIDE

% Add all definitions used in this documentation here
%   \def\mydef etc

\linespread{1.0}

% Add an abstract for this thorn's documentation
\begin{abstract}
  \texttt{VolumeIntegrals\_vacuum} is a thorn for integration of
  spacetime quantities, accepting integration volumes consisting of
  spherical shells, regions with hollowed balls, and simple spheres.
\end{abstract}

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Volume Integrals %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Volume integrals}
\label{sec:volume_integrals}

We now briefly describe the volume integrals that can be performed
using the \texttt{VolumeIntegrals\_vacuum} thorn.

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% L^2-norm %%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{$L^{2}$-norm}
\label{sec:L2_norm_integral}

For a given field $f$, the $L^{2}$-norm of the field, $\left\lVert f \right\rVert_{2}$,
is computed using the volume integral
%%
\begin{equation}
\boxed{\left\lVert \right\rVert_{2} = \int f^{2}dV}\; ,
\end{equation}
%%
where $dV$ is the volume element.

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Center of lapse %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Center of the lapse}
\label{sec:center_of_lapse}

The \emph{center of the lapse}, $C_{\alpha}$, volume integral yields
results which are pretty consistent with the center of mass volume
integral. We compute it using
%%
\begin{equation}
\boxed{ C_{\alpha}^{i} = \int \left[\left(1-\alpha\right)^{80}x^{i}\right]dV }\; ,
\end{equation}
%%
where $\alpha$ is the lapse function, $x^{i}$ is the position vector
and $dV$ is the volume element.

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% ADM mass %%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{ADM mass}
\label{sec:ADM_mass_integral}

The ADM mass, $M_{\rm ADM}$ is computed using equation (A.5) in~\cite{alcubierre2008introduction}
(see also eq. (7.15) in~\cite{gourgoulhon20073+})
%%
\begin{equation}
M_{\rm ADM} = \frac{1}{16\pi}\lim_{r\to\infty}\oint_{S}\left[
  \delta^{ij}\left(\partial_{i}h_{jk} - \partial_{k}h_{ij}\right)dS^{k}
  \right],
\end{equation}
%%
where $S$ is the surface of integration and $dS^{i} = s^{i}dA$, with
$s^{i}$ the unit outward-pointing normal vector to the surface and
$dA$ the area element. To obtain the equation above, the physical
spatial metric, $\gamma_{ij}$, has been decomposed using
%%
\begin{equation}
\gamma_{ij} = \delta_{ij} + h_{ij},
\end{equation}
%%
where $\delta_{ij}$ is the Kronecker delta and represents the flat
space metric in Cartesian coordinates, while $h_{ij}$ is a small
perturbation around flat space physical spatial metric. In practice,
we do not take the integration surface to be at infinity, and therefore
we implement the expression
%%
\begin{equation}
\boxed{
M_{\rm ADM} = \frac{1}{16\pi}\oint_{S}\left[
  \gamma^{ij}\left(\partial_{i}\gamma_{jk} - \partial_{k}\gamma_{ij}\right)dS^{k}
  \right]
}\; .
\end{equation}
%%
where $\gamma^{ij}$ is the inverse spatial metric.

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% ADM momentum %%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{ADM momentum}
\label{sec:ADM_momentum_integral}

The ADM momentum, $P_{\rm ADM}^{i}$, is obtained from equation (A.6) in
\cite{alcubierre2008introduction} (see also eq. (7.56) in
\cite{gourgoulhon20073+})
%%
\begin{equation}
P_{\rm ADM}^{i} = \frac{1}{8\pi}\lim_{r\to\infty}\oint_{S}\left[
  \left(K^{i}_{\ j}-\delta^{i}_{\ j}K\right)dS^{j}
  \right],
\end{equation}
%%
where $K_{ij}$ is the extrinsic curvature and $K\equiv\gamma^{ij}K_{ij}$
is the mean curvature. Like the ADM mass, the integration is not performed
at infinity, and the implemented equation is
%%
\begin{equation}
\boxed{
P_{\rm ADM}^{i} = \frac{1}{8\pi}\oint_{S}\left[
  \left(K^{ij}-\gamma^{ij}K\right)dS_{j}
  \right]
}\; .
\end{equation}
%%

%%%%%%%%%%%%%%%%%%%%%%%%%%
%% ADM angular momentum %%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{ADM angular momentum}
\label{sec:ADM_angular_momentum_integral}

The ADM angular momentum, $J_{\rm ADM}^{i}$, follows from equation (A.7) in
\cite{alcubierre2008introduction} (see also eq. (7.63) in
\cite{gourgoulhon20073+})
%%
\begin{equation}
J_{\rm ADM}^{i} = \frac{1}{8\pi}\lim_{r\to\infty}\oint_{S}\left[
  \epsilon^{ijk}x_{j}\left(K_{kl} - \delta_{kl}K\right)dS^{l}
  \right],
\end{equation}
%%
where $\epsilon^{ijk}$ is the three-dimensional Levi-Civita tensor and
$x^{i}$ are the components of the position vector in Cartesian coordinates.
At a finite distance from the origin this equation is written as
%%
\begin{equation}
\boxed{
J_{\rm ADM}^{i} = \frac{1}{8\pi}\oint_{S}\left[
  \epsilon^{ijk}x_{j}\left(K_{kl} - \gamma_{kl}K\right)dS^{l}
  \right]
}\; .
\end{equation}
%%


%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Basic usage %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Basic usage}
\label{sec:basic_usage}

Except for the definition of the integrands, the behavior of this thorn
is almost completely driver by the configuration of the parameter file.
We present here an example of such a parameter file, which performs the
following tasks:

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Evolution thorns %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Specifying the BSSN evolution thorn}
\label{sec:evolution_thorn}

The \texttt{VolumeIntegrals\_vacuum} thorn requires information about the
Hamiltonian and momentum constraint variables in order to perform certain
volume integrals. For maximum flexibility, one can specify which variables
to use, making \texttt{VolumeIntegrals\_vacuum} compatible with any BSSN
evolution thorn. This is achieved by setting the following variables:
%%
\begin{enumerate}
  \setlength{\itemsep}{0.0pt}
  \setlength{\parskip}{0.0pt}
  \setlength{\parsep}{ 0.0pt}
  \item \texttt{VolumeIntegrals\_vacuum::HamiltonianVarString};
  \item \texttt{VolumeIntegrals\_vacuum::Momentum0VarString};
  \item \texttt{VolumeIntegrals\_vacuum::Momentum1VarString};
  \item \texttt{VolumeIntegrals\_vacuum::Momentum2VarString};
\end{enumerate}
%%
The default values for these variables are the variables from the
\texttt{ML\_BSSN} thorn, but you can use any thorn you want. For example,
to use the variables \texttt{Ham}, \texttt{MU0}, \texttt{MU1}, and \texttt{MU2} from
an evolution thorn called \texttt{MyBSSNthorn}, one would add the following
lines to the parameter file:
%%
\begin{verbatim}
VolumeIntegrals_vacuum::HamiltonianVarString = "MyBSSNthorn::Ham"
VolumeIntegrals_vacuum::Momentum0VarString   = "MyBSSNthorn::MU0"
VolumeIntegrals_vacuum::Momentum1VarString   = "MyBSSNthorn::MU1"
VolumeIntegrals_vacuum::Momentum2VarString   = "MyBSSNthorn::MU2"
\end{verbatim}
%%

%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Full example %%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Full parameter file configuration example}
\label{sec:full_parfileexample}

We now provide an example of a parameter file configuration which uses
the Hamiltonian and momentum constraint variables of the \texttt{Baikal}
thorn and performs the following tasks:
%%
\begin{enumerate}
  \setlength{\itemsep}{0.0pt}
  \setlength{\parskip}{0.0pt}
  \setlength{\parsep}{ 0.0pt}
\item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume.
  \label{int1}
  \item Exactly the same as~\ref{int1}, but excising the region inside a
  sphere of radius 2.2 tracking the zeroth AMR grid (initially at
  $(x,y,z) = (-5.9,0,0)$);
  \label{int2}
  \item Exactly the same as \ref{int2}, but additionally excising the
  region inside a sphere of radius 2.2 tracking the center of the first
  AMR grid (initially at $(x,y,z)=(+5.9,0,0)$);
  \label{int3}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 8.2;
  \label{int4}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 12.0;
  \label{int5}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 16.0;
  \label{int6}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 24.0;
  \label{int7}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 48.0;
  \label{int8}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 96.0;
  \label{int9}
  \item Integral of Hamiltonian \& momentum constraints, over the entire
  grid volume, minus the spherical region inside coordinate radius 192.0;
  \label{int10}
\end{enumerate}
%%
To achieve this, add the following configuration to your parameter file:
%%
\begin{verbatim}
ActiveThorns = "VolumeIntegrals_vacuum"
# Set the Hamiltonian and momentum constraint variables to Baikal's
VolumeIntegrals_vacuum::HamiltonianVarString = "Baikal::HGF"
VolumeIntegrals_vacuum::Momentum0VarString   = "Baikal::MU0GF"
VolumeIntegrals_vacuum::Momentum1VarString   = "Baikal::MU1GF"
VolumeIntegrals_vacuum::Momentum2VarString   = "Baikal::MU2GF"

# Now setup basic information about the integrals
VolumeIntegrals_vacuum::NumIntegrals = 10
VolumeIntegrals_vacuum::VolIntegral_out_every = 64
VolumeIntegrals_vacuum::enable_file_output = 1
VolumeIntegrals_vacuum::outVolIntegral_dir = "volume_integration"
VolumeIntegrals_vacuum::verbose = 1
# The AMR centre will only track the first referenced integration
# quantities that track said centre. Thus, centeroflapse output will
# not feed back into the AMR centre positions.
VolumeIntegrals_vacuum::Integration_quantity_keyword[1] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[2] = "usepreviousintegrands"
VolumeIntegrals_vacuum::Integration_quantity_keyword[3] = "usepreviousintegrands"
VolumeIntegrals_vacuum::Integration_quantity_keyword[4] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[5] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[6] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[7] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[8] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[9] = "H_M_CnstraintsL2"
VolumeIntegrals_vacuum::Integration_quantity_keyword[10]= "H_M_CnstraintsL2"

# Second integral takes the first integral integrand,
# then excises the region around the first BH
VolumeIntegrals_vacuum::volintegral_sphere__center_x_initial            [2] = -5.9
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius              [2] =  2.2
VolumeIntegrals_vacuum::volintegral_sphere__tracks__amr_centre          [2] =  0
VolumeIntegrals_vacuum::volintegral_usepreviousintegrands_num_integrands[2] =  4

# Third integral takes the second integral integrand,
# then excises the region around the first BH
VolumeIntegrals_vacuum::volintegral_sphere__center_x_initial            [3] =  5.9
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius              [3] =  2.2
VolumeIntegrals_vacuum::volintegral_sphere__tracks__amr_centre          [3] =  1
VolumeIntegrals_vacuum::volintegral_usepreviousintegrands_num_integrands[3] =  4

# Just an outer region
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[4] = 8.2
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[5] =12.0
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[6] =16.0
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[7] =24.0
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[8] =48.0
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[9] =96.0
VolumeIntegrals_vacuum::volintegral_outside_sphere__radius[10]=192.0
\end{verbatim}
%%


%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% References %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{thebibliography}{2}

\bibitem{alcubierre2008introduction}
  Alcubierre, M.
  \newblock {\em Introduction to 3+ 1 numerical relativity\/}, Vol 140. Oxford University Press (2008).

\bibitem{gourgoulhon20073+}
  Gourgoulhon, E.
  \newblock {\em 3+ 1 formalism and bases of numerical relativity\/}, arXiv preprint gr-qc/0703035 (2007).

\end{thebibliography}

% Do not delete next line
% END CACTUS THORNGUIDE



\section{Parameters} 


\parskip = 0pt

\setlength{\tableWidth}{160mm}

\setlength{\paraWidth}{\tableWidth}
\setlength{\descWidth}{\tableWidth}
\settowidth{\maxVarWidth}{volintegral\_usepreviousintegrands\_num\_integrands}

\addtolength{\paraWidth}{-\maxVarWidth}
\addtolength{\paraWidth}{-\columnsep}
\addtolength{\paraWidth}{-\columnsep}
\addtolength{\paraWidth}{-\columnsep}

\addtolength{\descWidth}{-\columnsep}
\addtolength{\descWidth}{-\columnsep}
\addtolength{\descWidth}{-\columnsep}
\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{amr\_centre\_\_tracks\_\_volintegral\_inside\_sphere} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Use output from volume integral to move AMR box centre N.}} \\
\hline{\bf Range} & &  {\bf Default:} -1 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering -1:100} & \multicolumn{2}{p{\paraWidth}|}{-1 = do not track an AMR box centre. Otherwise track AMR box centre number N = [0,100]} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{enable\_file\_output} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Enable output file}} \\
\hline{\bf Range} & &  {\bf Default:} 1 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:1} & \multicolumn{2}{p{\paraWidth}|}{0 = no output; 1 = yes, output to file} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{enable\_time\_reparameterization} & {\bf Scope:} private & BOOLEAN \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Enable time reparameterization a la http://arxiv.org/abs/1404.6523}} \\
\hline & & {\bf Default:} no \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{hamiltonianvarstring} & {\bf Scope:} private & STRING \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Hamiltonian constraint variable name}} \\
\hline{\bf Range} & &  {\bf Default:} ML\_BSSN::H \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering ML\_BSSN::H} & \multicolumn{2}{p{\paraWidth}|}{ML\_BSSN thorn Hamiltonian constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering Baikal::HGF} & \multicolumn{2}{p{\paraWidth}|}{Baikal thorn Hamiltonian constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering BaikalVacuum::HGF} & \multicolumn{2}{p{\paraWidth}|}{BaikalVacuum thorn Hamiltonian constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering LeanBSSNMoL::hc} & \multicolumn{2}{p{\paraWidth}|}{LeanBSSNMoL thorn Hamiltonian constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering .+} & \multicolumn{2}{p{\paraWidth}|}{Or use you can use your own thorn's Hamiltonian constraint gridfunction name} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{integration\_quantity\_keyword} & {\bf Scope:} private & KEYWORD \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Which quantity to integrate}} \\
\hline{\bf Range} & &  {\bf Default:} nothing \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering nothing} & \multicolumn{2}{p{\paraWidth}|}{Default, null parameter} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering H\_M\_CnstraintsL2} & \multicolumn{2}{p{\paraWidth}|}{Hamiltonian, Momentum\^i} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering H\_M2\_CnstraintsL2} & \multicolumn{2}{p{\paraWidth}|}{Hamiltonian, Momentum squared} \\\multicolumn{1}{|p{\maxVarWidth}|}{see [1] below} & \multicolumn{2}{p{\paraWidth}|}{Use integrands from step(s) immediately preceeding. Useful for Swiss-cheese-type volume integrations.} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering centeroflapse} & \multicolumn{2}{p{\paraWidth}|}{Center of Lapse} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering one} & \multicolumn{2}{p{\paraWidth}|}{Integrand = 1. Useful for debugging} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering ADM\_Mass} & \multicolumn{2}{p{\paraWidth}|}{ADM Mass} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering ADM\_Momentum} & \multicolumn{2}{p{\paraWidth}|}{ADM Momentum} \\\multicolumn{1}{|p{\maxVarWidth}|}{see [1] below} & \multicolumn{2}{p{\paraWidth}|}{ADM Angular Momentum} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent {\bf [1]} \noindent \begin{verbatim}usepreviousintegrands\end{verbatim}\noindent {\bf [1]} \noindent \begin{verbatim}ADM\_Angular\_Momentum\end{verbatim}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{momentum0varstring} & {\bf Scope:} private & STRING \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Momentum constraint variable name (x-direction)}} \\
\hline{\bf Range} & &  {\bf Default:} ML\_BSSN::M1 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering ML\_BSSN::M1} & \multicolumn{2}{p{\paraWidth}|}{ML\_BSSN thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering Baikal::MU0GF} & \multicolumn{2}{p{\paraWidth}|}{Baikal thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering BaikalVacuum::MU0GF} & \multicolumn{2}{p{\paraWidth}|}{BaikalVacuum thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering LeanBSSNMoL::mcx} & \multicolumn{2}{p{\paraWidth}|}{LeanBSSNMoL thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering .+} & \multicolumn{2}{p{\paraWidth}|}{Or use you can use your own thorn's momentum constraint gridfunction name} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{momentum1varstring} & {\bf Scope:} private & STRING \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Momentum constraint variable name (y-direction)}} \\
\hline{\bf Range} & &  {\bf Default:} ML\_BSSN::M2 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering ML\_BSSN::M2} & \multicolumn{2}{p{\paraWidth}|}{ML\_BSSN thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering Baikal::MU1GF} & \multicolumn{2}{p{\paraWidth}|}{Baikal thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering BaikalVacuum::MU1GF} & \multicolumn{2}{p{\paraWidth}|}{BaikalVacuum thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering LeanBSSNMoL::mcy} & \multicolumn{2}{p{\paraWidth}|}{LeanBSSNMoL thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering .+} & \multicolumn{2}{p{\paraWidth}|}{Or use you can use your own thorn's momentum constraint gridfunction name} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{momentum2varstring} & {\bf Scope:} private & STRING \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Momentum constraint variable name (z-direction)}} \\
\hline{\bf Range} & &  {\bf Default:} ML\_BSSN::M3 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering ML\_BSSN::M3} & \multicolumn{2}{p{\paraWidth}|}{ML\_BSSN thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering Baikal::MU2GF} & \multicolumn{2}{p{\paraWidth}|}{Baikal thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering BaikalVacuum::MU2GF} & \multicolumn{2}{p{\paraWidth}|}{BaikalVacuum thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering LeanBSSNMoL::mcz} & \multicolumn{2}{p{\paraWidth}|}{LeanBSSNMoL thorn momentum constraint gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering .+} & \multicolumn{2}{p{\paraWidth}|}{Or use you can use your own thorn's momentum constraint gridfunction name} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{momentumsquaredvarstring} & {\bf Scope:} private & STRING \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Momentum constraint squared variable name}} \\
\hline{\bf Range} & &  {\bf Default:} BaikalVacuum::MSQUAREDGF \\\multicolumn{1}{|p{\maxVarWidth}|}{see [1] below} & \multicolumn{2}{p{\paraWidth}|}{Baikal thorn momentum constraint squared gridfunction name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering .+} & \multicolumn{2}{p{\paraWidth}|}{Or use you can use your own thorn's momentum constraint squared gridfunction name} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent {\bf [1]} \noindent \begin{verbatim}BaikalVacuum::MSQUAREDGF\end{verbatim}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{numintegrals} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Number of volume integrals to perform}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:1000} & \multicolumn{2}{p{\paraWidth}|}{zero (disable integration) or some other number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{outvolintegral\_dir} & {\bf Scope:} private & STRING \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Output directory for volume integration output files, overrides IO::out\_dir}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering .+} & \multicolumn{2}{p{\paraWidth}|}{A valid directory name} \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering \^\$} & \multicolumn{2}{p{\paraWidth}|}{An empty string to choose the default from IO::out\_dir} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{verbose} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Set verbosity level: 1=useful info; 2=moderately annoying (though useful for debugging)}} \\
\hline{\bf Range} & &  {\bf Default:} 1 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:2} & \multicolumn{2}{p{\paraWidth}|}{0 = no output; 1=useful info; 2=moderately annoying (though useful for debugging)} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{viv\_time\_reparam\_t0} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Time reparameterization parameter t\_0: Center of time reparameterization curve. SET TO BE SAME AS IN ImprovedPunctureGauge thorn}} \\
\hline{\bf Range} & &  {\bf Default:} 10.0 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:*} & \multicolumn{2}{p{\paraWidth}|}{Probably don't want to set this {\textless}0, so {\textgreater}=0 enforced} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{viv\_time\_reparam\_w} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Time reparameterization parameter w: Width of time reparameterization curve. SET TO BE SAME AS IN ImprovedPunctureGauge thorn}} \\
\hline{\bf Range} & &  {\bf Default:} 5.0 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:*} & \multicolumn{2}{p{\paraWidth}|}{Probably don't want to set this {\textless}0, so {\textgreater}=0 enforced} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_inside\_sphere\_\_radius} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Volume integral in a spherical region: radius of spherical region}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering *:*} & \multicolumn{2}{p{\paraWidth}|}{Any number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_out\_every} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em How often to compute volume integrals?}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:1000} & \multicolumn{2}{p{\paraWidth}|}{zero (disable integration) or some other number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_outside\_sphere\_\_radius} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Volume integral outside a spherical region: radius of spherical region}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering *:*} & \multicolumn{2}{p{\paraWidth}|}{Any number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_sphere\_\_center\_x\_initial} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Volume integral in a spherical region: x-coord of center(s)}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering *:*} & \multicolumn{2}{p{\paraWidth}|}{Any number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_sphere\_\_center\_y\_initial} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Volume integral in a spherical region: y-coord of center(s)}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering *:*} & \multicolumn{2}{p{\paraWidth}|}{Any number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_sphere\_\_center\_z\_initial} & {\bf Scope:} private & REAL \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Volume integral in a spherical region: z-coord of center(s)}} \\
\hline{\bf Range} & &  {\bf Default:} (none) \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering *:*} & \multicolumn{2}{p{\paraWidth}|}{Any number} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_sphere\_\_tracks\_\_amr\_centre} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Volume integral tracks AMR box centre N.}} \\
\hline{\bf Range} & &  {\bf Default:} -1 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering -1:100} & \multicolumn{2}{p{\paraWidth}|}{-1 = do not track an AMR box centre. Otherwise track AMR box centre number N = [0,100]} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{volintegral\_usepreviousintegrands\_num\_integrands} & {\bf Scope:} private & INT \\\hline
\multicolumn{3}{|p{\descWidth}|}{{\bf Description:}   {\em Number of integrands for usepreviousintegrands, must be specified explicitly as information from previous integrand is not passed.}} \\
\hline{\bf Range} & &  {\bf Default:} 4 \\\multicolumn{1}{|p{\maxVarWidth}|}{\centering 0:100} & \multicolumn{2}{p{\paraWidth}|}{Default is set to the maximum, 4.} \\\hline
\end{tabular*}

\vspace{0.5cm}\noindent \begin{tabular*}{\tableWidth}{|c|l@{\extracolsep{\fill}}r|}
\hline
\multicolumn{1}{|p{\maxVarWidth}}{out\_dir} & {\bf Scope:} shared from IO & STRING \\\hline
\end{tabular*}

\vspace{0.5cm}\parskip = 10pt 

\section{Interfaces} 


\parskip = 0pt

\vspace{3mm} \subsection*{General}

\noindent {\bf Implements}: 

volumeintegrals\_vacuum
\vspace{2mm}

\noindent {\bf Inherits}: 

grid

admbase

carpetregrid2
\vspace{2mm}
\subsection*{Grid Variables}
\vspace{5mm}\subsubsection{PRIVATE GROUPS}

\vspace{5mm}

\begin{tabular*}{150mm}{|c|c@{\extracolsep{\fill}}|rl|} \hline 
~ {\bf Group Names} ~ & ~ {\bf Variable Names} ~  &{\bf Details} ~ & ~\\ 
\hline 
volintegrands &  & compact & 0 \\ 
 & VolIntegrand1 & dimensions & 3 \\ 
 & VolIntegrand2 & distribution & DEFAULT \\ 
 & VolIntegrand3 & group type & GF \\ 
 & VolIntegrand4 & tags & InterpNumTimelevels=1 prolongation="none" Checkpoint="no" \\ 
 &  & timelevels & 1 \\ 
 &  & variable type & REAL \\ 
\hline 
volintegrals &  & compact & 0 \\ 
 & VolIntegral & description & Volume integrals \\ 
& ~ & description &  post-sum. The first dimension denotes which integral(s) \\ 
 & VolIntegral & description &  and the second denotes the values of the integral(s). E.g. \\ 
 & VolIntegral & description &  a center of mass volume integral will have 3 outputs. \\ 
 &  & dimensions & 2 \\ 
 &  & distribution & CONSTANT \\ 
 &  & group type & ARRAY \\ 
 &  & size & 101 \\ 
& ~ & size & 4 \\ 
 &  & timelevels & 1 \\ 
 &  & variable type & REAL \\ 
\hline 
movingsphregionintegrals &  & compact & 0 \\ 
 & volintegral\_inside\_sphere\_\_center\_x & description & Specify regions for volume integrals inside/outside spheres THAT MOVE. \\ 
 & volintegral\_inside\_sphere\_\_center\_y & dimensions & 1 \\ 
 & volintegral\_inside\_sphere\_\_center\_z & distribution & CONSTANT \\ 
 & volintegral\_outside\_sphere\_\_center\_x & group type & ARRAY \\ 
 & volintegral\_outside\_sphere\_\_center\_y & size & 101 \\ 
 & volintegral\_outside\_sphere\_\_center\_z & timelevels & 1 \\ 
 &  & variable type & REAL \\ 
\hline 
\end{tabular*} 


\vspace{5mm}\subsubsection{PUBLIC GROUPS}

\vspace{5mm}

\begin{tabular*}{150mm}{|c|c@{\extracolsep{\fill}}|rl|} \hline 
~ {\bf Group Names} ~ & ~ {\bf Variable Names} ~  &{\bf Details} ~ & ~\\ 
\hline 
integralcountervar &  & compact & 0 \\ 
 & IntegralCounter & description & Counter that keeps track of which integral we are calculating. \\ 
 &  & dimensions & 0 \\ 
 &  & distribution & CONSTANT \\ 
 &  & group type & SCALAR \\ 
 &  & tags & checkpoint="no" \\ 
 &  & timelevels & 1 \\ 
 &  & variable type & INT \\ 
\hline 
volintegrals\_vacuum\_time &  & compact & 0 \\ 
 & physical\_time & description & keeps track of the physical time \\ 
& ~ & description &  in case time coordinate is reparameterized \\ 
 & physical\_time & description &  a la http://arxiv.org/abs/1404.6523 \\ 
 &  & dimensions & 0 \\ 
 &  & distribution & CONSTANT \\ 
 &  & group type & SCALAR \\ 
 &  & tags & checkpoint="no" \\ 
 &  & timelevels & 1 \\ 
 &  & variable type & REAL \\ 
\hline 
\end{tabular*} 



\vspace{5mm}\parskip = 10pt 

\section{Schedule} 


\parskip = 0pt


\noindent This section lists all the variables which are assigned storage by thorn WVUThorns\_Diagnostics/VolumeIntegrals\_vacuum.  Storage can either last for the duration of the run ({\bf Always} means that if this thorn is activated storage will be assigned, {\bf Conditional} means that if this thorn is activated storage will be assigned for the duration of the run if some condition is met), or can be turned on for the duration of a schedule function.


\subsection*{Storage}

\hspace{5mm}

 \begin{tabular*}{160mm}{ll} 

{\bf Always:}&  ~ \\ 
 VolIntegrands VolIntegrals MovingSphRegionIntegrals IntegralCounterVar VolIntegrals\_vacuum\_time & ~\\ 
~ & ~\\ 
\end{tabular*} 


\subsection*{Scheduled Functions}
\vspace{5mm}

\noindent {\bf CCTK\_INITIAL}   (conditional) 

\hspace{5mm} vi\_vacuum\_file\_output\_routine\_startup 

\hspace{5mm}{\it create directory for file output. } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Language:  & c \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf CCTK\_POST\_RECOVER\_VARIABLES}   (conditional) 

\hspace{5mm} vi\_vacuum\_file\_output\_routine\_startup 

\hspace{5mm}{\it create directory for file output. } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Language:  & c \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf CCTK\_INITIAL} 

\hspace{5mm} initializeintegralcountertozero 

\hspace{5mm}{\it initialize integralcounter variable to zero } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf CCTK\_POST\_RECOVER\_VARIABLES} 

\hspace{5mm} initializeintegralcountertozero 

\hspace{5mm}{\it initialize integralcounter variable to zero } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf CCTK\_ANALYSIS} 

\hspace{5mm} initializeintegralcounter 

\hspace{5mm}{\it initialize integralcounter variable } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Before:  & volumeintegralgroup \\ 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf CCTK\_ANALYSIS} 

\hspace{5mm} volumeintegralgroup 

\hspace{5mm}{\it evaluate all volume integrals } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Before:  & carpetlib\_printtimestats \\ 
~& ~ &carpetlib\_printmemstats\\ 
~ & Type:  & group \\ 
~ & While:  & volumeintegrals\_vacuum::integralcounter \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf VolumeIntegralGroup} 

\hspace{5mm} volumeintegrals\_vacuum\_computeintegrand 

\hspace{5mm}{\it compute integrand } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & Before:  & dosum \\ 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~& ~ &loop-local\\ 
~ & Storage:  & volintegrands \\ 
~& ~ &volintegrals\\ 
~& ~ &movingsphregionintegrals\\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf VolumeIntegralGroup} 

\hspace{5mm} dosum 

\hspace{5mm}{\it do sum } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & After:  & volumeintegrals\_vacuum\_computeintegrand \\ 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf VolumeIntegralGroup} 

\hspace{5mm} decrementintegralcounter 

\hspace{5mm}{\it decrement integralcounter variable } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & After:  & dosum \\ 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~ & Type:  & function \\ 
\end{tabular*} 


\vspace{5mm}

\noindent {\bf CCTK\_ANALYSIS} 

\hspace{5mm} vi\_vacuum\_file\_output 

\hspace{5mm}{\it output volumeintegral results to disk } 


\hspace{5mm}

 \begin{tabular*}{160mm}{cll} 
~ & After:  & volumeintegralgroup \\ 
~ & Language:  & c \\ 
~ & Options:  & global \\ 
~ & Type:  & function \\ 
\end{tabular*} 



\vspace{5mm}\parskip = 10pt 
\end{document}
