## Thorn Guide for the EHFinder Thorn

Date

Abstract

This thorn locates the Event Horizon (EH) in an analytic or numerical spacetime by evolving a null surface backwards in time. The null surface is described at each time step as the 0-level iso-surface of a 3D scalar function $f$. This level set description of the surface allows, trivially, changes of the topology of the surface so it is possible to follow the merger of two (or more) black holes into a ﬁnal black hole.

### 1 Introduction

This thorn attempts to locate the Event Horizon (EH) in an analytic or numerical spacetime by evolving a null surface backwards in time. This method depends on the fact that, except in cases where the coordinates are adapted to outgoing null geodesics, an outgoing null surface started close to the EH, when evolved forward in time, is diverging exponentially from the EH. Reversing the time evolution then means that an outgoing null surface will converge exponentially to the EH. The level set function, $f$, is evolved according to

$\begin{array}{rcll}{\partial }_{t}f& =& \frac{-{g}^{ti}{\partial }_{i}f+\sqrt{{\left({g}^{ti}{\partial }_{i}f\right)}^{2}-{g}^{tt}{g}^{ij}{\partial }_{i}f{\partial }_{j}f}}{{g}^{tt}}& \text{}\\ & =& {\beta }^{i}{\partial }_{i}f-\sqrt{{\alpha }^{2}{\gamma }^{ij}{\partial }_{i}f{\partial }_{j}f},& \text{(1)}\text{}\text{}\end{array}$

where in the second equation the lapse, shift and 3-metric has been substituted for the 4-metric. For more details on the theory and implementation see [1].

This thorn uses a level set description of the null surface, i.e.the surface is the 0-level isosurface of a 3D scalar function, $f$, that is negative inside and positive outside the surface. With this choice of surface description one level-set function can describe multiple surfaces at the same time, simply by having several, disconnected regions with negative values. The biggest advantage, however, is that any change of topology of the surface is handled naturally and simply by the level-set function changing sign. Therefore this EHFinder can follow the EH during the merger of two (or more) black holes into one black hole.

To ﬁnd the EH in a numerical spacetime several points have to be taken into consideration. Since the null surface has to be evolved backwards in time, the EHFinder has to be seen as a pre-processing analysis thorn. Therefore it is necessary to evolve the initial data forward in time while outputting enough 3D data, that the full 4-metric can be recovered at each timestep. The 3D data is then read back in, in reverse order, while the level-set function is evolved backwards in time. The thorn can evolve more than one level set function at a time using diﬀerent initial guesses for the surfaces (NOTE: this is a quite recent feature and has not yet been tested extensively). More details about the actual use of the thorn in section 7

### 2 Re-initialization

The evolution equation for $f$, equation (1), causes steepening of the gradient of $f$, which is undesireble numerically. For that reason, $f$ is periodically re-initialized to a distance function. That is, the values of $f$ are changed so that the the value of $f$ in a grid point is equal to the (signed) distance from the grid point to the surface $f=0$. This is done by evolving $f$ according to the following evolution equation (in the parameter $\lambda$)

 $\frac{df}{d\lambda }=-\frac{f}{\sqrt{{f}^{2}+1}}\left(|\nabla f|-1\right)$ (2)

until a steady state is achieved. This method is called the pde-method since it is basically evolving a pde. Sometimes the $f=0$ surface can be moved slightly during the re-initialization procedure. This happens when the surface develops a narrow neck just before a topology change. For that reason, there is an option to detect when this is about to happen and undo the re-initialization.

There used to be another method doing the re-initialization, but it proved inferior to the pde-method and was removed. Other methods may be implemented in the future.

### 3 The initial shape of the surface

Currently three diﬀerent choices for the initial shape of the surface are implemented. The simplest choice is a sphere in which case $f$ is set according to

 $f=\sqrt{{\left(x-{x}_{0}\right)}^{2}+{\left(y-{y}_{0}\right)}^{2}+{\left(z-{z}_{0}\right)}^{2}}-{r}_{0},$ (3)

where ${r}_{0}$ is the radius of the sphere and ${x}_{0}$, ${y}_{0}$ and ${z}_{0}$ are the coordinates of the center of the sphere. The second choice is a rotated and translated ellipsoid. The basic equation is here

 $f=\sqrt{\frac{{x}^{2}}{{a}^{2}}+\frac{{y}^{2}}{{b}^{2}}+\frac{{z}^{2}}{{c}^{2}}}-1$ (4)

This ellipsoid is ﬁrst rotated an angle $\alpha$ around the $z$-axis, then rotated an angle $\beta$ around the $y$-axis, then rotated an angle $\gamma$ around the $x$-axis and ﬁnally the rotated ellipsoid is translated to have its “center” at the point $\left({x}_{0},{y}_{0},{z}_{0}\right)$. The ﬁnal possible shape of the initial surface is an ovaloid of Cassini. This was implented initially to test changing the topology in ﬂat space. it is most likely not useful for numerical data. In this case $f$ is set according to

 $f={\left({x}^{2}+{y}^{2}+{z}^{2}\right)}^{2}+{a}^{4}-2{a}^{2}\left({x}^{2}-{y}^{2}-{z}^{2}\right)-{b}^{4}.$ (5)

There are no translation or rotations implemented for the ovaloid of Cassini.

Diﬀerent initial shapes can be used for the diﬀerent level set functions used in the same run.

### 4 Excision

Even though the level set function, $f$, in principle can be deﬁned everywhere it is often advantageous to only evolve it in a certain region around the surface $f=0$. Since $f$ is re-initialized regularly to become a distance function, $f$ itself can be used as a measure of the distance from a certain grid point to the surface $f=0$. The parameter ehfinder::shell_width speciﬁes the size of the active region around $f=0$. However the interior and exterior excisions are handled diﬀerently. The interior excision is most simple, since here all grid points with $f<-\text{ehfinder::shell_width}$ are marked as inactive. This should work in all cases when the excised region is everywhere concave, since then all points on the boundary of the excised region will have enough neighbouring active points to be able to calculate second order accurate one sided derivatives. If the interior excised region happens to have a convex region, this might fail. To avoid a similiar problem at the outer excised boundary, this boundary is shaped as a rectangular box. The box is chosen so that all points with $f<\text{ehfinder::shell_width}$ are in the active region. This is illustrated in Figure 1, for the case

ehfinder::shell_width = 4, where the excised regions are hashed.

