## QuasoLocalMeasures

2010-04-02

Abstract

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

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

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

#### 1.1 Integral transformation

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

$\begin{array}{rcll}\int X\phantom{\rule{2.77695pt}{0ex}}{d}^{3}V& & & \text{(1)}\text{}\text{}\end{array}$

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{array}{rcll}\int X\phantom{\rule{2.77695pt}{0ex}}A\phantom{\rule{0.3em}{0ex}}{d}^{2}S\phantom{\rule{0.3em}{0ex}}dt& & & \text{(2)}\text{}\text{}\end{array}$

where ${d}^{2}S$ is the area element on the horizon cross section contained in $\Sigma$, and $dt$ is the coordinate time diﬀerential. The factor $A$ should contain the extra terms due to this coordinate transformation.

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

$\begin{array}{rcll}{d}^{3}V& =& \sqrt{detQ}\phantom{\rule{2.77695pt}{0ex}}d𝜃\phantom{\rule{0.3em}{0ex}}d\varphi \phantom{\rule{0.3em}{0ex}}d\sigma & \text{(3)}\text{}\text{}\\ & =& \frac{\sqrt{detQ}}{\sqrt{detq}}\phantom{\rule{2.77695pt}{0ex}}{d}^{2}S\phantom{\rule{0.3em}{0ex}}d\sigma & \text{(4)}\text{}\text{}\end{array}$

because ${d}^{2}S=\sqrt{detq}\phantom{\rule{0.3em}{0ex}}d𝜃\phantom{\rule{0.3em}{0ex}}d\varphi$.

The coordinate time diﬀerential $dt$ and the diﬀerential $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{array}{rcll}d\tau & =& \left(cosh\alpha \right)\phantom{\rule{0.3em}{0ex}}dt+\left(sinh\alpha \right)\phantom{\rule{0.3em}{0ex}}ds& \text{(5)}\text{}\text{}\\ d\sigma & =& \left(cosh\alpha \right)\phantom{\rule{0.3em}{0ex}}ds+\left(sinh\alpha \right)\phantom{\rule{0.3em}{0ex}}dt& \text{(6)}\text{}\text{}\end{array}$

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{array}{rcll}\frac{d\sigma }{dt}& =& \left(cosh\alpha \right)\phantom{\rule{0.3em}{0ex}}\frac{ds}{dt}+\left(sinh\alpha \right)\phantom{\rule{0.3em}{0ex}}\frac{dt}{dt}& \text{(7)}\text{}\text{}\\ & =& sinh\alpha \phantom{\rule{1em}{0ex}}\mathrm{\text{.}}& \text{(8)}\text{}\text{}\end{array}$

Putting everything together we arrive at

$\begin{array}{rcll}\int X\phantom{\rule{2.77695pt}{0ex}}\frac{\sqrt{detQ}}{\sqrt{detq}}\phantom{\rule{2.77695pt}{0ex}}\left(sinh\alpha \right)\phantom{\rule{0.3em}{0ex}}{d}^{2}S\phantom{\rule{0.3em}{0ex}}dt\phantom{\rule{1em}{0ex}}\mathrm{\text{.}}& & & \text{(9)}\text{}\text{}\end{array}$

#### 1.2 The “lapse” function ${N}_{R}$

Starting from

$\begin{array}{rcll}{N}_{R}& =& |\partial R|& \text{(10)}\text{}\text{}\end{array}$

we ﬁnd, since the radius $R$ changes only in the $\sigma$ direction,

$\begin{array}{rcll}{N}_{R}^{2}& =& {g}^{\sigma \sigma }\phantom{\rule{0.3em}{0ex}}\left({\partial }_{\sigma }R\right)\phantom{\rule{0.3em}{0ex}}\left({\partial }_{\sigma }R\right)\phantom{\rule{1em}{0ex}}\mathrm{\text{.}}& \text{(11)}\text{}\text{}\end{array}$

If we assume ${\partial }_{\tau }R=0$ and write ${\partial }_{t}R=Ṙ$, and use the relations between $\sigma$ and $t$ from above, we get

$\begin{array}{rcll}Ṙ& =& {\partial }_{t}R& \text{(12)}\text{}\text{}\\ & =& \frac{\partial \tau }{\partial t}{\partial }_{\tau }R+\frac{\partial \sigma }{\partial t}{\partial }_{\sigma }R& \text{(13)}\text{}\text{}\\ & =& sinh\alpha \phantom{\rule{0.3em}{0ex}}{\partial }_{\sigma }R& \text{(14)}\text{}\text{}\end{array}$

[NOTE: but ${\partial }_{t}\alpha \ne 0$.] and therefore

$\begin{array}{rcll}{\partial }_{\sigma }R& =& \frac{1}{sinh\alpha }\phantom{\rule{2.77695pt}{0ex}}Ṙ\phantom{\rule{1em}{0ex}}\mathrm{\text{.}}& \text{(15)}\text{}\text{}\end{array}$

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{array}{rcll}{\tau }^{a}& =& \left(cosh\alpha \right)\phantom{\rule{0.3em}{0ex}}{t}^{a}+\left(sinh\alpha \right)\phantom{\rule{0.3em}{0ex}}{s}^{a}& \text{(16)}\text{}\text{}\\ {\sigma }^{a}& =& \left(cosh\alpha \right)\phantom{\rule{0.3em}{0ex}}{s}^{a}+\left(sinh\alpha \right)\phantom{\rule{0.3em}{0ex}}{t}^{a}& \text{(17)}\text{}\text{}\end{array}$

