passagemath-symbolics 10.8.1a1__cp311-cp311-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_symbolics/.dylibs/libgmp.10.dylib +0 -0
- passagemath_symbolics/__init__.py +3 -0
- passagemath_symbolics-10.8.1a1.dist-info/METADATA +186 -0
- passagemath_symbolics-10.8.1a1.dist-info/RECORD +182 -0
- passagemath_symbolics-10.8.1a1.dist-info/WHEEL +6 -0
- passagemath_symbolics-10.8.1a1.dist-info/top_level.txt +3 -0
- sage/all__sagemath_symbolics.py +17 -0
- sage/calculus/all.py +14 -0
- sage/calculus/calculus.py +2838 -0
- sage/calculus/desolvers.py +1864 -0
- sage/calculus/predefined.py +51 -0
- sage/calculus/tests.py +225 -0
- sage/calculus/var.cpython-311-darwin.so +0 -0
- sage/calculus/var.pyx +401 -0
- sage/dynamics/all__sagemath_symbolics.py +6 -0
- sage/dynamics/complex_dynamics/all.py +5 -0
- sage/dynamics/complex_dynamics/mandel_julia.py +765 -0
- sage/dynamics/complex_dynamics/mandel_julia_helper.cpython-311-darwin.so +0 -0
- sage/dynamics/complex_dynamics/mandel_julia_helper.pyx +1034 -0
- sage/ext/all__sagemath_symbolics.py +1 -0
- sage/ext_data/kenzo/CP2.txt +45 -0
- sage/ext_data/kenzo/CP3.txt +349 -0
- sage/ext_data/kenzo/CP4.txt +4774 -0
- sage/ext_data/kenzo/README.txt +49 -0
- sage/ext_data/kenzo/S4.txt +20 -0
- sage/ext_data/magma/latex/latex.m +1021 -0
- sage/ext_data/magma/latex/latex.spec +1 -0
- sage/ext_data/magma/sage/basic.m +356 -0
- sage/ext_data/magma/sage/sage.spec +1 -0
- sage/ext_data/magma/spec +9 -0
- sage/geometry/all__sagemath_symbolics.py +8 -0
- sage/geometry/hyperbolic_space/all.py +5 -0
- sage/geometry/hyperbolic_space/hyperbolic_coercion.py +755 -0
- sage/geometry/hyperbolic_space/hyperbolic_constants.py +5 -0
- sage/geometry/hyperbolic_space/hyperbolic_geodesic.py +2419 -0
- sage/geometry/hyperbolic_space/hyperbolic_interface.py +206 -0
- sage/geometry/hyperbolic_space/hyperbolic_isometry.py +1083 -0
- sage/geometry/hyperbolic_space/hyperbolic_model.py +1502 -0
- sage/geometry/hyperbolic_space/hyperbolic_point.py +621 -0
- sage/geometry/riemannian_manifolds/all.py +7 -0
- sage/geometry/riemannian_manifolds/parametrized_surface3d.py +1632 -0
- sage/geometry/riemannian_manifolds/surface3d_generators.py +461 -0
- sage/interfaces/all__sagemath_symbolics.py +1 -0
- sage/interfaces/magma.py +2991 -0
- sage/interfaces/magma_free.py +90 -0
- sage/interfaces/maple.py +1402 -0
- sage/interfaces/mathematica.py +1345 -0
- sage/interfaces/mathics.py +1312 -0
- sage/interfaces/sympy.py +1398 -0
- sage/interfaces/sympy_wrapper.py +197 -0
- sage/interfaces/tides.py +938 -0
- sage/libs/all__sagemath_symbolics.py +6 -0
- sage/manifolds/all.py +7 -0
- sage/manifolds/calculus_method.py +553 -0
- sage/manifolds/catalog.py +437 -0
- sage/manifolds/chart.py +4010 -0
- sage/manifolds/chart_func.py +3416 -0
- sage/manifolds/continuous_map.py +2183 -0
- sage/manifolds/continuous_map_image.py +155 -0
- sage/manifolds/differentiable/affine_connection.py +2475 -0
- sage/manifolds/differentiable/all.py +1 -0
- sage/manifolds/differentiable/automorphismfield.py +1383 -0
- sage/manifolds/differentiable/automorphismfield_group.py +604 -0
- sage/manifolds/differentiable/bundle_connection.py +1445 -0
- sage/manifolds/differentiable/characteristic_cohomology_class.py +1840 -0
- sage/manifolds/differentiable/chart.py +1241 -0
- sage/manifolds/differentiable/curve.py +1028 -0
- sage/manifolds/differentiable/de_rham_cohomology.py +541 -0
- sage/manifolds/differentiable/degenerate.py +559 -0
- sage/manifolds/differentiable/degenerate_submanifold.py +1668 -0
- sage/manifolds/differentiable/diff_form.py +1660 -0
- sage/manifolds/differentiable/diff_form_module.py +1062 -0
- sage/manifolds/differentiable/diff_map.py +1315 -0
- sage/manifolds/differentiable/differentiable_submanifold.py +291 -0
- sage/manifolds/differentiable/examples/all.py +1 -0
- sage/manifolds/differentiable/examples/euclidean.py +2517 -0
- sage/manifolds/differentiable/examples/real_line.py +897 -0
- sage/manifolds/differentiable/examples/sphere.py +1186 -0
- sage/manifolds/differentiable/examples/symplectic_space.py +187 -0
- sage/manifolds/differentiable/examples/symplectic_space_test.py +40 -0
- sage/manifolds/differentiable/integrated_curve.py +4035 -0
- sage/manifolds/differentiable/levi_civita_connection.py +841 -0
- sage/manifolds/differentiable/manifold.py +4254 -0
- sage/manifolds/differentiable/manifold_homset.py +1826 -0
- sage/manifolds/differentiable/metric.py +3032 -0
- sage/manifolds/differentiable/mixed_form.py +1507 -0
- sage/manifolds/differentiable/mixed_form_algebra.py +559 -0
- sage/manifolds/differentiable/multivector_module.py +800 -0
- sage/manifolds/differentiable/multivectorfield.py +1522 -0
- sage/manifolds/differentiable/poisson_tensor.py +268 -0
- sage/manifolds/differentiable/pseudo_riemannian.py +755 -0
- sage/manifolds/differentiable/pseudo_riemannian_submanifold.py +1839 -0
- sage/manifolds/differentiable/scalarfield.py +1343 -0
- sage/manifolds/differentiable/scalarfield_algebra.py +472 -0
- sage/manifolds/differentiable/symplectic_form.py +912 -0
- sage/manifolds/differentiable/symplectic_form_test.py +220 -0
- sage/manifolds/differentiable/tangent_space.py +412 -0
- sage/manifolds/differentiable/tangent_vector.py +616 -0
- sage/manifolds/differentiable/tensorfield.py +4665 -0
- sage/manifolds/differentiable/tensorfield_module.py +963 -0
- sage/manifolds/differentiable/tensorfield_paral.py +2450 -0
- sage/manifolds/differentiable/tensorfield_paral_test.py +16 -0
- sage/manifolds/differentiable/vector_bundle.py +1725 -0
- sage/manifolds/differentiable/vectorfield.py +1717 -0
- sage/manifolds/differentiable/vectorfield_module.py +2445 -0
- sage/manifolds/differentiable/vectorframe.py +1832 -0
- sage/manifolds/family.py +270 -0
- sage/manifolds/local_frame.py +1490 -0
- sage/manifolds/manifold.py +3090 -0
- sage/manifolds/manifold_homset.py +452 -0
- sage/manifolds/operators.py +359 -0
- sage/manifolds/point.py +994 -0
- sage/manifolds/scalarfield.py +3718 -0
- sage/manifolds/scalarfield_algebra.py +629 -0
- sage/manifolds/section.py +3111 -0
- sage/manifolds/section_module.py +831 -0
- sage/manifolds/structure.py +229 -0
- sage/manifolds/subset.py +2721 -0
- sage/manifolds/subsets/all.py +1 -0
- sage/manifolds/subsets/closure.py +131 -0
- sage/manifolds/subsets/pullback.py +883 -0
- sage/manifolds/topological_submanifold.py +891 -0
- sage/manifolds/trivialization.py +733 -0
- sage/manifolds/utilities.py +1348 -0
- sage/manifolds/vector_bundle.py +1347 -0
- sage/manifolds/vector_bundle_fiber.py +332 -0
- sage/manifolds/vector_bundle_fiber_element.py +111 -0
- sage/matrix/all__sagemath_symbolics.py +1 -0
- sage/matrix/matrix_symbolic_dense.cpython-311-darwin.so +0 -0
- sage/matrix/matrix_symbolic_dense.pxd +6 -0
- sage/matrix/matrix_symbolic_dense.pyx +1030 -0
- sage/matrix/matrix_symbolic_sparse.cpython-311-darwin.so +0 -0
- sage/matrix/matrix_symbolic_sparse.pxd +6 -0
- sage/matrix/matrix_symbolic_sparse.pyx +1038 -0
- sage/modules/all__sagemath_symbolics.py +1 -0
- sage/modules/vector_callable_symbolic_dense.py +105 -0
- sage/modules/vector_symbolic_dense.py +116 -0
- sage/modules/vector_symbolic_sparse.py +118 -0
- sage/rings/all__sagemath_symbolics.py +4 -0
- sage/rings/asymptotic/all.py +6 -0
- sage/rings/asymptotic/asymptotic_expansion_generators.py +1485 -0
- sage/rings/asymptotic/asymptotic_ring.py +4858 -0
- sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py +4106 -0
- sage/rings/asymptotic/growth_group.py +5373 -0
- sage/rings/asymptotic/growth_group_cartesian.py +1400 -0
- sage/rings/asymptotic/term_monoid.py +5205 -0
- sage/rings/function_field/all__sagemath_symbolics.py +2 -0
- sage/rings/polynomial/all__sagemath_symbolics.py +1 -0
- sage/symbolic/all.py +15 -0
- sage/symbolic/assumptions.py +987 -0
- sage/symbolic/benchmark.py +93 -0
- sage/symbolic/callable.py +456 -0
- sage/symbolic/callable.pyi +66 -0
- sage/symbolic/comparison_impl.pyi +38 -0
- sage/symbolic/complexity_measures.py +35 -0
- sage/symbolic/constants.py +1286 -0
- sage/symbolic/constants_c_impl.pyi +10 -0
- sage/symbolic/expression_conversion_algebraic.py +310 -0
- sage/symbolic/expression_conversion_sympy.py +317 -0
- sage/symbolic/expression_conversions.py +1727 -0
- sage/symbolic/function_factory.py +355 -0
- sage/symbolic/function_factory.pyi +41 -0
- sage/symbolic/getitem_impl.pyi +24 -0
- sage/symbolic/integration/all.py +1 -0
- sage/symbolic/integration/external.py +271 -0
- sage/symbolic/integration/integral.py +1075 -0
- sage/symbolic/maxima_wrapper.py +162 -0
- sage/symbolic/operators.py +267 -0
- sage/symbolic/operators.pyi +61 -0
- sage/symbolic/pynac_constant_impl.pyi +13 -0
- sage/symbolic/pynac_function_impl.pyi +8 -0
- sage/symbolic/random_tests.py +461 -0
- sage/symbolic/relation.py +2062 -0
- sage/symbolic/ring.cpython-311-darwin.so +0 -0
- sage/symbolic/ring.pxd +5 -0
- sage/symbolic/ring.pyi +110 -0
- sage/symbolic/ring.pyx +1393 -0
- sage/symbolic/series_impl.pyi +10 -0
- sage/symbolic/subring.py +1025 -0
- sage/symbolic/symengine.py +19 -0
- sage/symbolic/tests.py +40 -0
- sage/symbolic/units.py +1468 -0
|
@@ -0,0 +1,1668 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-symbolics
|
|
2
|
+
r"""
|
|
3
|
+
Degenerate submanifolds
|
|
4
|
+
|
|
5
|
+
An *embedded (resp. immersed) degenerate submanifold of a proper
|
|
6
|
+
pseudo-Riemannian manifold* `(M,g)` is an embedded (resp. immersed)
|
|
7
|
+
submanifold `H` of `M` as a differentiable manifold such that pull
|
|
8
|
+
back of the metric tensor `g` via the embedding (resp. immersion)
|
|
9
|
+
endows `H` with the structure of a degenerate manifold.
|
|
10
|
+
|
|
11
|
+
Degenerate submanifolds are study in many fields of mathematics and physics,
|
|
12
|
+
for instance in Differential Geometry (especially in geometry of
|
|
13
|
+
lightlike submanifold) and in General Relativity. In geometry of lightlike
|
|
14
|
+
submanifolds, according to the dimension `r` of the radical distribution
|
|
15
|
+
(see below for definition of radical distribution), degenerate submanifolds
|
|
16
|
+
have been classified into 4 subgroups: `r`-lightlike submanifolds, Coisotropic
|
|
17
|
+
submanifolds, Isotropic submanifolds and Totally lightlike submanifolds.
|
|
18
|
+
(See the book of Krishan L. Duggal and Aurel Bejancu [DS2010]_.)
|
|
19
|
+
|
|
20
|
+
In the present module, you can define any of the 4 types but most of the
|
|
21
|
+
methods are implemented only for degenerate hypersurfaces who belong to
|
|
22
|
+
`r`-lightlike submanifolds. However, they might be generalized to
|
|
23
|
+
`1`-lightlike submanifolds. In the literature there is a new approach
|
|
24
|
+
(the rigging technique) for studying `1`-lightlike submanifolds but
|
|
25
|
+
here we use the method of Krishan L. Duggal and Aurel Bejancu based on
|
|
26
|
+
the screen distribution.
|
|
27
|
+
|
|
28
|
+
Let `H` be a lightlike hypersurface of a pseudo-Riemannian manifold
|
|
29
|
+
`(M,g)`. Then the normal bundle `TH^\perp` intersect the tangent
|
|
30
|
+
bundle `TH`. The radical distribution is defined as
|
|
31
|
+
`Rad(TH)=TH\cap TH^\perp`. In case of hypersurfaces, and more
|
|
32
|
+
generally `1`-lightlike submanifolds, this is a rank 1 distribution.
|
|
33
|
+
A screen distribution `S(TH)` is a complementary of `Rad(TH)` in `TH`.
|
|
34
|
+
|
|
35
|
+
Giving a screen distribution `S(TH)` and a null vector field `\xi`
|
|
36
|
+
locally defined and spanning `Rad(TH)`, there exists a unique
|
|
37
|
+
transversal null vector field 'N' locally defined and such that
|
|
38
|
+
`g(N,\xi)=1`. From a transverse vector 'v', the null rigging 'N'
|
|
39
|
+
is giving by the formula
|
|
40
|
+
|
|
41
|
+
.. MATH::
|
|
42
|
+
|
|
43
|
+
N = \frac{1}{g(\xi, v)}\left(v-\frac{g(v,v)}{2g(\xi, v)}\xi\right)
|
|
44
|
+
|
|
45
|
+
Tensors on the ambient manifold `M` are projected on `H` along `N`
|
|
46
|
+
to obtain induced objects. For instance, induced connection is the
|
|
47
|
+
linear connection defined on H through the Levi-Civitta connection of
|
|
48
|
+
`g` along `N`.
|
|
49
|
+
|
|
50
|
+
To work on a degenerate submanifold, after defining `H` as an instance
|
|
51
|
+
of :class:`~sage.manifolds.differentiable.manifold.DifferentiableManifold`,
|
|
52
|
+
with the keyword ``structure='degenerate_metric'``, you have to set a
|
|
53
|
+
transvervector `v` and screen distribution together with the radical
|
|
54
|
+
distribution.
|
|
55
|
+
|
|
56
|
+
An example of degenerate submanifold from General Relativity is the
|
|
57
|
+
horizon of the Schwarzschild black hole. Allow us to recall that
|
|
58
|
+
Schwarzschild black hole is the first non-trivial solution of Einstein's
|
|
59
|
+
equations. It describes the metric inside a star of radius `R = 2m`,
|
|
60
|
+
being `m` the inertial mass of the star. It can be seen as an open
|
|
61
|
+
ball in a Lorentzian manifold structure on `\RR^4`::
|
|
62
|
+
|
|
63
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
64
|
+
sage: X_M.<t, r, th, ph> = \
|
|
65
|
+
....: M.chart(r"t r:(0,oo) th:(0,pi):\theta ph:(0,2*pi):\phi")
|
|
66
|
+
sage: var('m'); assume(m>0)
|
|
67
|
+
m
|
|
68
|
+
sage: g = M.metric()
|
|
69
|
+
sage: g[0,0], g[0,1], g[1,1], g[2,2], g[3,3] = \
|
|
70
|
+
....: -1+2*m/r, 2*m/r, 1+2*m/r, r^2, r^2*sin(th)^2
|
|
71
|
+
|
|
72
|
+
Let us define the horizon as a degenerate hypersurface::
|
|
73
|
+
|
|
74
|
+
sage: H = Manifold(3, 'H', ambient=M, structure='degenerate_metric')
|
|
75
|
+
sage: H
|
|
76
|
+
degenerate hypersurface H embedded in 4-dimensional differentiable
|
|
77
|
+
manifold M
|
|
78
|
+
|
|
79
|
+
A `2`-dimensional degenerate submanifold of a Lorentzian manifold::
|
|
80
|
+
|
|
81
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
82
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
83
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
84
|
+
sage: S
|
|
85
|
+
2-dimensional degenerate submanifold S embedded in 4-dimensional
|
|
86
|
+
differentiable manifold M
|
|
87
|
+
sage: X_S.<u,v> = S.chart()
|
|
88
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, u, v]},
|
|
89
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
90
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y]}, name='Phi_inv',
|
|
91
|
+
....: latex_name=r'\Phi^{-1}');
|
|
92
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
93
|
+
sage: g = M.metric()
|
|
94
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
95
|
+
sage: S.set_transverse(rigging=[x,y])
|
|
96
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
97
|
+
sage: V = M.vector_field(); V[3] = 1
|
|
98
|
+
sage: Sc = S.screen('Sc', V, xi)
|
|
99
|
+
|
|
100
|
+
sage: S.default_screen()
|
|
101
|
+
screen distribution Sc along the 2-dimensional degenerate submanifold
|
|
102
|
+
S embedded in 4-dimensional differentiable manifold M mapped into
|
|
103
|
+
the 4-dimensional Lorentzian manifold M
|
|
104
|
+
|
|
105
|
+
sage: S.ambient_metric()
|
|
106
|
+
Lorentzian metric g on the 4-dimensional Lorentzian manifold M
|
|
107
|
+
|
|
108
|
+
sage: S.induced_metric()
|
|
109
|
+
degenerate metric gamma on the 2-dimensional degenerate submanifold S
|
|
110
|
+
embedded in 4-dimensional differentiable manifold M
|
|
111
|
+
|
|
112
|
+
sage: S.first_fundamental_form()
|
|
113
|
+
Field of symmetric bilinear forms g|S along the 2-dimensional
|
|
114
|
+
degenerate submanifold S embedded in 4-dimensional differentiable manifold M
|
|
115
|
+
with values on the 4-dimensional Lorentzian manifold M
|
|
116
|
+
|
|
117
|
+
sage: S.adapted_frame()
|
|
118
|
+
Vector frame (S, (vv_0,vv_1,vv_2,vv_3)) with values on the 4-dimensional Lorentzian manifold M
|
|
119
|
+
|
|
120
|
+
sage: S.projection(V)
|
|
121
|
+
Tensor field of type (1,0) along the 2-dimensional degenerate submanifold S
|
|
122
|
+
embedded in 4-dimensional differentiable manifold M
|
|
123
|
+
with values on the 4-dimensional Lorentzian manifold M
|
|
124
|
+
|
|
125
|
+
sage: S.weingarten_map() # long time
|
|
126
|
+
Tensor field nabla_g(xi)|X(S) of type (1,1) along the 2-dimensional
|
|
127
|
+
degenerate submanifold S embedded in 4-dimensional differentiable manifold M
|
|
128
|
+
with values on the 4-dimensional Lorentzian manifold M
|
|
129
|
+
|
|
130
|
+
sage: SO = S.shape_operator() # long time
|
|
131
|
+
sage: SO.display() # long time
|
|
132
|
+
A^* = 0
|
|
133
|
+
|
|
134
|
+
sage: S.is_tangent(xi.along(Phi))
|
|
135
|
+
True
|
|
136
|
+
sage: v = M.vector_field(); v[1] = 1
|
|
137
|
+
sage: S.is_tangent(v.along(Phi))
|
|
138
|
+
False
|
|
139
|
+
|
|
140
|
+
AUTHORS:
|
|
141
|
+
|
|
142
|
+
- Hans Fotsing Tetsing (2019) : initial version
|
|
143
|
+
|
|
144
|
+
REFERENCES:
|
|
145
|
+
|
|
146
|
+
- [DB1996]_
|
|
147
|
+
- [DS2010]_
|
|
148
|
+
- [FNO2019]_
|
|
149
|
+
"""
|
|
150
|
+
# *****************************************************************************
|
|
151
|
+
# Copyright (C) 2019 Hans Fotsing Tetsing <hans.fotsing@aims-cameroon.org>
|
|
152
|
+
#
|
|
153
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
154
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
155
|
+
# the License, or (at your option) any later version.
|
|
156
|
+
# https://www.gnu.org/licenses/
|
|
157
|
+
# *****************************************************************************
|
|
158
|
+
|
|
159
|
+
from __future__ import annotations
|
|
160
|
+
|
|
161
|
+
from typing import TYPE_CHECKING
|
|
162
|
+
|
|
163
|
+
from sage.manifolds.differentiable.degenerate import DegenerateManifold, TangentTensor
|
|
164
|
+
from sage.manifolds.differentiable.differentiable_submanifold import (
|
|
165
|
+
DifferentiableSubmanifold,
|
|
166
|
+
)
|
|
167
|
+
from sage.manifolds.differentiable.pseudo_riemannian import PseudoRiemannianManifold
|
|
168
|
+
from sage.manifolds.differentiable.vectorfield_module import VectorFieldModule
|
|
169
|
+
from sage.matrix.constructor import matrix
|
|
170
|
+
from sage.rings.infinity import infinity
|
|
171
|
+
from sage.symbolic.expression import Expression
|
|
172
|
+
|
|
173
|
+
if TYPE_CHECKING:
|
|
174
|
+
from sage.manifolds.differentiable.metric import DegenerateMetric
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class DegenerateSubmanifold(DegenerateManifold, DifferentiableSubmanifold):
|
|
178
|
+
r"""
|
|
179
|
+
Degenerate submanifolds.
|
|
180
|
+
|
|
181
|
+
An *embedded (resp. immersed) degenerate submanifold of a proper
|
|
182
|
+
pseudo-Riemannian manifold* `(M,g)` is an embedded (resp. immersed)
|
|
183
|
+
submanifold `H` of `M` as a differentiable manifold such that pull
|
|
184
|
+
back of the metric tensor `g` via the embedding (resp. immersion)
|
|
185
|
+
endows `H` with the structure of a degenerate manifold.
|
|
186
|
+
|
|
187
|
+
INPUT:
|
|
188
|
+
|
|
189
|
+
- ``n`` -- positive integer; dimension of the manifold
|
|
190
|
+
- ``name`` -- string; name (symbol) given to the manifold
|
|
191
|
+
- ``ambient`` -- (default: ``None``) pseudo-Riemannian manifold `M` in
|
|
192
|
+
which the submanifold is embedded (or immersed). If ``None``, it is set
|
|
193
|
+
to ``self``
|
|
194
|
+
- ``metric_name`` -- (default: ``None``) string; name (symbol) given to the
|
|
195
|
+
metric; if ``None``, ``'g'`` is used
|
|
196
|
+
- ``signature`` -- (default: ``None``) signature `S` of the metric as a
|
|
197
|
+
tuple: `S = (n_+, n_-, n_0)`, where `n_+` (resp. `n_-`, resp. `n_0`) is the
|
|
198
|
+
number of positive terms (resp. negative terms, resp. zero tems) in any
|
|
199
|
+
diagonal writing of the metric components; if ``signature`` is not
|
|
200
|
+
provided, `S` is set to `(ndim-1, 0, 1)`, being `ndim` the manifold's dimension
|
|
201
|
+
- ``base_manifold`` -- (default: ``None``) if not ``None``, must be a
|
|
202
|
+
topological manifold; the created object is then an open subset of
|
|
203
|
+
``base_manifold``
|
|
204
|
+
- ``diff_degree`` -- (default: ``infinity``) degree of differentiability
|
|
205
|
+
- ``latex_name`` -- (default: ``None``) string; LaTeX symbol to
|
|
206
|
+
denote the manifold; if none are provided, it is set to ``name``
|
|
207
|
+
- ``metric_latex_name`` -- (default: ``None``) string; LaTeX symbol to
|
|
208
|
+
denote the metric; if none is provided, it is set to ``metric_name``
|
|
209
|
+
- ``start_index`` -- (default: 0) integer; lower value of the range of
|
|
210
|
+
indices used for "indexed objects" on the manifold, e.g., coordinates
|
|
211
|
+
in a chart
|
|
212
|
+
- ``category`` -- (default: ``None``) to specify the category; if
|
|
213
|
+
``None``, ``Manifolds(field)`` is assumed (see the category
|
|
214
|
+
:class:`~sage.categories.manifolds.Manifolds`)
|
|
215
|
+
- ``unique_tag`` -- (default: ``None``) tag used to force the construction
|
|
216
|
+
of a new object when all the other arguments have been used previously
|
|
217
|
+
(without ``unique_tag``, the
|
|
218
|
+
:class:`~sage.structure.unique_representation.UniqueRepresentation`
|
|
219
|
+
behavior inherited from
|
|
220
|
+
:class:`~sage.manifolds.subset.ManifoldSubset`
|
|
221
|
+
would return the previously constructed object corresponding to these
|
|
222
|
+
arguments)
|
|
223
|
+
|
|
224
|
+
.. SEEALSO::
|
|
225
|
+
|
|
226
|
+
:mod:`~sage.manifolds.manifold` and
|
|
227
|
+
:mod:`~sage.manifolds.differentiable.differentiable_submanifold`
|
|
228
|
+
"""
|
|
229
|
+
def __init__(self, n, name, ambient=None, metric_name=None, signature=None,
|
|
230
|
+
base_manifold=None, diff_degree=infinity, latex_name=None,
|
|
231
|
+
metric_latex_name=None, start_index=0, category=None,
|
|
232
|
+
unique_tag=None):
|
|
233
|
+
r"""
|
|
234
|
+
Construct a degenerate submanifold.
|
|
235
|
+
|
|
236
|
+
EXAMPLES:
|
|
237
|
+
|
|
238
|
+
A `2`-dimensional degenerate submanifold of a Lorentzian manifold::
|
|
239
|
+
|
|
240
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
241
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
242
|
+
sage: S
|
|
243
|
+
2-dimensional degenerate submanifold S embedded in 4-dimensional
|
|
244
|
+
differentiable manifold M
|
|
245
|
+
"""
|
|
246
|
+
DegenerateManifold.__init__(self, n, name=name,
|
|
247
|
+
metric_name=metric_name,
|
|
248
|
+
signature=signature,
|
|
249
|
+
base_manifold=base_manifold,
|
|
250
|
+
diff_degree=diff_degree,
|
|
251
|
+
latex_name=latex_name,
|
|
252
|
+
metric_latex_name=metric_latex_name,
|
|
253
|
+
start_index=start_index,
|
|
254
|
+
category=category)
|
|
255
|
+
DifferentiableSubmanifold.__init__(self, n, name, self._field,
|
|
256
|
+
self._structure, ambient=ambient,
|
|
257
|
+
base_manifold=base_manifold,
|
|
258
|
+
latex_name=latex_name,
|
|
259
|
+
start_index=start_index,
|
|
260
|
+
category=category)
|
|
261
|
+
self._normal = None
|
|
262
|
+
self._first_fundamental_form = None
|
|
263
|
+
self._induced_metric = None
|
|
264
|
+
self._second_fundamental_form = {}
|
|
265
|
+
self._ambient_metric = None
|
|
266
|
+
self._gauss_curvature = {}
|
|
267
|
+
self._principal_directions = {}
|
|
268
|
+
self._principal_curvatures = {}
|
|
269
|
+
self._mean_curvature = {}
|
|
270
|
+
self._screens = {}
|
|
271
|
+
self._default_screen = None
|
|
272
|
+
self._adapted_frame = {}
|
|
273
|
+
self._shape_operator = {}
|
|
274
|
+
self._rotation_one_form = {}
|
|
275
|
+
signature = self._ambient.metric().signature()
|
|
276
|
+
ndim = self._ambient._dim
|
|
277
|
+
try:
|
|
278
|
+
if signature[0] == ndim or signature[1] == ndim:
|
|
279
|
+
raise ValueError("ambient must be a proper pseudo-Riemannian"
|
|
280
|
+
" or a degenerate manifold")
|
|
281
|
+
except TypeError:
|
|
282
|
+
if signature == ndim or signature == -ndim:
|
|
283
|
+
raise ValueError("ambient must be a proper pseudo-Riemannian"
|
|
284
|
+
" or a degenerate manifold")
|
|
285
|
+
self._transverse = {}
|
|
286
|
+
|
|
287
|
+
def _repr_(self):
|
|
288
|
+
r"""
|
|
289
|
+
Return a string representation of the submanifold.
|
|
290
|
+
|
|
291
|
+
If no ambient manifold is specified, the submanifold is considered
|
|
292
|
+
as a manifold.
|
|
293
|
+
|
|
294
|
+
TESTS:
|
|
295
|
+
|
|
296
|
+
A `2`-dimensional degenerate submanifold of a Lorentzian manifold::
|
|
297
|
+
|
|
298
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
299
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
300
|
+
sage: S.__repr__()
|
|
301
|
+
'2-dimensional degenerate submanifold S embedded in 4-dimensional
|
|
302
|
+
differentiable manifold M'
|
|
303
|
+
"""
|
|
304
|
+
if self._ambient is None:
|
|
305
|
+
return super(DegenerateManifold, self).__repr__()
|
|
306
|
+
if self._ambient._dim - self._dim == 1:
|
|
307
|
+
return "degenerate hypersurface {} embedded " \
|
|
308
|
+
"in {}-dimensional differentiable " \
|
|
309
|
+
"manifold {}".format(self._name, self._ambient._dim,
|
|
310
|
+
self._ambient._name)
|
|
311
|
+
return "{}-dimensional degenerate submanifold {} embedded " \
|
|
312
|
+
"in {}-dimensional differentiable " \
|
|
313
|
+
"manifold {}".format(self._dim, self._name, self._ambient._dim,
|
|
314
|
+
self._ambient._name)
|
|
315
|
+
|
|
316
|
+
def ambient_metric(self):
|
|
317
|
+
r"""
|
|
318
|
+
Return the metric of the ambient manifold. The submanifold has to be
|
|
319
|
+
embedded
|
|
320
|
+
|
|
321
|
+
OUTPUT: the metric of the ambient manifold
|
|
322
|
+
|
|
323
|
+
EXAMPLES:
|
|
324
|
+
|
|
325
|
+
The lightcone of the 3D Minkowski space::
|
|
326
|
+
|
|
327
|
+
sage: M = Manifold(3, 'M', structure='Lorentzian')
|
|
328
|
+
sage: X.<t,x,y> = M.chart()
|
|
329
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
330
|
+
sage: X_S.<u,v> = S.chart()
|
|
331
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [sqrt(u^2+v^2), u, v]},
|
|
332
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
333
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x, y]}, name='Phi_inv',
|
|
334
|
+
....: latex_name=r'\Phi^{-1}');
|
|
335
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
336
|
+
sage: S.ambient_metric()
|
|
337
|
+
Lorentzian metric g on the 3-dimensional Lorentzian manifold M
|
|
338
|
+
"""
|
|
339
|
+
if self._ambient_metric is None:
|
|
340
|
+
if not self._embedded or not isinstance(self._ambient,
|
|
341
|
+
(PseudoRiemannianManifold, DegenerateManifold)):
|
|
342
|
+
raise ValueError("degenerate submanifold must be embedded in a "
|
|
343
|
+
"pseudo-Riemannian or degenerate manifold")
|
|
344
|
+
self._ambient_metric = self._ambient.metric()
|
|
345
|
+
return self._ambient_metric
|
|
346
|
+
|
|
347
|
+
def default_screen(self):
|
|
348
|
+
r"""
|
|
349
|
+
Return the default screen distribution.
|
|
350
|
+
|
|
351
|
+
OUTPUT:
|
|
352
|
+
|
|
353
|
+
- an instance of
|
|
354
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`
|
|
355
|
+
|
|
356
|
+
EXAMPLES:
|
|
357
|
+
|
|
358
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
359
|
+
|
|
360
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
361
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
362
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
363
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
364
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
365
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
366
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
367
|
+
....: latex_name=r'\Phi^{-1}');
|
|
368
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
369
|
+
sage: g = M.metric()
|
|
370
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
371
|
+
sage: S.set_transverse(rigging=x)
|
|
372
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
373
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
374
|
+
sage: Sc = S.screen('Sc', (U,V), xi) # long time
|
|
375
|
+
sage: S.default_screen() # long time
|
|
376
|
+
screen distribution Sc along the degenerate hypersurface S embedded
|
|
377
|
+
in 4-dimensional differentiable manifold M mapped into the 4-dimensional
|
|
378
|
+
Lorentzian manifold M
|
|
379
|
+
"""
|
|
380
|
+
return self._default_screen
|
|
381
|
+
|
|
382
|
+
def list_of_screens(self):
|
|
383
|
+
r"""
|
|
384
|
+
Return the default screen distribution.
|
|
385
|
+
|
|
386
|
+
OUTPUT:
|
|
387
|
+
|
|
388
|
+
- an instance of
|
|
389
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`
|
|
390
|
+
|
|
391
|
+
EXAMPLES:
|
|
392
|
+
|
|
393
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
394
|
+
|
|
395
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
396
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
397
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
398
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
399
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
400
|
+
....: name='Phi', latex_name=r'\Phi')
|
|
401
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
402
|
+
....: latex_name=r'\Phi^{-1}')
|
|
403
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
404
|
+
sage: g = M.metric()
|
|
405
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
406
|
+
sage: S.set_transverse(rigging=x)
|
|
407
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
408
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
409
|
+
sage: Sc = S.screen('Sc', (U,V), xi) # long time
|
|
410
|
+
sage: S.list_of_screens() # long time
|
|
411
|
+
{'Sc': screen distribution Sc along the degenerate hypersurface S
|
|
412
|
+
embedded in 4-dimensional differentiable manifold M mapped into the
|
|
413
|
+
4-dimensional Lorentzian manifold M}
|
|
414
|
+
"""
|
|
415
|
+
return self._screens
|
|
416
|
+
|
|
417
|
+
def set_transverse(self, rigging=None, normal=None):
|
|
418
|
+
r"""
|
|
419
|
+
For setting a transversal distribution of the degenerate submanifold.
|
|
420
|
+
|
|
421
|
+
According to the type of the submanifold among the 4 possible types,
|
|
422
|
+
one must enter a list of normal transversal vector fields and/or a
|
|
423
|
+
list of transversal and not normal vector fields spanning a transverse
|
|
424
|
+
distribution.
|
|
425
|
+
|
|
426
|
+
INPUT:
|
|
427
|
+
|
|
428
|
+
- ``rigging`` -- list or tuple (default: ``None``); list of vector fields
|
|
429
|
+
of the ambient manifold or chart function; of the ambient manifold in
|
|
430
|
+
the latter case, the corresponding gradient vector field with respect to
|
|
431
|
+
the ambient metric is calculated; the vectors must be linearly independent,
|
|
432
|
+
transversal to the submanifold but not normal
|
|
433
|
+
- ``normal`` -- list or tuple (default: ``None``); list of vector fields
|
|
434
|
+
of the ambient manifold or chart function; of the ambient manifold in
|
|
435
|
+
the latter case, the corresponding gradient vector field with respect to
|
|
436
|
+
the ambient metric is calculated; the vectors must be linearly independent,
|
|
437
|
+
transversal and normal to the submanifold
|
|
438
|
+
|
|
439
|
+
EXAMPLES:
|
|
440
|
+
|
|
441
|
+
The lightcone of the 3-dimensional Minkowski space `\RR^3_1`::
|
|
442
|
+
|
|
443
|
+
sage: M = Manifold(3, 'M', structure='Lorentzian')
|
|
444
|
+
sage: X.<t,x,y> = M.chart()
|
|
445
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
446
|
+
sage: X_S.<u,v> = S.chart()
|
|
447
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [sqrt(u^2+v^2), u, v]},
|
|
448
|
+
....: name='Phi', latex_name=r'\Phi')
|
|
449
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x, y]}, name='Phi_inv',
|
|
450
|
+
....: latex_name=r'\Phi^{-1}')
|
|
451
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
452
|
+
sage: g = M.metric()
|
|
453
|
+
sage: g[0,0], g[1,1], g[2,2] = -1,1,1
|
|
454
|
+
sage: S.set_transverse(rigging=t)
|
|
455
|
+
"""
|
|
456
|
+
if isinstance(rigging, (list, tuple)):
|
|
457
|
+
rigging = list(rigging)
|
|
458
|
+
else:
|
|
459
|
+
if rigging is not None:
|
|
460
|
+
rigging = [rigging]
|
|
461
|
+
if isinstance(normal, (list, tuple)):
|
|
462
|
+
normal = list(normal)
|
|
463
|
+
else:
|
|
464
|
+
if normal is not None:
|
|
465
|
+
normal = [normal]
|
|
466
|
+
frame = self.default_frame()
|
|
467
|
+
im = self.immersion()
|
|
468
|
+
g = self.ambient_metric().along(im)
|
|
469
|
+
nor = []
|
|
470
|
+
rig = []
|
|
471
|
+
l1, l2 = 0, 0
|
|
472
|
+
if normal is not None:
|
|
473
|
+
for u in normal:
|
|
474
|
+
if isinstance(u, Expression):
|
|
475
|
+
u = self._ambient.scalar_field(u).gradient()
|
|
476
|
+
for v in frame:
|
|
477
|
+
v = im.pushforward(v)
|
|
478
|
+
if not g(u.along(im), v).is_zero():
|
|
479
|
+
raise ValueError("{} is not tangent to {}".format(u.display(), self._name))
|
|
480
|
+
nor.append(u)
|
|
481
|
+
l1 += 1
|
|
482
|
+
if rigging is not None:
|
|
483
|
+
for u in rigging:
|
|
484
|
+
if isinstance(u, Expression):
|
|
485
|
+
u = self._ambient.scalar_field(u).gradient()
|
|
486
|
+
rigg = False
|
|
487
|
+
for v in frame:
|
|
488
|
+
v = im.pushforward(v)
|
|
489
|
+
if not g(u.along(im), v).is_zero():
|
|
490
|
+
rigg = True
|
|
491
|
+
if not rigg:
|
|
492
|
+
raise ValueError("{} is normal to {}".format(u.display(), self._name))
|
|
493
|
+
rig.append(u)
|
|
494
|
+
l2 += 1
|
|
495
|
+
if l1+l2 != self._codim:
|
|
496
|
+
raise ValueError("length of the transverse must be {}".format(self._codim))
|
|
497
|
+
self._transverse['normal'] = tuple(nor)
|
|
498
|
+
self._transverse['rigging'] = tuple(rig)
|
|
499
|
+
|
|
500
|
+
def screen(self, name, screen, rad, latex_name=None):
|
|
501
|
+
r"""
|
|
502
|
+
For setting a screen distribution and vector fields of the radical distribution
|
|
503
|
+
that will be used for computations
|
|
504
|
+
|
|
505
|
+
INPUT:
|
|
506
|
+
|
|
507
|
+
- ``name`` -- string (default: ``None``); name given to the screen
|
|
508
|
+
- ``latex_name`` -- string (default: ``None``); LaTeX symbol to denote
|
|
509
|
+
the screen; if ``None``, the LaTeX symbol is set to ``name``
|
|
510
|
+
- ``screen`` -- list or tuple of vector fields
|
|
511
|
+
of the ambient manifold or chart function; of the ambient manifold in
|
|
512
|
+
the latter case, the corresponding gradient vector field with respect to
|
|
513
|
+
the ambient metric is calculated; the vectors must be linearly independent,
|
|
514
|
+
tangent to the submanifold but not normal
|
|
515
|
+
- ``rad`` -- -- list or tuple of vector fields
|
|
516
|
+
of the ambient manifold or chart function; of the ambient manifold in
|
|
517
|
+
the latter case, the corresponding gradient vector field with respect to
|
|
518
|
+
the ambient metric is calculated; the vectors must be linearly independent,
|
|
519
|
+
tangent and normal to the submanifold
|
|
520
|
+
|
|
521
|
+
EXAMPLES:
|
|
522
|
+
|
|
523
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
524
|
+
|
|
525
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
526
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
527
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
528
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
529
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
530
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
531
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
532
|
+
....: latex_name=r'\Phi^{-1}');
|
|
533
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
534
|
+
sage: g = M.metric()
|
|
535
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
536
|
+
sage: S.set_transverse(rigging=x)
|
|
537
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
538
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
539
|
+
sage: Sc = S.screen('Sc', (U,V), xi); Sc # long time
|
|
540
|
+
screen distribution Sc along the degenerate hypersurface S embedded
|
|
541
|
+
in 4-dimensional differentiable manifold M mapped into the 4-dimensional
|
|
542
|
+
Lorentzian manifold M
|
|
543
|
+
"""
|
|
544
|
+
if isinstance(screen, (list, tuple)):
|
|
545
|
+
screen = list(screen)
|
|
546
|
+
else:
|
|
547
|
+
screen = [screen]
|
|
548
|
+
if isinstance(rad, (list, tuple)):
|
|
549
|
+
rad = list(rad)
|
|
550
|
+
else:
|
|
551
|
+
rad = [rad]
|
|
552
|
+
if name in self._screens:
|
|
553
|
+
if list(screen) == self._screens[name]._screen and list(rad) == self._screens[name]._rad:
|
|
554
|
+
return self._screens[name]
|
|
555
|
+
else:
|
|
556
|
+
raise ValueError("a different screen distribution with the "
|
|
557
|
+
"same name had already been set")
|
|
558
|
+
if len(screen)+len(rad) != self._dim:
|
|
559
|
+
raise ValueError("total length screen+rad must be {}".format(self._dim))
|
|
560
|
+
frame = self.default_frame()
|
|
561
|
+
im = self.immersion()
|
|
562
|
+
g = self.ambient_metric().along(im)
|
|
563
|
+
for (i, u) in enumerate(screen):
|
|
564
|
+
if isinstance(u, Expression):
|
|
565
|
+
u = self._ambient.scalar_field(u).gradient()
|
|
566
|
+
screen[i] = u
|
|
567
|
+
sc = False
|
|
568
|
+
for v in frame:
|
|
569
|
+
v = im.pushforward(v)
|
|
570
|
+
if not g(u.along(im), v).is_zero():
|
|
571
|
+
sc = True
|
|
572
|
+
if not sc:
|
|
573
|
+
raise ValueError("{} cannot belong to a screen distribution".format(u.display()))
|
|
574
|
+
for (i, u) in enumerate(rad):
|
|
575
|
+
if isinstance(u, Expression):
|
|
576
|
+
u = self._ambient.scalar_field(u).gradient()
|
|
577
|
+
rad[i] = u
|
|
578
|
+
for v in frame:
|
|
579
|
+
v = im.pushforward(v)
|
|
580
|
+
if not g(u.along(im), v).is_zero():
|
|
581
|
+
raise ValueError("{} is not orthogonal to {}".format(u.display(), self._name))
|
|
582
|
+
for u in self._transverse['rigging']:
|
|
583
|
+
for v in screen:
|
|
584
|
+
if not g(u.along(im), v.along(im)).is_zero():
|
|
585
|
+
raise ValueError("{} is not orthogonal to the rigging {}".format(v.display(), u.display()))
|
|
586
|
+
self._screens[name] = Screen(self, name, tuple(screen), tuple(rad), latex_name=latex_name)
|
|
587
|
+
self._default_screen = self._screens[name]
|
|
588
|
+
return self._screens[name]
|
|
589
|
+
|
|
590
|
+
def induced_metric(self) -> DegenerateMetric:
|
|
591
|
+
r"""
|
|
592
|
+
Return the pullback of the ambient metric.
|
|
593
|
+
|
|
594
|
+
OUTPUT:
|
|
595
|
+
|
|
596
|
+
- induced metric, as an instance of
|
|
597
|
+
:class:`~sage.manifolds.differentiable.metric.DegenerateMetric`
|
|
598
|
+
|
|
599
|
+
EXAMPLES:
|
|
600
|
+
|
|
601
|
+
Section of the lightcone of the Minkowski space with a hyperplane
|
|
602
|
+
passing through the origin::
|
|
603
|
+
|
|
604
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
605
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
606
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
607
|
+
sage: X_S.<u,v> = S.chart()
|
|
608
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [sqrt(u^2+v^2), u, v, 0]},
|
|
609
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
610
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x, y]}, name='Phi_inv',
|
|
611
|
+
....: latex_name=r'\Phi^{-1}');
|
|
612
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
613
|
+
sage: g = M.metric()
|
|
614
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
615
|
+
sage: h = S.induced_metric(); h # long time
|
|
616
|
+
degenerate metric gamma on the 2-dimensional degenerate
|
|
617
|
+
submanifold S embedded in 4-dimensional differentiable manifold M
|
|
618
|
+
"""
|
|
619
|
+
if self._induced_metric is None or self._induced_metric._components == {}:
|
|
620
|
+
self._induced_metric = self.metric()
|
|
621
|
+
self._induced_metric.set(
|
|
622
|
+
self.immersion().pullback(self.ambient_metric()))
|
|
623
|
+
self._induced_metric.set_name("gamma", r"\gamma")
|
|
624
|
+
return self._induced_metric
|
|
625
|
+
|
|
626
|
+
def first_fundamental_form(self):
|
|
627
|
+
r"""
|
|
628
|
+
Return the restriction of the ambient metric on vector field
|
|
629
|
+
along the submanifold and tangent to it. It is difference from
|
|
630
|
+
induced metric who gives the pullback of the ambient metric
|
|
631
|
+
on the submanifold.
|
|
632
|
+
|
|
633
|
+
OUTPUT:
|
|
634
|
+
|
|
635
|
+
- the first fundamental form, as an instance of
|
|
636
|
+
:class:`~sage.manifolds.differentiable.degenerate.TangentTensor`
|
|
637
|
+
|
|
638
|
+
EXAMPLES:
|
|
639
|
+
|
|
640
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
641
|
+
|
|
642
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
643
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
644
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
645
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
646
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
647
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
648
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
649
|
+
....: latex_name=r'\Phi^{-1}');
|
|
650
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
651
|
+
sage: g = M.metric()
|
|
652
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
653
|
+
sage: S.set_transverse(rigging=x)
|
|
654
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
655
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
656
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
657
|
+
sage: h = S.first_fundamental_form() # long time
|
|
658
|
+
"""
|
|
659
|
+
if self._first_fundamental_form is None:
|
|
660
|
+
g = self.ambient_metric()
|
|
661
|
+
h = g.copy()
|
|
662
|
+
h.set_name(g._name+"|"+self._name, g._latex_name+r"|_"+self._latex_name)
|
|
663
|
+
h = TangentTensor(h, self.immersion())
|
|
664
|
+
self._first_fundamental_form = h
|
|
665
|
+
return self._first_fundamental_form
|
|
666
|
+
|
|
667
|
+
def _ambient_decomposition(self, screen=None):
|
|
668
|
+
r"""
|
|
669
|
+
Return a list ``[screen, rad, normal, rig]`` where ``screen``
|
|
670
|
+
is a list a vector fields on the ambient manifold `M` spanning
|
|
671
|
+
the giving screen distribution, ``rad`` a list of vector fields
|
|
672
|
+
spanning radical distribution, ``normal`` list of normal transversal
|
|
673
|
+
vector fields, and ``rig`` list of rigging vector fields
|
|
674
|
+
corresponding to the giving screen.
|
|
675
|
+
|
|
676
|
+
INPUT:
|
|
677
|
+
|
|
678
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
679
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`;
|
|
680
|
+
if ``None``, the default screen is used.
|
|
681
|
+
|
|
682
|
+
OUTPUT:
|
|
683
|
+
|
|
684
|
+
- a list of 4 lists, this 1st one being independent vector fields
|
|
685
|
+
spanning the screen distribution, the 2nd one independent vector fields
|
|
686
|
+
spanning the radical distribution, the 3rd one independent vector fields
|
|
687
|
+
spanning the transversal normal distribution, the 4th one being a list
|
|
688
|
+
of independent riggings in `Rig(T\Sigma)` according to the decomposition
|
|
689
|
+
|
|
690
|
+
.. MATH::
|
|
691
|
+
|
|
692
|
+
TM_{|\Sigma}=S(T\Sigma)\oplus_{orth}((Rad(T\Sigma)\oplus_{orth}(
|
|
693
|
+
T\sigma^\perp\cap tr(TM))\oplus Rig(T\Sigma))
|
|
694
|
+
|
|
695
|
+
EXAMPLES:
|
|
696
|
+
|
|
697
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
698
|
+
|
|
699
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
700
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
701
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
702
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
703
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
704
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
705
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
706
|
+
....: latex_name=r'\Phi^{-1}');
|
|
707
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
708
|
+
sage: g = M.metric()
|
|
709
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
710
|
+
sage: S.set_transverse(rigging=x)
|
|
711
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
712
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
713
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
714
|
+
sage: S._ambient_decomposition() # long time
|
|
715
|
+
[[Vector field on the 4-dimensional Lorentzian manifold M,
|
|
716
|
+
Vector field on the 4-dimensional Lorentzian manifold M],
|
|
717
|
+
[Vector field on the 4-dimensional Lorentzian manifold M],
|
|
718
|
+
(),
|
|
719
|
+
[Vector field N on the 4-dimensional Lorentzian manifold M]]
|
|
720
|
+
"""
|
|
721
|
+
try:
|
|
722
|
+
normal = self._transverse['normal']
|
|
723
|
+
except KeyError:
|
|
724
|
+
raise ValueError("Set first transverse by using set_transverse")
|
|
725
|
+
if screen is None:
|
|
726
|
+
screen = self.default_screen()
|
|
727
|
+
if isinstance(screen, Screen):
|
|
728
|
+
rad = screen._rad
|
|
729
|
+
screen = screen._screen
|
|
730
|
+
rig = self._transverse['rigging']
|
|
731
|
+
else:
|
|
732
|
+
raise ValueError("set first a screen distribution")
|
|
733
|
+
if self._codim == 1:
|
|
734
|
+
xi = rad[0]
|
|
735
|
+
v = rig[0]
|
|
736
|
+
g = self.ambient_metric()
|
|
737
|
+
N = (1/g(xi, v))*(v-(g(v,v)/(2*g(xi, v)))*xi)
|
|
738
|
+
if not self._adapted_frame:
|
|
739
|
+
N.set_name(name='N')
|
|
740
|
+
else:
|
|
741
|
+
n = len(self._adapted_frame)
|
|
742
|
+
N.set_name(name='N'+str(n))
|
|
743
|
+
rig = [N]
|
|
744
|
+
return [screen, rad, normal, rig]
|
|
745
|
+
|
|
746
|
+
def _adapted_frame_(self, screen=None):
|
|
747
|
+
r"""
|
|
748
|
+
Return a frame
|
|
749
|
+
`(e_1,\ldots,e_p, \xi_1,\ldots, \xi_r, v_1,\ldots, v_q, N_1, \ldots, N_n)`
|
|
750
|
+
of the ambient manifold, being `e_i` vector fields
|
|
751
|
+
spanning the giving screen distribution, `\xi_i` vector fields spanning
|
|
752
|
+
radical distribution, `v_i` normal transversal vector fields, `N_i`
|
|
753
|
+
rigging vector fields corresponding to the giving screen.
|
|
754
|
+
|
|
755
|
+
INPUT:
|
|
756
|
+
|
|
757
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
758
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`;
|
|
759
|
+
if ``None`` default screen is used.
|
|
760
|
+
|
|
761
|
+
OUTPUT: a frame on the ambient manifold
|
|
762
|
+
|
|
763
|
+
EXAMPLES:
|
|
764
|
+
|
|
765
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
766
|
+
|
|
767
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
768
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
769
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
770
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
771
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
772
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
773
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
774
|
+
....: latex_name=r'\Phi^{-1}');
|
|
775
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
776
|
+
sage: g = M.metric()
|
|
777
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
778
|
+
sage: S.set_transverse(rigging=x)
|
|
779
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
780
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
781
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
782
|
+
sage: T = S._adapted_frame_(); # long time
|
|
783
|
+
"""
|
|
784
|
+
|
|
785
|
+
if screen is None:
|
|
786
|
+
screen = self.default_screen()
|
|
787
|
+
if screen is None:
|
|
788
|
+
raise ValueError("set first a screen distribution")
|
|
789
|
+
if screen._name in self._adapted_frame:
|
|
790
|
+
return self._adapted_frame[screen._name]
|
|
791
|
+
decomposition = self._ambient_decomposition(screen)
|
|
792
|
+
sc, rad = decomposition[0], decomposition[1]
|
|
793
|
+
normal, rigging = decomposition[2], decomposition[3]
|
|
794
|
+
A = self._ambient.automorphism_field()
|
|
795
|
+
i = self._ambient._sindex
|
|
796
|
+
for u in sc:
|
|
797
|
+
for j in self._ambient.irange():
|
|
798
|
+
A[j,i] = u[j]
|
|
799
|
+
i += 1
|
|
800
|
+
for u in rad:
|
|
801
|
+
for j in self._ambient.irange():
|
|
802
|
+
A[j,i] = u[j]
|
|
803
|
+
i += 1
|
|
804
|
+
for u in normal:
|
|
805
|
+
for j in self._ambient.irange():
|
|
806
|
+
A[j,i] = u[j]
|
|
807
|
+
i += 1
|
|
808
|
+
for u in rigging:
|
|
809
|
+
for j in self._ambient.irange():
|
|
810
|
+
A[j,i] = u[j]
|
|
811
|
+
i += 1
|
|
812
|
+
f = self._ambient.default_frame()
|
|
813
|
+
GLHPhi = f.along(self.immersion())[0].parent().general_linear_group()
|
|
814
|
+
if not self._adapted_frame:
|
|
815
|
+
e = f.new_frame(A, 'vv')
|
|
816
|
+
else:
|
|
817
|
+
n = len(self._adapted_frame)
|
|
818
|
+
e = f.new_frame(A, 'vv'+str(n))
|
|
819
|
+
self.set_change_of_frame(f.along(self.immersion()), e.along(
|
|
820
|
+
self.immersion()), GLHPhi(A.along(self.immersion())))
|
|
821
|
+
b = e.dual_basis()
|
|
822
|
+
if self._codim == 1:
|
|
823
|
+
if not self._adapted_frame:
|
|
824
|
+
e[self._dim-self._sindex].set_name('N')
|
|
825
|
+
else:
|
|
826
|
+
n = len(self._adapted_frame)
|
|
827
|
+
e[self._dim-self._sindex].set_name('N'+str(n))
|
|
828
|
+
e[self._dim-self._sindex-1].set_name('xi', latex_name=r'\xi')
|
|
829
|
+
if not self._adapted_frame:
|
|
830
|
+
b[self._dim-self._sindex].set_name('N^b', latex_name=r'N^\flat')
|
|
831
|
+
else:
|
|
832
|
+
b[self._dim-self._sindex].set_name('N'+str(n)+'^b', latex_name=r'N'+str(n)+r'^\flat')
|
|
833
|
+
b[self._dim-self._sindex-1].set_name('xi^b', latex_name=r'\xi^\flat')
|
|
834
|
+
self._adapted_frame[screen._name] = e
|
|
835
|
+
return e
|
|
836
|
+
|
|
837
|
+
def adapted_frame(self, screen=None):
|
|
838
|
+
r"""
|
|
839
|
+
Return a frame
|
|
840
|
+
`(e_1,\ldots,e_p, \xi_1,\ldots, \xi_r, v_1,\ldots, v_q, N_1, \ldots, N_n)`
|
|
841
|
+
of the ambient manifold along the submanifold, being `e_i` vector fields
|
|
842
|
+
spanning the giving screen distribution, `\xi_i` vector fields spanning
|
|
843
|
+
radical distribution, `v_i` normal transversal vector fields, `N_i`
|
|
844
|
+
rigging vector fields corresponding to the giving screen.
|
|
845
|
+
|
|
846
|
+
INPUT:
|
|
847
|
+
|
|
848
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
849
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
850
|
+
if ``None`` default screen is used.
|
|
851
|
+
|
|
852
|
+
OUTPUT: a frame on the ambient manifold along the submanifold
|
|
853
|
+
|
|
854
|
+
EXAMPLES:
|
|
855
|
+
|
|
856
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
857
|
+
|
|
858
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
859
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
860
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
861
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
862
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
863
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
864
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
865
|
+
....: latex_name=r'\Phi^{-1}');
|
|
866
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
867
|
+
sage: g = M.metric()
|
|
868
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
869
|
+
sage: S.set_transverse(rigging=x)
|
|
870
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
871
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
872
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
873
|
+
sage: T = S.adapted_frame(); T # long time
|
|
874
|
+
Vector frame (S, (vv_0,vv_1,vv_2,vv_3)) with values on the 4-dimensional
|
|
875
|
+
Lorentzian manifold M
|
|
876
|
+
"""
|
|
877
|
+
e = self._adapted_frame_(screen).along(self.immersion())
|
|
878
|
+
b = e.dual_basis()
|
|
879
|
+
if self._codim == 1:
|
|
880
|
+
if not self._adapted_frame:
|
|
881
|
+
e[self._dim-self._sindex].set_name('N')
|
|
882
|
+
else:
|
|
883
|
+
n = len(self._adapted_frame)
|
|
884
|
+
e[self._dim-self._sindex].set_name('N'+str(n))
|
|
885
|
+
e[self._dim-self._sindex-1].set_name('xi', latex_name=r'\xi')
|
|
886
|
+
if not self._adapted_frame:
|
|
887
|
+
b[self._dim-self._sindex].set_name('N^b', latex_name=r'N^\flat')
|
|
888
|
+
else:
|
|
889
|
+
b[self._dim-self._sindex].set_name('N'+str(n)+'^b', latex_name=r'N'+str(n)+r'^\flat')
|
|
890
|
+
b[self._dim-self._sindex-1].set_name('xi^b', latex_name=r'\xi^\flat')
|
|
891
|
+
return self._adapted_frame_(screen).along(self.immersion())
|
|
892
|
+
|
|
893
|
+
def second_fundamental_form(self, screen=None):
|
|
894
|
+
r"""
|
|
895
|
+
|
|
896
|
+
This method is implemented only for null hypersurfaces. The method
|
|
897
|
+
returns a tensor `B` of type `(0,2)` instance of
|
|
898
|
+
:class:`~sage.manifolds.differentiable.degenerate.TangentTensor`
|
|
899
|
+
such that for two vector fields `U, V` on the ambient manifold along
|
|
900
|
+
the null hypersurface, one has:
|
|
901
|
+
|
|
902
|
+
.. MATH::
|
|
903
|
+
|
|
904
|
+
\nabla_UV=D(U,V)+B(U,V)N
|
|
905
|
+
|
|
906
|
+
being `\nabla` the ambient connection, `D` the induced connection
|
|
907
|
+
and `N` the chosen rigging.
|
|
908
|
+
|
|
909
|
+
INPUT:
|
|
910
|
+
|
|
911
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
912
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
913
|
+
If ``None``, the default screen is used
|
|
914
|
+
|
|
915
|
+
OUTPUT:
|
|
916
|
+
|
|
917
|
+
- an instance of
|
|
918
|
+
:class:`~sage.manifolds.differentiable.degenerate.TangentTensor`
|
|
919
|
+
|
|
920
|
+
EXAMPLES:
|
|
921
|
+
|
|
922
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
923
|
+
|
|
924
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
925
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
926
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
927
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
928
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
929
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
930
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
931
|
+
....: latex_name=r'\Phi^{-1}');
|
|
932
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
933
|
+
sage: g = M.metric()
|
|
934
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
935
|
+
sage: S.set_transverse(rigging=x)
|
|
936
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
937
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
938
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
939
|
+
sage: B = S.second_fundamental_form(); # long time
|
|
940
|
+
sage: B.display() # long time
|
|
941
|
+
B = 0
|
|
942
|
+
"""
|
|
943
|
+
if self._ambient._dim-self._dim != 1:
|
|
944
|
+
raise ValueError("'second_fundamental_form' is defined" +
|
|
945
|
+
" only for hypersurfaces.")
|
|
946
|
+
if screen is None:
|
|
947
|
+
screen = self.default_screen()
|
|
948
|
+
if screen._name not in self._second_fundamental_form:
|
|
949
|
+
resu = self._ambient.vector_field_module() \
|
|
950
|
+
.tensor((0, 2), name='B', latex_name='B', sym=[(0, 1)], antisym=[]) \
|
|
951
|
+
.along(self.immersion())
|
|
952
|
+
f = self.adapted_frame(screen)
|
|
953
|
+
rad = self._ambient_decomposition(screen)[1]
|
|
954
|
+
nab = self.ambient_metric().connection()
|
|
955
|
+
xi = rad[0]
|
|
956
|
+
A = self.screen_projection(nab(xi))
|
|
957
|
+
resu[f, :] = A[f, :]
|
|
958
|
+
im = self.immersion()
|
|
959
|
+
self._second_fundamental_form[screen._name] = TangentTensor(resu, im)
|
|
960
|
+
return self._second_fundamental_form[screen._name]
|
|
961
|
+
|
|
962
|
+
extrinsic_curvature = second_fundamental_form
|
|
963
|
+
|
|
964
|
+
def projection(self, tensor, screen=None):
|
|
965
|
+
r"""
|
|
966
|
+
|
|
967
|
+
For a given tensor `T` of type `(r, 1)` on the ambient manifold, this
|
|
968
|
+
method returns the tensor `T'` of type `(r,1)` such that for `r`
|
|
969
|
+
vector fields `v_1,\ldots,v_r`, `T'(v_1,\ldots,v_r)` is the projection
|
|
970
|
+
of `T(v_1,\ldots,v_r)` on ``self`` along the bundle spanned by the
|
|
971
|
+
transversal vector fields provided by :meth:`set_transverse`.
|
|
972
|
+
|
|
973
|
+
INPUT:
|
|
974
|
+
|
|
975
|
+
- ``tensor`` -- a tensor of type `(r,1)` on the ambient manifold
|
|
976
|
+
|
|
977
|
+
OUTPUT:
|
|
978
|
+
|
|
979
|
+
- a tensor of type `(r,1)` on the ambient manifold along ``self``
|
|
980
|
+
|
|
981
|
+
EXAMPLES:
|
|
982
|
+
|
|
983
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
984
|
+
|
|
985
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
986
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
987
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
988
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
989
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
990
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
991
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
992
|
+
....: latex_name=r'\Phi^{-1}');
|
|
993
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
994
|
+
sage: g = M.metric()
|
|
995
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
996
|
+
sage: S.set_transverse(rigging=x)
|
|
997
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
998
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
999
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1000
|
+
sage: U1 = S.projection(U) # long time
|
|
1001
|
+
"""
|
|
1002
|
+
if tensor.tensor_type()[0] != 1:
|
|
1003
|
+
raise NotImplementedError("``projection`` is implemented only for "
|
|
1004
|
+
"tensors with 1 as contravariant order")
|
|
1005
|
+
return TangentTensor(tensor, self.immersion(), screen)
|
|
1006
|
+
|
|
1007
|
+
def screen_projection(self, tensor, screen=None):
|
|
1008
|
+
r"""
|
|
1009
|
+
For a given tensor `T` of type `(r, 1)` on the ambient manifold, this
|
|
1010
|
+
method returns the tensor `T'` of type `(r,1)` such that for `r`
|
|
1011
|
+
vector fields `v_1,\ldots,v_r`, `T'(v_1,\ldots,v_r)` is the projection
|
|
1012
|
+
of `T(v_1,\ldots,v_r)` on the bundle spanned by ``screen`` along the
|
|
1013
|
+
bundle spanned by the transversal plus the radical vector fields provided.
|
|
1014
|
+
|
|
1015
|
+
INPUT:
|
|
1016
|
+
|
|
1017
|
+
- ``tensor`` -- a tensor of type `(r,1)` on the ambient manifold
|
|
1018
|
+
|
|
1019
|
+
OUTPUT:
|
|
1020
|
+
|
|
1021
|
+
- a tensor of type `(r,1)` on the ambient manifold
|
|
1022
|
+
|
|
1023
|
+
EXAMPLES:
|
|
1024
|
+
|
|
1025
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1026
|
+
|
|
1027
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1028
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1029
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1030
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1031
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1032
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1033
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1034
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1035
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1036
|
+
sage: g = M.metric()
|
|
1037
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1038
|
+
sage: S.set_transverse(rigging=x)
|
|
1039
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1040
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1041
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1042
|
+
sage: U1 = S.screen_projection(U); # long time
|
|
1043
|
+
"""
|
|
1044
|
+
if tensor.tensor_type()[0] != 1:
|
|
1045
|
+
raise NotImplementedError("``projection`` is implemented only for " +
|
|
1046
|
+
"tensors with 1 as contravariant order")
|
|
1047
|
+
frame = self.adapted_frame(screen)
|
|
1048
|
+
T = tensor.copy()
|
|
1049
|
+
try:
|
|
1050
|
+
T = T.along(self.immersion())
|
|
1051
|
+
except ValueError:
|
|
1052
|
+
pass
|
|
1053
|
+
T.display(frame)
|
|
1054
|
+
for i in self._ambient.index_generator(T.tensor_rank()):
|
|
1055
|
+
if i[0] in range(self._dim-self._sindex-1,self._ambient._dim-self._sindex):
|
|
1056
|
+
T[frame, i] = 0
|
|
1057
|
+
if tensor._latex_name is None:
|
|
1058
|
+
T.set_name(tensor._name)
|
|
1059
|
+
else:
|
|
1060
|
+
T.set_name("P"+tensor._name, latex_name=r'P'+tensor._latex_name)
|
|
1061
|
+
return TangentTensor(T, self.immersion(), screen)
|
|
1062
|
+
|
|
1063
|
+
def weingarten_map(self, screen=None):
|
|
1064
|
+
r"""
|
|
1065
|
+
|
|
1066
|
+
This method is implemented only for hypersurfaces.
|
|
1067
|
+
*Weigarten map* is the `1`-form `W` defined for a vector field
|
|
1068
|
+
`U` tangent to ``self`` by
|
|
1069
|
+
|
|
1070
|
+
.. MATH::
|
|
1071
|
+
|
|
1072
|
+
W(U)=\nabla_U\xi
|
|
1073
|
+
|
|
1074
|
+
being `\nabla` the Levi-Civita connection of the ambient manifold
|
|
1075
|
+
and `\xi` the chosen vector field spanning the radical distribution.
|
|
1076
|
+
|
|
1077
|
+
INPUT:
|
|
1078
|
+
|
|
1079
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
1080
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
1081
|
+
If ``None`` the default screen is used.
|
|
1082
|
+
|
|
1083
|
+
OUTPUT:
|
|
1084
|
+
|
|
1085
|
+
- tensor of type `(1,1)` instance of
|
|
1086
|
+
:class:`~sage.manifolds.differentiable.degenerate.TangentTensor`
|
|
1087
|
+
|
|
1088
|
+
EXAMPLES:
|
|
1089
|
+
|
|
1090
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1091
|
+
|
|
1092
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1093
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1094
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1095
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1096
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1097
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1098
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1099
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1100
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1101
|
+
sage: g = M.metric()
|
|
1102
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1103
|
+
sage: v = M.vector_field(); v[1] = 1
|
|
1104
|
+
sage: S.set_transverse(rigging=v)
|
|
1105
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1106
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1107
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1108
|
+
sage: W = S.weingarten_map(); # long time
|
|
1109
|
+
sage: W.display() # long time
|
|
1110
|
+
nabla_g(xi)|X(S) = 0
|
|
1111
|
+
"""
|
|
1112
|
+
|
|
1113
|
+
im = self.immersion()
|
|
1114
|
+
rad = self._ambient_decomposition(screen)[1]
|
|
1115
|
+
nab = self.ambient_metric().connection()
|
|
1116
|
+
xi = rad[0]
|
|
1117
|
+
T = self.projection(nab(xi)).extension()
|
|
1118
|
+
try:
|
|
1119
|
+
T = T.along(im)
|
|
1120
|
+
except ValueError:
|
|
1121
|
+
pass
|
|
1122
|
+
T.set_name("nabla_g(xi)|X("+self._name+")",
|
|
1123
|
+
latex_name=r'\nabla_g(\xi)|_{\mathfrak{X}('+self._latex_name+r')}')
|
|
1124
|
+
return TangentTensor(T, im, screen)
|
|
1125
|
+
|
|
1126
|
+
def shape_operator(self, screen=None):
|
|
1127
|
+
r"""
|
|
1128
|
+
|
|
1129
|
+
This method is implemented only for hypersurfaces.
|
|
1130
|
+
*shape operator* is the projection of the Weingarten map
|
|
1131
|
+
on the screen distribution along the radical distribution.
|
|
1132
|
+
|
|
1133
|
+
INPUT:
|
|
1134
|
+
|
|
1135
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
1136
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
1137
|
+
If ``None`` the default screen is used.
|
|
1138
|
+
|
|
1139
|
+
OUTPUT:
|
|
1140
|
+
|
|
1141
|
+
- tensor of type `(1,1)` instance of
|
|
1142
|
+
:class:`~sage.manifolds.differentiable.degenerate.TangentTensor`
|
|
1143
|
+
|
|
1144
|
+
EXAMPLES:
|
|
1145
|
+
|
|
1146
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1147
|
+
|
|
1148
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1149
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1150
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1151
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1152
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1153
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1154
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1155
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1156
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1157
|
+
sage: g = M.metric()
|
|
1158
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1159
|
+
sage: v = M.vector_field(); v[1] = 1
|
|
1160
|
+
sage: S.set_transverse(rigging=v)
|
|
1161
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1162
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1163
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1164
|
+
sage: SO = S.shape_operator(); # long time
|
|
1165
|
+
sage: SO.display() # long time
|
|
1166
|
+
A^* = 0
|
|
1167
|
+
"""
|
|
1168
|
+
if screen is None:
|
|
1169
|
+
screen = self.default_screen()
|
|
1170
|
+
if screen._name in self._shape_operator:
|
|
1171
|
+
return self._shape_operator[screen._name]
|
|
1172
|
+
im = self.immersion()
|
|
1173
|
+
rad = self._ambient_decomposition(screen)[1]
|
|
1174
|
+
nab = self.ambient_metric().connection()
|
|
1175
|
+
xi = rad[0]
|
|
1176
|
+
T = self.screen_projection(nab(-xi), screen=screen).extension()
|
|
1177
|
+
try:
|
|
1178
|
+
T = T.along(im)
|
|
1179
|
+
except ValueError:
|
|
1180
|
+
pass
|
|
1181
|
+
T.set_name("A^*", latex_name=r'A^\ast')
|
|
1182
|
+
A = TangentTensor(T, im)
|
|
1183
|
+
self._shape_operator[screen._name] = A
|
|
1184
|
+
return A
|
|
1185
|
+
|
|
1186
|
+
def gauss_curvature(self, screen=None):
|
|
1187
|
+
r"""
|
|
1188
|
+
Gauss curvature is the product of all eigenfunctions of the shape operator.
|
|
1189
|
+
|
|
1190
|
+
INPUT:
|
|
1191
|
+
|
|
1192
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
1193
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
1194
|
+
If ``None`` the default screen is used.
|
|
1195
|
+
|
|
1196
|
+
OUTPUT: a scalar function on ``self``
|
|
1197
|
+
|
|
1198
|
+
EXAMPLES:
|
|
1199
|
+
|
|
1200
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1201
|
+
|
|
1202
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1203
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1204
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1205
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1206
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1207
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1208
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1209
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1210
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1211
|
+
sage: g = M.metric()
|
|
1212
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1213
|
+
sage: S.set_transverse(rigging=x)
|
|
1214
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1215
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1216
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1217
|
+
sage: K = S.gauss_curvature(); # long time
|
|
1218
|
+
sage: K.display() # long time
|
|
1219
|
+
S → ℝ
|
|
1220
|
+
(u, v, w) ↦ 0
|
|
1221
|
+
"""
|
|
1222
|
+
if self._ambient._dim-self._dim != 1:
|
|
1223
|
+
raise ValueError("'gauss_curvature' is defined"
|
|
1224
|
+
" only for hypersurfaces.")
|
|
1225
|
+
if screen is None:
|
|
1226
|
+
screen = self.default_screen()
|
|
1227
|
+
if screen._name not in self._gauss_curvature:
|
|
1228
|
+
f = self.adapted_frame()
|
|
1229
|
+
A = self.shape_operator()
|
|
1230
|
+
self._gauss_curvature[screen._name] = self.scalar_field(
|
|
1231
|
+
{chart: A[f,:,chart].determinant()
|
|
1232
|
+
for chart in self.top_charts()})
|
|
1233
|
+
return self._gauss_curvature[screen._name]
|
|
1234
|
+
|
|
1235
|
+
def principal_directions(self, screen=None):
|
|
1236
|
+
r"""
|
|
1237
|
+
|
|
1238
|
+
Principal directions are eigenvectors of the shape operator. This
|
|
1239
|
+
method is implemented only for hypersurfaces.
|
|
1240
|
+
|
|
1241
|
+
INPUT:
|
|
1242
|
+
|
|
1243
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
1244
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
1245
|
+
If ``None`` default screen is used.
|
|
1246
|
+
|
|
1247
|
+
OUTPUT:
|
|
1248
|
+
|
|
1249
|
+
- list of pairs (vector field, scalar field) representing the
|
|
1250
|
+
principal directions and the associated principal curvatures
|
|
1251
|
+
|
|
1252
|
+
EXAMPLES:
|
|
1253
|
+
|
|
1254
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1255
|
+
|
|
1256
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1257
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1258
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1259
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1260
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1261
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1262
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1263
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1264
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1265
|
+
sage: g = M.metric()
|
|
1266
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1267
|
+
sage: S.set_transverse(rigging=x)
|
|
1268
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1269
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1270
|
+
sage: Sc = S.screen('Sc', (U,V), xi); T = S.adapted_frame() # long time
|
|
1271
|
+
sage: PD = S.principal_directions() # long time
|
|
1272
|
+
sage: PD[2][0].display(T) # long time
|
|
1273
|
+
e_2 = xi
|
|
1274
|
+
"""
|
|
1275
|
+
if self._codim != 1:
|
|
1276
|
+
raise ValueError("'principal directions' is defined" +
|
|
1277
|
+
" only for hypersurfaces.")
|
|
1278
|
+
if screen is None:
|
|
1279
|
+
screen = self.default_screen()
|
|
1280
|
+
if screen._name in self._principal_directions:
|
|
1281
|
+
return self._principal_directions[screen._name]
|
|
1282
|
+
a = self.shape_operator(screen)
|
|
1283
|
+
frame = self.adapted_frame(screen)
|
|
1284
|
+
pr_d = matrix(
|
|
1285
|
+
[[a[frame, :][i, j].expr() for i in self.irange()]
|
|
1286
|
+
for j in self.irange()]).eigenvectors_right()
|
|
1287
|
+
res = []
|
|
1288
|
+
counter = self.irange()
|
|
1289
|
+
for eigen_space in pr_d:
|
|
1290
|
+
for eigen_vector in eigen_space[1]:
|
|
1291
|
+
v = self._ambient.vector_field(name="e_{}".format(next(counter))
|
|
1292
|
+
).along(self.immersion())
|
|
1293
|
+
v[frame, :] = list(eigen_vector) + [0]
|
|
1294
|
+
res.append((TangentTensor(v, self.immersion()), self.scalar_field(
|
|
1295
|
+
{chart: eigen_space[0] for chart in self.top_charts()})))
|
|
1296
|
+
#res[-1][0].set_name("e_{}".format(next(counter)))
|
|
1297
|
+
self._principal_directions[screen._name] = res
|
|
1298
|
+
return res
|
|
1299
|
+
|
|
1300
|
+
def mean_curvature(self, screen=None):
|
|
1301
|
+
r"""
|
|
1302
|
+
|
|
1303
|
+
Mean curvature is the sum of principal curvatures. This
|
|
1304
|
+
method is implemented only for hypersurfaces.
|
|
1305
|
+
|
|
1306
|
+
INPUT:
|
|
1307
|
+
|
|
1308
|
+
- ``screen`` -- (default: ``None``) an instance of
|
|
1309
|
+
:class:`~sage.manifolds.differentiable.degenerate_submanifold.Screen`.
|
|
1310
|
+
If ``None`` the default screen is used.
|
|
1311
|
+
|
|
1312
|
+
OUTPUT: the mean curvature, as a scalar field on the submanifold
|
|
1313
|
+
|
|
1314
|
+
EXAMPLES:
|
|
1315
|
+
|
|
1316
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1317
|
+
|
|
1318
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1319
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1320
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1321
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1322
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1323
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1324
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1325
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1326
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1327
|
+
sage: g = M.metric()
|
|
1328
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1329
|
+
sage: S.set_transverse(rigging=x)
|
|
1330
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1331
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1332
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1333
|
+
sage: m = S.mean_curvature(); m # long time
|
|
1334
|
+
Scalar field on the degenerate hypersurface S embedded in 4-dimensional
|
|
1335
|
+
differentiable manifold M
|
|
1336
|
+
sage: m.display() # long time
|
|
1337
|
+
S → ℝ
|
|
1338
|
+
(u, v, w) ↦ 0
|
|
1339
|
+
"""
|
|
1340
|
+
if self._codim != 1:
|
|
1341
|
+
raise ValueError("'mean_curvature' is defined" +
|
|
1342
|
+
" only for hypersurfaces.")
|
|
1343
|
+
if screen is None:
|
|
1344
|
+
screen = self.default_screen()
|
|
1345
|
+
if screen._name in self._mean_curvature:
|
|
1346
|
+
return self._mean_curvature[screen._name]
|
|
1347
|
+
pc = [elt[-1] for elt in self.principal_directions(screen)]
|
|
1348
|
+
self._mean_curvature[screen._name] = self.scalar_field({chart: sum(
|
|
1349
|
+
pc).expr(chart)/self._dim for chart in self.top_charts()})
|
|
1350
|
+
return self._mean_curvature[screen._name]
|
|
1351
|
+
|
|
1352
|
+
def is_tangent(self, v):
|
|
1353
|
+
r"""
|
|
1354
|
+
Determine whether a vector field on the ambient manifold along ``self``
|
|
1355
|
+
is tangent to ``self`` or not.
|
|
1356
|
+
|
|
1357
|
+
INPUT:
|
|
1358
|
+
|
|
1359
|
+
- ``v`` -- field on the ambient manifold along ``self``
|
|
1360
|
+
|
|
1361
|
+
OUTPUT:
|
|
1362
|
+
|
|
1363
|
+
- ``True`` if ``v`` is everywhere tangent to ``self`` or ``False`` if
|
|
1364
|
+
not
|
|
1365
|
+
|
|
1366
|
+
EXAMPLES:
|
|
1367
|
+
|
|
1368
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1369
|
+
|
|
1370
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1371
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1372
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1373
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1374
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1375
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1376
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1377
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1378
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1379
|
+
sage: g = M.metric()
|
|
1380
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1381
|
+
sage: v = M.vector_field(); v[1] = 1
|
|
1382
|
+
sage: S.set_transverse(rigging=v)
|
|
1383
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1384
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1385
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1386
|
+
sage: S.is_tangent(xi.along(Phi)) # long time
|
|
1387
|
+
True
|
|
1388
|
+
sage: S.is_tangent(v.along(Phi)) # long time
|
|
1389
|
+
False
|
|
1390
|
+
"""
|
|
1391
|
+
g = self.ambient_metric()
|
|
1392
|
+
im = self.immersion()
|
|
1393
|
+
decomposition = self._ambient_decomposition()
|
|
1394
|
+
rad, normal = decomposition[1], decomposition[2]
|
|
1395
|
+
for u in rad:
|
|
1396
|
+
if not g.along(im)(u.along(im),v).is_zero():
|
|
1397
|
+
return False
|
|
1398
|
+
return all(g.along(im)(u.along(im), v).is_zero() for u in normal)
|
|
1399
|
+
|
|
1400
|
+
|
|
1401
|
+
#**************************************************************************************
|
|
1402
|
+
|
|
1403
|
+
class Screen(VectorFieldModule):
|
|
1404
|
+
r"""
|
|
1405
|
+
Let `H` be a lightlike submanifold embedded in a pseudo-Riemannian
|
|
1406
|
+
manifold `(M,g)` with `\Phi` the embedding map. A screen distribution
|
|
1407
|
+
is a complementary `S(TH)` of the radical distribution `Rad(TM)=TH\cap
|
|
1408
|
+
TH^\perp` in `TH`. One then has
|
|
1409
|
+
|
|
1410
|
+
.. MATH::
|
|
1411
|
+
|
|
1412
|
+
TH=S(TH)\oplus_{orth}Rad(TH)
|
|
1413
|
+
|
|
1414
|
+
INPUT:
|
|
1415
|
+
|
|
1416
|
+
- ``submanifold`` -- a lightlike submanifold, as an instance of
|
|
1417
|
+
:class:`DegenerateSubmanifold`
|
|
1418
|
+
- ``name`` -- name given to the screen distribution
|
|
1419
|
+
- ``screen`` -- vector fields of the ambient manifold which
|
|
1420
|
+
span the screen distribution
|
|
1421
|
+
- ``rad`` -- vector fields of the ambient manifold which
|
|
1422
|
+
span the radical distribution
|
|
1423
|
+
- ``latex_name`` -- (default: ``None``) LaTeX symbol to denote the
|
|
1424
|
+
screen distribution; if ``None``, it is formed from ``name``
|
|
1425
|
+
|
|
1426
|
+
EXAMPLES:
|
|
1427
|
+
|
|
1428
|
+
The horizon of the Schwarzschild black hole::
|
|
1429
|
+
|
|
1430
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1431
|
+
sage: X_M.<t, r, th, ph> = \
|
|
1432
|
+
....: M.chart(r"t r:(0,oo) th:(0,pi):\theta ph:(0,2*pi):\phi")
|
|
1433
|
+
sage: var('m'); assume(m>0)
|
|
1434
|
+
m
|
|
1435
|
+
sage: g = M.metric()
|
|
1436
|
+
sage: g[0,0], g[0,1], g[1,1], g[2,2], g[3,3] = \
|
|
1437
|
+
....: -1+2*m/r, 2*m/r, 1+2*m/r, r^2, r^2*sin(th)^2
|
|
1438
|
+
sage: H = Manifold(3, 'H', ambient=M, structure='degenerate_metric')
|
|
1439
|
+
sage: X_H.<ht,hth,hph> = \
|
|
1440
|
+
....: H.chart(r"ht:(-oo,oo):t hth:(0,pi):\theta hph:(0,2*pi):\phi")
|
|
1441
|
+
sage: Phi = H.diff_map(M, {(X_H, X_M): [ht, 2*m,hth, hph]}, \
|
|
1442
|
+
....: name='Phi', latex_name=r'\Phi')
|
|
1443
|
+
sage: Phi_inv = M.diff_map(H, {(X_M, X_H): [t,th, ph]}, \
|
|
1444
|
+
....: name='Phi_inv', latex_name=r'\Phi^{-1}')
|
|
1445
|
+
sage: H.set_immersion(Phi, inverse=Phi_inv); H.declare_embedding()
|
|
1446
|
+
sage: xi = M.vector_field(-1, 0, 0, 0)
|
|
1447
|
+
sage: v = M.vector_field(r, -r, 0, 0)
|
|
1448
|
+
sage: e1 = M.vector_field(0, 0, 1, 0)
|
|
1449
|
+
sage: e2 = M.vector_field(0, 0, 0, 1)
|
|
1450
|
+
|
|
1451
|
+
A screen distribution for the Schwarzschild black hole horizon::
|
|
1452
|
+
|
|
1453
|
+
sage: H.set_transverse(rigging=v)
|
|
1454
|
+
sage: S = H.screen('S', [e1, e2], (xi)); S # long time
|
|
1455
|
+
screen distribution S along the degenerate hypersurface H embedded
|
|
1456
|
+
in 4-dimensional differentiable manifold M mapped into the
|
|
1457
|
+
4-dimensional Lorentzian manifold M
|
|
1458
|
+
|
|
1459
|
+
The corresponding normal tangent null vector field and null
|
|
1460
|
+
transversal vector field::
|
|
1461
|
+
|
|
1462
|
+
sage: xi = S.normal_tangent_vector(); xi.display() # long time
|
|
1463
|
+
xi = -∂/∂t
|
|
1464
|
+
sage: N = S.rigging(); N.display() # long time
|
|
1465
|
+
N = ∂/∂t - ∂/∂r
|
|
1466
|
+
|
|
1467
|
+
Those vector fields are normalized by `g(\xi,N)=1`::
|
|
1468
|
+
|
|
1469
|
+
sage: g.along(Phi)(xi, N).display() # long time
|
|
1470
|
+
g(xi,N): H → ℝ
|
|
1471
|
+
(ht, hth, hph) ↦ 1
|
|
1472
|
+
|
|
1473
|
+
"""
|
|
1474
|
+
|
|
1475
|
+
def __init__(self, submanifold, name, screen, rad, latex_name=None):
|
|
1476
|
+
r"""
|
|
1477
|
+
|
|
1478
|
+
TESTS::
|
|
1479
|
+
|
|
1480
|
+
sage: M = Manifold(3, 'M', structure='Lorentzian')
|
|
1481
|
+
sage: X.<t,x,y> = M.chart()
|
|
1482
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
1483
|
+
sage: X_S.<u,v> = S.chart()
|
|
1484
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [sqrt(u^2+v^2), u, v]},
|
|
1485
|
+
....: name='Phi', latex_name=r'\Phi')
|
|
1486
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x, y]}, name='Phi_inv',
|
|
1487
|
+
....: latex_name=r'\Phi^{-1}')
|
|
1488
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1489
|
+
sage: g = M.metric()
|
|
1490
|
+
sage: g[0,0], g[1,1], g[2,2] = -1,1,1
|
|
1491
|
+
sage: S.set_transverse(rigging=t)
|
|
1492
|
+
sage: xi = M.vector_field(); xi[0] = sqrt(x^2+y^2); xi[1] = x; xi[2] = y
|
|
1493
|
+
sage: U = M.vector_field(); U[1] = -y; U[2] = x
|
|
1494
|
+
sage: Sc = S.screen('Sc', U, xi);
|
|
1495
|
+
"""
|
|
1496
|
+
if not isinstance(submanifold, DegenerateSubmanifold):
|
|
1497
|
+
raise TypeError("the first argument must be a null submanifold")
|
|
1498
|
+
VectorFieldModule.__init__(self, submanifold, dest_map=submanifold.immersion())
|
|
1499
|
+
try:
|
|
1500
|
+
self._rigging = submanifold._transverse['rigging']
|
|
1501
|
+
except KeyError:
|
|
1502
|
+
raise ValueError("set first transverse by using `set_transverse` method")
|
|
1503
|
+
self._screen = list(screen)
|
|
1504
|
+
self._rad = list(rad)
|
|
1505
|
+
self._name = name
|
|
1506
|
+
if not latex_name:
|
|
1507
|
+
latex_name = name
|
|
1508
|
+
self._latex_name = latex_name
|
|
1509
|
+
|
|
1510
|
+
def _repr_(self):
|
|
1511
|
+
r"""
|
|
1512
|
+
String representation of ``self``.
|
|
1513
|
+
|
|
1514
|
+
TESTS::
|
|
1515
|
+
|
|
1516
|
+
sage: M = Manifold(3, 'M', structure='Lorentzian')
|
|
1517
|
+
sage: X.<t,x,y> = M.chart()
|
|
1518
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
1519
|
+
sage: X_S.<u,v> = S.chart()
|
|
1520
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [sqrt(u^2+v^2), u, v]},
|
|
1521
|
+
....: name='Phi', latex_name=r'\Phi')
|
|
1522
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x, y]}, name='Phi_inv',
|
|
1523
|
+
....: latex_name=r'\Phi^{-1}')
|
|
1524
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1525
|
+
sage: g = M.metric()
|
|
1526
|
+
sage: g[0,0], g[1,1], g[2,2] = -1,1,1
|
|
1527
|
+
sage: S.set_transverse(rigging=t)
|
|
1528
|
+
sage: xi = M.vector_field(); xi[0] = sqrt(x^2+y^2); xi[1] = x; xi[2] = y
|
|
1529
|
+
sage: U = M.vector_field(); U[1] = -y; U[2] = x
|
|
1530
|
+
sage: Sc = S.screen('Sc', U, xi); Sc._repr_()
|
|
1531
|
+
'screen distribution Sc along the degenerate hypersurface S embedded in
|
|
1532
|
+
3-dimensional differentiable manifold M mapped into the 3-dimensional
|
|
1533
|
+
Lorentzian manifold M'
|
|
1534
|
+
"""
|
|
1535
|
+
description = "screen distribution "+self._name
|
|
1536
|
+
if self._dest_map is self._domain.identity_map():
|
|
1537
|
+
description += " on the {}".format(self._domain)
|
|
1538
|
+
else:
|
|
1539
|
+
description += (" along the {}".format(self._domain)
|
|
1540
|
+
+ " mapped into the {}".format(self._ambient_domain))
|
|
1541
|
+
return description
|
|
1542
|
+
|
|
1543
|
+
def __getitem__(self, i):
|
|
1544
|
+
r"""
|
|
1545
|
+
Access vector fields spanning the screen distribution.
|
|
1546
|
+
|
|
1547
|
+
INPUT:
|
|
1548
|
+
|
|
1549
|
+
- ``i`` -- index of the coordinate; if the slice ``[:]``, then all
|
|
1550
|
+
the coordinates are returned
|
|
1551
|
+
|
|
1552
|
+
OUTPUT:
|
|
1553
|
+
|
|
1554
|
+
- a vector field on the ambient manifold that belong to
|
|
1555
|
+
the screen distribution
|
|
1556
|
+
|
|
1557
|
+
TESTS::
|
|
1558
|
+
|
|
1559
|
+
sage: M = Manifold(3, 'M', structure='Lorentzian')
|
|
1560
|
+
sage: X.<t,x,y> = M.chart()
|
|
1561
|
+
sage: S = Manifold(2, 'S', ambient=M, structure='degenerate_metric')
|
|
1562
|
+
sage: X_S.<u,v> = S.chart()
|
|
1563
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [sqrt(u^2+v^2), u, v]},
|
|
1564
|
+
....: name='Phi', latex_name=r'\Phi')
|
|
1565
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x, y]}, name='Phi_inv',
|
|
1566
|
+
....: latex_name=r'\Phi^{-1}')
|
|
1567
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1568
|
+
sage: g = M.metric()
|
|
1569
|
+
sage: g[0,0], g[1,1], g[2,2] = -1,1,1
|
|
1570
|
+
sage: S.set_transverse(rigging=t)
|
|
1571
|
+
sage: xi = M.vector_field(); xi[0] = sqrt(x^2+y^2); xi[1] = x; xi[2] = y
|
|
1572
|
+
sage: U = M.vector_field(); U[1] = -y; U[2] = x
|
|
1573
|
+
sage: Sc = S.screen('Sc', U, xi);
|
|
1574
|
+
sage: Sc.__getitem__(0)
|
|
1575
|
+
Vector field along the degenerate hypersurface S embedded in
|
|
1576
|
+
3-dimensional differentiable manifold M with values on the 3-dimensional
|
|
1577
|
+
Lorentzian manifold M
|
|
1578
|
+
"""
|
|
1579
|
+
sc = [elt.along(self._domain.immersion()) for elt in self._screen]
|
|
1580
|
+
return sc[i-self._domain._sindex]
|
|
1581
|
+
|
|
1582
|
+
def normal_tangent_vector(self):
|
|
1583
|
+
r"""
|
|
1584
|
+
Return either a list ``Rad`` of vector fields spanning the radical
|
|
1585
|
+
distribution or (in case of a hypersurface) a normal tangent null
|
|
1586
|
+
vector field spanning the radical distribution.
|
|
1587
|
+
|
|
1588
|
+
OUTPUT:
|
|
1589
|
+
|
|
1590
|
+
- either a list of vector fields or a single vector field in
|
|
1591
|
+
case of a hypersurface
|
|
1592
|
+
|
|
1593
|
+
EXAMPLES:
|
|
1594
|
+
|
|
1595
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1596
|
+
|
|
1597
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1598
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1599
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1600
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1601
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1602
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1603
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1604
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1605
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1606
|
+
sage: g = M.metric()
|
|
1607
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1608
|
+
sage: v = M.vector_field(); v[1] = 1
|
|
1609
|
+
sage: S.set_transverse(rigging=v)
|
|
1610
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1611
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1612
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1613
|
+
sage: Rad = Sc.normal_tangent_vector(); Rad.display() # long time
|
|
1614
|
+
xi = ∂/∂t + ∂/∂x
|
|
1615
|
+
"""
|
|
1616
|
+
rad = [elt.along(self._domain.immersion()) for elt in self._rad]
|
|
1617
|
+
if self._domain._codim == 1:
|
|
1618
|
+
xi = rad[0]
|
|
1619
|
+
xi.set_name(name='xi', latex_name=r'\xi')
|
|
1620
|
+
return xi
|
|
1621
|
+
else:
|
|
1622
|
+
return rad
|
|
1623
|
+
|
|
1624
|
+
def rigging(self):
|
|
1625
|
+
r"""
|
|
1626
|
+
Return either a list ``Rad`` of vector fields spanning the
|
|
1627
|
+
complementary of the normal distribution `TH^\perp` in the
|
|
1628
|
+
transverse bundle or (when `H` is a null hypersurface) the
|
|
1629
|
+
null transversal vector field defined in [DB1996]_.
|
|
1630
|
+
|
|
1631
|
+
OUTPUT:
|
|
1632
|
+
|
|
1633
|
+
- either a list made by vector fields or a vector field in
|
|
1634
|
+
case of hypersurface
|
|
1635
|
+
|
|
1636
|
+
EXAMPLES:
|
|
1637
|
+
|
|
1638
|
+
A degenerate hyperplane the 4-dimensional Minkowski space `\RR^4_1`::
|
|
1639
|
+
|
|
1640
|
+
sage: M = Manifold(4, 'M', structure='Lorentzian')
|
|
1641
|
+
sage: X.<t,x,y,z> = M.chart()
|
|
1642
|
+
sage: S = Manifold(3, 'S', ambient=M, structure='degenerate_metric')
|
|
1643
|
+
sage: X_S.<u,v,w> = S.chart()
|
|
1644
|
+
sage: Phi = S.diff_map(M, {(X_S, X): [u, u, v, w]},
|
|
1645
|
+
....: name='Phi', latex_name=r'\Phi');
|
|
1646
|
+
sage: Phi_inv = M.diff_map(S, {(X, X_S): [x,y, z]}, name='Phi_inv',
|
|
1647
|
+
....: latex_name=r'\Phi^{-1}');
|
|
1648
|
+
sage: S.set_immersion(Phi, inverse=Phi_inv); S.declare_embedding()
|
|
1649
|
+
sage: g = M.metric()
|
|
1650
|
+
sage: g[0,0], g[1,1], g[2,2], g[3,3] = -1,1,1,1
|
|
1651
|
+
sage: v = M.vector_field(); v[1] = 1
|
|
1652
|
+
sage: S.set_transverse(rigging=v)
|
|
1653
|
+
sage: xi = M.vector_field(); xi[0] = 1; xi[1] = 1
|
|
1654
|
+
sage: U = M.vector_field(); U[2] = 1; V = M.vector_field(); V[3] = 1
|
|
1655
|
+
sage: Sc = S.screen('Sc', (U,V), xi); # long time
|
|
1656
|
+
sage: rig = Sc.rigging(); rig.display() # long time
|
|
1657
|
+
N = -1/2 ∂/∂t + 1/2 ∂/∂x
|
|
1658
|
+
"""
|
|
1659
|
+
im = self._domain.immersion()
|
|
1660
|
+
rig = [elt.along(im) for elt in self._domain._transverse['rigging']]
|
|
1661
|
+
if self._domain._codim != 1:
|
|
1662
|
+
return rig
|
|
1663
|
+
xi = self.normal_tangent_vector()
|
|
1664
|
+
v = rig[0]
|
|
1665
|
+
g = self._domain.ambient_metric().along(im)
|
|
1666
|
+
N = (1/g(xi, v))*(v-(g(v,v)/(2*g(xi, v)))*xi)
|
|
1667
|
+
N.set_name(name='N')
|
|
1668
|
+
return N
|