Changes to the excision regions are only done after re-initialization, since it is only at this time that $f$ is a distance function. The excision regions can move across the grid, tracking the surface $f=0$.

Also if the numerical run was done with excision using SpaceMask, the EHFinder excision region is guaranteed to completely cover the numerical excision region. The EHFinder currently only supports the old style excision mask but the support of the new style excision mask should be trivial and fast to implement.

### 5 Upwinding

All ﬁnite diﬀerences used in the evolution of the null surface are second order one sided diﬀerences. For that reason a ghost_size larger or equal to 2 should always be used. It is possible to choose between three diﬀerent upwinding schemes. This is done by setting the parameter ehfinder::upwind_type to either intrinsic, shift or characteristic.

The intrinsic scheme, looks at the values of $f$ itself, to determine the direction of the stencil. This is basically in order to be able to handle situations like the one illustrated in 1D in Figure 2.

If the stencil for calculating derivatives in the point labeled 1 is taken to consist of the points 1, 2 and 3’, the non diﬀerentiablility of $f$ may cause problems. The algorithm detects this and instead uses the points 1, 2, 3 as the stencil. This ensures that a non diﬀerentiable feature can be maintained in the evolution.

However this scheme only works in a few simple cases. For more general cases it is important to use characteristic information in order to ensure that the numerical stencil contains the domain of dependence. Therefore the characteristic scheme was introduced. Fortunately, by using the information contained in the level set functions the characteristic of the level set function can be calculated using

 $\frac{d{x}^{i}}{dt}=-{\beta }^{i}+\frac{{\alpha }^{2}{\gamma }^{ij}{\partial }_{j}f}{\sqrt{{\alpha }^{2}{\gamma }^{kl}{\partial }_{k}f{\partial }_{l}f}}.$ (6)

The method estimates the characteristic direction using centered ﬁnite diﬀerences in equation (6) and then recalculates the one sided ﬁnite diﬀerences in the appropriate direction.

It might happen that the upwinding direction based on the characteristic direction results in the stencil to consist of the points 1, 2, 3’ in Figure 2. However, if the re-initialization is done often enough, this turns out not to cause any problems.

The shift scheme was implemented as an improvement to the intrinsic scheme but it turned out that the characteristic scheme was superior. Therefore shift upwinding should not be used. It might be completely removed in future revisions.

For the re-initialization the default is to use the intrinsic second order scheme (the re-initialization doesn’t depend on where the surface is moving), so characteristic upwinding is not applicable. It is possible to use a ﬁrst order intrinsic scheme, but this is, in my experience, not accurate enough. A centered diﬀerencing scheme is also available, but is only there for testing purposes and should never be used. These alternative schemes will probably be removed in the future.

### 6 The most important parameters

Here the most important parameters are described.

• ehfinder::mode
The mode can either be set to normal (normal event horizon ﬁnder mode), analysis (compare a previously calculated level set function to a small number of analytic spacetimes) and generator (only evolve the generators while keeping the level set function ﬁxed). The default is normal and should normally not be changed. The other modes are only useful for debugging and testing purposes.
• ehfinder::eh_number_level_sets
An integer parameter specifying how many individual level set functions to evolve at a time. Currently it has to be between 1 and 10.
• ehfinder::eh_metric_type
The metric type can either be set to numerical or analytic. If it is set to numerical the EHFinder will attempt to read in the metric from ﬁles in the directory speciﬁed by the io::recover_dir parameter. At present all the timesteps has to be saved in the same ﬁle. Note that if the numerical data was produced with admbase::metric_type = "static conformal" this parameter has to be speciﬁed again. In this case the EHFinder will attempt to also read in the conformal factor from a ﬁle. If metric type is set to analytic another thorn needs to set up the metric. It is possible to only set the metric on the initial slice, but it is also possible to have a thorn (like thorn Exact) set the metric at CCTK_PRESTEP if the analytic metric is time dependent. The default is numerical.
• ehfinder::eh_lapse_type
The same for the lapse.
• ehfinder::eh_shift_type
The same for the shift.
• initial_f[i]
A vector parameter specifying the initial shape of the null surface for the individual level set functions. The initial shape can currently be chosen from sphere, ellipsoid and cassini as described in section 3. The default is sphere.
A vector parameter specifying the radius of the initial sphere (${r}_{0}$ in equation 3). The deafault is 1.
• translate_x[i]
A vector parameter specifying how much to translate the initial surface in the $x$-direction (${x}_{0}$ in equation 3). Also used for the initial ellipsoid. The default is 0.
• translate_y[i]
A vector parameter specifying how much to translate the initial surface in the $y$-direction (${y}_{0}$ in equation 3). Also used for the initial ellipsoid. The default is 0.
• translate_z[i]
A vector parameter specifying how much to translate the initial surface in the $z$-direction (${z}_{0}$ in equation 3). Also used for the initial ellipsoid. The default is 0.
• initial_a[i]
A vector parameter specifying $a$ in equation 4. The default is 1.
• initial_b[i]
A vector parameter specifying $b$ in equation 4. The default is 1.
• initial_c[i]
A vector parameter specifying $c$ in equation 4. The default is 1.
• rotation_alpha[i]
A vector parameter specifying the rotation angle $\alpha$ for the ellipsoid around the $z$-axis. The default is 0.
• rotation_beta[i]
A vector parameter specifying the rotation angle $\beta$ for the ellipsoid around the $y$-axis. The default is 0.
• rotation_gamma[i]
A vector parameter specifying the rotation angle $\gamma$ for the ellipsoid around the $x$-axis. The default is 0.
• shell_width
The width of the active evolution region. Grid points more than shell_width gridspacings away from the $f=0$ surface are marked as inactive and are not evolved as described in section 4. The default is $7$ gridspacings.
• use_inner_excision
A boolean parameter specifying whether the interior excision should be used or not.
• use_outer_excision
A boolean parameter specifying whether the exterior excision should be used or not.
• upwind_type
The type of upwinding to be used (either intrinsic, shift or characteristic). See the detailed description of the upwinding types in section 5. The default is characteristic.
• surface_direction
The code can track both outgoing and ingoing null surfaces. Choose the direction by using outward or inward. The default is outward. Note that the code only works as an event horizon ﬁnder when evolving outward going null surfaces backwards in time.
• re_init_undo
Should the re-initialization be undone just before pinch-oﬀ or not as described in section 2. The default is "no".
• re_init_int_method
Choose the integration method in the pde-re-initialization method. Choose either a simple Euler (euler) integration scheme or a second order Runge-Kutta (rk2) scheme. Since a pde is evolved to steady state, it seems that the Euler scheme works just ﬁne and is faster than the Runge-Kutta scheme. The default is euler.
• re_init_max_iter
The maximum number of iterations in the pde-re-initialization scheme, before giving up. Unless you are working at high resolution the default should be enough. The default is 800.
• pde_differences
Choose the type of ﬁnite diﬀerencing used in the pde re-initialization. Don’t ever use anything else than second order upwinding (upwind2). The other choices (centered and upwind) are there only for testing purposes and might be removed.
• re_initialize_every
How often to re-initialize using the pde re-initialization. This depends on the problem. For some problems it is necessary to do it more often than for other problems. You’ll have to experiment to ﬁgure out what works best. The default is 10.
• last_iteration_number
The last iteration number of the numerical simulation that produced the metric data. Active when eh_metric_type is equal to numerical.
• saved_iteration_every
How often was the numerical data saved? This and the above parameter is used in the code to ﬁgure out which data set iteration number to read in from ﬁle
(last_iteration_number-saved_iteration_every*cctk_iteration).
• ntheta
How many points in the $𝜃$-direction should be used for integrations over the surface.
• nphi
How many points in the $\varphi$-direction should be used for integrations over the surface.
• maximum_surface_number
The maximal number of surfaces expected at any given time during the whole evolution.
• surface_interpolator
Which interpolator to use for the location of points on the surface. It should be the name of a valid interpolator provided by one of the available interpolators. The interpolator should be able to return both the interpolated value and derivatives. At present this is provided by AEILocalInterp. The default is Hermite polynomial interpolation.
• surface_interpolation_order
The interpolation order used for ﬁnding points on the surface. Higher orders require larger number of ghost zones for parallel runs. The default value is 2 (consistent with a ghostsize of 2).
• area_interpolator
Which interpolator should be used to interpolate metric information onto the surface once the surface points have been found. The default is Lagrange polynomial interpolation.
• area_interpolation_order
The interpolation order used for calculating the area of the surface. The default value is 3 (consistent with a ghostsize of 2).

