Function Repository Resource:

# DiscreteHypersurfaceDecomposition

Decompose a Riemannian or pseudo-Riemannian manifold into a union of discrete hypersurfaces

Contributed by: Jonathan Gorard
 ResourceFunction["DiscreteHypersurfaceDecomposition"][MetricTensor[…],{t,tinit,tfinal},{x,xmin,xmax},{y,ymin,ymax},n,disc] represents the decomposition of the given MetricTensor into generalized "spacelike" hypersurfaces with "spatial" coordinates x and y, and "time" coordinate t, using n points for the discretization, and with a discreteness scale of disc. ResourceFunction["DiscreteHypersurfaceDecomposition"][MetricTensor[…],{t,tinit,tfinal},{x,xmin,xmax},{y,ymin,ymax}] uses 100 points for the discretization and assumes a discreteness scale of 1. ResourceFunction["DiscreteHypersurfaceDecomposition"][MetricTensor[…],…,n,disc] uses the first coordinate of the MetricTensor as the "time" coordinate, and the second and third coordinate of the MetricTensor as the "spatial" coordinates. ResourceFunction["DiscreteHypersurfaceDecomposition"][ResourceFunction["DiscreteHypersurfaceDecomposition"][…],coords] transforms a specified ResourceFunction["DiscreteHypersurfaceDecomposition"] into the new coordinate system coords.

## Details

