AHFinder

Miguel Alcubierre/Latex version by Peter Diener

\( \)Date\( \)

Abstract

Finding Apparent Horizons in a numerical spacetime

1 Purpose

Thorn AHFinder finds Apparent Horizons (AHs) in numerical spacetimes. It calulates various quantities like horizon area and its corresponding mass.

2 Using AHFinder

Thorn AHFinder can be used either with a minimization or a flow algorithm.

2.1 Parameters

General parameters

Parameters used in evolutions

Parameters specifying the expansion of the surface in sperical harmonics.

Looking for three horizons

The finder can also be used to look for three horizons each time. This is done by just running the algorithm three consecutive times with different initial guesses, and is useful for simulations of black hole collisions.

Further parameters for the initial guess

The initial guess can be furthermore controlled by some parameters which are set to ”no” by default.

Parameters for surface intergrals

Parameters indicating symmetries

Parameters for minimization algorithm

Parameters for the flow algorithm

The character of the different flows and the \(\alpha \) and \(\beta \) parameters are described in Carsten Gundlach’s paper on his pseudo-spectral apparent horizon finder (gr-qc/9707050).

Parameters for output

Parameters for mask

2.2 Minimal parameter settings

Usually only a few of the parameters described above are needed in the parameter file. The simplest parameter settings for using the flow algorithm for a full 3D horizon with a large sphere as initial guess is

interpolation_order = 2     # Second order interpolation
ahf_active          = "yes"
ahf_flow            = "yes"
ahf_phi             = "yes"

This looks for a non-axisymmetric horizon around the origin with lmax = 8 and using the flow algorithm. It starts with the largest sphere that fits in the 3D grid and outputs 2D grid functions. The other parameters can be used if needed.

2.3 Hints for parameter settings

In full 3D the flow algorithm is faster than the minimization algorithm. However, in cases when there are very few terms in the expansion in spherical harmonics the minimization can be faster. In axisymmetry this typically happens for lmax\(\leq 10\).

While the default settings usually work fine, they can be changed to meet special purposes:

2.4 Output to Files

The output of the thorn consists of two gridfunctions and several one dimensional output files.

2.5 Some results with the finder

The finder has been examined with puncture initial data for single and binary-black hole scenarios.

Calculations with different grid spacings but constant grid size show convergence of the horizon area.

This has been checked with different linear momenta in the z direction \(P_{z}=(0M,2M,5M)\) and vanishing spin. Also for \(P_{z}=2M\) and a spin of \(5M\) in the x direction the horizon converges. Figure 1 shows the case with \(P_{z}=2M\) and vanishing spin.


PIC


Figure 1: Convergence of the horizon area for \(P_{z}=2M\)

Further, not only the area converges but also the shape of the horizon. For both the minimization and the flow algorithm the horizon converges to the same shape, as can be seen from the coefficients fo the expansion. The order of convergence for the coefficients is between 1.4 and 1.7.

By using the parameters ahf_xc, ahf_yc, ahf_zc it can also be shown that the finder also locates horizons which are not centered. This works in general as long as the surface can be expanded in spherical harmonics around this point, but the error increases with the off-centering.

The parameter ahf_r0 can be used e.g. when dealing with two black holes. If one searches for separate horizons one can center the finder on one of the locations of the holes and use an initial radius ahf_r0 smaller than the coordinate distance of the holes. With this parameter settings the single horizon can be found faster. But also a setup with an initial sphere of maximum radius should work at least for the flow algorithm. This has been checked with puncture data for two holes with vanishing linear and angular momentum for each hole (equivalent to Brill-Lindquist data) and is shown in Figure 2. Here for a coordinate distance of the holes of 1.6M the separated horizons for the holes are found but no common horizon. For a coordinate distance of 1.5M a common horizon is found and also single ones, which are inner surfaces in this case. This coincides with other work where the critical coordinate distance for a single horizon is between 1.53M and 1.56M (gr-qc/9809004).


PIC


Figure 2: Horizon positions for BL data

The dashed lines show inner trapped surfaces in the left figure and the surface where the algorithm stopped without finding a horizon in the right figure.

Also the Misner case was checked. Here for \(\mu \) = 1.35 a common horizon is found. For \(\mu \) = 1.37 separated horizons are found. From the literature we know that (e.g. gr-qc/9809004) the critical value of \(\mu \) is 1.36. This is confirmed by the horizon finder.

The information of when a horizon was found can be seen in the cactus-logfile. There will be output from the thorn even if no horizon was found.

References

3 Parameters