EHFinder also extends the following parameter from admbase in order to be able to read in initial data.

### 7 How to use EHFinder with numerical data

In this section I will try to describe in little more detail how EHFinder can be used to ﬁnd the EH in a numerical spacetime.

#### 7.1 Outputting numerical data

The ﬁrst thing to make sure, is that enough data is output during the numerical run, to be able to reconstruct the full 4-metric. The required output therefore consists of the ADMBase::metric, ADMBase::lapse and ADMBase::shift. However if the evolution was done with zero shift and/or lapse equal to one, it is not necessary to output these grid functions, as long as storage is turned on and they are set to the correct value initially when EHFinder is run. If the evolution was done with a conformal factor then StaticConformal::psi has to be output as well, since it is necessary in order to reconstruct the 4-metric. However it is only necessary to output this once since it is constant during the evolution. It is not necessary to output the derivatives of the conformal factor. If excision was used in the numerical run then it is also necessary to output SpaceMask::emask1 , since EHFinder has to make sure that its internal mask covers the space mask.

At present it is necessary to output all timesteps into the same ﬁle (use IO::out_timesteps_per_file = -1, which is the default). In principle both FLEXIO and HDF5 output should be supported, but only HDF5 output has been tested. Since EHFinder can be run on a lot less processors compared to the spacetime evolution, it is often advantageous to either do unchuncked output or to recombine the output ﬁles, since it is then possible to read the data onto a smaller number of processors (use IO::out_unchunked = "yes" to write unchunked data). If the numerical run is larger than the EH containing region (hopefully that is the case; otherwise the boundaries are deﬁnitely to close in), it is possible to use hyperslabbing to just output the EH containing region (see for example CactusPUGHIO/IOHDF5 for details on this). If hyperslabbing is used it is deﬁnitely necessary to do the output unchunked or recombine afterwards. An example parameter ﬁle can be seen in the par/Misner_2.2_80_3D.par.

In principle EHFinder should also work for downsampled (in both space and time) data, but no experiments have been done so far to estimate the loss of accuracy (I have always used the full resolution and done output at every timestep).

If hyperslabbing and/or downsampling is used, it is the users responsibility (by specifying the right parameters in the parameter ﬁle) to ensure that EHFinder is run with the correct grid spacing and time step.

#### 7.2 Tips for parameter choices

EHFinder is still under development and testing and can as yet not be used as a black box. But still I can give some guidelines and advice on how to proceed.

The ﬁrst concern is to setup the initial guess for the surface. Ideally one would like to use at least two diﬀerent initial surfaces. One surface completely inside the EH and one surface completely outside the EH. In practice it is often a good idea to use more than two diﬀerent initial surfaces, since then the initial surfaces closest to the EH can be identiﬁed. Using the feature of evolving multiple level set functions at a time, this can be done while reading in the numerical data only once. The easiest way to get an initial surface inside the EH, is to set up the initial guess to be completely inside the apparent horizon (AH). To get an initial guess that is outside of the EH is not as easy. One way is to choose a surface, that starts to contract everywhere when evolved according to equation (1). However this is not a guarantee, since the EH can be expanding in the numerical coordinates. This of course means that it is necessary to do it by trial and error. Set up some initial guess evolve it for a little while, look at 3D output to determine if the surface is contracting everywhere and change the initial surface if necessary.

Then comes the question of how often to do the re-initialization and how much to excise. These parameters depend on the numerical data. In principle, since the re-initialization can move the surface, one wants to do it as rarely as possible. On the other hand, re-initialization is necessary in order to keep the evolution nicely controlled (by avoiding large gradients), so a compromise has to be found. This might require some experimentation. Because movements of the surface during re-initialization, usually only occurs close to moments of topology change, it might be necessary to evolve all the way beyond the change of topology and look at 3D output to see if any problems occured. If signiﬁcant movement of the surface during re-initialization near the change of topology is observed, then try again with re-initialization undo activated. How often to do the re-initialization also depends on the width of the active region. If the active region around the surface is narrow, it might be necessary to re-initialize more often, since in this case the boundaries of the active region is closer to the surface. At the boundaries the stencil direction is dictated by the geometry and not $f$ itself or the characteristics, which might cause instabilities if it is not re-initialized. Good values guesses for ehfinder::reinitialize_every_pde seems to in the range 5–10 at low or medium resolutions but can usually be increased for higher resolutions. For ehfinder::shell_width I normally use at least 7.

