QuasiLocalMeasures

Erik Schnetter <schnetter@cct.lsu.edu>
Roland Haas <rhaas@ncsa.illinois.edu>

2017-03-21

Abstract

Calculate quasi-local measures such as masses, momenta, or angular momenta and related quantities on closed two-dimentional surfaces, including on horizons.

1 Introduction

The module QuasiLocalMeasures implements the calculation of mass and spin multipoles from the isolated and dynamical horizon formalism [12], as well as a number of other proposed formulæ for quasilocal mass, linear momentum and angular momentum that have been advanced over the years [3]. Even though there are only a few rigorous proofs that establish the properties of these latter quantities, they have been demonstrated to be surprisingly helpful in numerical simulations (see, e.g., [4]), and are therefore an indispensable tool in numerical relativity. QuasiLocalMeasures takes as input a horizon surface, or any other surface that the user specifies (like a large coordinate sphere) and can calculate useful quantities such as the Weyl or Ricci scalars or the three-volume element of the horizon world tube in addition to physical observables such as mass and momenta.

2 Physical System

The Weyl tensor \(C_{\alpha \beta \gamma \delta }\) is defined as the traceless part of the Riemann tensor \(R_{\alpha \beta \gamma \delta }\)

\begin {eqnarray} {\Gamma ^{\alpha }}_{\beta \gamma } &=& \frac 12 g^{\alpha \mu } \left ( g_{\mu \beta ,\gamma }+g_{\mu \gamma ,\beta } - g_{\beta \gamma ,\mu } \right ), \\ {R^\alpha }_{\beta \gamma \delta } &=& {\Gamma ^\alpha }_{\beta \delta ,\gamma } - {\Gamma ^\alpha }_{\beta \gamma ,\delta } + {\Gamma ^\alpha }_{\mu \gamma } {\Gamma ^\mu }_{\beta \delta } - {\Gamma ^\alpha }_{\mu \delta } {\Gamma ^\mu }_{\beta \gamma }, \\ {R^\beta }_\delta &=& {R^{\mu \beta }}_{\mu \delta }, \\ R &=& {R^\mu }_\mu , \\ C_{\alpha \beta \gamma \delta } &=& R_{\alpha \beta \gamma \delta }+ {\frac {1}{2}}\left (R_{\alpha \delta }g_{\beta \gamma }-R_{\alpha \gamma }g_{\beta \delta }+R_{\beta \gamma }g_{\alpha \delta }-R_{\beta \delta }g_{\alpha \gamma }\right )+ {\frac {1}{6}}R\left (g_{\alpha \gamma }g_{\beta \delta }-g_{\alpha \delta }g_{\beta \gamma }\right ), \end {eqnarray}

where \({\Gamma ^{\alpha }}_{\beta \gamma }\), \({R^\beta }_\delta \) and \(R\) are the Christoffel symbols, Ricci tensor and Riemann scalar respectively [6]. Its self-dual is \begin {equation} \tilde C_{\alpha \beta \gamma \delta } = C_{\alpha \beta \gamma \delta } + (i/2)\epsilon _{\alpha \beta \mu \nu } {C^{\mu \nu }}_{\gamma \delta }. \end {equation}

The curvature invariants \(\mathcal {I}\) (qlm_i) and \(\mathcal {J}\) (qlm_j) are defined in terms of the self-dual of the Weyl tensor [5] \begin {equation} \mathcal {I} = \tilde C_{\alpha \beta \gamma \delta } \tilde C^{\alpha \beta \gamma \delta } \qquad \mbox {and}\qquad \mathcal {J} = \tilde C_{\alpha \beta \gamma \delta } {\tilde C^{\gamma \delta }}_{\mu \nu } \tilde C^{\mu \nu \alpha \beta }. \end {equation}

3 A note on evaluating 3D integrals on the horizon world tube

[NOTE: Ignore the stuff below. You can do that much easier.]

3.1 Integral transformation

The papers about dynamical horizons contain integrals over the 3D horizon world tube, expressed e.g. as

\begin {eqnarray} \int X\; d^3V \end {eqnarray}

where \(X\) is some quantity that lives on the horizon. These integrals have to be transformed into a \(2+1\) form so that they can be conveniently evaluated, e.g. as

\begin {eqnarray} \int X\; A\, d^2S\, dt \end {eqnarray}

where \(d^2S\) is the area element on the horizon cross section contained in \(\Sigma \), and \(dt\) is the coordinate time differential. The factor \(A\) should contain the extra terms due to this coordinate transformation.