ahf_1doutput
Scope: private  BOOLEAN



Description: 1D output of grid functions?



  Default: no






ahf_2doutput
Scope: private  BOOLEAN



Description: 2D output of grid functions?



  Default: no






ahf_3doutput
Scope: private  BOOLEAN



Description: 3D output of grid functions?



  Default: no






ahf_areamap
Scope: private  BOOLEAN



Description: Find area map?



  Default: no






ahf_cartoon
Scope: private  BOOLEAN



Description: Cartoon mode?



  Default: no






ahf_find3
Scope: private  BOOLEAN



Description: Searching for 3 surfaces?



  Default: no






ahf_findafter
Scope: private  INT



Description: After how many iterations look for horizons



Range   Default: (none)
0:
Any positive integer






ahf_findaftertime
Scope: private  REAL



Description: After how much time look for horizons



Range   Default: 0.0
0.0:
Any positive real number. If non-zero overides ahf_findafter






ahf_findevery
Scope: private  INT



Description: How often to look for horizons



Range   Default: 1
1:
Set to 1 for searching each iteration






ahf_flow
Scope: private  BOOLEAN



Description: Use flow instead of minimization?



  Default: no






ahf_flowa
Scope: private  REAL



Description: alpha parameter for flow



Range   Default: 0.01
:
Anything






ahf_flowb
Scope: private  REAL



Description: beta parameter for flow



Range   Default: 0.5
:
Anything






ahf_flowc
Scope: private  REAL



Description: Weight of C flow



Range   Default: 1.0
:
Anything






ahf_flowh
Scope: private  REAL



Description: Weight of H flow



Range   Default: 0.0
:
Anything






ahf_flowiter
Scope: private  INT



Description: Maximum number of iterations for flow



Range   Default: 200
0:
Anything






ahf_flown
Scope: private  REAL



Description: Weight of N flow



Range   Default: 0.0
:
Anything






ahf_flowtol
Scope: private  REAL



Description: Tolerance for flow



Range   Default: 0.0001
:
Anything






ahf_gaussout
Scope: private  BOOLEAN



Description: Output gaussian curvature of horizon?



  Default: yes






ahf_guess_absmin
Scope: private  BOOLEAN



Description: Use absolute min to start minimization?



  Default: no






ahf_guessold
Scope: private  BOOLEAN



Description: Use old horizon as initial guess?



  Default: no






ahf_guessverbose
Scope: private  BOOLEAN



Description: Print info on initial guess?



  Default: no






ahf_hdf5output
Scope: private  BOOLEAN



Description: HDF5 output of AHFinder data?



  Default: no






ahf_inner
Scope: private  BOOLEAN



Description: Look for inner horizon?



  Default: no






ahf_l0_guess
Scope: private  REAL



Description: Manual guess for l=0 component



Range   Default: 1.0
:
Anything






ahf_l10_guess
Scope: private  REAL



Description: Manual guess for l=10 component



Range   Default: 0.0
:
Anything






ahf_l12_guess
Scope: private  REAL



Description: Manual guess for l=12 component



Range   Default: 0.0
:
Anything






ahf_l14_guess
Scope: private  REAL



Description: Manual guess for l=14 component



Range   Default: 0.0
:
Anything






ahf_l16_guess
Scope: private  REAL



Description: Manual guess for l=16 component



Range   Default: 0.0
:
Anything






ahf_l18_guess
Scope: private  REAL



Description: Manual guess for l=18 component



Range   Default: 0.0
:
Anything






ahf_l2_guess
Scope: private  REAL



Description: Manual guess for l=2 component



Range   Default: 0.0
:
Anything






ahf_l4_guess
Scope: private  REAL



Description: Manual guess for l=4 component



Range   Default: 0.0
:
Anything






ahf_l6_guess
Scope: private  REAL



Description: Manual guess for l=6 component



Range   Default: 0.0
:
Anything






ahf_l8_guess
Scope: private  REAL



Description: Manual guess for l=8 component



Range   Default: 0.0
:
Anything






ahf_lmax
Scope: private  INT



Description: Maximum number of terms in theta expansion



Range   Default: 8
0:19
Range from 0 to 19






ahf_logfile
Scope: private  BOOLEAN



Description: Write log file?



  Default: no






ahf_manual_guess
Scope: private  BOOLEAN



Description: Use specified coefficients for guess?



  Default: no






ahf_mask
Scope: private  KEYWORD



Description: Use mask?



Range   Default: off
off
Mask is off
strong
Mask set only for definite horizons
weak
Mask set for both definite and probable horizons