EHFinder does not yet work fully with the ﬁxed mesh reﬁnement driver Carpet, but this is under development. Currently the evolution of the level set function and the re-initialization works, but only with no inner and outer excision. The analysis routines to ﬁnd areas of the surfaces does not work with Carpet. Reading in metric data has not been tested with Carpet.

This documentation will be updated, as input comes in from users.

Happy event horizon ﬁnding.

### References

[1]   Diener P., 2003, 2003, Classical and Quantum Gravity, 20, 4901–4917, A New General Purpose Event Horizon Finder for 3D Numerical Spacetimes, gr-qc/0305039

### 8 Parameters

 area_calculation_method Scope: private KEYWORD Description: How should the areas be calculated Range Default: standard standard Using a angular coordinate system on the surface isosurface Using an isosurface triangulation

 area_interpolation_order Scope: private INT Description: What order should be used for the area interpoation Range Default: 3 1:* A valid positive interpolation order

 area_interpolator Scope: private STRING Description: What interpolator should be used for the area Range Default: Lagrange polynomial interpolation .+ A valid interpolator name

 cas_a Scope: private REAL Description: Initial a coeﬃcient of ovaloid of cassini Range Default: 2.0 : Any number (negative and positive are equivalent)

 cas_b Scope: private REAL Description: Initial b coeﬃcient of ovaloid of cassini Range Default: 2.05 : Any number (negative and positive are equivalent)

 center_x Scope: private REAL Description: The x-coordinate of the center Range Default: 0.0 *:* Anything

 center_y Scope: private REAL Description: The y-coordinate of the center Range Default: 0.0 *:* Anything

 center_z Scope: private REAL Description: The z-coordinate of the center Range Default: 0.0 *:* Anything

 cheat Scope: private BOOLEAN Description: Should we cheat and evolve using the last data set for a while? Default: no

 cheat_iterations Scope: private INT Description: For how many iterations should we cheat Range Default: (none) 0:* If you really want to cheat this should be positive

 eh_lapse_type Scope: private KEYWORD Description: Do we use numerical or analytic metric information Range Default: numerical numerical Read in metric from numerical data analytic Use external analytic metric

 eh_metric_type Scope: private KEYWORD Description: Do we use numerical or analytic metric information Range Default: numerical numerical Read in metric from numerical data analytic Use external analytic metric

 eh_number_level_sets Scope: private INT Description: How many level set functions should we evolve Range Default: 1 1:10 Between 1 and 10

 eh_shift_type Scope: private KEYWORD Description: Do we use numerical or analytic metric information Range Default: numerical numerical Read in metric from numerical data analytic Use external analytic metric

 evolve_generators Scope: private BOOLEAN Description: Should the generators be evolved Default: no

 ﬁle_type Scope: private KEYWORD Description: Are the timesteps in separate ﬁles or in one ﬁle? Range Default: one_ﬁle one_ﬁle All timesteps are in the same ﬁle sep_time_ﬁles Timesteps are in separete ﬁles

 generator_distribution Scope: private KEYWORD Description: What initial distribution should be used Range Default: line line Put the generators on a line in the xz-plane 2D array Put the generators on a surface with spherical topology

 generator_interpolation_order Scope: private INT Description: What order should be used for the generator interpoation Range Default: 3 1:* A valid positive interpolation order

 generator_interpolator Scope: private STRING Description: What interpolator should be used for the generators Range Default: Lagrange polynomial interpolation .+ A valid interpolator name

 generator_tracking_method Scope: private KEYWORD Description: What method should be used for tracking the generators Range Default: interpolate_before interpolate_before Interpolate ﬁrst, then calculate interpolate_after Calculate ﬁrst, then interpolate

 initial_a Scope: private REAL Description: Initial a coeﬃcient of ellipsoid Range Default: 1.0 0.0: Positive please

 initial_b Scope: private REAL Description: Initial b coeﬃcient of ellipsoid Range Default: 1.0 0.0: Positive please

 initial_c Scope: private REAL Description: Initial c coeﬃcient of ellipsoid Range Default: 1.0 0.0: Positive please

 initial_f Scope: private KEYWORD Description: Initial surface choice Range Default: sphere sphere spherical surface ellipsoid ellipsoidal surface cassini ovaloid of cassini

 last_iteration_number Scope: private INT Description: The starting iteration number for the EH_Finder (last iteration number of the simulation) Range Default: (none) 0: Positive please

 maximum_surface_number Scope: private INT Description: The maximum number of surfaces expected in the data Range Default: 1 1:* Positive please

 mode Scope: private KEYWORD Description: Mode of operation Range Default: normal normal Find event horizons analysis Provide storage for f without evolving generator Provide storage for f and initialize without evolving

 n_array_ghosts Scope: private INT Description: Number of ghost points in the surface grid array Range Default: 1 1: Positive please

 nphi Scope: private INT Description: Number of points in the phi direction when ﬁnding points on the surface Range Default: 51 1:*:2 Positive and odd please

 ntheta Scope: private INT Description: Number of points in the theta direction when ﬁnding points on the surface Range Default: 51 1:*:2 Positive and odd please

 number_of_generators Scope: private INT Description: How many generators should be evolved Range Default: 1 1:* Postive please

 number_of_generators_phi Scope: private INT Description: How many generators in the phi direction Range Default: 1 1:* Positive please

 number_of_generators_theta Scope: private INT Description: How many generators in the theta direction Range Default: 1 1:* Positive please

 pde_diﬀerences Scope: private KEYWORD Description: Type of ﬁnite diﬀencing used in pde re-initialization Range Default: upwind2 centered Use 2nd order centered diﬀerences except at the boundaries upwind Use 1st order upwinded diﬀerences everywhere upwind2 Use 2nd order upwinded diﬀerences everywhere

 re_init_int_method Scope: private KEYWORD Description: Integration method used in re-initialization Range Default: euler euler Standard euler scheme rk2 Second order Runge-Kutta scheme

 re_init_max_iter Scope: private INT Description: maximum number of iterations in the re-initialization Range Default: 800 0: Positive please

 re_init_undo Scope: private BOOLEAN Description: Should re-initialization be undone at pinch-oﬀ Default: yes

 re_init_verbose Scope: private BOOLEAN Description: Should re-initialization be verbose? Default: no

 re_initialize_every Scope: private INT Description: How often to re-initialize the level set function Range Default: 10 0: If 0 don’t re-initialize

 read_conformal_factor_once Scope: private BOOLEAN Description: Should the conformal factor only be read once Default: yes

 rotation_alpha Scope: private REAL Description: Rotation angle around z-axis of ellipsoid Range Default: 0.0 *:* Everything is possible

 rotation_beta Scope: private REAL Description: Rotation angle around y-axis of ellipsoid Range Default: 0.0 *:* Everything is possible

 rotation_gamma Scope: private REAL Description: Rotation angle around x-axis of ellipsoid Range Default: 0.0 *:* Everything is possible

 saved_iteration_every Scope: private INT Description: How often was the numerical data saved Range Default: 1 1: Positive please

 shell_width Scope: private REAL Description: Width of the evolution region in units of the grid spacing Range Default: 7.0 0.0: Positive please

 surface_direction Scope: private KEYWORD Description: Should we track outward or inward moving surfaces Range Default: outward outward Track outward moving surfaces. Use for event horizon ﬁnding. inward Track inward moving surfaces.

 surface_interpolation_order Scope: private INT Description: What order should be used for the surface interpoation Range Default: 2 1:* A valid positive interpolation order

 surface_interpolator Scope: private STRING Description: What interpolator should be used to locate the surface Range Default: Hermite polynomial interpolation .+ A valid interpolator name

 translate_x Scope: private REAL Description: Translation in x-direction Range Default: 0.0 *:* Everything is possible

 translate_y Scope: private REAL Description: Translation in y-direction Range Default: 0.0 *:* Everything is possible

 translate_z Scope: private REAL Description: Translation in z-direction Range Default: 0.0 *:* Everything is possible

 upwind_type Scope: private KEYWORD Description: Type of upwinding used in evolving the ehﬁnder equations Range Default: characteristic intrinsic Use the values of f itself to determine upwind direction shift Use the shift to determine upwind direction characteristic Use characteristic information

 use_inner_excision Scope: private BOOLEAN Description: Should inner excision be used? Default: yes

 use_outer_excision Scope: private BOOLEAN Description: Should outer excision be used? Default: yes

 use_user_center Scope: private BOOLEAN Description: Should the user prescribed center be used Default: no

 ehﬁnder_max_evolved_array_size Scope: restricted INT Description: The maximum size of evolved grid arrays used by EHFinder Range Default: 1 1:* The size of the generator grid arrays

 ehﬁnder_maxnumevolvedvars Scope: restricted INT Description: The maximum number of evolved variables used by EHFinder Range Default: 1 1:10 Only evolve the level set functions

 ehﬁnder_num_arrayevolved_vars Scope: restricted INT Description: The maximum number of evolved grid arrays used by EHFinder Range Default: 3 0:30 Should be exactly zero or a multiple of three

