xx AHFinderDirect – A Fast Apparent Horizon Finder

AHFinderDirect – A Fast Apparent Horizon Finder

Jonathan Thornburg <jthorn@aei.mpg.de>

Date

Abstract

Thorn AHFinderDirect locates apparent horizons (or more generally, closed 2-surfaces with topology having any desired constant expansion) in a numerically computed slice using a direct method, posing the apparent horizon equation as an elliptic PDE on angular-coordinate space. This is very fast and accurate, but requires a “reasonable” initial guess. This thorn guide describes how to use the thorn.

1 Introduction

A “marginally trapped surface” is a closed 2-surface in a slice whose congruence of future-pointing outgoing null geodesics has zero expansion. There may be several such surfaces, some nested inside others; an “apparent horizon” is an outermost marginally trapped surface. In terms of the usual variables, an apparent horizon satisfies the equation where is the outward-pointing unit normal to the apparent horizon, and is the covariant derivative operator associated with the 3-metric in the slice. (See [?] for a derivation of equationx.) (Optionally, you can replace the right hand side ofx by any specified nonzero constant, i.e. you can find a surface of constant (in general nonzero) expansion.; this is dicsussed in sectionx4.8.)

ThornxAHFinderDirect finds an apparent horizon by numerically solving equationx. It requires as input the usual Cactus 3-metric and extrinsic curvature , (and optionally the conformal factor if the StaticConformal metric semantics are used), and produces as output the Cactus coordinates of a large number of points on the apparent horizon, together with some auxiliary information like the apparent horizon area and centroid position, and the irreducable mass associated with the area.

Besides this thorn guide, the other main sources of information on AHFinderDirect are the comments in the param.ccl file, the paper [?], and to a lesser extent the paper [?]. As a courtesy, I ask that both these papers be cited in any published research which uses this thorn, or which uses code from this thorn.

2 What AHFinderDirect Needs

There are some restrictions on the spacetime, or more precisely on each slice where you want to find apparent horizons, which are necessary in order for AHFinderDirect to work:

AHFinderDirect requires that the Cactus geometry (, , and optionally ) be nonsingular in a neighborhood of the apparent horizon. In particular, this means that it quite certainly will not work for spacetimes/slicings which have a singular geometry on the horizon, such as Schwarzschild/Schwarzschild

and Kerr/Boyer-Lindquist.1 1Nonsingular slicings of those same spacetimes, such as Schwarzschild/Eddington-Finkelstein, Kerr/Kerr, and Kerr/Kerr-Schild, are fine, and are in fact nice test cases.

Less obviously, this also means that if there is a singularity in the geometry somewhere near the apparent horizon, then you need to have a high enough Cactus 3-D grid resolution that the geometry interpolation doesn’t “see” the singularity. (If AHFinderDirect “sees” the singularity, it may “just” fail to find the horizon, and/or it may report that the interpolated fails to be positive definite or even contains NaNs.)

At the moment AHFinderDirect and the Cactus interpolators don’t know how to avoid an excised region, so if the apparent horizon (or any trial horizon surface as the algorithm is iterating towards the apparent horizon) gets too close to an excised region, you’ll get garbage results as the interpolator tries to interpolate data from the excised region. I plan to fix this sometime soon.

AHFinderDirect requires that any apparent horizon it’s going to (try to) find must be a “Strahlkxrper” (literally “ray body”, or more commonly “star-shaped region”) relative to some local coordinate origin (which you must specify). A Strahlkxrper is defined by Minkowski ([?, p.x108]) as

a region in -dimensional Euclidean space containing the origin and whose surface, as seen from the origin, exhibits only one point in any direction.

In other words, using polar spherical coordinates relative to the local coordinate origin, the apparent horizon’s shape must be parameterizable as for some single-valued function . (AHFinderDirect uses precisely this parameterization.)

There are also some restrictions on your Cactus configuration and run; here’s what works and what doesn’t:

I strongly recommend using a current-CVS checkout of the Cactus flesh and of all relevant thorns. I haven’t tested AHFinderDirect at all with older versions of the flesh or other thorns.

AHFinderDirect works fine with the PUGH unigrid driver and with the Carpet mesh-refinement driver. So far as I know it’s never been tested with any other driver.

AHFinderDirect works fine in single- or multi-processor Cactus runs.

Obviously, your Cactus configuration must include AHFinderDirect, and your ActiveThorns parameter(s) must activate it.

AHFinderDirect inherits from the other thorns (strictly speaking, implementations) listed in tablex1, so you’ll need them (or more precisely some thorns providing them) in your configuration and activated, too.

10Implementation  01Typically provided by Thorn
10Grid  01CactusBase/CartGrid3d
10IO  01CactusBase/IOUtil
10ADMBase  01CactusEinstein/ADMBase
10StaticConformal  01CactusEinstein/StaticConformal
10SpaceMask  01CactusEinstein/SpaceMask
10SphericalSurface  01AEIThorns/SphericalSurface

Tablex1: This table lists all the other implementations from which AHFinderDirect inherits, and the thorns which typically provide these implementations.

Grid::domainx=x"full", "bitant", "quadrant", and "octant" are supported. Alas, at present rotating

(or more precisely nonlocal) symmetry boundary conditions aren’t supported.

The ADMBase::metric_type values "physical" and "staticxconformal" are supported; for the latter

you must have storage turned on for at least the conformal factor StaticConformal::psi. (The Cactus 3-D grid functions for 1st and 2nd derivatives of psi aren’t used.)

AHFinderDirect uses the CCTK_InterpGridArrays() Cactus global (multi-processor grid array) interpolator API; this is provided by PUGHInterp or CarpetInterp (so you must have the appropriate one of these thorns compiled in and activated). CCTK_InterpGridArrays() in turn uses the new CCTK_InterpLocalUniform() processor-local interpolator API; AHFinderDirect uses various options in this API which at present are only supported by thorn AEILocalInterp (so you must have this thorn compiled in and activated)

AHFinderDirect uses various Cactus reduction APIs to coordinate multi-processor horizon finding, so (even if you’re only going to run on a single processor) you must have a reduction thorn like PUGHReduce or CarpetReduce compiled in and activated.

At present only a few of AHFinderDirect’s parameters are steerable. (This is actually quite easy to fix; I just haven’t gotten around to it yet.)

I think AHFinderDirect will “work” with checkpoint/restart, but I haven’t tested this yet. Here “work” means the restart will be like starting a new run, in that AHFinderDirect will set the initial guess for each horizon in a start-of-a-new-run manner. Alas, it will also write a new BH_diagnostics file for each horizon found, overwriting any existing BH_diagnostics files. This is a bug, which I plan to fix soon (the right behavior is/will be to append to the existing BH_diagnostics file).

AHFinderDirect can pass information to the rest of Cactus in several ways; these are described in detail in sectionx4.7.

3 Obtaining and Compiling AHFinderDirect

You should be able to obtain the source code for this thorn via the usual procedures for anonymous git checkout; at present it lives in the EinsteinAnalysis arrangement.

This thorn is written primarily in C^{++}, calling C and Fortranx77 numerical

libraries.2 2The (C) code for the relativity computations (i.e.xthe apparent horizon equation itself) is mainly machine-generated from Maple code, which in turn uses a Perl preprocessor. But the machine-generated C code is already in CVS along with the rest of this thorn’s source code, so you don’t need to have Maple installed unless you want to modify the relativity computations. In theory the code should be quite portable to modern C^{++} compilers, but in practice I’ve had a number of portability problems with various compilers. See the “Code Notes” and “Compiler Notes” sections in the top-level README file for details and lists of compilers currently known to be ok or not.

By default AHFinderDirect doesn’t use any external libraries. However, if HAVExDENSExJACOBIANxxLAPACK is defined in src/include/config.h, then AHFinderDirect uses the LAPACK library for solving linear equations. In this case you need to configure Cactus with LAPACK=yes. See the top-level README and README.library files for details on this.

4 AHFinderDirect Parameters

This thorn has lots of parameters, but most of them have reasonable default values which you probably won’t need to change. Here I describe the parameters which you are likely to want to at least look at, and possibly set explicitly.

Note that all of the “[]” parameters are Cactus array parameters, which you need to specify separately in your parameter file for each apparent horizon. IMPORTANT: Apparent horizons are numbered starting at 1, not 0! The example in sectionx8 should make this clear.

4.1 Overall Parameters

findxevery

This is an integer parameter specifying how often AHFinderDirect should try to find apparent horizons: If , AHFinderDirect is a no-op. If , AHFinderDirect tries to find apparent horizons

each find_every time steps.3 3More precisely, if , AHFinderDirect tries to find apparent horizons at each time step where cctkxiteration is evenly divisible by findxevery. The default value isx1, i.e. AHFinderDirect tries to find apparent horizons at every time step.

Nxhorizons

How many apparent horizons do you want to find in each slice? Typical values are 1 (the default), 2,

or 3.4 4Larger values are also possible. The present upper limit is 100, but it would be trivial to raise this further if desired – see the comments in param.ccl for details. This thorn numbers the apparent horizons from 1 to Nxhorizons inclusive. There are a number of other parameters (described below) which you need to set for of these each apparent horizons.

Note that Nxhorizons sets the number of apparent horizons you want to find in the Cactus 3-D numerical grid, not in the whole spacetime. For example, if you are simulating (say) Misner data with Grid::domainx=x"bitant", with the two throats at (say) roughly , then you should set N_horizonsx=x1 to find those two apparent horizons, since you’re only finding one apparent horizon within the numerical grid. If you also want to search for a common apparent horizon surrounding both black holes, then you should set N_horizonsx=x2, since you’re finding at most 2 apparent horizons within the numerical grid.

verbosexlevel

This controls how verbose this thorn is in printing informational (non-error) messages describing what it’s doing. In order from tersest to most verbose, the allowable values are

"no output"

Don’t print anything.

"physics highlights"

Print only a single line each time AHFinderDirect runs, giving which horizons were found.

"physics details"

Print two lines for each horizon found, giving the horizon area, centroid position, and irreducible mass. This is the default.

"algorithm highlights"

Also print a single line for each Newton iteration giving the 2-norm and -norm of the function defined by equationx.

"algorithm details"

Print lots of detailed messages tracing what the code is doing.

"algorithm debug"

Print even more detailed messages tracing what the code is doing, mainly useful for debugging purposes.

4.2 Choosing the Local Coordinate Origin for each Apparent Horizon

For each apparent horizon you want to find, you need to specify the Cactus coordinates of a local coordinate system origin. As described in sectionx2, each apparent horizon must be a Strahlkxrper with respect to its local coordinate system origin.

You specify the local coordinate system origin for each horizon with the (Cactus array) parameters

00originxx[]
00originxy[]
00originxz[]

These all default to 0.0. In practice, you should set these parameters to be somewhere reasonably close to your best guess for the center of each apparent horizon. These aren’t too critical: being off by 1/4 of the horizon radius is no problem, and – assuming the algorithm still converges – even 1/2 of the horizon radius only slows the convergence by an extra iteration or two. But poor values of these parameters do make the algorithm more likely to fail to converge.

At present the local coordinate origin is fixed once you set it; there’s no provision for it to move to track a moving black hole. I hope to add such a provision

soon.5 ^{5This would be along the lines of the AHFinder apparent horizon finder’s AHFinder::ahfxwander = true option.}

4.3 Specifying the Initial Guess

AHFinderDirect requires an initial guess for the apparent horizon’s coordinate position and shape (that is, for the function defined in sectionx2), for each apparent horizon you want to find. Unlike some other apparent horizon finders (eg.xthe curvature flow method in AHFinder), for AHFinderDirect there’s no restriction on whether the initial guess is inside, outside, or crossing the actual apparent horizon: the only important thing is that it should be “close”. Just how close the initial guess needs to be for AHFinderDirect to find the (a) apparent horizon depends on the slice and the coordinates, but as a general rule of thumb any initial guess that’s within 1/3 to 1/2 of the mean horizon radius will probably work.

The “initial guess” specification is used the first time we try to find any given apparent horizon, and also any succeeding time when the most recent attempt to find this apparent horizon failed. If we succeed in finding a given apparent horizon, than that apparent horizon position is automatically reused as the initial guess the next time we try to find the same apparent horizon; in this case the explicit “initial guess” specification is