ahf_mask_0
Scope: private  BOOLEAN



Description: Mask for first horizon with find3?



  Default: yes






ahf_mask_1
Scope: private  BOOLEAN



Description: Mask for second horizon with find3?



  Default: yes






ahf_mask_2
Scope: private  BOOLEAN



Description: Mask for third horizon with find3?



  Default: yes






ahf_mask_time
Scope: private  REAL



Description: Time after which to start setting the mask



Range   Default: -1.0
:
Anything goes. Negative number means setting the mask as soon as possible






ahf_maskbuffer
Scope: private  INT



Description: Number of grid points in mask buffer zone



Range   Default: 5
0:*
Positive please






ahf_maskshrink
Scope: private  REAL



Description: Shrink factor for mask



Range   Default: 0.8
0.0:1.0
Must be positive and not larger than 1






ahf_masktype
Scope: private  KEYWORD



Description: Type of mask



Range   Default: cube
lego
Mask is a lego sphere
cube
Mask is a cube
poly
Mask is a polyhedra






ahf_maxchange
Scope: private  REAL



Description: Maximum relative difference between 1 big and 2 small steps



Range   Default: 0.1
:
Anything






ahf_maxiter
Scope: private  INT



Description: Maximum number of iterations of POWELL



Range   Default: 10
:
Any sensible integer value






ahf_minarea
Scope: private  BOOLEAN



Description: Minimize area instead of expansion?



  Default: no






ahf_minchange
Scope: private  REAL



Description: Minimum relative difference between 1 big and 2 small steps



Range   Default: 0.01
:
Anything






ahf_nn0
Scope: private  INT



Description: Number of subdivisions of c0(0) for initial guess



Range   Default: 10
:
Some positive integer






ahf_nn2
Scope: private  INT



Description: Number of subdivisions of c0(2) for initial guess



Range   Default: 10
:
Some positive integer






ahf_nphi
Scope: private  INT



Description: Number of subdivisions in phi



Range   Default: 100
1:
Any sensible integer






ahf_ntheta
Scope: private  INT



Description: Number of subdivisions in theta



Range   Default: 100
1:
Any sensible integer






ahf_octant
Scope: private  KEYWORD



Description: Octant symmetry?



Range   Default: no
no
No octant symmetry
yes
Octant symmetry: reflection symmetry on all three coordinate planes
high
Octant symmetry + symmetry of rotation of pi/2 around z axis






ahf_offset
Scope: private  BOOLEAN



Description: Center offset from origin?



  Default: no






ahf_phi
Scope: private  BOOLEAN



Description: Expand also in phi? (seach for non-axisymmetric surface)



  Default: no






ahf_r0
Scope: private  REAL



Description: Radius of initial sphere (0 forces largest sphere)



Range   Default: 0.0
:
Anything






ahf_r0_0
Scope: private  REAL



Description: Radius of first initial sphere for find3 (0 forces largest sphere)



Range   Default: 0.0
:
Anything






ahf_r0_1
Scope: private  REAL



Description: Radius of second initial sphere for find3 (0 forces largest sphere)



Range   Default: 0.0
:
Anything






ahf_r0_2
Scope: private  REAL



Description: Radius of third initial sphere for find3 (0 forces largest sphere)



Range   Default: 0.0
:
Anything






ahf_refx
Scope: private  BOOLEAN



Description: Reflection symmetry x->-x?



  Default: no






ahf_refy
Scope: private  BOOLEAN



Description: Reflection symmetry y->-y?



  Default: no






ahf_refz
Scope: private  BOOLEAN



Description: Reflection symmetry z->-z?



  Default: no






ahf_reportalways
Scope: private  BOOLEAN



Description: Report for all surfaces found (yes) or just for apparent horizons (no)



  Default: no






ahf_shiftcoeff
Scope: private  REAL



Description: Coefficient for shift



Range   Default: 0.0
:
Anything goes






ahf_sloppyguess
Scope: private  BOOLEAN



Description: Use sphere as initial guess?



  Default: no






ahf_tol
Scope: private  REAL



Description: Tolerance for minimization routines



Range   Default: 0.1
0:
A sensible positive number






ahf_trapped_surface
Scope: private  BOOLEAN



Description: Minimize (expansion + delta) to find trapped surface?



  Default: no






ahf_verbose
Scope: private  BOOLEAN



Description: Print messages to screen?



  Default: yes






ahf_veryverbose
Scope: private  BOOLEAN