### 9 Interfaces

Implements:

ehﬁnder

Inherits:

grid

coordgauge

staticconformal

boundary

#### Grid Variables

##### 9.0.1 PRIVATE GROUPS
 Group Names Variable Names Details f compact 0 f dimensions 3 distribution DEFAULT group type GF timelevels 3 vararray_size eh_number_level_sets variable type REAL sf compact 0 sf dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL dfx compact 0 dfx dimensions 3 distribution DEFAULT group type GF tags Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL dfy compact 0 dfy dimensions 3 distribution DEFAULT group type GF tags Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL dfz compact 0 dfz dimensions 3 distribution DEFAULT group type GF tags Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL dfsq compact 0 dfsq dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL
 Group Names Variable Names Details ftmp compact 0 ftmp dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL sftmp compact 0 sftmp dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL fbak compact 0 fbak dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type REAL g3inv compact 0 g3xx description The inverse of the 3-metric g3xy dimensions 3 g3xz distribution DEFAULT g3yy group type GF g3yz tags tensortypealias=”Scalar” Prolongation=”None” g3zz timelevels 1 variable type REAL eh_mask compact 0 eh_mask description The inverse of the 3-metric dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type INT tm_mask compact 0 tm_mask description The inverse of the 3-metric dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type INT
 Group Names Variable Names Details eh_mask_bak compact 0 eh_mask_bak description The inverse of the 3-metric dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 vararray_size eh_number_level_sets variable type INT re_init_control compact 0 re_init_control description The inverse of the 3-metric dimensions 0 distribution CONSTANT group type SCALAR timelevels 1 variable type INT niter_reinit compact 0 niter_reinit description The inverse of the 3-metric dimensions 0 distribution CONSTANT group type SCALAR timelevels 1 variable type INT surface_index compact 0 sc dimensions 3 distribution DEFAULT group type GF tags tensortypealias=”Scalar” Prolongation=”None” timelevels 1 variable type REAL ﬁnd_surface_status compact 0 ﬁnd_surface_status dimensions 0 distribution CONSTANT group type SCALAR timelevels 1 variable type INT levelset_integers compact 0 levelset_counter description Integer variables used to loop over the level sets more_levelsets dimensions 0 distribution CONSTANT group type SCALAR timelevels 1 variable type INT
 Group Names Variable Names Details surface_integers compact 0 surface_counter description Integer variables used in surface integration points_counter dimensions 0 more_surfaces distribution CONSTANT more_points group type SCALAR integrate_counter timelevels 1 variable type INT surface_reals compact 0 sym_factor description Real variables used in surface integration theta_sym_factor dimensions 0 phi_sym_factor distribution CONSTANT group type SCALAR timelevels 1 variable type REAL surface_arrays compact 0 ctheta description Grid arrays for points on the surface cphi dimensions 2 rsurf distribution DEFAULT sintheta ghostsize N_ARRAY_GHOSTS ghostsize N_ARRAY_GHOSTS costheta group type ARRAY sinphi size NTHETA size NPHI cosphi timelevels 1 drdtheta variable type REAL surface_tmp_arrays compact 0 drsurf description Temporary grid arrays for ﬁnding points on the surface interp_x dimensions 2 interp_y distribution DEFAULT interp_z ghostsize N_ARRAY_GHOSTS ghostsize N_ARRAY_GHOSTS f_interp group type ARRAY dfdx_interp size NTHETA size NPHI dfdy_interp timelevels 1 dfdz_interp variable type REAL center_arrays compact 0 center description The cartesian location of the center for the spherical coordinate system dimensions 1 distribution CONSTANT group type ARRAY size 3 timelevels 1 variable type REAL surface_int_array compact 0 n_since_last_reduction description Temporary integer grid array for ﬁnding points on the surface dimensions 2 distribution DEFAULT ghostsize N_ARRAY_GHOSTS ghostsize N_ARRAY_GHOSTS group type ARRAY size NTHETA size NPHI timelevels 1 variable type INT
 Group Names Variable Names Details interp_metric_arrays compact 0 gxxi description Arrays for holding the interpolated metric and conformal factor gxyi dimensions 2 gxzi distribution DEFAULT gyyi ghostsize N_ARRAY_GHOSTS ghostsize N_ARRAY_GHOSTS gyzi group type ARRAY gzzi size NTHETA size NPHI psii timelevels 1 variable type REAL integrate_tmp_array compact 0 int_tmp description Temporary array that is used in the integration of various quantities dimensions 2 distribution DEFAULT ghostsize N_ARRAY_GHOSTS ghostsize N_ARRAY_GHOSTS group type ARRAY size NTHETA size NPHI timelevels 1 variable type REAL eh_area compact 0 eh_area description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_area2 compact 0 eh_area2 description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_centroid_x compact 0 eh_centroid_x description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_centroid_y compact 0 eh_centroid_y description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL
 Group Names Variable Names Details eh_centroid_z compact 0 eh_centroid_z description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_centroid2_x compact 0 eh_centroid2_x description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_centroid2_y compact 0 eh_centroid2_y description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_centroid2_z compact 0 eh_centroid2_z description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_circ_eq compact 0 eh_circ_eq description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_circ_pol compact 0 eh_circ_pol description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL
 Group Names Variable Names Details eh_circ_eq2 compact 0 eh_circ_eq2 description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL eh_circ_pol2 compact 0 eh_circ_pol2 description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size MAXIMUM_SURFACE_NUMBER timelevels 1 vararray_size eh_number_level_sets variable type REAL xg compact 0 xg description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS timelevels 3 vararray_size eh_number_level_sets variable type REAL yg compact 0 yg description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS timelevels 3 vararray_size eh_number_level_sets variable type REAL zg compact 0 zg description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS timelevels 3 vararray_size eh_number_level_sets variable type REAL dxg compact 0 dxg description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS timelevels 1 vararray_size eh_number_level_sets variable type REAL
 Group Names Variable Names Details dyg compact 0 dyg description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS timelevels 1 vararray_size eh_number_level_sets variable type REAL dzg compact 0 dzg description Temporary array that is used in the integration of various quantities dimensions 1 distribution DEFAULT ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS timelevels 1 vararray_size eh_number_level_sets variable type REAL generator_arrays compact 0 alpg description Arrays to hold the interpolated metric description gauge and level set data betaxg dimensions 1 betayg distribution DEFAULT betazg ghostsize 0 gxxg group type ARRAY gxyg size NUMBER_OF_GENERATORS gxzg timelevels 1 gyyg variable type REAL generator_gf compact 0 xgf description Temporary grid function used in calculating the right hand side of the generator evolution equation ygf dimensions 3 zgf distribution DEFAULT group type GF tags Prolongation=”None” timelevels 1 variable type REAL xg2 compact 0 xg2 description Temporary grid function used in calculating the right hand side of the generator evolution equation dimensions 2 distribution DEFAULT ghostsize 0 ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI timelevels 3 vararray_size eh_number_level_sets variable type REAL yg2 compact 0 yg2 description Temporary grid function used in calculating the right hand side of the generator evolution equation dimensions 2 distribution DEFAULT ghostsize 0 ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI timelevels 3 vararray_size eh_number_level_sets variable type REAL
 Group Names Variable Names Details zg2 compact 0 zg2 description Temporary grid function used in calculating the right hand side of the generator evolution equation dimensions 2 distribution DEFAULT ghostsize 0 ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI timelevels 3 vararray_size eh_number_level_sets variable type REAL dxg2 compact 0 dxg2 description Temporary grid function used in calculating the right hand side of the generator evolution equation dimensions 2 distribution DEFAULT ghostsize 0 ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI timelevels 1 vararray_size eh_number_level_sets variable type REAL dyg2 compact 0 dyg2 description Temporary grid function used in calculating the right hand side of the generator evolution equation dimensions 2 distribution DEFAULT ghostsize 0 ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI timelevels 1 vararray_size eh_number_level_sets variable type REAL dzg2 compact 0 dzg2 description Temporary grid function used in calculating the right hand side of the generator evolution equation dimensions 2 distribution DEFAULT ghostsize 0 ghostsize 0 group type ARRAY size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI timelevels 1 vararray_size eh_number_level_sets variable type REAL generator_arrays2 compact 0 alpg2 description Arrays to hold the interpolated metric description gauge and level set data betaxg2 dimensions 2 betayg2 distribution DEFAULT betazg2 ghostsize 0 ghostsize 0 gxxg2 group type ARRAY gxyg2 size NUMBER_OF_GENERATORS_THETA size NUMBER_OF_GENERATORS_PHI gxzg2 timelevels 1 gyyg2 variable type REAL generator_gf2 compact 0 xgf2 description Temporary grid function used in calculating the right hand side of the generator evolution equation ygf2 dimensions 3 zgf2 distribution DEFAULT group type GF tags Prolongation=”None” timelevels 1 variable type REAL