Starting from the \(3\)-volume element \(d^3V\), let us first decompose it into the \(2\)-volume element \(d^2S\) and a “time” coordinate on the horizon, which we call \(\sigma \). Note that \(\sigma \) will generally be a spacelike coordinate for dynamical horizons. Let \(\mathbf {Q}\) be the induced \(3\)-metric on the horizon, and \(\mathbf {q}\) be the induced \(2\)-metric on the cross section. Then it is

\begin {eqnarray} d^3V & = & \sqrt {\det Q}\; d\theta \, d\phi \, d\sigma \\ & = & \frac {\sqrt {\det Q}}{\sqrt {\det q}}\; d^2S\, d\sigma \end {eqnarray}

because \(d^2S = \sqrt {\det q}\, d\theta \, d\phi \).

The coordinate time differential \(dt\) and the differential \(d\sigma \) will in general not be aligned because the horizon world tube will in general not have a static coordinate shape. It is

\begin {eqnarray} d\tau & = & (\cosh \alpha )\, dt + (\sinh \alpha )\, ds \\ d\sigma & = & (\cosh \alpha )\, ds + (\sinh \alpha )\, dt \end {eqnarray}

where \(s\) is a radial coordinate perpendicular to the horizon and also perpendicular to \(t\), and \(\tau \) is perpendicular to \(\sigma \) and lies in the plan spanned by \(t\) and \(s\). \(\tau \) and \(\sigma \) are depend on \(t\) and \(s\) via a Lorentz boost. Thus we have

\begin {eqnarray} \frac {d\sigma }{dt} & = & (\cosh \alpha )\, \frac {ds}{dt} + (\sinh \alpha )\, \frac {dt}{dt} \\ & = & \sinh \alpha \quad \text {.} \end {eqnarray}

Putting everything together we arrive at

\begin {eqnarray} \int X\; \frac {\sqrt {\det Q}}{\sqrt {\det q}}\; (\sinh \alpha )\, d^2S\, dt \quad \text {.} \end {eqnarray}

3.2 The “lapse” function \(N_R\)

Starting from

\begin {eqnarray} N_R & = & | \partial R | \end {eqnarray}

we find, since the radius \(R\) changes only in the \(\sigma \) direction,

\begin {eqnarray} N_R^2 & = & g^{\sigma \sigma }\, (\partial _\sigma R)\, (\partial _\sigma R) \quad \text {.} \end {eqnarray}

If we assume \(\partial _\tau R = 0\) and write \(\partial _t R = \dot R\), and use the relations between \(\sigma \) and \(t\) from above, we get

\begin {eqnarray} \dot R & = & \partial _t R \\ & = & \frac {\partial \tau }{\partial t} \partial _\tau R + \frac {\partial \sigma }{\partial t} \partial _\sigma R \\ & = & \sinh \alpha \, \partial _\sigma R \end {eqnarray}

[NOTE: but \(\partial _t \alpha \ne 0\).] and therefore

\begin {eqnarray} \partial _\sigma R & = & \frac {1}{\sinh \alpha }\; \dot R \quad \text {.} \end {eqnarray}

Additionally we have \(g^{\sigma \sigma } = g^{ab} \sigma _a \sigma _b = g_{ab} \sigma ^a \sigma ^b\) where \(\sigma ^a\) is the unit vector in the \(\sigma \) direction, i.e. 

\begin {eqnarray} \tau ^a & = & (\cosh \alpha )\, t^a + (\sinh \alpha )\, s^a \\ \sigma ^a & = & (\cosh \alpha )\, s^a + (\sinh \alpha )\, t^a \end {eqnarray}

3.3 Special Behaviour

In order to use the QuasiLocalMeasures thorn on existing data (postprocessing), the following procedure is necessary.

The thorns involved in this procedure have some examples. In general, this is NOT a “just do it” action; you have to know what you are doing, since you have to put the pieces together in your parameter file and make sure that everything is consistent. We may have a vision that you just call a script in a directory that contains output files and the script figures out everything else, but we’re not there yet. All the ingredients are there, but you’ll have to put them together in the right way. Think Lego.

4 Interpreting 2D output

2D output is given on a rectangular grid. This grid has coordinates which are regular and have a constant spacing in the \(\theta \) and \(\phi \) directions. Cactus output has only grid point indices, but does not contain the coordinates \(\theta \) and \(\phi \) themselves.

In gnuplot, one can define functions to convert indices to coordinates:

\begin {eqnarray} \theta (i) & = & (i - g\theta + 0.5) * \pi / n\theta \\ \phi (j) & = & (j - g\phi ) * 2*\pi / n\phi \end {eqnarray}