Formally, ResourceFunction["DiscreteHypersurfaceDecomposition"] represents a foliation of a Riemannian or pseudo-Riemannian manifold into a collection of discrete submanifolds, i.e. it designates an equivalence relation on the manifold whose equivalence classes are connected and injectively-immersed submanifolds of uniform dimension. Typically, these submanifolds are known as the "leaves" or "hypersurfaces" of the foliation.
In general relativity, in which the ambient manifold is a Lorentzian spacetime, these hypersurfaces are usually spacelike and of codimension-1, with the equivalence classes being the level surfaces of a smooth universal "time function" whose gradient is everywhere timelike. Such a decomposition thus allows one to formulate the Einstein field equations as an explicit time evolution problem. The ADM decomposition, due to Arnowitt, Deser and Misner, provides a standard formalism for parameterizing such foliations in terms of a family of "lapse" and "shift" gauge variables.
If the spacetime is globally hyperbolic, then there exists a foliation (and therefore a gauge choice) in which the hypersurfaces do not intersect, and thus in which the initial value problem formulation of the Einstein field equations is guaranteed to be well-posed.
ResourceFunction["DiscreteHypersurfaceDecomposition"] represents all of the discrete submanifolds in the foliation as (undirected) graphs, with extrinsic curvature and spatial coordinate information attached to each vertex; internally, ResourceFunction["DiscreteHypersurfaceDecomposition"] may be thought of as applying a topologically unstructured generalization of the local adaptive mesh refinement (AMR) algorithm of Berger, Oliger and Colella.
Please note that the operations performed internally by ResourceFunction["DiscreteHypersurfaceDecomposition"] are, in general, highly computationally demanding. Indications are given within the example captions of any examples that are likely to require in excess of 1 minute of total computation time on a typical personal computer.
ResourceFunction["DiscreteHypersurfaceDecomposition"] does not assume any particular number of dimensions, nor any particular metric convention, for the underlying manifold (although some properties, such as "LorentzianConditions", implicitly assume a (-,+,+,+,) signature). ResourceFunction["DiscreteHypersurfaceDecomposition"] also does not require the metric to be strictly symmetric (i.e. spin and torsion connections are also supported), although the computation of the spacetime decomposition implicitly assumes the torsion-free Levi-Civita connection by default.
ResourceFunction["DiscreteHypersurfaceDecomposition"] uses generalized "time" (t) and "space" (x and y) coordinates to parameterize its foliation, although can be applied to arbitrary Riemannian and pseudo-Riemannian manifolds that do not necessarily have distinguished "time" and "space" directions in the physical sense. In this way, ResourceFunction["DiscreteHypersurfaceDecomposition"] effectively provides a discretization of the Cauchy problem for an arbitrary computational domain.
ResourceFunction["DiscreteHypersurfaceDecomposition"] produces visualizations of arbitrary-dimensional hypersurfaces by projecting them onto 2-dimensional surfaces (parameterized by means of the x and y coordinates described above).
Initial data for the Cauchy problem is discretized by means of a Poisson point process, with the expected number of points within a given region being proportional to the Riemannian volume measure (such that the total number of points on each hypersurface is always exactly n). Undirected spatial edges are then added in accordance with both the underlying metric tensor and the discretization scale disc, so as to guarantee approximate isometry between the spatial graph and the underlying manifold.
ResourceFunction["DiscreteHypersurfaceDecomposition"] employs the technique of "excision", in which regions of extremely high extrinsic curvature (typically enclosed within black hole event horizons) are omitted from the computational domain, so as to avoid numerical issues associated with the presence of physical and coordinate singularities.
If the function succeeds in constructing the specified decomposition into discrete hypersurfaces, it will return a ResourceFunction["DiscreteHypersurfaceDecomposition"] expression.
Based on the eigenvalues of the matrix representation of the underlying metric tensor in covariant form, the underlying manifold will be classified by ResourceFunction["DiscreteHypersurfaceDecomposition"] as either Riemannian (either all eigenvalues positive or all eigenvalues negative), pseudo-Riemannian (some eigenvalues positive and some eigenvalues negative), Lorentzian (all eigenvalues positive except for one negative, or all eigenvalues negative except for one positive) or Indeterminate.
The property "RiemannianConditions" returns the conditions necessary to guarantee that the eigenvalues of the matrix representation of the underlying metric tensor are strictly positive; "PseudoRiemannianConditions" returns the conditions necessary to guarantee that the eigenvalues of the matrix representation of the underlying metric tensor are all non-zero; "LorentzianConditions" returns the conditions necessary to guarantee that the eigenvalue corresponding to the {1,0,0,0,} eigenvector of the underlying metric tensor (if it exists) is negative, with all other eigenvalues being positive. Note that this is strictly less general than the behavior of properties such as "RiemannianQ" (described in the point above), since it assumes certain features of the metric signature.
In ResourceFunction["DiscreteHypersurfaceDecomposition"], the following properties are supported:
 "CoordinatizedPolarGraphColored" final hypersurface of the decomposition in polar coordinates, represented as an undirected graph with vertices colored based on (extrinsic) curvature and with spatial coordinates assigned based on hypersurface embedding information "PolarGraphColored" final hypersurface of the decomposition in polar coordinates, represented as an undirected graph with vertices colored based on (extrinsic) curvature "CoordinatizedPolarGraph" final hypersurface of the decomposition in polar coordinates, represented as an undirected graph with spatial coordinates of vertices assigned based on hypersurface embedding information "PolarGraph" final hypersurface of the decomposition in polar coordinates, represented as an undirected graph "CoordinatizedPolarGraphEvolutionColored" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature and with spatial coordinates assigned based on hypersurface embedding information {"CoordinatizedPolarGraphEvolutionColored",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature and with spatial coordinates assigned based on hypersurface embedding information "PolarGraphEvolutionColored" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature {"PolarGraphEvolutionColored",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature "CoordinatizedPolarGraphEvolution" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs with spatial coordinates of vertices assigned based on hypersurface embedding information {"CoordinatizedPolarGraphEvolution",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs with spatial coordinates of vertices assigned based on hypersurface embedding information "PolarGraphEvolution" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs {"PolarGraphEvolution",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in polar coordinates, represented as undirected graphs "CoordinatizedCartesianGraphColored" final hypersurface of the decomposition in Cartesian coordinates, represented as an undirected graph with vertices colored based on (extrinsic) curvature and with spatial coordinates assigned based on hypersurface embedding information "CartesianGraphColored" final hypersurface of the decomposition in Cartesian coordinates, represented as an undirected graph with vertices colored based on (extrinsic) curvature "CoordinatizedCartesianGraph" final hypersurface of the decomposition in Cartesian coordinates, represented as an undirected graph with spatial coordinates of vertices assigned based on hypersurface embedding information "CartesianGraph" final hypersurface of the decomposition in Cartesian coordinates, represented as an undirected graph "CoordinatizedCartesianGraphEvolutionColored" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature and with spatial coordinates assigned based on hypersurface embedding information {"CoordinatizedCartesianGraphEvolutionColored",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature and with spatial coordinates assigned based on hypersurface embedding information "CartesianGraphEvolutionColored" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature {"CartesianGraphEvolutionColored",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs with vertices colored based on (extrinsic) curvature "CoordinatizedCartesianGraphEvolution" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs with spatial coordinates of vertices assigned based on hypersurface embedding information {"CoordinatizedCartesianGraphEvolution",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs with spatial coordinates of vertices assigned based on hypersurface embedding information "CartesianGraphEvolution" list of 10 hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs {"CartesianGraphEvolution",steps} list of steps hypersurfaces (plus initial data) representing the full "evolution history" of the decomposition in Cartesian coordinates, represented as undirected graphs "MetricTensor" underlying metric tensor associated to the discrete hypersurface decomposition "Coordinates" list of coordinate symbols for the discrete hypersurface decomposition "CoordinateOneForms" list of differential 1-form symbols for the coordinates of the discrete hypersurface decomposition "TimeCoordinate" distinguished "time" coordinate symbol for the discrete hypersurface decomposition "TimeInterval" 1-dimensional interval (range) of the distinguished "time" coordinate for the discrete hypersurface decomposition "SpatialCoordinates" distinguished "spatial" coordinate symbols for the discrete hypersurface decomposition "SpatialRegion" 2-dimensional region (range) of the distinguished "spatial" coordinates for the discrete hypersurface decomposition "VertexCount" number of points (vertices) in each discrete hypersurface of the decomposition "DiscretizationScale" discretization scale for each discrete hypersurface of the decomposition "Dimensions" number of dimensions of the underlying manifold/spacetime described by the discrete hypersurface decomposition "Signature" list of +1s and -1s designating the signature of the underlying manifold described by the discrete hypersurface decomposition (+1 for each positive eigenvalue of the metric, -1 for each negative eigenvalue of the metric) "RiemannianQ" whether the underlying manifold described by the discrete hypersurface decomposition is Riemannian (i.e. all eigenvalues of the metric have the same sign) "PseudoRiemannianQ" whether the underlying manifold described by the discrete hypersurface decomposition is pseudo-Riemannian (i.e. all eigenvalues of the metric are non-zero, but not all have the same sign) "LorentzianQ" whether the underlying manifold described by the discrete hypersurface decomposition is Lorentzian (i.e. all eigenvalues of the metric have the same sign, except for one eigenvalue which has the opposite sign) "RiemannianConditions" list of conditions required to guarantee that the underlying manifold described by the discrete hypersurface decomposition is Riemannian (i.e. all eigenvalues of the metric are positive) "PseudoRiemannianConditions" list of conditions required to guarantee that the underlying manifold described by the discrete hypersurface decomposition is pseudo-Riemannian (i.e. all eigenvalues of the metric are non-zero) "LorentzianConditions" list of conditions required to guarantee that the underlying manifold described by the discrete hypersurface decomposition is Lorentzian (i.e. the "time" eigenvalue of the metric is negative and all other eigenvalues are positive) "Properties" list of properties

## Examples

### Basic Examples (2)

Construct a discrete hypersurface decomposition for the Schwarzschild metric (e.g. for an uncharged, non-rotating black hole with numerical mass 1) in standard spherical polar coordinates, with time coordinate t ranging between 0 and 1, radial coordinate r ranging between 0 and 4 and angular coordinate a1 ranging between -Pi and Pi, using 200 vertices and a discretization scale of 1.5:

 In[1]:=
 Out[1]=
 In[2]:=
 Out[2]=

Show the final hypersurface of the decomposition in polar coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[3]:=

Show the final hypersurface of the decomposition in polar coordinates, with all spatial coordinate information removed:

 In[4]:=

Show a list of 5 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with colors based on extrinsic curvature:

 In[5]:=

Construct a discrete hypersurface decomposition of the same (Schwarzschild) metric, but using 400 vertices and a discretization scale of 1 instead:

 In[6]:=
 Out[6]=
 In[7]:=

(Note that the remaining examples within this subsection are likely to require in excess of 1 minute of total computation time to evaluate on a typical personal computer.) Construct a discrete hypersurface decomposition of the same (Schwarzschild) metric in "Cartesian-like" isotropic coordinates, in which all light cones appear round, with time coordinate t still ranging between 0 and 1, x coordinate ranging between -2 and 2 and y coordinate ranging between -2 and 2, using 200 vertices and a discretization scale of 0.75:

 In[8]:=
 Out[8]=
 In[9]:=
 Out[9]=

Show the final hypersurface of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[10]:=

Show the final hypersurface of the decomposition in Cartesian coordinates, with all spatial coordinate information removed:

 In[11]:=

Construct a discrete hypersurface decomposition for the Kerr metric (e.g. for an uncharged, spinning black hole with numerical mass 1 and numerical angular momentum 1/3) in Boyer-Lindquist/oblate spheroidal coordinates, with time coordinate t ranging between 0 and 1, radial coordinate r ranging between 0 and 4 and angular coordinate a1 ranging between -Pi and Pi, using 200 vertices and a discretization scale of 1.5:

 In[12]:=
 Out[12]=
 In[13]:=
 Out[13]=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[14]:=

(Note that the remaining examples within this subsection are likely to require in excess of 1 minute of total computation time to evaluate on a typical personal computer.) Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with all spatial coordinate information removed:

 In[15]:=

Show a list of only 3 hypersurfaces (plus initial data) characterizing the evolution instead:

 In[16]:=

### Scope (3)

If not otherwise specified, default values will be chosen for the vertex count n and the discretization scale disc (namely 100 and 1, respectively):

 In[17]:=
 Out[17]=
 In[18]:=
 Out[18]=
 In[19]:=
 Out[19]=

Likewise for the time coordinate t and the spatial coordinates x and y (namely the first coordinate and the second and third coordinates of the underlying MetricTensor, respectively), along with their respective ranges:

 In[20]:=
 Out[20]=
 In[21]:=
 Out[21]=
 In[22]:=
 Out[22]=
 In[23]:=
 Out[23]=
 In[24]:=
 Out[24]=

Or for both simultaneously:

 In[25]:=
 Out[25]=
 In[26]:=
 Out[26]=
 In[27]:=
 Out[27]=

New coordinate symbols can be specified for any discrete hypersurface decomposition:

 In[28]:=
 Out[28]=
 In[29]:=
 Out[29]=
 In[30]:=
 Out[30]=
 In[31]:=
 Out[31]=

Construct a discrete hypersurface decomposition for the Reissner-Nordström metric (e.g. for a charged, non-rotating black hole with numerical mass 1 and numerical electric charge 1/2) in standard spherical polar coordinates, with time coordinate t ranging between 0 and 1, radial coordinate r ranging between 0 and 4 and angular coordinate a1 ranging between -Pi and Pi, using 200 vertices and a discretization scale of 1.5:

 In[32]:=
 Out[32]=
 In[33]:=
 Out[33]=

Show the list of properties:

 In[34]:=
 Out[34]=

Show the final hypersurface of the decomposition in polar coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[35]:=

Show the final hypersurface of the decomposition in polar coordinates, with colors based on extrinsic curvature:

 In[36]:=

Show the final hypersurface of the decomposition in polar coordinates, with spatial coordinates based on hypersurface embedding information:

 In[37]:=

Show the final hypersurface of the decomposition in polar coordinates:

 In[38]:=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[39]:=
 Out[39]=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[40]:=
 Out[40]=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with colors based on extrinsic curvature:

 In[41]:=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with colors based on extrinsic curvature:

 In[42]:=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with spatial coordinates based on hypersurface embedding information:

 In[43]:=
 Out[43]=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates, with spatial coordinates based on hypersurface embedding information:

 In[44]:=
 Out[44]=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates:

 In[45]:=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in polar coordinates:

 In[46]:=

(Note that the remaining examples within this subsection are likely to require in excess of 1 minute of total computation time to evaluate on a typical personal computer.) Construct a discrete hypersurface decomposition of the Schwarzschild metric (e.g. for an uncharged, non-rotating black hole with numerical mass 1) in "Cartesian-like" isotropic coordinates, in which all light cones appear round, with time coordinate t still ranging between 0 and 1, x coordinate ranging between -2 and 2 and y coordinate ranging between -2 and 2, using 200 vertices and a discretization scale of 0.75:

 In[47]:=
 Out[47]=
 In[48]:=
 Out[48]=

Show the final hypersurface of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[49]:=

Show the final hypersurface of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature:

 In[50]:=

Show the final hypersurface of the decomposition in Cartesian coordinates, with spatial coordinates based on hypersurface embedding information:

 In[51]:=

Show the final hypersurface of the decomposition in Cartesian coordinates:

 In[52]:=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[53]:=
 Out[53]=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature and spatial coordinates based on hypersurface embedding information:

 In[54]:=
 Out[54]=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature:

 In[55]:=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates, with colors based on extrinsic curvature:

 In[56]:=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates, with spatial coordinates based on hypersurface embedding information:

 In[57]:=
 Out[57]=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates, with spatial coordinates based on hypersurface embedding information:

 In[58]:=
 Out[58]=

Show a list of 10 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates:

 In[59]:=

Show a list of 3 hypersurfaces (plus initial data) representing the complete "evolution" of the decomposition in Cartesian coordinates:

 In[60]:=

Show the metric tensor for the underlying manifold represented by the discrete hypersurface decomposition:

 In[61]:=
 Out[61]=

Show the list of coordinate symbols for the discrete hypersurface decomposition:

 In[62]:=
 Out[62]=

Show the list of differential 1-form symbols for the coordinates of the discrete hypersurface decomposition:

 In[63]:=
 Out[63]=

Show the distinguished "time" coordinate symbol for the discrete hypersurface decomposition:

 In[64]:=
 Out[64]=

Show the 1-dimensional interval (range) of the distinguished "time" coordinate for the discrete hypersurface decomposition:

 In[65]:=
 Out[65]=

Show the distinguished "spatial" coordinate symbols for the discrete hypersurface decomposition:

 In[66]:=
 Out[66]=

Show the 2-dimensional region (range) of the distinguished "spatial" coordinates for the discrete hypersurface decomposition:

 In[67]:=
 Out[67]=

Show the number of points (vertices) within each hypersurface of the decomposition:

 In[68]:=
 Out[68]=

Show the discretization scale for each hypersurface of the decomposition:

 In[69]:=
 Out[69]=

Show the number of dimensions of the underlying manifold represented by the discrete hypersurface decomposition:

 In[70]:=
 Out[70]=

Show the signature of the underlying manifold represented by the discrete hypersurface decomposition (with +1s representing positive eigenvalues and -1s representing negative eigenvalues of the metric tensor):

 In[71]:=
 Out[71]=

Determine whether the underlying manifold represented by the discrete hypersurface decomposition is Riemannian (i.e. all eigenvalues of the metric tensor have the same sign):

 In[72]:=
 Out[72]=

Determine whether the underlying manifold represented by the discrete hypersurface decomposition is pseudo-Riemannian (i.e. all eigenvalues are non-zero, but not all have the same sign):

 In[73]:=
 Out[73]=

Determine whether the underlying manifold represented by the discrete hypersurface decomposition is Lorentzian (i.e. all eigenvalues of the metric tensor have the same sign, except for one eigenvalues which has the opposite sign):

 In[74]:=
 Out[74]=

Show the list of conditions on the coordinates required to guarantee that the underlying manifold represented by the discrete hypersurface decomposition is Riemannian (i.e. all eigenvalues of the metric tensor are positive):

 In[75]:=
 Out[75]=

Show the list of conditions on the coordinates required to guarantee that the underlying manifold represented by the discrete hypersurface decomposition is pseudo-Riemannian (i.e. all eigenvalues of the metric tensor are non-zero):

 In[76]:=
 Out[76]=

Show the list of conditions on the coordinates required to guarantee that the underlying manifold represented by the discrete hypersurface decomposition is Lorentzian (i.e. the "time" eigenvalue is negative, and all other eigenvalues are positive):

 In[77]:=
 Out[77]=

Jonathan Gorard

## Version History

• 1.0.0 – 27 March 2023