Boundary.h

carpet.h

### 10 Schedule

This section lists all the variables which are assigned storage by thorn EinsteinAnalysis/EHFinder. 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

 Conditional: f[1] f[2] levelset_integers center_arrays xg[2] yg[2] zg[2] dxg dyg dzg xg2[2] yg2[2] zg2[2] dxg2 dyg2 dzg2 sf ftmp sftmp eh_mask surface_arrays eh_area2 eh_centroid2_x eh_centroid2_y eh_centroid2_z eh_circ_eq2 eh_circ_pol2 ﬁnd_surface_status

#### Scheduled Functions

CCTK_PARAMCHECK (conditional)

ehﬁnder_paramcheck

check parameters

 Language: fortran Type: function

CCTK_INITIAL (conditional)

 Language: fortran Type: function

CCTK_POST_RECOVER_VARIABLES (conditional)

ehﬁnder_initweights

setup weights for simpson integration

 Language: fortran Type: function

CCTK_ANALYSIS (conditional)

ehﬁnder_level_sets

loop over the level set functions

 Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: group

EHFinder_Level_Sets (conditional)

ehﬁnder_levelsetloopinit

initialize the loop counter over the level set functions

 Language: fortran Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_Level_Sets (conditional)

ehﬁnder_surfaces

count the number of surfaces and integrate over them

 Storage: surface_integers surface_reals surface_index Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: group While: ehﬁnder::more_levelsets