Description: Print messages at each iteration step to screen?



  Default: no






ahf_wander
Scope: private  BOOLEAN



Description: Allow the center to wander?



  Default: no






ahf_xc
Scope: private  REAL



Description: x-coordinate of center of expansion



Range   Default: 0.0
:
Anything






ahf_xc_0
Scope: private  REAL



Description: x-coordinate of center of expansion for first surface with find3



Range   Default: 0.0
:
Anything






ahf_xc_1
Scope: private  REAL



Description: x-coordinate of center of expansion for second surface with find3



Range   Default: 0.0
:
Anything






ahf_xc_2
Scope: private  REAL



Description: x-coordinate of center of expansion for third surface with find3



Range   Default: 0.0
:
Anything






ahf_yc
Scope: private  REAL



Description: y-coordinate of center of expansion



Range   Default: 0.0
:
Anything






ahf_yc_0
Scope: private  REAL



Description: y-coordinate of center of expansion for first surface with find3



Range   Default: 0.0
:
Anything






ahf_yc_1
Scope: private  REAL



Description: y-coordinate of center of expansion for second surface with find3



Range   Default: 0.0
:
Anything






ahf_yc_2
Scope: private  REAL



Description: y-coordinate of center of expansion for third surface with find3



Range   Default: 0.0
:
Anything






ahf_zc
Scope: private  REAL



Description: z-coordinate of center of expansion



Range   Default: 0.0
:
Anything






ahf_zc_0
Scope: private  REAL



Description: z-coordinate of center of expansion for first surface with find3



Range   Default: 0.0
:
Anything






ahf_zc_1
Scope: private  REAL



Description: z-coordinate of center of expansion for second surface with find3



Range   Default: 0.0
:
Anything






ahf_zc_2
Scope: private  REAL



Description: z-coordinate of center of expansion for third surface with find3



Range   Default: 0.0
:
Anything






horizon_to_announce_centroid
Scope: private  INT



Description: For which horizon should we announce the centroid to driftcorrect



Range   Default: (none)
don’t announce the centroid
1:3
announce this horizon’s centroid each time we find it






horizon_to_output_centroid
Scope: private  INT



Description: For which horizon should we output the centroid



Range   Default: (none)
don’t output any centroids
1:3
output this horizon’s centroid each time we find it






interpolation_operator
Scope: private  STRING



Description: Name of interpolation operator to use



Range   Default: uniform cartesian
.+
A valid name for a registered interpolation operator






interpolation_order
Scope: private  INT



Description: Order for interpolation



Range   Default: 2
1:4
Choose between first and fourth order interpolation






trapped_surface_delta
Scope: private  REAL



Description: find (expansion = delta) surface



Range   Default: 0.0
:
Just a real number






ahf_active
Scope: restricted  BOOLEAN



Description: Activate AHFinder?



  Default: no






ahf_persists
Scope: restricted  BOOLEAN



Description: Do the finder grid functions stay around?



  Default: no






use_mask
Scope: shared from SPACEMASK BOOLEAN



4 Interfaces

General

Implements:

ahfinder

Inherits:

admbase

staticconformal

spacemask

grid

io

admmacros

Grid Variables

4.0.1 PRIVATE GROUPS




  Group Names    Variable Names    Details   




triggergroup   compact0
triggervar   descriptionFor triggering output
  dimensions0
  distributionCONSTANT
  group typeSCALAR
  timelevels1
 variable typeINT




ahfgradient   compact0
ahfgradx   descriptionGrid functions for gradients
ahfgrady   dimensions3
ahfgradz   distributionDEFAULT
ahfgradn   group typeGF
  timelevels1
 variable typeREAL




ahfinder_gauss   compact0
ahfgauss   descriptionGrid function for gaussian curvature calculation
  dimensions3
  distributionDEFAULT
  group typeGF
  timelevels1
 variable typeREAL




find3grid   compact0
ahfgrid3   descriptionGrid functions to use in find3 algorithm
ahf_exp3   dimensions3
  distributionDEFAULT
  group typeGF
  timelevels1
 variable typeREAL




ahf_centroid   compact0
ahf_centroid_x   descriptionCentroid of one of the horizons
ahf_centroid_y   dimensions0
ahf_centroid_z   distributionCONSTANT
  group typeSCALAR
  timelevels1
 variable typeREAL




drift_check   compact0
drift_first   descriptionFor checking if its the first drift correction
  dimensions0
  distributionCONSTANT
  group typeSCALAR
  timelevels1
 variable typeINT








  Group Names    Variable Names    Details   