where \(g\theta \) and \(g\phi \) is the number of ghost points in the corresponding direction, and \(n\theta \) and \(n\phi \) the number of interior points. Here are the same equations in gnuplot syntax:

theta(i) = (i - nghosts + 0.5) * pi / ntheta
phi(j) = (j - nghosts) * 2*pi / nphi

Usually, nghosts=2, ntheta=35, and nphi=72. i and j are is the integer grid point indices. Note that ntheta and nphi in the parameter file include ghost zones, while their definitions here do not include them. In general, nphi is even and ntheta is odd, because the points are staggered about the poles.

A test plot shows whether the plot is symmetric about \(\pi /2\) in the \(\theta \) and \(\pi \) in the \(\phi \) direction. Also, plotting something axisymmetric with bitant symmetry vs. \(\theta \) and vs. \(\pi -\theta \), and vs. \(\phi \) and \(2\pi -\phi \), should lie exactly on top of each other.

There are also scalars origin/delta_theta/phi which one can use in the above equations. Then the equations read

theta(i) = (i + origin_theta) * delta_theta
phi(j) = (j + origin_phi) * delta_phi

but, of course, these four quantities are all irrational and don’t look nice.

References

[1]   O. Dreyer, B. Krishnan, D. Shoemaker and E. Schnetter, Phys. Rev. D 67, 024018 (2003) doi:10.1103/PhysRevD.67.024018 [gr-qc/0206008].

[2]   E. Schnetter, B. Krishnan and F. Beyer, Phys. Rev. D 74, 024028 (2006) doi:10.1103/PhysRevD.74.024028 [gr-qc/0604015].

[3]   L. B. Szabados, Living Rev. Rel. 7, 4 (2004).

[4]   G. Lovelace et al., Phys. Rev. D 82, 064031 (2010) doi:10.1103/PhysRevD.82.064031 [arXiv:0907.0869 [gr-qc]].

[5]   J. G. Baker, M. Campanelli and C. O. Lousto, Phys. Rev. D 65, 044001 (2002) doi:10.1103/PhysRevD.65.044001 [gr-qc/0104063].

[6]   C. W. Misner, K. S. Thorne and J. A. Wheeler, San Francisco 1973, 1279p

5 Parameters




begin_qlm_calculations_after
Scope: private REAL



Description: when should we start calculations?



Range Default: 0.0
*:*
at/after this time (inclusively)






coordsystem
Scope: private STRING



Description: The coordinate system to use



Range Default: cart3d
must be a registered coordinate system






interpolator
Scope: private STRING



Description: The interpolator to use



Range Default: Lagrange polynomial interpolation
must be a registered interpolator






interpolator_options
Scope: private STRING



Description: Options for the interpolator



Range Default: order=2
must be a valid options specification






killing_vector_method
Scope: private KEYWORD



Description: Method for finding the Killing vector field



Range Default: eigenvector
axial
Assume that d/dphi is a Killing vector
eigenvector
Solve the Killing vector equation as eigenvector equation
gradient
Calculate the normal to the gradient of a scalar






killing_vector_normalisation
Scope: private KEYWORD



Description: Method for normalising the Killing vector field



Range Default: average
average
Average several integral lines
median
Use the median integral line






num_surfaces
Scope: private INT



Description: Number of surfaces



Range Default: 1
0:100






output_vtk_every
Scope: private INT



Description: Output a VTK file with the main 2D



Range Default: (none)
don’t output VTK file
1:*
output every so many iterations






spatial_order
Scope: private INT



Description: Order of spatial differencing



Range Default: 2
2
second order
4
fourth order






surface_index
Scope: private INT



Description: Spherical surface that contains the surface shape



Range Default: -1
-1
do not calculate
0:*
surface index






surface_name
Scope: private STRING



Description: Spherical surface that contains the surface shape



Range Default: (none)
use surface_index
.*
surface name






verbose
Scope: private BOOLEAN



Description: Produce log output while running



Default: no






veryverbose
Scope: private BOOLEAN



Description: Produce much log output while running



Default: no






auto_res
Scope: shared from SPHERICALSURFACEBOOLEAN






maxnphi
Scope: shared from SPHERICALSURFACEINT






maxntheta
Scope: shared from SPHERICALSURFACEINT






nghostsphi
Scope: shared from SPHERICALSURFACEINT






nghoststheta
Scope: shared from SPHERICALSURFACEINT