EHFinder_Surfaces (conditional)

ehﬁnder_countsurfacesinit

initialize while loop control

 Language: fortran Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_Surfaces (conditional)

ehﬁnder_countmarksurfaces

counting and mark surfaces

 After: ehﬁnder_countsurfacesinit Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: group While: ehﬁnder::more_surfaces

EHFinder_CountMarkSurfaces (conditional)

ehﬁnder_countsurfaces

check if there are more surfaces

 Language: fortran Sync: surface_index Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_CountMarkSurfaces (conditional)

ehﬁnder_markpoints

marking surfaces

 After: ehﬁnder_countsurfaces Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: group While: ehﬁnder::more_points

EHFinder_MarkPoints (conditional)

ehﬁnder_marksurfaces

mark points inside the current surface

 Language: fortran Sync: surface_index Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_MarkPoints (conditional)

ehﬁnder_applysymsc

select the surface counter grid function for boundary conditions

 After: ehﬁnder_marksurfaces Language: fortran Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

CCTK_INITIAL (conditional)

 Language: fortran Type: function

EHFinder_MarkPoints (conditional)

applybcs

apply boundary conditions (symmetries)

 After: ehﬁnder_applysymsc Type: group

EHFinder_Surfaces (conditional)

ehﬁnder_infosurfaces

 After: ehﬁnder_countmarksurfaces Language: fortran Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_Surfaces (conditional)

ehﬁnder_integration

ﬁnd and integrate over surfaces

 After: ehﬁnder_infosurfaces Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: group While: ehﬁnder::integrate_counter

EHFinder_Integration (conditional)

ehﬁnder_ﬁndsurface

ﬁnd surface

 Language: fortran Storage: surface_tmp_arrays surface_int_array Sync: surface_arrays Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_Integration (conditional)

ehﬁnder_ﬁndsurfaceelement

ﬁnd surface area element

 After: ehﬁnder_ﬁndsurface Language: fortran Storage: surface_tmp_arrays interp_metric_arrays Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_Integration (conditional)

ehﬁnder_integratearea

calculate area integrals

 After: ehﬁnder_ﬁndsurfaceelement Language: fortran Storage: integrate_tmp_array Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

EHFinder_Integration (conditional)

ehﬁnder_integratecentroid

calculate centroid integrals

 After: ehﬁnder_integratearea Language: fortran Storage: surface_tmp_arrays integrate_tmp_array Triggers: eh_centroid_x eh_centroid_y eh_centroid_z Type: function

EHFinder_Integration (conditional)

ehﬁnder_integratecircumference

calculate circumferences

 After: ehﬁnder_integratearea Language: fortran Storage: surface_tmp_arrays integrate_tmp_array Triggers: eh_circ_eq eh_circ_pol Type: function

EHFinder_Surfaces (conditional)

ehﬁnder_updatecounter

update the loop variables

 Language: fortran Triggers: eh_area eh_centroid_x eh_centroid_y eh_centroid_z eh_circ_eq eh_circ_pol Type: function

CCTK_ANALYSIS (conditional)

ehﬁnder_copyarea

copy areas to output variable

 After: ehﬁnder_level_sets Language: fortran Storage: eh_area Triggers: eh_area Type: function

CCTK_INITIAL (conditional)

 Language: fortran Type: function

CCTK_ANALYSIS (conditional)

ehﬁnder_copycentroid

copy centroids to output variable

 After: ehﬁnder_level_sets Language: fortran Storage: eh_centroid_x eh_centroid_y eh_centroid_z Triggers: eh_centroid_x eh_centroid_y eh_centroid_z Type: function

CCTK_ANALYSIS (conditional)

ehﬁnder_copycircumference

copy circumferences to output variable

 After: ehﬁnder_level_sets Language: fortran Storage: eh_circ_eq eh_circ_pol Triggers: eh_circ_eq eh_circ_pol Type: function

CCTK_ANALYSIS (conditional)

ehﬁnder_isosurfacearea

ﬁnd isosurfaces and calculate the area

 Triggers: eh_area Type: group

EHFinder_IsoSurfaceArea (conditional)

ehﬁnder_isosurface

ﬁnd isosurfaces

 Language: fortran Storage: eh_area Triggers: eh_area Type: function

CCTK_PRESTEP (conditional)

 Language: fortran Type: function

CCTK_PRESTEP (conditional)

 Language: fortran Type: function

CCTK_PRESTEP (conditional)

 Language: fortran Type: function

CCTK_PRESTEP (conditional)

read in conformal factor from ﬁle

 Language: fortran Type: function

CCTK_PRESTEP (conditional)

 Language: fortran Type: function

MoL_Register (conditional)

ehﬁnder_molregister

register evolution variables

 Language: fortran Type: function

CCTK_INITIAL (conditional)

read in conformal factor from ﬁle

 Language: fortran Type: function

CCTK_BASEGRID (conditional)

ehﬁnder_setsym

register the symmetries for the level set function

 Language: fortran Storage: sftmp Type: function

CCTK_POSTINITIAL (conditional)

 After: ehﬁnder_init Language: fortran Type: function

MoL_CalcRHS (conditional)

ehﬁnder_sources

calculate the source terms

 Language: fortran Storage: dfx dfy dfz g3inv Type: function

MoL_CalcRHS (conditional)

ehﬁnder_generator_sources

calculate the source terms for the generator evolution

 Language: fortran Storage: generator_arrays Type: function

MoL_CalcRHS (conditional)

ehﬁnder_generator_sources_2d

calculate the source terms for the 2d generator evolution

 Language: fortran Storage: generator_arrays2 Type: function

MoL_CalcRHS (conditional)

ehﬁnder_generator_sources2

calculate the source terms2 for the generator evolution

 After: ehﬁnder_sources Language: fortran Storage: generator_arrays Type: function