out_scalars   compact0
out_mass   descriptionOutput of scalar variables
out_radius   dimensions0
out_area   distributionCONSTANT
out_perimeter   group typeSCALAR
out_meridian1   timelevels1
out_meridian2  variable typeREAL




out_1d_legen   compact0
out_c0   descriptionOutput of c0 coefficients
  dimensions1
  distributionCONSTANT
  group typeARRAY
  sizeAHF_LMAX
  timelevels1
 variable typeREAL




out_2d_legen   compact0
out_cc   descriptionOutput of cc and cs coefficients
out_cs   dimensions2
  distributionCONSTANT
  group typeARRAY
  sizeAHF_LMAX
    sizeAHF_LMAX
  timelevels1
 variable typeREAL




ahfinder_gaussian   compact0
gaussian   descriptionGaussian Curvature
  dimensions2
  distributionCONSTANT
  group typeARRAY
  sizeAHF_NTHETA+1
    sizeAHF_NPHI+1
  timelevels1
 variable typeREAL




4.0.2 PUBLIC GROUPS




  Group Names    Variable Names    Details   




ahfindergrid   compact0
ahfgrid   descriptionHorizon function
  dimensions3
  distributionDEFAULT
  group typeGF
  timelevels1
 variable typeREAL




ahfinderexp   compact0
ahf_exp   descriptionExpansion
  dimensions3
  distributionDEFAULT
  group typeGF
  timelevels1
 variable typeREAL




ahfmask   compact0
ahmask   descriptionGrid function for masking
  dimensions3
  distributionDEFAULT
  group typeGF
  timelevels1
 variable typeREAL




hole1_bounds   compact0
dhole1_xmin   descriptionBounds of excision box for hole 1
dhole1_ymin   dimensions0
dhole1_zmin   distributionCONSTANT
dhole1_xmax   group typeSCALAR
dhole1_ymax   timelevels1
dhole1_zmax  variable typeREAL




hole2_bounds   compact0
dhole2_xmin   descriptionBounds of excision box for hole 2
dhole2_ymin   dimensions0
dhole2_zmin   distributionCONSTANT
dhole2_xmax   group typeSCALAR
dhole2_ymax   timelevels1
dhole2_zmax  variable typeREAL




hole3_bounds   compact0
dhole3_xmin   descriptionBounds of excision box for hole 3
dhole3_ymin   dimensions0
dhole3_zmin   distributionCONSTANT
dhole3_xmax   group typeSCALAR
dhole3_ymax   timelevels1
dhole3_zmax  variable typeREAL




5 Schedule

This section lists all the variables which are assigned storage by thorn EinsteinAnalysis/AHFinder. 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:
  hole1_bounds hole2_bounds hole3_bounds ahf_centroid
  out_scalars
  ahfinder_gaussian
  out_1d_legen out_2d_legen
  ahfindergrid ahfinderexp ahfgradient ahfinder_gauss find3grid
  ahfmask
  ahfmask
  hole1_bounds hole2_bounds hole3_bounds
   

Scheduled Functions

CCTK_WRAGH

  ahfinder_setsym

  set symmetries for ahfinder grid functions

 

 Language:fortran
 Options: global
 Type: function

CCTK_STARTUP

  ahfinder_startup

  register ahfinder as an io method

 

 Language:c
 Options: global
 Type: function

CCTK_PARAMCHECK

  ahfinder_paramcheck

  check for physical or conformal metric

 

 Language:fortran
 Options: global
 Type: function

CCTK_INITIAL

  ahfinder_initoutput

  create output files, write headers

 

 Language:fortran
 Type: function

CCTK_ANALYSIS (conditional)

  ahfinder

  call apparent horizon finder with persisting grid functions

 

 Before: driftcorrect
  Language:fortran
 Storage: triggergroup
 Triggers: triggergroup
 Type: function

CCTK_ANALYSIS (conditional)

  ahfinder

  call apparent horizon finder

 

 Before: driftcorrect
  Language:fortran
 Storage: ahfindergrid
   ahfinderexp
   ahfgradient
   ahfinder_gauss
   find3grid
   ahfmask
   triggergroup
 Triggers: triggergroup
 Type: function

CCTK_ANALYSIS (conditional)

  ahfinder

  call apparent horizon finder with persisting mask

 

 Before: driftcorrect
  Language:fortran
 Storage: ahfindergrid
   ahfinderexp
   ahfgradient
   ahfinder_gauss
   find3grid
   triggergroup
 Triggers: triggergroup
 Type: function