ignored.6 ^{6This is similar to the AHFinder apparent horizon finder’s behavior with the AHFinder::ahfxguessold = true option.}

There are a number of parameters for specifying the initial guess:

initialxguessxmethod[]

This sets what type of the initial guess is used for each apparent horizon position. There are several possibilities, most with their own sets of

subparameters:7 7The naming scheme for these is similar to that used in the Exact thorn. 8 ^{8For the Kerr parameters, note that this thorn always uses the convention that the spin parameter is dimensionless.}

"read from file"

This reads the initial-guess function from a data file. The file format is currently hard-wired to be that written with file_formatx=x"ASCIIx(gnuplot)" (see below). The subparameter

initial_guess__read_from_named_file__file_name specifies the file name.

"Kerr/Kerr"

This sets the initial guess to the analytically-known apparent horizon position in a Kerr spacetime in Kerr coordinates. This is a coordinate sphere of radius . There are subparameters

 00initialxguessxxKerrxKerrxxxxposn[]
00initialxguessxxKerrxKerrxxyxposn[]
00initialxguessxxKerrxKerrxxzxposn[]

to set the position of the Kerr black hole (note this position is in global Cactus coordinates, not relative to the local coordinate origin), and

 00initialxguessxxKerrxKerrxxmass[]
00initialxguessxxKerrxKerrxxspin[]

to set its mass and spin.

"Kerr/Kerr-Schild"

This sets the initial guess to the analytically-known apparent horizon position in a Kerr spacetime in Kerr-Schild coordinates. This is a coordinate ellipsoid with radia (semi-major axes)

 00initialxguessxxKerrxKerrSchildxxxxposn[]
00initialxguessxxKerrxKerrSchildxxyxposn[]
00initialxguessxxKerrxKerrSchildxxzxposn[]

(note this position is in global Cactus coordinates, not relative to the local coordinate origin), and

 00initialxguessxxKerrxKerrSchildxxmass[]
00initialxguessxxKerrxKerrSchildxxspin[]

to set its mass and spin.

"coordinate sphere"

This sets the initial guess to a coordinate sphere; there are subparameters

 00initialxguessxxcoordxspherexxxxcenter[]
00initialxguessxxcoordxspherexxyxcenter[]
00initialxguessxxcoordxspherexxzxcenter[]

(note this position is in global Cactus coordinates, not relative to the local coordinate origin), and

initialxguessxxcoordxspherexxradius[]

to set the radius.

"coordinate ellipsoid"

This sets the initial guess to a coordinate ellipsoid; there are subparameters

 00initialxguessxxcoordxellipsoidxxxxcenter[]
00initialxguessxxcoordxellipsoidxxyxcenter[]
00initialxguessxxcoordxellipsoidxxzxcenter[]

(note this position is in global Cactus coordinates, not relative to the local coordinate origin), and

 00initialxguessxxcoordxellipsoidxxxxradius[]
00initialxguessxxcoordxellipsoidxxyxradius[]
00initialxguessxxcoordxellipsoidxxzxradius[]

to set the radia (semimajor axes).

4.4 I/O Parameters for the Apparent Horizon Shape(s)

The main output of this thorn is the computed horizon shape function , and correspondingly the coordinate positions of the apparent-horizon-surface (angular) grid points. There are several parameters controlling if, how often, and how these should be written to data files:

outputxhxevery

As described in sectionx4.1, AHFinderDirect will try to find the apparent horizon(s) every find_every time steps. However, you can control how often (if at all) the apparent horizon shape(s) are written to data files: this is only done if output_h_every is nonzero, and the Cactus time step number cctk_iteration is an integral multiple of this parameter (output_h_every).

filexformat

This specifies the file format for horizon-shape (and other angular-grid-function) data files. Unfortunately, at the moment only a single format is implemented,

"ASCII (gnuplot)"

This is a simple ASCII format designed for easy plotting with gnuplot:

AHFinderDirect writes a separate data file for each Cactus time step and for each apparent horizon found. By default these are all written in to the IOUtil::out_dir directory; see h_directory (below) to change this.

The time step number and the apparent horizon number are both encoded in the file name; the actual file name is given by a printf() format "%s/%s.t%d.ah%d.%s", where

the first %s is the directory set by the IO::out_dir and/or h_directory parameters (see below)

the second %s is the base file name set by the h_base_file_name parameter (see below)

the first %d is the Cactus time step number

the second %d is the apparent horizon number

the third %s is the file name extension, set by the

   ASCII_gnuplot_file_name_extension parameter; this defaults to "gp"

Comment lines begin with #.

Patches are separated by 2 blank lines; rows of apparent-horizon points within a patch are separated by single blank lines.

Each apparent-horizon-surface point is described by a single line, containing the whitespace-separated fields Two “unwrapped” angular coordinates in degrees, representing a point on .

The value, giving the radius of the apparent horizon surface at that angle.

The corresponding Cactus coordinates.

See sectionx6 for a discussion of visualization for these and other AHFinderDirect output files.

hxdirectory

This specifies the directory in which the data files are to be written. If it doesn’t already exist, this directory is created before writing the data files. This parameter defaults to the value of the IO::out_dir parameter.

hxbasexfilexname

This specifies the base file name for data files, as described above. This defaults to ”h”.

ASCIIxgnuplotxfilexnamexextension

This specifies the file name extension for data files, as described above. This defaults to

”gp”.

4.5 Parameters for the “BHxdiagnostics” Files

As well as the apparent horizon shape files, this thorn can also write files giving time series of various diagnostics. These are controlled by the following parameters:

outputxBHxdiagnostics

If this Boolean parameter is set to true, AHFinderDirect will write a “black hole diagnostics” file for each distinct apparent horizon found (up to N_horizons files in all). Each such file contains a time series of various diagnostics for all time steps when the corresponding apparent horizon was found. The file format is again a simple ASCII format designed for easy plotting with gnuplot:

The apparent horizon number is encoded in the file name; the actual file name is given by a printf()

format "%s/%s.ah%d.%s", where

the first %s is the directory set by the IO::out_dir and/or BH_diagnostics_directory

parameters (see below)

the second %s is the base file name set by the BH_diagnostics_base_file_name parameter (see below); this defaults to "BH_diagnostics"

the %d is the apparent horizon number

the third %s is the file name extension, set by the BH_diagnostics_file_name_extension parameter; this defaults to "gp"