nphi
Scope: shared from SPHERICALSURFACEINT






nsurfaces
Scope: shared from SPHERICALSURFACEINT






ntheta
Scope: shared from SPHERICALSURFACEINT






symmetric_x
Scope: shared from SPHERICALSURFACEBOOLEAN






symmetric_y
Scope: shared from SPHERICALSURFACEBOOLEAN






symmetric_z
Scope: shared from SPHERICALSURFACEBOOLEAN



6 Interfaces

General

Implements:

quasilocalmeasures

Inherits:

admbase

sphericalsurface

tmunubase

Grid Variables

6.0.1 PRIVATE GROUPS





  Group Names     Variable Names   Details    




qlm_state compact 0
qlm_calc_error description Status information
qlm_have_valid_data dimensions 0
qlm_have_killing_vector distribution CONSTANT
qlm_timederiv_order group type SCALAR
qlm_iteration timelevels 1
vararray_size num_surfaces
variable type INT




qlm_state_p compact 0
qlm_have_valid_data_p description Previous status information
qlm_have_valid_data_p_p dimensions 0
qlm_have_killing_vector_p distribution CONSTANT
qlm_have_killing_vector_p_p group type SCALAR
timelevels 1
vararray_size num_surfaces
variable type INT




qlm_grid_int compact 0
qlm_nghoststheta description Grid description
qlm_nghostsphi dimensions 0
qlm_ntheta distribution CONSTANT
qlm_nphi group type SCALAR
timelevels 1
vararray_size num_surfaces
variable type INT




qlm_grid_real compact 0
qlm_origin_x description Grid description
qlm_origin_y dimensions 0
qlm_origin_z distribution CONSTANT
qlm_origin_theta group type SCALAR
qlm_origin_phi timelevels 1
qlm_delta_theta vararray_size num_surfaces
qlm_delta_phi variable type REAL




qlm_grid_real_p compact 0
qlm_origin_x_p description Previous grid description
qlm_origin_y_p dimensions 0
qlm_origin_z_p distribution CONSTANT
qlm_origin_x_p_p group type SCALAR
qlm_origin_y_p_p timelevels 1
qlm_origin_z_p_p vararray_size num_surfaces
variable type REAL




qlm_shapes compact 0
qlm_shape description Shape of the surface
dimensions 2
distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL








  Group Names     Variable Names   Details    




qlm_shapes_p compact 0
qlm_shape_p description Previous shapes of the surface
qlm_shape_p_p dimensions 2
distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_coordinates compact 0
qlm_x description Cartesian coordinates of the grid points on the surface
qlm_y dimensions 2
qlm_z distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_coordinates_p compact 0
qlm_x_p description Past Cartesian coordinates of the grid points on the surface
qlm_y_p dimensions 2
qlm_z_p distribution CONSTANT
qlm_x_p_p group type ARRAY
qlm_y_p_p size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
qlm_z_p_p tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_tetrad_l compact 0
qlm_l0 description Tetrad vector lˆm  u
qlm_l1 dimensions 2
qlm_l2 distribution CONSTANT
qlm_l3 group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_tetrad_n compact 0
qlm_n0 description Tetrad vector nˆm  u
qlm_n1 dimensions 2
qlm_n2 distribution CONSTANT
qlm_n3 group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_tetrad_m compact 0
qlm_m0 description Tetrad vector mmˆ  u
qlm_m1 dimensions 2
qlm_m2 distribution CONSTANT
qlm_m3 group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type COMPLEX








  Group Names     Variable Names   Details    




qlm_newman_penrose compact 0
qlm_npkappa description Newman-Penrose quantities
qlm_nptau dimensions 2
qlm_npsigma distribution CONSTANT
qlm_nprho group type ARRAY
qlm_npepsilon size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
qlm_npgamma tags Checkpoint=”no”
  tags convergence_power=1
qlm_npbeta timelevels 1
qlm_npalpha vararray_size num_surfaces
qlm_nppi variable type COMPLEX




qlm_weyl_scalars compact 0
qlm_psi0 description Weyl scalars (aka Newman-Penrose spin coefficients)
qlm_psi1 dimensions 2
qlm_psi2 distribution CONSTANT
qlm_psi3 group type ARRAY
qlm_psi4 size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
qlm_i tags Checkpoint=”no”
  tags convergence_power=1
qlm_j timelevels 1
qlm_s vararray_size num_surfaces
qlm_sdiff variable type COMPLEX




