Pseudo-Riemannian submanifolds¶
An embedded (resp. immersed) submanifold of a pseudo-Riemannian manifold \((M,g)\) is an embedded (resp. immersed) submanifold \(N\) of \(M\) as a differentiable manifold such that pull back of the metric tensor \(g\) via the embedding (resp. immersion) endows \(N\) with the structure of a pseudo-Riemannian manifold.
A limitation of the current implementation is that a foliation is required to perform nearly all the calculations (except the induced metric). This is because the normal vector is easily computed with a foliation, but otherwise requires some operations which are not yet implemented in Sage (contraction over different domains).
To correctly compute the normal vector, the submanifold must be declared either Riemannian or Lorentzian.
The following example explains how to compute the various quantities associated with the hyperbolic slicing of the 3-dimensional Minkowski space.
The manifolds must first be declared:
sage: M = Manifold(3, 'M', structure="Lorentzian")
sage: N = Manifold(2, 'N', ambient=M, structure="Riemannian")
The considered slice being spacelike hypersurfaces, they are Riemannian manifolds.
Let us continue with chart declarations and various free variables:
sage: E.<w,x,y> = M.chart()
sage: C.<rh,th> = N.chart(r'rh:(0,+oo):\rho th:(0,2*pi):\theta')
sage: b = var('b',domain='real')
sage: assume(b>0)
sage: t = var('t',domain='real')
Here \(b\) is the hyperbola semi major axis, and \(t\) is the parameter of the foliation.
One must then define the embedding, as well as the inverse embedding and the inverse concerning the foliation parameter:
sage: phi = N.diff_map(M,{(C,E): [b*cosh(rh)+t,
....: b*sinh(rh)*cos(th),
....: b*sinh(rh)*sin(th)]})
sage: phi_inv = M.diff_map(N,{(E,C):[log(sqrt(x^2+y^2+b^2)/b+
....: sqrt((x^2+y^2+b^2)/b^2-1)),
....: atan2(y,x)]})
sage: phi_inv_t = M.scalar_field({E:w-sqrt(x^2+y^2+b^2)})
One can check that the inverse is correct with:
sage: (phi*phi_inv).display()
M --> M
(w, x, y) |--> ((b^2 + x^2 + y^2 + sqrt(b^2 + x^2 + y^2)*(t + sqrt(x^2 +
y^2)) + sqrt(x^2 + y^2)*t)/(sqrt(b^2 + x^2 + y^2) + sqrt(x^2 + y^2)), x, y)
The first parameter cannot be evaluated yet, because the inverse for \(t\) is not taken into account. To prove that it is correct, one can temporarily inject it in the result:
sage: assume(w-t>0)
sage: (phi*phi_inv).expr()[0].subs({b^2: (w-t)^2-x^2-y^2})\
....: .simplify().expand().simplify_full()
w
sage: forget(w-t>0)
The immersion can then be declared:
sage: N.set_immersion(phi, inverse=phi_inv, var=t,
....: t_inverse = {t: phi_inv_t})
This line doesn’t do any calculation yet. It just check the coherence of the arguments, but not the inverse, the user is trusted on this point. The user can also declare that the immersion is in fact an embedding:
sage: N.declare_embedding()
Finally, we initialize the metric of the Minkowski space:
sage: g = M.metric()
sage: g[0,0], g[1,1], g[2,2] = -1, 1, 1
With this, the declaration the ambient manifold and its foliation is finished, and calculations can be performed.
The first step is always to find a chart adapted to the foliation. This is done by the method “adapted_chart”:
sage: T = N.adapted_chart(); T
[Chart (M, (rh_M, th_M, t_M))]
T
contains a new chart defined on M. By default, the name of a coordinate
will be the name of the coordinate in the submanifold chart indexed by the name
of the ambient manifold.
One can check that some coordinates changes have been introduced on \(M\):
sage: len(M.coord_changes())
2
Let us compute the induced metric (or first fundamental form):
sage: N.induced_metric()[:] # long time
[ b^2 0]
[ 0 b^2*sinh(rh)^2]
the normal vector:
sage: N.normal().display() # long time
n = sqrt(b^2 + x^2 + y^2)/b d/dw + x/b d/dx + y/b d/dy
Check that the hypersurface is indeed spacelike:
sage: N.ambient_metric()(N.normal(), N.normal()).display() # long time
g(n,n): M --> R
(w, x, y) |--> -1
(rh_M, th_M, t_M) |--> -1
The lapse function is:
sage: N.lapse().display() # long time
N: M --> R
(w, x, y) |--> sqrt(b^2 + x^2 + y^2)/b
(rh_M, th_M, t_M) |--> cosh(rh_M)
while the shift vector is:
sage: N.shift().display() # long time
beta = -(x^2 + y^2)/b^2 d/dw - sqrt(b^2 + x^2 + y^2)*x/b^2 d/dx
- sqrt(b^2 + x^2 + y^2)*y/b^2 d/dy
The extrinsic curvature (or second fundamental form) as a tensor of the ambient manifold:
sage: N.ambient_extrinsic_curvature()[:] # long time
[ -(x^2 + y^2)/b^3 (b^2*x + x^3 + x*y^2)/(sqrt(b^2 + x^2 + y^2)*b^3) (y^3 + (b^2 + x^2)*y)/(sqrt(b^2 + x^2 + y^2)*b^3)]
[ sqrt(b^2 + x^2 + y^2)*x/b^3 -(b^2 + x^2)/b^3 -x*y/b^3]
[ sqrt(b^2 + x^2 + y^2)*y/b^3 -x*y/b^3 -(b^2 + y^2)/b^3]
The extrinsic curvature (or second fundamental form) as a tensor of the submanifold:
sage: N.extrinsic_curvature()[:] # long time
[ -b 0]
[ 0 -b*sinh(rh)^2]
AUTHORS:
- Florentin Jaffredo (2018): initial version
REFERENCES:
-
sage.manifolds.differentiable.pseudo_riemannian_submanifold.
PseudoRiemannianSubmanifold
¶ Pseudo-Riemannian submanifold.
An embedded (resp. immersed) submanifold of a pseudo-Riemannian manifold \((M,g)\) is an embedded (resp. immersed) submanifold \(N\) of \(M\) as a differentiable manifold such that pull back of the metric tensor \(g\) via the embedding (resp. immersion) endows \(N\) with the structure of a pseudo-Riemannian manifold.
INPUT:
n
– positive integer; dimension of the manifoldname
– string; name (symbol) given to the manifoldfield
– field \(K\) on which the manifold is defined; allowed values are'real'
or an object of typeRealField
(e.g.,RR
) for- a manifold over \(\RR\)
'complex'
or an object of typeComplexField
(e.g.,CC
)- for a manifold over \(\CC\)
- an object in the category of topological fields (see
Fields
andTopologicalSpaces
) for other types of manifolds
structure
– manifold structure (seeTopologicalStructure
orRealTopologicalStructure
)ambient
– (default:None
) manifold of destination of the immersion. IfNone
, set toself
base_manifold
– (default:None
) if notNone
, must be a topological manifold; the created object is then an open subset ofbase_manifold
latex_name
– (default:None
) string; LaTeX symbol to denote the manifold; if none are provided, it is set toname
start_index
– (default: 0) integer; lower value of the range of indices used for “indexed objects” on the manifold, e.g., coordinates in a chart -category
– (default:None
) to specify the category; ifNone
,Manifolds(field)
is assumed (see the categoryManifolds
)unique_tag
– (default:None
) tag used to force the construction of a new object when all the other arguments have been used previously (withoutunique_tag
, theUniqueRepresentation
behavior inherited fromManifoldSubset
would return the previously constructed object corresponding to these arguments)
EXAMPLES:
Let \(N\) be a 2-dimensional submanifold of a 3-dimensional manifold \(M\):
sage: M = Manifold(3, 'M', structure ="pseudo-Riemannian") sage: N = Manifold(2, 'N', ambient=M, structure="pseudo-Riemannian") sage: N 2-dimensional pseudo-Riemannian submanifold N embedded in 3-dimensional differentiable manifold M sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart()
Let us define a 1-dimension foliation indexed by \(t\). The inverse map is needed in order to compute the adapted chart in the ambient manifold:
sage: t = var('t') sage: phi = N.diff_map(M, {(CN,CM):[u, v, t+u^2+v^2]}); phi Differentiable map from the 2-dimensional pseudo-Riemannian submanifold N embedded in 3-dimensional differentiable manifold M to the 3-dimensional Riemannian manifold M sage: phi_inv = M.diff_map(N,{(CM, CN): [x,y]}) sage: phi_inv_t = M.scalar_field({CM: z-x^2-y^2})
\(\phi\) can then be declared as an embedding \(N\to M\):
sage: N.set_embedding(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t})
The foliation can also be used to find new charts on the ambient manifold that are adapted to the foliation, ie in which the expression of the immersion is trivial. At the same time, the appropriate coordinate changes are computed:
sage: N.adapted_chart() [Chart (M, (u_M, v_M, t_M))] sage: len(M.coord_changes()) 2
See also