#### 1.3 Special Behaviour

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

• Computing time-independent quantities.

The 3-metric and the extrinsic curvature must be available in HDF5 ﬁles.

• Set up a parameter ﬁle for a grid structure that contains the region around the horizon. The reﬁnement level structure and grid spacing etc. needs to be the same as in the HDF5 ﬁles, but the grids can be much smaller. You can also leave out some ﬁner grids, i.e., reduce the number of levels. However, the coarse grid spacing must remain the same. The symmetries must also be the same.
• Use the ﬁle reader and thorn AEIThorns/IDFileADM to read in the ADM variables from the ﬁles. The parameter ﬁle does not need to activate BSSN_MoL or any time evolution mechanism. IDFileADM acts as provider for initial data, so you don’t need any other initial data either.
• Set up your parameter ﬁle so that the AH ﬁnder runs, stores the horizon shape in SphericalSurface, and IsolatedHorizon accesses these data.

This gives you the time-independent variables on the horizon, i.e., mostly the spin. It also allows you to look for apparent horizons if you don’t know where they are.

• Computing time-independent quantities, e.g. 3-determinant of the horizon
• Performing some time steps is necessary. Either read in lapse and shift from ﬁles, or set them arbitrarily (e.g. lapse one, shift zero).
• Activate a time evolution thorn, i.e., BSSN_MoL, MoL, Time, etc. In order to ﬁll the past time levels, just choose MoL::initial_data_is_crap. If you have hydrodynamics, read in the hydro variables as well.
• Only two time steps are required. Remember that the output of IsolatedHorizon for iteration 0 and 1 are incorrect or very inaccurate, since the past time levels are not correct, and hence the time derivatives that IsolatedHorizon calculates are wrong. However, iteration 2 should be good. (One could also perform 5 iterations and cross-check.)
• If data for the extrinsic curvature is not available, but those for the 3-metric, lapse, and shift for consecutive time steps are (that is, if you have data suitable for ﬁnding event horizons), then one needs to reconstruct the extrinsic curvature ﬁrst. There is a thorn AEIThorns/CalcK that helps with that. It reads the data for the 4-metric timestep after timestep, calculates the time derivative of the 3-metric through ﬁnite diﬀerencing in time, and then determines the extrinsic curvature from that, and writes it to a ﬁle. Once you have it, you can go on as above. CalcK has a small shell script that tells you what to do.

• In general, things become more interesting if a static conformal factor is involved (since more variables are present), especially if it is output only once (since it is static), which means that one has to mix variables from diﬀerent time steps.

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 ﬁle and make sure that everything is consistent. We may have a vision that you just call a script in a directory that contains output ﬁles and the script ﬁgures 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.

### 2 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 $𝜃$ and $\varphi$ directions. Cactus output has only grid point indices, but does not contain the coordinates $𝜃$ and $\varphi$ themselves.

In gnuplot, one can deﬁne functions to convert indices to coordinates:

$\begin{array}{rcll}𝜃\left(i\right)& =& \left(i-g𝜃+0.5\right)\ast \pi ∕n𝜃& \text{(18)}\text{}\text{}\\ \varphi \left(j\right)& =& \left(j-g\varphi \right)\ast 2\ast \pi ∕n\varphi & \text{(19)}\text{}\text{}\end{array}$

where $g𝜃$ and $g\varphi$ is the number of ghost points in the corresponding direction, and $n𝜃$ and $n\varphi$ 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 ﬁle include ghost zones, while their deﬁnitions 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 $𝜃$ and $\pi$ in the $\varphi$ direction. Also, plotting something axisymmetric with bitant symmetry vs. $𝜃$ and vs. $\pi -𝜃$, and vs. $\varphi$ and $2\pi -\varphi$, 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.

### 3 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 speciﬁcation

 killing_vector_method Scope: private KEYWORD Description: Method for ﬁnding the Killing vector ﬁeld 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 ﬁeld 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 ﬁle with the main 2D Range Default: (none) don’t output VTK ﬁle 1:* output every so many iterations

 spatial_order Scope: private INT Description: Order of spatial diﬀerencing 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 SPHERICALSURFACE BOOLEAN

 maxnphi Scope: shared from SPHERICALSURFACE INT

 maxntheta Scope: shared from SPHERICALSURFACE INT

 nghostsphi Scope: shared from SPHERICALSURFACE INT

 nghoststheta Scope: shared from SPHERICALSURFACE INT

 nphi Scope: shared from SPHERICALSURFACE INT

 nsurfaces Scope: shared from SPHERICALSURFACE INT

 ntheta Scope: shared from SPHERICALSURFACE INT

 symmetric_x Scope: shared from SPHERICALSURFACE BOOLEAN

 symmetric_y Scope: shared from SPHERICALSURFACE BOOLEAN

 symmetric_z Scope: shared from SPHERICALSURFACE BOOLEAN

### 4 Interfaces

#### General

Implements:

quasilocalmeasures

Inherits:

sphericalsurface

tmunubase

#### Grid Variables

##### 4.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 lm̂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 nm̂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 coeﬃcients) 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_sdiﬀ 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 ﬁeld 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 ﬁeld 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

### 5 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