qlm_ricci_scalars compact 0
qlm_phi00 description Ricci scalars
qlm_phi11 dimensions 2
qlm_phi01 distribution CONSTANT
qlm_phi12 group type ARRAY
qlm_phi10 size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
qlm_phi21 tags Checkpoint=”no”
  tags convergence_power=1
qlm_phi02 timelevels 1
qlm_phi22 vararray_size num_surfaces
qlm_phi20 variable type REAL




qlm_twometric compact 0
qlm_qtt description 2-metric
qlm_qtp dimensions 2
qlm_qpp distribution CONSTANT
qlm_rsc group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags Checkpoint=”no”
  tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_killing_vector compact 0
qlm_xi_t description Killing vector field
qlm_xi_p dimensions 2
qlm_chi distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_killed_twometric compact 0
qlm_lqtt description Lie derivative of the 2-metric along the Killing vector field
qlm_lqtp dimensions 2
qlm_lqpp distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags Checkpoint=”no”
  tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL








  Group Names     Variable Names   Details    




qlm_invariant_coordinates compact 0
qlm_inv_z description Invariant coordinates on the surface
  description assuming axisymmetry
dimensions 2
distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags Checkpoint=”no”
  tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_multipole_moments compact 0
qlm_mp_m0 description Mass and spin multipole moments
qlm_mp_m1 dimensions 0
qlm_mp_m2 distribution CONSTANT
qlm_mp_m3 group type SCALAR
qlm_mp_m4 tags Checkpoint=”no”
qlm_mp_m5 timelevels 1
qlm_mp_m6 vararray_size num_surfaces
qlm_mp_m7 variable type REAL




qlm_3determinant compact 0
qlm_3det description 3-Determinant of H for a special choice of the triad
dimensions 2
distribution CONSTANT
group type ARRAY
size SPHERICALSURFACE::MAXNTHETA
  size SPHERICALSURFACE::MAXNPHI
tags Checkpoint=”no”
  tags convergence_power=1
timelevels 1
vararray_size num_surfaces
variable type REAL




qlm_scalars compact 0
qlm_time description Scalar quantities on the surface
qlm_equatorial_circumference dimensions 0
qlm_polar_circumference_0 distribution CONSTANT
qlm_polar_circumference_pi_2 group type SCALAR
qlm_area timelevels 1
qlm_irreducible_mass vararray_size num_surfaces
qlm_radius variable type REAL




qlm_scalars_p compact 0
qlm_time_p description Some scalar quantities on the surface at previous times
qlm_time_p_p dimensions 0
qlm_radius_p distribution CONSTANT
qlm_radius_p_p group type SCALAR
timelevels 1
vararray_size num_surfaces
variable type REAL




7 Schedule

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

 

Always:  
qlm_state qlm_scalars  
qlm_state_p qlm_scalars_p  
qlm_grid_int qlm_grid_real qlm_grid_real_p  
qlm_shapes qlm_tetrad_l qlm_tetrad_n qlm_tetrad_m  
qlm_shapes_p  
qlm_killing_vector  
qlm_coordinates qlm_coordinates_p  
qlm_newman_penrose qlm_weyl_scalars  
qlm_ricci_scalars qlm_twometric qlm_killed_twometric  
qlm_invariant_coordinates qlm_multipole_moments qlm_3determinant  
   

Scheduled Functions

CCTK_PARAMCHECK

  qlm_paramcheck

  check quasi-local parameter settings

 

  Language: fortran
  Options: global
  Type: function

CCTK_INITIAL

  qlm_init

  initialise quasi-local calculations

 

  Language: fortran
  Options: global
  Type: function

CCTK_ANALYSIS

  qlm_calculate

  calculate quasi-local quantities

 

  After: sphericalsurface_hasbeenset
    settmunu
  Language: fortran
  Options: global
  Storage: qlm_coordinates
    qlm_coordinates_p
    qlm_newman_penrose
    qlm_weyl_scalars
    qlm_ricci_scalars
    qlm_twometric
    qlm_killed_twometric
    qlm_invariant_coordinates
    qlm_multipole_moments
    qlm_3determinant
  Triggers: qlm_state
    qlm_grid_int
    qlm_grid_real
    qlm_shapes
    qlm_tetrad_l
    qlm_tetrad_n
    qlm_tetrad_m
    qlm_coordinates
    qlm_newman_penrose
    qlm_weyl_scalars
    qlm_ricci_scalars
    qlm_twometric
    qlm_killing_vector
    qlm_killed_twometric
    qlm_invariant_coordinates
    qlm_multipole_moments
    qlm_3determinant
    qlm_scalars
  Type: function