MoL_PostStep (conditional)

ehﬁnder_poststep

schedule group for symmetry boundaries and syncing

 Type: group

EHFinder_PostStep (conditional)

ehﬁnder_applysymf

select f for boundary conditions

 Language: fortran Sync: f sftmp Type: function

EHFinder_PostStep (conditional)

applybcs

apply boundary conditions (symmetries)

 After: ehﬁnder_applysymf Type: group

CCTK_POSTSTEP (conditional)

ehﬁnder_reinitialize

re-initialize the level set function

 Storage: fbak eh_mask_bak re_init_control niter_reinit Type: group

CCTK_INITIAL (conditional)

 After: maskone Language: fortran Type: function

(conditional)

ehﬁnder_prereinitialize

routines for re-initialization control

 Type: group

EHFinder_PreReInitialize (conditional)

ehﬁnder_reinitializecontrol

initializes the re-initialization control

 Language: fortran Options: global Type: function

EHFinder_PreReInitialize (conditional)

ehﬁnder_reinitializeinitialize

initializes variables for reinitialization

 After: ehﬁnder_reinitializecontrol Language: fortran Type: function

(conditional)

euler_reinitializeevolve

schedule group for euler re-initialization evolution

 Type: group

Euler_ReInitializeEvolve (conditional)

ehﬁnder_reinitializeeuler

euler scheme

 Language: fortran Storage: dfx dfy dfz dfsq Type: function

Euler_ReInitializeEvolve (conditional)

ehﬁnder_applysymfsftmp

select f for boundary conditions

 After: ehﬁnder_reinitializeeuler Language: fortran Sync: f sftmp Type: function

Euler_ReInitializeEvolve (conditional)

applybcs

apply boundary conditions (symmetries)

 After: ehﬁnder_applysymf Type: group

(conditional)

euler_poststep

schedule group for euler re-initialization post step

 Type: group

Euler_PostStep (conditional)

ehﬁnder_reinitializepoststep

check if the re-initialization is done

 Language: fortran Options: global Type: function

EHFinder_ReInitialize (conditional)

ehﬁnder_prereinitialize

pugh version of the pre-re-initialization routines

 Type: group

CCTK_INITIAL (conditional)

ehﬁnder_init

setup local variables

 Language: fortran Sync: f Type: function

EHFinder_ReInitialize (conditional)

euler_reinitialize

schedule group for euler re-initialization

 After: ehﬁnder_prereinitializepugh Type: group While: ehﬁnder::re_init_control

Euler_ReInitialize (conditional)

euler_reinitializeevolve

schedule group for euler re-initialization evolution with pugh

 Type: group

Euler_ReInitialize (conditional)

euler_poststep

schedule group for euler re-initialization post step

 After: euler_reinitializeevolve Type: group

EHFinder_ReInitialize (conditional)

ehﬁnder_reinitialize_check

check to see if re-initialization has to be undone

 After: euler_reinitialize Language: fortran Type: function

EHFinder_ReInitialize (conditional)

ehﬁnder_prereinitialize_carpet

carpet version of the pre-reinitialization routines

 Language: c Options: level Type: function

EHFinder_ReInitialize (conditional)

ehﬁnder_reinitialize_wrapper

wrapper routine for euler re-initialization for carpet

 After: ehﬁnder_prereinitialize_carpet Language: c Options: level Type: function While: ehﬁnder::re_init_control

EHFinder_ReInitialize (conditional)

rk2_reinitialize

schedule group for rk2 re-initialization

 After: ehﬁnder_reinitializecontrol Type: group While: ehﬁnder::re_init_control

RK2_ReInitialize (conditional)

ehﬁnder_reinitializerk2_1

rk2 scheme step 1

 Language: fortran Storage: dfx dfy dfz dfsq Type: function

RK2_ReInitialize (conditional)

ehﬁnder_applysymf

select f for boundary conditions

 After: ehﬁnder_reinitializerk2_1 Language: fortran Sync: f Type: function

RK2_ReInitialize (conditional)

applybcs

apply boundary conditions (symmetries)

 After: sym_rk2_1 Type: group

CCTK_INITIAL (conditional)

ehﬁnder_init_f

setup the initial surface

 Language: fortran Sync: f Type: function

RK2_ReInitialize (conditional)

ehﬁnder_reinitializerk2_2

rk2 scheme step 2

 After: sym_rk2_1 Language: fortran Storage: dfx dfy dfz dfsq Type: function

RK2_ReInitialize (conditional)

ehﬁnder_applysymf

select f for boundary conditions

 After: ehﬁnder_reinitializerk2_2 Language: fortran Sync: f Type: function

RK2_ReInitialize (conditional)

applybcs

apply boundary conditions (symmetries)

 After: sym_rk2_2 Type: group

CCTK_POSTSTEP

 After: ehﬁnder_reinitialize Storage: tm_mask Type: group

ehﬁnder_applysymall

select both f and eh_mask for boundary conditions

 After: ehﬁnder_setmask1 Language: fortran Type: function

applybcs

apply boundary conditions (symmetries)

 After: ehﬁnder_applysymall Type: group

ﬁnd excision boundaries

 After: ehﬁnder_setmask2 Language: fortran Type: function

applybcs

apply boundary conditions (symmetries)

 After: asm1 Type: group

CCTK_INITIAL (conditional)

ehﬁnder_initweights

setup weights for simpson integration

 Language: fortran Type: function

check to see if the mask needs to be modiﬁed

 After: ehﬁnder_setmask3 Language: fortran Type: function

applybcs

apply boundary conditions (symmetries)

 After: asm2 Type: group

ﬁnd excision boundaries

 After: sm2 Language: fortran Type: function

applybcs

apply boundary conditions (symmetries)

 After: asm3 Type: group

CCTK_POST_RECOVER_VARIABLES (conditional)

ehﬁnder_init

setup local variables

 Language: fortran Sync: f Type: function

#### Aliased Functions

 Alias Name: Function Name: ApplyBCs EHFinderMask3_ApplyBCs EHFinder_ApplySymF Sym_RK2_2 EHFinder_ApplySymMask ASM3 EHFinder_PreReInitialize EHFinder_PreReInitializePugh EHFinder_SetMask2 SM2 Euler_PostStep Euler_PostStepPUGH Euler_ReInitializeEvolve Euler_ReInitializeEvolvePUGH