The file begins with a block of header comments (lines begining with #) describing the data fields.

Each time this apparent horizon is found, a single line is appended to the data file, containing various whitespace-separated fields. The the precise list of fields, see the header comments, or see the function output() in src/driver/BH_diagnostics.cc. As of this writing the fields are:

the Cactus iteration number cctk_iteration

the Cactus time coordinate cctk_time

the Cactus coordinates of the apparent horizon centroid

the minimum, maximum, and mean coordinate radia of the apparent horizon about the local coordinate origin the minimum and maximum Cactus , , and coordinates of the apparent horizon surface

the proper circumferences of the apparent horizon in the , , and local-coordinate planes9 9Note that if the apparent horizon is not symmetric across one of these coordinate planes, then the circumference in this plane is not very meaningful. In particular, in this case this circumference is probably different from the apparent horizon’s maximum “hoop” circumference. the and ratios of the proper circumferences the proper area of the apparent horizon, the irreducible mass of the apparent horizon, the areal radius of the apparent horizon,

BHxdiagnosticsxdirectory

This specifies the directory in which the black hole diagnostics data files are to be written. If it doesn’t already exist, this directory is created before writing the data files. This parameter defaults to the value of the IO::out_dir parameter.

BHxdiagnosticsxbasexfilexname

This specifies the base file name for black hole diagnostics data files, as described above. This defaults to

"BH_diagnostics".
BHxdiagnosticsxfilexnamexextension

This specifies the file name extension for black hole diagnostics data files, as described above. This defaults

to "gp".

4.6 (Excision) Mask Parameters

This thorn can optionally set a mask grid function (or functions) at each point of the Cactus grid, to indicate where that point is with respect to the apparent horizon(s). This is usually used for excision.

 00setxmaskxforxallxhorizons
00setxmaskxforxindividualxhorizon[]

These Boolean parameters control whether AHFinderDirect should set a mask grid function(s):

     If the (C) expression set_mask_for_all_horizonsx||xset_mask_for_individual_horizon[i]

is true, then AHFinderDirect will set a mask grid function(s) for apparent horizon . All these parameters default to false (don’t set a mask).

If any of these parameters is set to true, you almost certainly also need to set the Boolean parameter SpaceMask::use_mask to true to to turn on storage for the mask grid function(s)!

If it’s setting a mask(s), AHFinderDirect partitions the Cactus grid into 3xregions: an “inside”, a “buffer”, and an “outside”. Typically the inner region is excised, but AHFinderDirect doesn’t itself do this: It just sets the mask(s); you need to use some other thorn(s) to do the actual excision.

The 3xregions are defined as follows: For a grid point a distance from horizonx’s local coordinate origin, with horizonx’s radius in this same direction (again, measured from its local coordinate origin) being

,10 ^{10Note that these are flat-space distances – the spacetime metric is not used here.} the regions are defined by where and where is the base-grid Cactus grid spacing (more precisely, the geometric mean of the base grid’s , , and Cactus grid

spacings)11 11The “base grid” part here only matters if you’re doing mesh refinement, in which case it’s necessary to keep excision consistent between the different refinement levels. .

 00maskxradiusxmultiplier
00maskxradiusxoffset
00maskxbufferxthickness

These parameters are used to define the radia and in equationx above.

Note that the sign convention here is that mask_radius_multiplier is multiplied by the horizon radius, then mask_radius_offset (scaled by the Cactus grid spacing) is added. Thus for use with excision (where the inner region – which will be excised – must be somewhat inside the horizon), mask_radius_multiplier should be a positive real number slightly less thanx1.0, and/or mask_radius_offset a negative real number.

The default values for these parameters are

mask_radius_multiplierx=xx0.8
mask_radius_offsetxxxxx=x-5.0
mask_buffer_thicknessxx=xx5.0

maskxisxnoshrink

This Boolean parameter specifies whether the inside and buffer regions should be prevented from ever shrinking during a time evolution (this is the default), or whether they should be set independently from one time step to the next (and thus allowed to either grow or shrink). More precisely, once a given grid point has been classified as inside, buffer, or outside, AHFinderDirect executes the following algorithm:

inside

buffer

    if (mask_is_noshrink && ())

then {

# this point was previously inside no-op here

} else

outside

    if (mask_is_noshrink && (() || ())

then {

# this point was previously inside or buffer no-op here

} else

minxhorizonxradiusxpointsxforxmask

By default, AHFinderDirect sets the mask for each apparent horizon found. If we’re using mesh refinement, it’s possible for an apparent horizon to be found on a coarse grid, and the masked region to be only a few grid points across on a fine grid. This causes some other Cactus thorns (eg. LegoExcision) to crash. :(

This parameter can be used to avoid this problem: For each apparent horizon that it finds, AHFinderDirect only sets the mask on a given grid if where is the minimum over all angles of as defined by equationx, and is the maximum of the Cactus , , andx grid spacings on the current Cactus

grid.12 12Note that this is the current Cactus grid spacing, not the base Cactus grid spacing that’s used when calculating and by equationx. If this condition isn’t satisfied, then AHFinderDirect skips setting the mask for this apparent horizon, just as if this apparent horizon wasn’t found. (Note that all other processing for an apparent horizon being found is still done, including writing output files, using the apparent horizon shape as the initial guess for the next time step’s apparent-horizon finding, etc.; it’s only the mask processing for this horizon (at this time step) that’s skipped.)

AHFinderDirect supports two types of mask grid functions; the following two Boolean parameters choose which of them you want to set; you can set either or even both of these:

setxoldxstylexmask

This parameter (default true) specifies an old-style excision mask, one stored in a CCTK_REAL Cactus grid function. (The AHFinder apparent horizon finder uses this type of mask.)

setxnewxstylexmask

This parameter (default false) specifies a new-style excision mask, one stored in a specified bit field of a CCTK_INT Cactus grid function. The bit field is specified by its name, as registered with the SpaceMask thorn. We plan to eventually convert all Cactus excision (and other uses of mask grid functions) to this scheme, but at the moment not much code supports it. Note that AHFinderDirect doesn’t itself create/register any bit fields or state names with SpaceMask – you must arrange for some other thorn(s) to do this.

For an old-style mask, the following parameters specify the mask grid function and how it should be set:

oldxstylexmaskxgridfnxname

This parameter specifies the mask grid function’s name.

 00oldxstylexmaskxinsidexvalue
00oldxstylexmaskxbufferxvalue
00oldxstylexmaskxoutsidexvalue

If an old-style mask is to be set in the corresponding regions, these parameters specify the values to which it should be set. These are all CCTK_REAL values.

For an new-style mask, the following parameters specify the mask grid function and how it should be set:

 00newxstylexmaskxgridfnxname
00newxstylexmaskxbitfieldxname

These parameters specify the mask grid function’s name and the bitfield name within it.

 00newxstylexmaskxinsidexvalue
00newxstylexmaskxbufferxvalue
00newxstylexmaskxoutsidexvalue

If an new-style mask is to be set in the corresponding regions, these parameters specify the values to which it should be set. These are all character-string state names, as registered with the SpaceMask thorn.

Note that AHFinderDirect doesn’t itself register any bitfields or states with SpaceMask – you must arrange for some other thorn(s) to do this before AHFinderDirect tries to find the horizon(s).

If AHFinderDirect sets a mask or masks, this happens in the same schedule bin(s) as the horizon finding. More precisely, AHFinderDirect creates two schedule groups for this purpose:

The schedule group group_for_mask_stuff is scheduled to run just after the horizon is found.

The schedule group group_where_mask_is_set is scheduled inside the schedule group

     group_for_mask_stuff.

The actual setting of the mask is scheduled inside the schedule group group_where_mask_is_set.

Thorn PreviousMask uses these schedule groups to keep a “previous” as well as a “current” mask. See that thorn’s thorn guide for further details.

4.7 Communicating with Other Thorns

Besides the data files it writes, AHFinderDirect currently has three ways to communicate with other Cactus thorns:

AHFinderDirect can set a mask grid function(s) based on the (a) horizon’s shape; other thorns may then use this for excision or other purposes. AHFinderDirect supports both the old-style (CCTK_REAL) mask (compatible with AHFinder) or the new-style (CCTK_INT) mask bit-fields defined by SpaceMask; you can even use both styles simultaneously.

AHFinderDirect can announce a selected horizon’s centroid position to another thorn (typically DriftCorrect, which uses this to adjust its corotating shift vector). This uses the new function-aliasing version of DriftCorrect, not the old version which worked with an auxiliary thorn AHFSetDCCentroid.

AHFinderDirect provides a set of aliased functions which any other thorn(s) can call to find out the shape of a specified horizon.

AHFinderDirect can store information about the horizon(s) it finds in the SphericalSurface variables for other thorns to use.

AHFinderDirect’s mask features are described in sectionx4.6; the other communication mechanisms are described in the following subsections.

4.7.1 Parameters for Announcing a Horizon Centroid to Other Thorns This thorn can optionally announce the centroid of a specified apparent horizon to another thorn (typically DriftCorrect) each time that apparent horizon is found. This is controlled by the following parameter:

whichxhorizonxtoxannouncexcentroid

This is an integer parameter which defaults to 0 (which means not to announce any centroid). If it’s set to a nonzero integer, that specifies the horizon number to have its centroid announced.

4.7.2 Aliased Functions to Provide Horizon-Shape Information

AHFinderDirect provides the following aliased functions to allow other thorns to find out about the horizons. Each function returns a status code which is xfor ok, or negative for an error.

#
#xThisxfunctionxreturnsxthexlocalxcoordinatexoriginxforxaxgivenxhorizon.
#
CCTK_INTxFUNCTIONxHorizonLocalCoordinateOriginxxxxxxxxxxxxxxxxxxxxxxxxxx\
xxx(CCTK_INTxINxhorizon_number,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\
xxxxCCTK_REALxOUTxorigin_x,xCCTK_REALxOUTxorigin_y,xCCTK_REALxOUTxorigin_z)
#
#xThexfollowingxfunctionxqueriesxwhetherxorxnotxthexspecifiedxhorizon
#xwasxfoundxthexmostxrecentxtimexAHFinderDirectxsearchedxforxit.
#xThexreturnxvaluexis:
#xx1xifxthexhorizonxwasxfound
#xx0xifxthexhorizonxwasxnotxfound
#xxnegativexforxanxerror
#
CCTK_INTxFUNCTIONxHorizonWasFound(CCTK_INTxINxhorizon_number)
#
#xThexfollowingxfunctionxcomputesxthexhorizonxradiusxinxthexdirection
#xofxeachx(x,y,z)xpoint,xorx-1.0xifxthisxhorizonxwasn'txfoundxthexmost
#xrecentxtimexAHFinderDirectxsearchedxforxit.xxMorexprecisely,xforxeach
#x(x,y,z),xconsiderxthexrayxfromxthexlocalxcoordinatexoriginxthrough
#x(x,y,z).xxThisxfunctionxcomputesxthexEuclideanxdistancexbetweenxthe
#xlocalxcoordinatexoriginxandxthisxray'sxintersectionxwithxthexhorizon,
#xorx-1.0xifxthisxhorizonxwasn'txfoundxthexmostxrecentxtimexAHFinderDirect
#xsearchedxforxit.
#
#xIfxthisxfunctionxisxtoxbexusedxinxaxmultiprocessorxrunxonxaxhorizon
#xwhichxwasxfoundxonxsomexotherxprocessor,xthexparameter
#xxxAHFinderDirect::always_broadcast_horizon_shape
#xmustxbexsetxtoxtruextoxgetxthexcorrectxanswer.
#
CCTK_INTxFUNCTIONxHorizonRadiusInDirectionxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\
xxx(CCTK_INTxINxhorizon_number,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\
xxxxCCTK_INTxINxN_points,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\
xxxxCCTK_REALxINxARRAYxx,xCCTK_REALxINxARRAYxy,xCCTK_REALxINxARRAYxz,xxx\
xxxxCCTK_REALxOUTxARRAYxradius)

4.7.3 Storing Horizon-Shape Information in the SphericalSurface Variables

SphericalSurface (in the AEIThorns arrangement) defines a set of generic grid arrays which describe “spherical surfaces”. AHFinderDirect can optionally store information about the horizons it finds in the SphericalSurface variables. This is controlled by the following parameters:

whichxsurfacextoxstorexinfo[]

This parameter should be set to the SphericalSurface surface number into which information on a given AHFinderDirect horizon should be stored, or to -1 to skip storing the information. It defaults to -1 for each horizon.

Note that SphericalSurface numbers surfaces starting from 0, whereas AHFinderDirect numbers horizons starting from 1!

At present, if multiple AHFinderDirect horizons specify the same SphericalSurface surface, the highest-numbered horizon will “win”, i.e. it will overwrite the data from any lower-numbered horizons.

4.8 Other Parameters

00runxatxCCTKxANALYSIS
00runxatxCCTKxPOSTSTEP
00runxatxCCTKxPOSTINITIAL
00runxatxCCTKxPOSTxRECOVERxVARIABLES

These parameters (which default to true, false, false, and true respectively) control which schedule bins AHFinderDirect runs in. Historically, AHFinderDirect ran in CCTKxANALYSIS, and that’s still the default, but these parameters allow you to change this so it runs in CCTKxPOSTSTEP and/or CCTKxPOSTINITIAL instead. (You can even run in all three bins if you want!)

In general we need to run at CCTKxPOSTxRECOVERxVARIABLES, since

parameters may have been steered at recovery, so we may need to find a new horizon or horizons, and

we need to set the mask again to make sure it’s correct right away (since our next regular horizon-finding may not be until some time steps later)

Therefore the run_at_CCTK_POST_RECOVER_VARIABLES parameter should probably be left at its default setting of true.

00geometryxinterpolatorxname
00geometryxinterpolatorxpars

These parameters control the (3-D) “geometry interpolation” of the spacetime geometry ( and , or their StaticConformal equivalents) to the apparent horizon position. The defaults are set to use a quadratic Hermite interpolator. This works fairly well, but because of the interpolator molecule size you must use .

If you want to get very high accuracy from AHFinderDirect, then you should use a cubic Hermite geometry interpolator, by setting

AHFinderDirect::geometry_interpolator_parsx=x"
xxorder=3
xxboundary_off_centering_tolerance={1.0e-10x1.0e-10x1.0e-10x1.0e-10x1.0e-10x1.0e-10}
xxboundary_extrapolation_tolerance={0.0x0.0x0.0x0.0x0.0x0.0}
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Assuming perfectly accurate geometry variables in the 3-D Cactus grid, this will make AHFinderDirect (very) roughly an order of magnitude more accurate. However, the larger molecule size will make it about a factor of 2–3xslower, and will also require that you set . The sample parameter file par/Kerr-order3.par shows an example of this.

Nxzonesxperxrightxangle[]

This parameter sets the angular resolution used to compute each patch. The units are the number of angular grid zones per right angle. The default is 18, i.e. a 5xdegree angular resolution. There’s no problem with this parameter varying from one horizon to another, but for simplicity it should be

even.13 13More precisely, it must be even for any horizon whose patch system type is anything other than "full sphere". See the comments in param.ccl for further information.

For any horizon which is close to spherical about its local coordinate origin, you can lower this parameter to make AHFinderDirect run faster (typical run-times scale roughly as the cube of this parameter); 6xis about the minimum reasonable value.

For any horizon which is highly non-spherical about its local coordinate origin, you can raise this parameter to get better resolution; 30xshould be enough for even a highly non-spherical horizon.

maxxallowablexhorizonxradius[]

This parameter gives the maximum mean-coordinate-radius which any given trial surface may have in the course of trying to solve the apparent horizon

equation.14 14Note that this is an unweighted arithmetic mean over the horizon-surface grid points, the same value which is printed as rxgrid during the horizon-finding iterations. In particular, if any trial surface has a mean coordinate radius which exceeds this parameter, AHFinderDirect gives up and deems this apparent horizon to be “not found”.

This parameter defaults to (effectively ) for each apparent horizon. You can set it to a smaller value to make AHFinderDirect a bit more efficient, or (probably more important in practice) to stop AHFinderDirect from iterating off the edge of the grid if this causes problems with interpolation or boundary conditions.

maxxallowablexTheta

This parameter gives the maximum which any given trial surface may have in the course of trying to solve the apparent horizon equation. In particular, if any trial surface has exceeding this parameter, AHFinderDirect gives up and deems this apparent horizon to be “not found”. This parameter defaults to (effectively ) for each apparent horizon.

surfacexexpansion[]

This parameter (which defaults to 0.0) sets the expansion of each surface. With the default setting this thorn solvesx to find apparent horizons. With other settings of this parameter this thorn can be used to find “surfaces of constant expansion”; these may be useful for excision, wave extraction, or other purposes ([?]). To help in choosing the value(s) of the surface_expansion[] parameter, figurex1 (from [?]), shows the expansion of surfaces in an Eddington-Finkelsteon slice of the unit-mass Schwarzschild spacetime.

PIC

Figurex1: This figure shows the expansion for surfaces in an Eddington-Finkelstein slice of the unit-Mass Schwarzschild Spacetime.

5 Monitoring AHFinderDirect’s Status

There are two primary ways of monitoring what AHFinderDirect is doing during a Cactus run: the BH_diagnostics files and the CCTK_INFO messages written to the Cactus standard output:

The BH_diagnostics files are described in detail in sectionx4.5. These files are written and “flushed” at each time step, so they’re always up-to-date.

During the apparent-horizon–finding process, AHFinderDirect writes various CCTK_INFO messages describing the convergence of the iterative solution of the apparent horizon equationx?? on each processor. In particular, if verbose_level is set to "algorithmxhighlights" or a more verbose setting (cf.xsectionx4.1), then AHFinderDirect writes CCTK_INFO messages like these:

INFOx(AHFinderDirect):xxxxprocx0/horizonx1:itx1xr_grid=0.595x||Theta||=1.1e-01
INFOx(AHFinderDirect):xxxxprocx0/horizonx1:itx2xr_grid=0.614x||Theta||=7.2e-02
INFOx(AHFinderDirect):xxxxprocx0/horizonx1:itx3xr_grid=0.632x||Theta||=2.9e-02
INFOx(AHFinderDirect):xxxxprocx0/horizonx1:itx4xr_grid=0.642x||Theta||=9.9e-04
INFOx(AHFinderDirect):xxxxprocx0/horizonx1:itx5xr_grid=0.642x||Theta||=7.9e-07
INFOx(AHFinderDirect):xxxxprocx0/horizonx1:itx6xr_grid=0.642x||Theta||=7.2e-13
INFOx(AHFinderDirect):xAHx1/2:xr=0.660716xatx(0.000000,0.000000,1.127434)
INFOx(AHFinderDirect):xAHx1/2:xarea=338.0473838xm_irreducible=2.59330658
INFOx(AHFinderDirect):xwritingxhxtox"misner.h.t0.ah1.gp"

Here r_grid is a rough estimate of the mean radius of the trial surface at each iteration, and ||Theta|| is the infinity-norm of , the left hand side of the apparent horizon equationx?? over the surface. Once the apparent horizon has been found (||Theta|| is sufficiently small), then AHFinderDirect prints its mean

radius,15 15Note that this may differ significantly from the last iterations’ estimated radius. This is because the mean radius printed during the iterations is only a rough estimate (it’s the unweighted arithmetic mean of the radius at all the horizon-surface grid points), while the radius printed after the horizon is found is a more accurate value (it’s computed via numerical integrals over the surface, taking into account the induced metric). centroid position, area, and irreducible mass.

6 Visualization

There are several ways to visualize AHFinderDirect’s output:

The simplest is to plot various quantities from the BH_diagnostics files (described in detail in sectionx4.5). For example, using gnuplot (http://www.gnuplot.info), you can plot a graph of the surface area of horizon #4 as a function of coordinate time, with the command

plotx'BH_diagnostics.ah4.gp'xusingx2:26xwithxpoints
 ygraph (http://www.aei.mpg.de/~pollney/ygraph/) may also be able to directly plot the BH_diagnostics

files. Given a horizon-shape data file h.t105.h4.gp, the gnuplot command

splotx'h.t105.h4.gp'xwithxlines

will plot the function, with the and xaxes of the plot being the two “unwrapped” angular coordinates on , in degrees, and the xaxis being . However, in practice this usually isn’t very informative. Instead, you probably want the gnuplot command

splotx'h.t105.h4.gp'xusingx4:5:6xwithxlines

which will plot the 3-D shape of the apparent horizon surface.

The src/misc directory of the AHFinderDirect source code contains several perl scripts which are useful in visualizing AHFinderDirect output. In particular, the script select.plane selects a particular 2-D plane. If you put this in your Unix path, it can be used with a gnuplot command like

splotx'<select.planexxyx<h.t105.h4.gp'xusingx4:5xwithxlines

to show the shape of an apparent horizon in the xy

plane.16 16Note that this script isn’t very smart: it doesn’t know about the AHFinderDirect local coordinate origin. That is, for example, if you select the plane, you’re selecting the global plane ().

Another Visualization option is OpenDX (http://www.opendx.org/). Thomas Radke’s has written some OpenDX macros ImportAHFinderDirectGnuplot.net and ImportAHFinderDirectGnuplotPatch.net to import AHFinderDirect horizon-shape data files. These macros use a set of “control files” named *.dx, one per horizon, which AHFinderDirect (by default) writes into the same directory as the main horizon–shape output files. You can get these macros by anonymous CVS with the command

cvsx-dx:pserver:cvs_anon@cvs.aei.mpg.de:/numrelcvsx\
xxxxxcheckoutxAEIPhysics/Visualization/OpenDX

Another Visualization option is to produce files in the standard Xdmfx[?] file format which can be visualized for example using VisItx[?]. Frank Lxffler has written a python script AH2xdmf.py, which is included in this thorn’s code repository, which generates such files from AHFinderDirect’s output from horizon shape files h.t%d.ah%d.gp\. Please see its help text for details.

7 Accuracy

The apparent horizon positions are typically computed very accurately; tests on Kerr spacetimes give typical errors of to .

The various diagnostics printed to standard output and written to the black hole diagnostics file(s), are typically computed to accuracies on the order of a part per million or so.

Note, however, that the irreducible mass may differ considerably from the black hole’s local mass or its contribution to the slice’s ADM mass. For example, for Kerr spacetime in Kerr-Schild coordinates, , , and for spin parameters , , and , respectively. It would be better to (also) use the “isolated horizons” formalism of [?]; at some point this thorn may be enhanced to do this.

8 Examples

There are a few example parameter files in the par/ directory, including Kerr initial data, Misner initial data, and Misner time-evolution tests. The Kerr-tiny.par parameter file is close to a minimal AHFinderDirect example:

#xThisxparameterxfilexsetsxupxKerr/Kerr-Schildxinitialxdata,xthen
#xfindsxthexapparentxhorizonxinxit.xxThexlocalxcoordinatexsystemxorigin
#xandxthexinitialxguessxarexbothxdeliberatelyxde-centeredxwithxrespect
#xtoxthexblackxhole,xtoxmakexthisxaxnon-trivialxtestxforxthexapparent
#xhorizonxfinder.
#
#xThisxparameterxfilexisx"tiny"xinxthexsensexthatxitxsetsxonlyxa
#xsmallxnumberxofxAHFinderDirectxparameters.
#xflesh
cactus::cctk_itlastx=x0
ActiveThornsx=x"PUGH"
driver::ghost_sizex=x2
driver::global_nxx=x31
driver::global_nyx=x31
driver::global_nzx=x19
ActiveThornsx=x"CoordBasexCartGrid3D"
grid::domainx=x"bitant"
grid::avoid_originx=xfalse
grid::typex=x"byspacing"
grid::dxyzx=x0.2
ActiveThornsx=x"ADMBasexADMCouplingxStaticConformalxSpacemaskxCoordGaugexExact"
ADMBase::initial_lapsex=x"exact"
ADMBase::initial_shiftx=x"exact"
ADMBase::initial_datax=x"exact"
ADMBase::lapse_evolution_methodx=x"static"
ADMBase::shift_evolution_methodx=x"static"
ADMBase::metric_typex=x"physical"
Exact::exact_modelx=x"Kerr/Kerr-Schild"
Exact::Kerr_KerrSchild__massx=x1.0
Exact::Kerr_KerrSchild__spinx=x0.6
########################################
ActiveThornsx=x"IOUtil"
IOUtil::parfile_writex=x"no"
########################################
ActiveThornsx=x"SphericalSurface"
ActiveThornsx=x"AEILocalInterpxPUGHInterpxPUGHReducexAHFinderDirect"
AHFinderDirect::h_base_file_namexxxxx=x"Kerr-tiny.h"

AHFinderDirect::N_horizonsx=x1
AHFinderDirect::origin_x[1]x=x0.5
AHFinderDirect::origin_y[1]x=x0.7
AHFinderDirect::origin_z[1]x=x0.0
AHFinderDirect::initial_guess_method[1]x=x"coordinatexsphere"
AHFinderDirect::initial_guess__coord_sphere__x_center[1]x=x-0.2
AHFinderDirect::initial_guess__coord_sphere__y_center[1]x=xx0.3
AHFinderDirect::initial_guess__coord_sphere__z_center[1]x=xx0.0
AHFinderDirect::initial_guess__coord_sphere__radius[1]x=x2.0

9 Surfaces of Constant Expansion

Surfaces of Constant Expansion (CE surfaces) are introduced in [?] as a generalisation of apparent horizons (AH). On an AH surface, the expansion is zero everywhere. On a CE surfaces, the expansion is still everywhere the same, but it need not be zero. CE surfaces are also a generalisation of Constant Mean Curvature surfaces (CMC surfaces); both are identical when the extrinsic curvature vanishes. As described in [?], it is likely that CE surfaces foliate the spacelike hypersurface outside of some interior region. This interior region is inside the common apparent horizon, if it exists.

CE surfaces can give some insight into the spacetime, because they can be used to analyse the part of the spacelike hypersurface “between the horizons and infinity”. Most notably, they can be used to look at the region where a common horizon is about to (or believed to) form. Similarly, one can use them for collapsing stars where an apparent horizon has not yet formed.

10 Pretracking

Apparent horizon pretracking is introduced in [?]. This is an application of CE surfaces. Even when there is no common horizon, there are still common CE surfaces surrounding multiple black holes. Pretracking consists of tracking in time the smallest common CE surface that can be found. It is reasonable to believe that this surface will evolve into the common horizon at the time where this common horizon begins to exist. The expansion of this smallest CE surface is also an indication of how close the spacelike hypersurface is to having a common apparent horizon.

11 How AHFinderDirect Works

AHFinderDirect uses the apparent horizon (henceforth “horizon”) finding algorithm of [?], modified slightly to work with and on a Cartesian () grid. The algorithm is described in detail in [?].

11.1 General Description of the Algorithm

As described above, I parameterizes the horizon shape by for some single-value function . The apparent horizon equationx then becomes a 2-D elliptic PDE on for the function . I finite difference this in angle to obtain a system of simultaneous nonlinear algebraic equations for at the angular grid points, and solve this system of equations by a global Newton’s method (or a variant with improved convergence).

Computationally, this algorithm has 3 main parts:

Computation of the “horizon function” given a trial surface defined by a trial horizon shape function . This is done by interpolating the Cactus geometry fields and (and optionally ) from the 3-D grid to the (2-D set of) trial-horizon-surface grid points (also computing in the interpolation process), then doing all further computations with angular grid functions defined solely on (i.e. at the horizon-surface grid points).

Computation of the Jacobian matrix of . This thorn incorporates the “symbolic differentiation” technique described in [?], so this computation is quite fast. The Jacobian is a highly sparse matrix; AHFinderDirect has code to store it as either a dense matrix (for debugging purposes), or a sparse matrix (the default). Which option is used is determined by a compile-time configuration in

src/include/config.h.

Solving the nonlinear equations by a global Newton’s method or a variant. How this is done depends on how the Jacobian is stored. At present,

If AHFinderDirect is configured to store the Jacobian as a dense matrix, then LAPACK is used to solve the linear equations.

If AHFinderDirect is configured to store the Jacobian as a sparse matrix, then an incomplete--decomposition–conjugate-gradient solver is used.

By default only the sparse-matrix code is configured, so LAPACK isn’t used and there’s no need to link with the LAPACK library.

11.2 The Multipatch System

Perhaps the most unusual feature of AHFinderDirect is the “multipatch” system used to cover without coordinate singularities. In general there are 6xpatches, one each covering a neighborhood of the , , and axes, but this may be reduced in the presence of suitable symmetries. For example, figurex2 on pagex40 shows a system of 3xpatches covering the xoctant of . This would be suitable for finding an apparent horizon with mirror symmetry about the (local) xplane, and either 90xdegree periodic rotation symmetry about the (local) xaxis, or mirror symmetry about each of the (local) xand xaxes.

PIC Figurex2: This figure shows a multipatch system covering the xoctant of the unit spherex with 3xpatches. The angular resolution is 5xdegrees. Notice that the patches overlap by several “ghost zone” grid points.

To allow easy angular finite differencing within the patch system, each patch is extended beyond its nominal extent by a

“ghost zone”17 17Note that this terminology differs somewhat from that used by Cactus in general; Cactus would call these “patch zones” or “symmetry zones”. (2xgrid points wide in figurex2). Angular grid function values in the ghost zone can be obtained by interpatch

interpolation18 18Due to the way the patch coordinates are defined, adjacent patches always share a common “perpendicular” angular coordinate, so only 1-D interpolation is needed here. or by applying symmetry operations. Once this is done, then angular finite differencing within the nominal extent of each patch can proceed normally, ignoring the patch boundaries. AHFinderDirect can be configured at compile time to use either 2ndxorder or 4thxorder angular finite differencing (3xpoint or 5xpoint angular molecules); the default is 4thxorder (5xpoint). This is configured at compile time in

src/include/config.h.

By default AHFinderDirect will automagically choose a patch system type for each apparent horizon searched for, based on the local coordinate origin and the symmetries implicit in the Cactus grid type. This generally works well, but if desired you can instead manually specify the patch system type, the angular resolution, the width of the ghost zones, etc. See the param.ccl file for details.

11.3 Other Software Used

AHFinderDirect’s src/sparse-matrix/ directory contains various sparse-matrix libraries, which have their own copyrights and licensing terms:

The src/sparse-matrix/umfpack/ directory contains a subset of the files in UMFPACK version 4.0 (11.Apr.2002). This code is copyrightx(©)x2002 by Timothy A. Davis, and is subect to the UMFPACK License:

YourxusexorxdistributionxofxUMFPACKxorxanyxmodifiedxversionxof
UMFPACKximpliesxthatxyouxagreextoxthisxLicense.
THISxMATERIALxISxPROVIDEDxASxIS,xWITHxABSOLUTELYxNOxWARRANTY
EXPRESSEDxORxIMPLIED.xxANYxUSExISxATxYOURxOWNxRISK.
Permissionxisxherebyxgrantedxtoxusexorxcopyxthisxprogram,xprovided
thatxthexCopyright,xthisxLicense,xandxthexAvailabilityxofxthexoriginal
versionxisxretainedxonxallxcopies.xxUserxdocumentationxofxanyxcodexthat
usesxUMFPACKxorxanyxmodifiedxversionxofxUMFPACKxcodexmustxcitexthe
Copyright,xthisxLicense,xthexAvailabilityxnote,xandx"Usedxbyxpermission."
Permissionxtoxmodifyxthexcodexandxtoxdistributexmodifiedxcodexisxgranted,
providedxthexCopyright,xthisxLicense,xandxthexAvailabilityxnotexare
retained,xandxaxnoticexthatxthexcodexwasxmodifiedxisxincluded.xxThis
softwarexwasxdevelopedxwithxsupportxfromxthexNationalxSciencexFoundation,
andxisxprovidedxtoxyouxfreexofxcharge.

12 Other Related Thorns

If you’re interested in AHFinderDirect, you might also be interested in some other related thorns:

EHFinder

(in the AEIDevelopment arrangement) was written by Peter Diener, and finds the event horizon(s) in a numerically computed spacetime. It’s described in detail in the paperx[?].

AHFinder

(in the CactusEinstein arrangement) was written by Miguel Alcubierre, and includes two different algorithms for finding apparent horizons, a minimization method and a “fast flow” method based on [?]. Unfortunately, both methods are very slow in practice.

TGRapparentHorizon2D

(in the TAT arrangement) was written by Erik Schnetter, and is another apparent horizon finder. It uses methods very similar to this thorn, and (like this thorn) is very fast and accurate. However, it’s no longer under active development. It’s described in detail in the papersx[?] andx[?].

AHFinderDirect (Erik branch)

(in the AEIThorns arrangement)

Erik Schnetter has added a number of new features to AHFinderDirect on a CVS branch with the tag Erik, including horizon pretracking (to locate places where horizons are about to form), and the ability to find constant-expansion and constant-mean-curvature surfaces specified by their areal radius. We hope to integrate these into the main AHFinderDirect branch during the summer of 2004.

13 Acknowledgments

I thank Peter Diener, Ian Hawke, and Erik Schnetter for many valuable conversations. I think Thomas Radke for his work on the new interpolators. I thank the whole Cactus crew for a great infrastructure!

Erik Schnetter originally implemented a number of improvements to this thorn, notably the SphericalSurface interface and the new features in the Erik branch.

I thank the Alexander von Humboldt foundation and the AEI visitors’ and postdoctoral fellowships programs for financial support.

14 Parameters

11asciixgnuplotxfilexnamexextension 10Scope: privatex01 STRING

11Description: extension for ASCII (gnuplot) data files

11 Range 10 x01 Default: gp
11.+  10any nonempty string

11

11bhxdiagnosticsxbasexfilexname  10Scope: privatex01  STRING

11Description: base file name for BH diagnostics output file(s)

11 Range 10 x01 Default: BHxdiagnostics
11.+  10any nonempty string

11bhxdiagnosticsxdirectory  10Scope: privatex01  STRING

11Description: directory for BH diagnostics output file(s)

11 Range 10 x01 Default: (none)
11.+  10any nonempty string
11ˆ$  10an empty string to default to IO::outxdir

11

11bhxdiagnosticsxfilexnamexextension  10Scope: privatex01  STRING

11Description: extension for BH diagnostics data files

11 Range 10 x01 Default: gp
11.+  10any nonempty string

11

11checkxthatxgeometryxisxfinite  10Scope: privatex01  BOOLEAN

11Description: should we check the interpolated geometry variables are finite?

11                                   10  x01  Default: true

11

11checkxthatxhxisxfinite  10Scope: privatex01  BOOLEAN

11Description: should we check that horizon shape function h is finite?

11                                   10  x01  Default: true

11

11coordinatexsystemxname  10Scope: privatex01  STRING

11Description: name under which the coordinate system is registered in Cactus

11 Range 10 x01 Default: cart3d
11.+  10any nonempty string

11

11debuggingxoutputxatxeachxnewtonxiteration 10Scope: privatex01  BOOLEAN

11Description: should we output {h, Theta, deltaxh} at each Newton iteration?

11                                   10  x01  Default: false

11

11deltaxhxbasexfilexname  10Scope: privatex01  STRING

11Description: base file name for horizon-shape-update Deltaxh output file(s)

11 Range 10 x01 Default: Deltaxh
11.+  10any nonempty string

11

11dependsxon  10Scope: privatex01  INT

11Description: the other horizon that this horizon depends on

11 Range 10 x01 Default: (none)
11                                   10the horizon is independent
111:100  10horizon index

11

11desiredxvalue  10Scope: privatex01  REAL

11Description: search for a surface with this (constant) value

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11desiredxvaluexfactor  10Scope: privatex01  REAL

11Description: factor between this horizon’s and the other horizon’s desired value, applied before the offset

11  Range  10  x01  Default: 1.0

11*:*  10

11desiredxvaluexoffset  10Scope: privatex01  REAL

11Description: difference between this horizon’s and the other horizon’s desired value, applied after the factor

11  Range  10  x01  Default: 0.0

11*:*  10

11

11disablexhorizon  10Scope: privatex01  BOOLEAN

11Description: should this horizon be disabled?

11                                   10  x01  Default: false

11

11dontxfindxafterxindividual  10Scope: privatex01  INT

11Description: when should we stop finding individual apparent horizons?

11 Range 10 x01 Default: -1
110:*  10after this iteration (exclusively)
11-1  10do not use this parameter

11

11dontxfindxafterxindividualxtime  10Scope: privatex01  REAL

11Description: when should we stop finding individual apparent horizons?

11 Range 10 x01 Default: 0.0
11*:*  10”after this time (exclusively); ignore this value if it is less than or equal to findxafterxindividua lxtime”

11

11findxafterxindividual  10Scope: privatex01  INT

11Description: when should we start to find individual apparent horizons?

11 Range 10 x01 Default: (none)
110:*  10after this iteration (inclusively)

11

11findxafterxindividualxtime  10Scope: privatex01  REAL

11Description: when should we start to find individual apparent horizons?

11 Range 10 x01 Default: 0.0
11*:*  10after this time (inclusively)

11

11findxevery  10Scope: privatex01  INT

11Description: how often should we try to find apparent horizons?

11 Range 10 x01 Default: 1
11                                   10don’t find AHs at all (this thorn is a no-op)
111:*  10any integer >= 1

11

11findxeveryxindividual  10Scope: privatex01  INT

11Description: how often should we try to find individual apparent horizons? (overrides findxevery)

11 Range 10 x01 Default: -1
11-1  10use the value of findxevery
11                                   10don’t find this AH at all
111:*  10any integer >= 1

11

11geometryxxschwarzschildxefxxdeltaxxyz 10Scope: privatex01  REAL

11Description: finite diff pseuo-grid spacing for computing partialxk gxij

11 Range 10 x01 Default: 1.0e-6
11(0.0:*  10any real number > 0

11

11geometryxxschwarzschildxefxxepsilon 10Scope: privatex01  REAL

11Description: threshold for sinˆ2 theta = (xˆ2 +yˆ2 )/rˆ2 below which we use z axis limits

11 Range 10 x01 Default: 1.0e-9
11(0.0:*  10this should be somewhat above the floating-point roundoff level

11geometryxxschwarzschildxefxxmass  10Scope: privatex01  REAL

11Description: mass of Schwarzschild BH

11 Range 10 x01 Default: 1.0
11(0.0:*  10BH mass = any real number > 0

11

11geometryxxschwarzschildxefxxxxposn 10Scope: privatex01  REAL

11Description: x coordinate of Schwarzschild BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11geometryxxschwarzschildxefxxyxposn 10Scope: privatex01  REAL

11Description: y coordinate of Schwarzschild BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11geometryxxschwarzschildxefxxzxposn 10Scope: privatex01  REAL

11Description: z coordinate of Schwarzschild BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11geometryxinterpolatorxname  10Scope: privatex01  STRING

11Description: name under which the geometry interpolation operator is registered in Cactus

11 Range 10 x01Default: Hermite polynomial interpolation
11.+  10any nonempty string

11

11geometryxinterpolatorxpars  10Scope: privatex01  STRING

11Description: parameters for the geometry interpolator

11 Range 10 x01Default: order=2 boundaryxoffxcenteringxtolerance={1.0e-10 1.0e-10 1.0e-10 1.0e-10 1.0e-10 1.0e-10} boundaryxextrapolationxtolerance={0.0 0.0 0.0 0.0 0.0 0.0}
11.*  10”any string acceptable to UtilxTableSetFromStr ing() and to the interpolator”

11

11ghostxzonexwidth  10Scope: privatex01  INT

11Description: number of ghost zones on each side of a patch

11 Range 10 x01 Default: 2
110:*  10any integer >= 0

11

11hxbasexfilexname  10Scope: privatex01  STRING

11Description: base file name for horizon shape h input/output file(s)

11 Range 10 x01 Default: h
11.+  10any nonempty string

11

11hxdirectory  10Scope: privatex01  STRING

11Description: directory for horizon shape and other similar output (or input) file(s)

11 Range 10 x01 Default: (none)
11.+  10any nonempty string
11ˆ$  10an empty string to default to IO::outxdir

11hxminxdigits  10Scope: privatex01  INT

11Description: minimum number of digits for the iteration number in the file name

11  Range  10  x01  Default: (none)

110:*  10

11

11hardwirexschwarzschildxefxgeometry 10Scope: privatex01  BOOLEAN

11Description: should we hard-wire the geometry to Schwarzschild/EF instead of interpolating from the Cactus grid?

11                                   10  x01  Default: false

11

11hdf5xfilexnamexextension  10Scope: privatex01  STRING

11Description: extension for HDF5 data files

11 Range 10 x01 Default: h5
11.+  10any nonempty string

11

11ilucgxxerrorxtolerance  10Scope: privatex01  REAL

11Description: error tolerance for conjugate gradient iteration

11 Range 10 x01 Default: 1.0e-10
11(*:0.0)  10negative ==> scale the absolute value by the floating point roundoff threshold, e.g. -256.0 means to allow the last 8 bits of the solution to be in error

11(0.0:*)  10positive ==> error tolerance

11

11ilucgxxlimitxcgxiterations  10Scope: privatex01  BOOLEAN

11Description: should we limit the maximum number of conjugate gradient iterations allowed?

11 Range 10 x01 Default: true
11false  10no limit on CG iterations
11true  10limit to Neqns CG iterations

11

11initialxguessxxcoordxellipsoidxxxxcenter 10Scope: privatex01  REAL

11Description: x coordinate of ellipsoid center

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxcoordxellipsoidxxxxradius 10Scope: privatex01  REAL

11Description: x radius of ellipsoid

11 Range 10 x01 Default: 2.0
11(0.0:*  10any real number > 0.0

11

11initialxguessxxcoordxellipsoidxxyxcenter 10Scope: privatex01  REAL

11Description: y coordinate of ellipsoid center

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxcoordxellipsoidxxyxradius 10Scope: privatex01  REAL

11Description: y radius of ellipsoid

11 Range 10 x01 Default: 2.0
11(0.0:*  10any real number > 0.0

11

11initialxguessxxcoordxellipsoidxxzxcenter 10Scope: privatex01  REAL

11Description: z coordinate of ellipsoid center

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11initialxguessxxcoordxellipsoidxxzxradius 10Scope: privatex01  REAL

11Description: z radius of ellipsoid

11 Range 10 x01 Default: 2.0
11(0.0:*  10any real number > 0.0

11

11initialxguessxxcoordxspherexxradius  10Scope: privatex01  REAL

11Description: radius of sphere

11 Range 10 x01 Default: 2.0
11(0.0:*  10any real number > 0.0

11

11initialxguessxxcoordxspherexxxxcenter 10Scope: privatex01  REAL

11Description: x coordinate of sphere center

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxcoordxspherexxyxcenter 10Scope: privatex01  REAL

11Description: y coordinate of sphere center

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxcoordxspherexxzxcenter 10Scope: privatex01  REAL

11Description: z coordinate of sphere center

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxkerrxkerrxxmass  10Scope: privatex01  REAL

11Description: mass of Kerr BH

11 Range 10 x01 Default: 1.0
11(0.0:*  10BH mass = any real number > 0

11

11initialxguessxxkerrxkerrxxspin  10Scope: privatex01  REAL

11Description: dimensionless spin a=J/mˆ2 of Kerr BH

11 Range 10 x01 Default: 0.6
11(-1.0:1.0)  10dimensionless BH spin = J/mˆ2 = any real number with absolute value < 1

11

11initialxguessxxkerrxkerrxxxxposn  10Scope: privatex01  REAL

11Description: x coordinate of Kerr BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxkerrxkerrxxyxposn  10Scope: privatex01  REAL

11Description: y coordinate of Kerr BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxkerrxkerrxxzxposn  10Scope: privatex01  REAL

11Description: z coordinate of Kerr BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11initialxguessxxkerrxkerrschildxxmass 10Scope: privatex01  REAL

11Description: mass of Kerr BH

11 Range 10 x01 Default: 1.0
11(0.0:*  10BH mass = any real number > 0

11

11initialxguessxxkerrxkerrschildxxspin  10Scope: privatex01  REAL

11Description: dimensionless spin a=J/mˆ2 of Kerr BH

11 Range 10 x01 Default: 0.6
11(-1.0:1.0)  10dimensionless BH spin = J/mˆ2 = any real number with absolute value < 1

11

11initialxguessxxkerrxkerrschildxxxxposn 10Scope: privatex01  REAL

11Description: x coordinate of Kerr BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxkerrxkerrschildxxyxposn 10Scope: privatex01  REAL

11Description: y coordinate of Kerr BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxkerrxkerrschildxxzxposn 10Scope: privatex01  REAL

11Description: z coordinate of Kerr BH

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11initialxguessxxreadxfromxnamedxfilexxfilexname 10Scope: privatex01  STRING

11Description: file name to read initial guess from

11 Range 10 x01 Default: h.gp
11.+  10file name to read initial guess from

11

11initialxguessxmethod  10Scope: privatex01  KEYWORD

11Description: method used to set up initial guess for apparent horizon shape

11 Range 10 x01 Default: coordinate sphere
11read from named file  10read from explicitly-named input file
11read from h file  10read from input file named the same as the (later) h output file
11Kerr/Kerr  10set to the (analytical) horizon of Kerr spacetime in Kerr coordinates (n.b. Schwarzschild/EF is the special case spin=0 of this)

11Kerr/Kerr-Schild  10set to the (analytical) horizon of Kerr spacetime in Kerr-Schild coordinates
11coordinate sphere  10set to a coordinate sphere
11coordinate ellipsoid  10set to a coordinate ellipsoid

11integralxmethod  10Scope: privatex01  KEYWORD

11Description: how do we compute integrals over the horizon?

11 Range 10 x01 Default: automatic choice
11trapezoid  10alternate name for trapezoid rule
11trapezoid rule  10trapezoid rule (2nd order for smooth functions)
11Simpson  10alternate name for Simpson’s rule
11Simpson’s rule  10Simpson’s rule (4th order for smooth fns, requires N to be even)
11Simpson (variant)  10alternate name for Simpson’s rule variant
11see [1] below  10Simpson’s rule variant (4th order for smooth fns, requires N >= 7)
11automatic choice  10choose Simpson’s rule or variant if applicable, otherwise trapezoid rule

11

Simpson'sxrulex(variant)

11interpatchxinterpolatorxname  10Scope: privatex01  STRING

11Description: name under which the interpatch interpolation operator is registered in Cactus

11 Range 10 x01Default: Lagrange polynomial interpolation
11.+  10any string (in practice it should be nonempty)

11

11interpatchxinterpolatorxpars  10Scope: privatex01  STRING

11Description: parameters for the interpatch interpolator

11 Range 10 x01 Default: order=5
11.*  10”any string acceptable to UtilxTableSetFromStr ing() and to the interpolator”

11

11jacobianxbasexfilexname  10Scope: privatex01  STRING

11Description: base file name for Jacobian output file(s)

11 Range 10 x01 Default: Jacobian.dat
11.+  10any valid file name

11

11jacobianxcomputexmethod  10Scope: privatex01  KEYWORD

11Description: how do we compute the Jacobian matrix?

11 Range 10 x01Default: symbolic differentiation with finite diff d/dr
11see [1] below  10n.b. this is *very* slow
11see [1] below  10fast, tricky programming, uses only gij, dx gij, Kij
11see [1] below  10fast, tricky programming, uses gij, dx gij, dxx gij, Kij, dx Kij

11

numericalxperturbation

[1]

symbolicxdifferentiationxwithxfinitexdiffxd/dr

[1]

symbolicxdifferentiation

11jacobianxperturbationxamplitude  10Scope: privatex01  REAL

11Description: perturbation amplitude for 1-sided finite differencing for Jacobians

11 Range 10 x01 Default: 1.0e-6
11(0.0:*  10any real number > 0

11

11jacobianxstorexsolvexmethod  10Scope: privatex01  KEYWORD

11Description: how do we store/linear-solve the Jacobian matrix?

11 Range 10 x01Default: row-oriented sparse matrix/UMFPACK
11dense matrix/LAPACK  10store as (Fortran) dense matrix, solve with LAPACK routines
11see [1] below  10store as sparse matrix (row-oriented storage format), solve with ILUCG (incomplete LU decomposition - conjugate gradient) method
11see [1] below  10store as sparse matrix (row-oriented storage format), solve with UMFPACK (sparse LU decomposition) method

11

row-orientedxsparsexmatrix/ILUCG

[1]

row-orientedxsparsexmatrix/UMFPACK

11maskxbufferxthickness  10Scope: privatex01  REAL

11Description: thickness (in Cactus base grid spacings) of the ’buffer’ mask region

11 Range 10 x01 Default: 5.0
11*:*  10any real number; typically this will be positive

11

11maskxisxnoshrink  10Scope: privatex01  BOOLEAN

11Description: should we prevent the inside & buffer regions from ever shrinking?

11                                   10  x01  Default: true

11

11maskxradiusxmultiplier  10Scope: privatex01  REAL

11Description: radius multiplier to define the ’inside’ mask region

11 Range 10 x01 Default: 0.8
11(0:*)  10any positive real number; typically this will be slightly less than 1.0

11

11maskxradiusxoffset  10Scope: privatex01  REAL

11Description: radius offset (in Cactus base grid spacings) to define the ’inside’ mask region

11 Range 10 x01 Default: -5.0
11*:*  10any real number; typically this will be negative

11

11maxxallowablexdeltaxhxoverxh  10Scope: privatex01  REAL

11Description: don’t let horizon move > this fraction of mean radius in a Newton iteration

11 Range 10 x01 Default: 0.1
11(0.0:*  10any positive real number

11

11maxxallowablexhorizonxradius  10Scope: privatex01  REAL

11Description: max mean-coordinate-radius allowed for any trial surface before we give up and say we can’t find this horizon

11  Range  10  x01  Default: 1.0e10
11(0.0:*  10any positive real number

11

11maxxallowablextheta  10Scope: privatex01  REAL

11Description: max ——Theta——xinfinity allowed for any trial surface before we give up and say we can’t find this horizon

11  Range  10  x01  Default: 1.0e10
11(0.0:*  10any positive real number

11

11maxxallowablexthetaxgrowthxiterations 10Scope: privatex01  INT

11Description: max number of consecutive iterations during which ——Theta——xinfinity is allowed to grow before we give up and say we can’t find this horizon

11  Range  10  x01  Default: (none)
11                                   10infinitly many
111:*  10that many

11maxxallowablexthetaxnonshrinkxiterations 10Scope: privatex01  INT

11Description: max number of consecutive iterations during which ——Theta——xinfinity is allowed to oscillate without shrinking before we give up and say we can’t find this horizon

11 Range 10 x01 Default: (none)
11                                   10infinitly many
111:*  10that many

11

11maxxnxzonesxperxrightxangle  10Scope: privatex01  INT

11Description: the maximum of all Nxzonesxperxrightxangle

11 Range 10 x01 Default: 18
111:*  10”must be at least the maximum of all Nxzonesxperxrightxan gle”

11

11maxxnewtonxiterationsxxinitial  10Scope: privatex01  INT

11Description: maximum number of Newton iterations before giving up when initially finding a given horizon

11 Range 10 x01 Default: 20
11(0:*  10any positive integer

11

11maxxnewtonxiterationsxxsubsequent 10Scope: privatex01  INT

11Description: maximum number of Newton iterations before giving up when re-finding a given horizon after finding it before

11 Range 10 x01 Default: 10
11(0:*  10any positive integer

11

11meanxcurvaturexbasexfilexname  10Scope: privatex01  STRING

11Description: base file name for meanxcurvature(h) output file(s)

11 Range 10 x01 Default: meanxcurvature
11.+  10any nonempty string

11

11method  10Scope: privatex01  KEYWORD

11Description: what should this thorn do for each apparent horizon?

11 Range 10 x01 Default: find horizons
11evaluate expansions  10evaluate the LHS function Theta(h)
11see [1] below  10”compute/print horizon 1’s J[Theta(h)] Jacobian matrix (possibly in multiple ways, depending on the testxallxJacobianxme thods parameter)”
11find horizons  10find the apparent horizon

11

testxexpansionxJacobians

11minxhorizonxradiusxpointsxforxmask 10Scope: privatex01  REAL

11Description: only set mask if min rxinner >= this number of local grid spacings

11 Range 10 x01 Default: -1.0e10
11*:*  10any real number

11

11movexorigins  10Scope: privatex01  BOOLEAN

11Description: move the origins with the horizons

11                                   10  x01  Default: no

11

11nxhorizons  10Scope: privatex01  INT

11Description: number of apparent horizons to search for

11 Range 10 x01 Default: 1
11                                   10turn this thorn into a fancy no-op :)
111:100  10search for this many apparent horizons

11

11nxzonesxperxrightxangle  10Scope: privatex01  INT

11Description: sets angular resolution of patch systems

11 Range 10 x01 Default: 18
111:*  10any integer >= 1; must be even for patch systems other than full-sphere

11

11newxstylexmaskxbitfieldxname  10Scope: privatex01  STRING

11Description: name of the new-style mask bit field (’type’) as registered with SpaceMask

11 Range 10 x01 Default: mask
11.+  10any valid bit field (’type’) name registered with the SpaceMask thorn

11

11newxstylexmaskxbufferxvalue  10Scope: privatex01  STRING

11Description: set the specified bit field of the new-style mask to this named state at grid points in the ’buffer’ region

11  Range  10  x01  Default: buffer
11.+  10any state name registered with the SpaceMask thorn

11

11newxstylexmaskxgridfnxname  10Scope: privatex01  STRING

11Description: name of the new-style mask grid function

11 Range 10 x01 Default: SpaceMask::spacexmask
11.+  10any valid Cactus grid function name

11

11newxstylexmaskxinsidexvalue  10Scope: privatex01  STRING

11Description: set the specified bit field of the new-style mask to this named state at grid points in the ’inside’ region

11  Range  10  x01  Default: inside
11.+  10any state name registered with the SpaceMask thorn

11newxstylexmaskxoutsidexvalue  10Scope: privatex01  STRING

11Description: set the specified bit field of the new-style mask to this named state at grid points in the ’outside’ region

11  Range  10  x01  Default: outside
11.+  10any state name registered with the SpaceMask thorn

11

11oldxstylexmaskxbufferxvalue  10Scope: privatex01  REAL

11Description: set the old-style mask to this value in the ’buffer’ region

11 Range 10 x01 Default: 0.5
11*:*  10any real number

11

11oldxstylexmaskxgridfnxname  10Scope: privatex01  STRING

11Description: name of the old-style mask grid function

11 Range 10 x01 Default: SpaceMask::emask
11.+  10any valid Cactus grid function name

11

11oldxstylexmaskxinsidexvalue  10Scope: privatex01  REAL

11Description: set the old-style mask to this value in the ’inside’ region

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11oldxstylexmaskxoutsidexvalue  10Scope: privatex01  REAL

11Description: set the old-style mask to this value in the ’outside’ region

11 Range 10 x01 Default: 1.0
11*:*  10any real number

11

11opendxxcontrolxfilexnamexextension 10Scope: privatex01  STRING

11Description: file name extension for OpenDX control files

11 Range 10 x01 Default: dx
11.+  10any nonempty string

11

11originxx  10Scope: privatex01  REAL

11Description: global x coordinate of patch system origin

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11originxy  10Scope: privatex01  REAL

11Description: global y coordinate of patch system origin

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11originxz  10Scope: privatex01  REAL

11Description: global z coordinate of patch system origin

11 Range 10 x01 Default: 0.0
11*:*  10any real number

11

11outputxasciixfiles  10Scope: privatex01  BOOLEAN

11Description: output h and Theta(h) as ASCII files

11                                   10  x01  Default: yes

11

11outputxbhxdiagnostics  10Scope: privatex01  BOOLEAN

11Description: should we output BH diagnostics to a data file for each AH found?

11                                   10  x01  Default: true

11outputxghostxzonesxforxh  10Scope: privatex01  BOOLEAN

11Description: should we include the patch system (angular) interpatch ghost zones in h data files?

11                                   10  x01  Default: false

11

11outputxhxevery  10Scope: privatex01  INT

11Description: how often (in Cactus time steps) should we output h (0 to disable)?

11 Range 10 x01 Default: 1
11                                   10don’t output h at all
111:*  10any integer >= 1

11

11outputxhdf5xfiles  10Scope: privatex01  BOOLEAN

11Description: output h and Theta(h) as HDF5 files

11                                   10  x01  Default: no

11

11outputxinitialxguess  10Scope: privatex01  BOOLEAN

11Description: should we output the initial guess back to the h data file?

11                                   10  x01  Default: false

11

11outputxmeanxcurvaturexevery  10Scope: privatex01  INT

11Description: how often (in Cactus time steps) should we output the meanxcurvature(h) functions?

11 Range 10 x01 Default: (none)
11                                   10don’t output meanxcurvature(h) at all
111:*  10any integer >= 1

11

11outputxopendxxcontrolxfiles  10Scope: privatex01  BOOLEAN

11Description: should we output OpenDX control files to allow reading of AHFinderDirect ’ASCII (gnuplot)’ format data files?

11                                   10  x01  Default: true

11

11outputxthetaxevery  10Scope: privatex01  INT

11Description: how often (in Cactus time steps) should we output the Theta(h) functions?

11 Range 10 x01 Default: (none)
11                                   10don’t output Theta(h) at all
111:*  10any integer >= 1

11

11patchxoverlapxwidth  10Scope: privatex01  INT

11Description: number of grid points that nominally-just-touching patches should overlap

11 Range 10 x01 Default: 1
111:*:2  10any integer >= 0; current implementation requires that it be odd

11patchxsystemxtype  10Scope: privatex01  KEYWORD

11Description: what type of patch system should we use?

11 Range 10 x01Default: match Cactus grid symmetry
11see [1] below  10choose automagically based on grid symmetries and the patch system’s origin
11full sphere  10full sphere, no symmetries
11+z hemisphere  10mirror symmetry across z=0 plane
11see [1] below  1090 degree periodic rotation symmetry about z axis
11see [1] below  10mirror symmetry across x=0 and y=0 planes
11see [1] below  10mirror symmetry across x=0 and z=0 planes
11see [1] below  10180 degree periodic rotation symmetry about z axis and mirror symmetry across z=0 plane
11see [1] below  1090 degree periodic rotation symmetry about z axis and mirror symmetry across z=0 plane
11see [1] below  10mirror symmetry across x=0 and y=0 and z=0 planes

11

matchxCactusxgridxsymmetry

[1]

+xyxquadrantx(rotating)

[1]

+xyxquadrantx(mirrored)

[1]

+xzxquadrantx(mirrored)

[1]

+xzxquadrantx(rotating)

[1]

+xyzxoctantx(rotating)

[1]

+xyzxoctantx(mirrored)

11predictxoriginxmovement  10Scope: privatex01  BOOLEAN

11Description: predict origin movement when moving the origins

11                                   10  x01  Default: no

11

11pretrackingxdelta  10Scope: privatex01  REAL

11Description: step size for value

11 Range 10 x01 Default: 1.0
11(0.0:*  10

11

11pretrackingxmaxxiterations  10Scope: privatex01  INT

11Description: maximum number of pretracking iterations

11  Range  10  x01  Default: 100

110:*  10

11

11pretrackingxmaximumxdelta  10Scope: privatex01  REAL

11Description: maximum step size for value

11 Range 10 x01 Default: 1.0
11(0.0:*  10

11

11pretrackingxmaximumxvalue  10Scope: privatex01  REAL

11Description: maximum pretracking value (should be near the outer boundary)

11  Range  10  x01  Default: 10.0

11*:*  10

11

11pretrackingxminimumxdelta  10Scope: privatex01  REAL

11Description: minimum step size for value

11 Range 10 x01 Default: 1.0e-4
11(0.0:*  10

11

11pretrackingxminimumxvalue  10Scope: privatex01  REAL

11Description: minimum pretracking value

11  Range  10  x01  Default: 0.0

11*:*  10

11

11pretrackingxvalue  10Scope: privatex01  REAL

11Description: initial pretracking value

11  Range  10  x01  Default: 1.0

11*:*  10

11

11printxtimingxstats  10Scope: privatex01  BOOLEAN

11Description: should we print timing stats for the whole apparent-horizon-finding process?

11                                   10  x01  Default: false

11

11resetxhorizonxafterxnotxfinding  10Scope: privatex01  BOOLEAN

11Description: reset the horizon shape to the initial data if a horizon was not found

11                                   10  x01  Default: yes

11reshapexwhilexmoving  10Scope: privatex01  BOOLEAN

11Description: reshape the horizons when moving them

11                                   10  x01  Default: no

11

11runxatxcctkxanalysis  10Scope: privatex01  BOOLEAN

11Description: should we run at CCTKxANALYSIS?

11                                   10  x01  Default: false

11

11runxatxcctkxpostxrecoverxvariables  10Scope: privatex01  BOOLEAN

11Description: should we run at CCTKxPOSTxRECOVERxVARIABLES?

11                                   10  x01  Default: false

11

11runxatxcctkxpostinitial  10Scope: privatex01  BOOLEAN

11Description: should we run at CCTKxPOSTINITIAL?

11                                   10  x01  Default: false

11

11runxatxcctkxpostpostinitial  10Scope: privatex01  BOOLEAN

11Description: should we run at CCTKxPOSTPOSTINITIAL?

11                                   10  x01  Default: false

11

11runxatxcctkxpoststep  10Scope: privatex01  BOOLEAN

11Description: should we run at CCTKxPOSTSTEP?

11                                   10  x01  Default: true

11

11setxmaskxforxallxhorizons  10Scope: privatex01  BOOLEAN

11Description: should we set a mask grid function (or functions) for all horizons?

11                                   10  x01  Default: false

11

11setxmaskxforxindividualxhorizon  10Scope: privatex01  BOOLEAN

11Description: should we set a mask grid function (or functions) for *this* horizon?

11                                   10  x01  Default: false

11

11setxnewxstylexmask  10Scope: privatex01  BOOLEAN

11Description: if we’re setting a mask, should we set an new-style (CCTKxINT) mask gridfn?

11                                   10  x01  Default: false

11

11setxoldxstylexmask  10Scope: privatex01  BOOLEAN

11Description: if we’re setting a mask, should we set an old-style (CCTKxREAL) mask gridfn?

11                                   10  x01  Default: true

11

11shiftoutxfactor  10Scope: privatex01  REAL

11Description: enlarge the surface initial guess before finding

11 Range 10 x01 Default: 1.0
11(0:*  10choose 1 for doing nothing, larger for enlarging, smaller for shrinking

11

11smoothingxfactor  10Scope: privatex01  REAL

11Description: smoothen (remove higher multipole moments) the surface initial guess before finding

11 Range 10 x01 Default: 0.0
11*:*  10choose 0 for no smoothing, 1 for complete smoothing, larger for over-smoothing, negative for roughening

11surfacexdefinition  10Scope: privatex01  KEYWORD

11Description: search for what kind of surface?

11 Range 10 x01 Default: expansion
11expansion  10Thetax(l) (apparent horizons etc.)
11inner expansion  10Thetax(n) (expansion of ingoing null normal)
11mean curvature  10for CMC surfaces
11expansion product  10Thetax(l) Thetax(n) (product of the expansions)

11

11surfacexinterpolatorxname  10Scope: privatex01  STRING

11Description: name under which the surface interpolation operator is registered in Cactus

11 Range 10 x01Default: Lagrange polynomial interpolation
11ˆ$  10the empty string if this interpolator isn’t going to be used
11.+  10any string (in practice it should be nonempty)

11

11surfacexinterpolatorxpars  10Scope: privatex01  STRING

11Description: parameters for the surface interpolator

11 Range 10 x01Default: order=2 boundaryxoffxcenteringxtolerance={1.0e-10 1.0e-10 1.0e-10 1.0e-10} boundaryxextrapolationxtolerance={0.0 0.0 0.0 0.0}
11.*  10”any string acceptable to UtilxTableSetFromStr ing() and to the interpolator”

11

11surfacexmodification  10Scope: privatex01  KEYWORD

11Description: how to modify the surface definition

11 Range 10 x01 Default: none
11none  10no modification
11radius  10multiply with the coordinate radius
11radiusˆ2  10multiply with the square of the coordinate radius
11mean radius  10multiply with the mean coordinate radius
11areal radius  10multiply with the areal radius (does not converge nicely, because the Jacobian is only approximate)

11

11surfacexselection  10Scope: privatex01  KEYWORD

11Description: search for a surface with this areal radius

11 Range 10 x01 Default: definition
11definition  10”look for a surface as defined by ’surfacexdefinition’ ”
11see [1] below  10look for a surface with a certain mean coordinate radius (not covariant, but fast)
11areal radius  10look for a surface with a certain areal radius
11see [1] below  10look for a surface with a certain product of expansion and mean coordiante radius
11see [1] below  10look for a surface with a certain product of expansion and areal radius

11

meanxcoordinatexradius

[1]

expansionxtimesxmeanxcoordinatexradius

[1]

expansionxtimesxarealxradius

11testxallxjacobianxcomputexmethods  10Scope: privatex01  BOOLEAN

11Description: should we test all Jacobian computation methods, or just NP?

11                                   10  x01  Default: true

11

11thetaxbasexfilexname  10Scope: privatex01  STRING

11Description: base file name for Theta(h) output file(s)

11 Range 10 x01 Default: Theta
11.+  10any nonempty string

11

11thetaxnormxforxconvergence  10Scope: privatex01  REAL

11Description: we declare the horizon to be found if ——Theta——xinfinity <= this

11 Range 10 x01 Default: 1.0e-8
11(0.0:*  10any positive real number

11

11trackxoriginxfromxgridxscalar  10Scope: privatex01  BOOLEAN

11Description: track horizon origin from given grid scalars

11                                   10  x01  Default: no

11

11trackxoriginxsourcexx  10Scope: privatex01  STRING

11Description: grid scalar containing the x component of the origin estimate

11 Range 10 x01 Default: (none)
11                                   10don’t use this feature
11see [1] below  10name of a grid scalar

11

[a-zA-Z\_][a-zA-Z0-9\_]*[:][:][a-zA-Z\_][a-zA-Z0-9\_]*({\textbackslash}[0-9
+{\textbackslash}])

11trackxoriginxsourcexy  10Scope: privatex01  STRING

11Description: grid scalar containing the x component of the origin estimate

11 Range 10 x01 Default: (none)
11                                   10don’t use this feature
11see [1] below  10name of a grid scalar

11

[a-zA-Z\_][a-zA-Z0-9\_]*[:][:][a-zA-Z\_][a-zA-Z0-9\_]*({\textbackslash}[0-9
+{\textbackslash}])

11trackxoriginxsourcexz  10Scope: privatex01  STRING

11Description: grid scalar containing the x component of the origin estimate

11 Range 10 x01 Default: (none)
11                                   10don’t use this feature
11see [1] below  10name of a grid scalar

11

[a-zA-Z\_][a-zA-Z0-9\_]*[:][:][a-zA-Z\_][a-zA-Z0-9\_]*({\textbackslash}[0-9
+{\textbackslash}])

11umfpackxxnxiixiterations  10Scope: privatex01  INT

11Description: number of iterative-improvement iterations to do inside UMFPACK after the sparse LU decompose/solve, each time we solve a linear system

11  Range  10  x01  Default: (none)
11-1  10use the UMFPACK default
11                                   10don’t do iterative improvement
111:*  10any positive integer (in practice a few iterations give almost all the benefit)

11

11usexpretracking  10Scope: privatex01  BOOLEAN

11Description: search for an outermost apparent horizon

11                                   10  x01  Default: no

11

11verbosexlevel  10Scope: privatex01  KEYWORD

11Description: controls which (how many) messages to print describing AH finding

11 Range 10 x01 Default: physics details
11physics highlights  10just a few physics messages
11physics details  10more detailed physics messages
11algorithm highlights  10physics details + a few messages about the AH-finding algorithm
11algorithm details  10physics details + lots of messages about the AH-finding algorithm
11algorithm debug  10physics details + lots and lots of messages about the AH-finding algorithm

11

11wantxexpansionxgradients  10Scope: privatex01  BOOLEAN

11Description: should we print the gradients of the expansions?

11                                   10  x01  Default: false

11

11warnxlevelxxgijxnotxpositivexdefinitexxinitial 10Scope: privatex01  INT

11Description: warning level if the interpolated gx{ij} isn’t positive definite (usually this means we’re too close to a singularity) (error occurs on first Newton iteration)

11  Range  10  x01  Default: 2
11-1:*  10any valid Cactus warning level

11

11warnxlevelxxgijxnotxpositivexdefinitexxsubsequent 10Scope: privatex01  INT

11Description: warning level if the interpolated gx{ij} isn’t positive definite (usually this means we’re too close to a singularity) (error occurs on subsequent Newton iteration)

11  Range  10  x01  Default: 2
11-1:*  10any valid Cactus warning level

11

11warnxlevelxxnonfinitexgeometry  10Scope: privatex01  INT

11Description: warning level if we find infinity and/or NaN in the interpolated geometry values {gxij, partialxk gxij, Kxij}

11  Range  10  x01  Default: 1
11-1:*  10any valid Cactus warning level

11warnxlevelxxpointxoutsidexxinitial  10Scope: privatex01  INT

11Description: warning level for point outside (or too close to boundary of) Cactus grid (error occurs on first Newton iteration)

11 Range 10 x01 Default: 1
11-1:*  10any valid Cactus warning level

11

11warnxlevelxxpointxoutsidexxsubsequent 10Scope: privatex01  INT

11Description: warning level for point outside (or too close to boundary of) Cactus grid (error occurs on subsequent Newton iteration)

11 Range 10 x01 Default: 2
11-1:*  10any valid Cactus warning level

11

11warnxlevelxxskippingxfinitexcheck  10Scope: privatex01  INT

11Description: warning level if the user sets checkxthatxgeometryxisxfinite but the Cactus configure process doesn’t find a finite() function so we have to skip the finite-geometry check

11 Range 10 x01 Default: 3
11-1:*  10any valid Cactus warning level

11

11whichxhorizonxtoxannouncexcentroid 10Scope: privatex01  INT

11Description: for which horizon should we announce the centroid?

11 Range 10 x01 Default: (none)
11                                   10don’t announce any centroid(s)
111:100  10announce this horizon’s centroid each time we find it

11

11whichxsurfacextoxstorexinfo  10Scope: privatex01  INT

11Description: into which surface should we store the info?

11 Range 10 x01 Default: -1
11-1  10don’t store info
110:*  10store info into the corresponding surface

11

11whichxsurfacextoxstorexinfoxbyxname 10Scope: privatex01  STRING

11Description: into which surface should we store the info?

11 Range 10 x01 Default: (none)
11                                   10”use whichxsurfacextoxsto rexinfo”
11.*  10any string

11

11maxnphi  10Scope: shared from SPHERICALSURFACEx01INT

11

11maxntheta  10Scope: shared from SPHERICALSURFACEx01INT

11

11nsurfaces  10Scope: shared from SPHERICALSURFACEx01INT

11

15 Interfaces General Implements: ahfinderdirect

Inherits: grid admbase staticconformal spacemask sphericalsurface io

Grid Variables

15.0.1 PRIVATE GROUPS

11x Group Names x10 x Variable Names x x01 Details x11x
11 ahmask 10 ahmask x01 compact110
11                 10  x01 dimensions113
11                 10  x01 distribution11DEFAULT
11                 10  x01 group type11GF
11 10 x01 tags11tensortypealias=”Scalar” Prolongation=”None” InterpNumTimelevels=1
11                 10  x01 timelevels113
11                 10  x01variable type11REAL
11 ahxradius 10 ahxradius x01 compact110
11                 10  x01 dimensions113
11                 10  x01 distribution11CONSTANT
11                 10  x01 group type11ARRAY
11                 10  x01  size11MAXxNxZONESxPERxRIGHTxANGLE+1
11                 10  x  x01  size11MAXxNxZONESxPERxRIGHTxANGLE+1

11                 10  x01  size116

11                 10  x01 timelevels111
11                 10  x01vararrayxsize11Nxhorizons
11                 10  x01variable type11REAL
11  ahxorigin  10  x01  compact110
11                 10  ahxoriginxx  x01 dimensions110
11                 10  ahxoriginxy  x01 distribution11CONSTANT
11                 10  ahxoriginxz  x01 group type11SCALAR
11                 10  x01 timelevels111
11                 10  x01vararrayxsize11Nxhorizons
11                 10  x01variable type11REAL
11 ahxcentroid 10  x01  compact110
11                 10  ahxcentroidxx  x01 dimensions110
11                 10  ahxcentroidxy  x01 distribution11CONSTANT
11                 10  ahxcentroidxz  x01 group type11SCALAR
11                 10  ahxcentroidxt  x01 timelevels111
11                 10  ahxcentroidxxxp  x01vararrayxsize11Nxhorizons
11                 10  ahxcentroidxyxp  x01variable type11REAL
11  ahxflags  10  x01  compact110
11                 10 ahxinitialxfindxflag x01 dimensions110
11                 10ahxreallyxinitialxfindxflagx01 distribution11CONSTANT
11                 10  ahxsearchxflag  x01 group type11SCALAR
11                 10  ahxfoundxflag  x01 timelevels111
11                 10 ahxcentroidxvalid x01vararrayxsize11Nxhorizons
11                 10 ahxcentroidxvalidxp x01variable type11INT

11

Uses header: SpaceMask.h

Provides: HorizonLocalCoordinateOrigin to HorizonWasFound to HorizonCentroid to HorizonRadiusInDirection to

16 Schedule This section lists all the variables which are assigned storage by thorn EinsteinAnalysis/AHFinderDirect. Storage can either last for the duration of the run (Always means that if this thorn is activated storage will be assigned, 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.

Storage x

11Always:  11x
11ahxradius ahxorigin ahxcentroid ahxflags11x
11ahmask[1]  11x

11x  11x

11

Scheduled Functions

CCTKxBASEGRID x ahfinderdirectxsetup x setup data structures x

11x11After: 11spatialcoordinates
11 x 11Language:11c
11 x 11Options: 11global
11 x 11Type: 11function
11 x 11Writes: 11ahfinderdirect::ahxcentroid
11 x 11x  11ahxflags

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectxrecover x import horizon data from cactus variables x

11x11Language:11c
11 x 11Options: 11global
11 x 11Type: 11function

11

CCTKxANALYSIS (conditional) x ahfinderdirectxannounce x announce horizon position(s) to other thorns x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11driftcorrect
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxANALYSIS (conditional) x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s)

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTSTEP (conditional) x ahfinderdirectximportxmask x import the excision mask x

11x11Before: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11x  11loop-local
11 x 11Reads: 11spacemask::emask
11 x 11Type: 11function
11 x 11Writes: 11ahfinderdirect::ahmask(everywhere)

11

CCTKxPOSTSTEP (conditional) x ahfinderdirectxstore x store apparent horizon(s) into spherical surface(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11sphericalsurfacexhasbeenset
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTSTEP (conditional) x ahfinderdirectxsave x save apparent horizon(s) into cactus variables x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTSTEP (conditional) x ahfinderdirectxannounce x announce horizon position(s) to other thorns x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11driftcorrect
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTSTEP (conditional) x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s)

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTINITIAL (conditional) x ahfinderdirectximportxmask x import the excision mask x

11x11Before: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11x  11loop-local
11 x 11Reads: 11spacemask::emask
11 x 11Type: 11function
11 x 11Writes: 11ahfinderdirect::ahmask(everywhere)

11

CCTKxPOSTINITIAL (conditional) x ahfinderdirectxstore x store apparent horizon(s) into spherical surface(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11sphericalsurfacexhasbeenset
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTINITIAL (conditional) x ahfinderdirectxsave x save apparent horizon(s) into cactus variables x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxANALYSIS (conditional) x ahfinderdirectxfindxhorizons x find apparent horizon(s) after this time step x

11x11Language:11c
11 x 11Options: 11global-early
11 x 11Reads: 11staticconformal::conformalxstate
11 x 11Type: 11function

11

CCTKxPOSTINITIAL (conditional) x ahfinderdirectxannounce x announce horizon position(s) to other thorns

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11driftcorrect
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTINITIAL (conditional) x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTPOSTINITIAL (conditional) x ahfinderdirectximportxmask x import the excision mask x

11x11Before: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11x  11loop-local
11 x 11Reads: 11spacemask::emask
11 x 11Type: 11function
11 x 11Writes: 11ahfinderdirect::ahmask(everywhere)

11

CCTKxPOSTPOSTINITIAL (conditional) x ahfinderdirectxstore x store apparent horizon(s) into spherical surface(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTPOSTINITIAL (conditional) x ahfinderdirectxsave x save apparent horizon(s) into cactus variables x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTPOSTINITIAL (conditional) x ahfinderdirectxannounce x announce horizon position(s) to other thorns

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11driftcorrect
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTPOSTINITIAL (conditional) x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectximportxmask x import the excision mask x

11x11Before: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11x  11loop-local
11 x 11Reads: 11spacemask::emask
11 x 11Type: 11function
11 x 11Writes: 11ahfinderdirect::ahmask(everywhere)

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectxstore x store apparent horizon(s) into spherical surface(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11sphericalsurfacexhasbeenset
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectxsave x save apparent horizon(s) into cactus variables x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTSTEP (conditional) x ahfinderdirectxfindxhorizons x find apparent horizon(s) after this time step

11x11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectxannounce x announce horizon position(s) to other thorns x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11driftcorrect
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTREGRIDINITIAL x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s) x

11x11After: 11maskone
11 x 11x  11maskzero
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTREGRID x ahfinderdirectxmaybexdoxmasks x set mask(s) based on apparent horizon position(s) x

11x11After: 11maskone
11 x 11x  11maskzero
11 x 11Language:11c
11 x 11Type: 11function

11

CCTKxPOSTINITIAL (conditional) x ahfinderdirectxfindxhorizons x find apparent horizon(s) after this time step x

11x11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

CCTKxPOSTPOSTINITIAL (conditional) x ahfinderdirectxfindxhorizons x find apparent horizon(s) after this time step x

11x11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxPOSTxRECOVERxVARIABLES (conditional) x ahfinderdirectxfindxhorizons x find apparent horizon(s) after this time step x

11x11After: 11molxpoststep
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxANALYSIS (conditional) x ahfinderdirectximportxmask x import the excision mask x

11x11Before: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11x  11loop-local
11 x 11Reads: 11spacemask::emask
11 x 11Type: 11function
11 x 11Writes: 11ahfinderdirect::ahmask(everywhere)

11

CCTKxANALYSIS (conditional) x ahfinderdirectxstore x store apparent horizon(s) into spherical surface(s) x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Before: 11sphericalsurfacexhasbeenset
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function

11

CCTKxANALYSIS (conditional) x ahfinderdirectxsave x save apparent horizon(s) into cactus variables x

11x11After: 11ahfinderdirectxfindxhorizons
11 x 11Language:11c
11 x 11Options: 11global-early
11 x 11Type: 11function