passagemath-symbolics 10.8.1a1__cp314-cp314t-musllinux_1_2_aarch64.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.
Files changed (181) hide show
  1. passagemath_symbolics/__init__.py +3 -0
  2. passagemath_symbolics-10.8.1a1.dist-info/METADATA +186 -0
  3. passagemath_symbolics-10.8.1a1.dist-info/RECORD +181 -0
  4. passagemath_symbolics-10.8.1a1.dist-info/WHEEL +5 -0
  5. passagemath_symbolics-10.8.1a1.dist-info/top_level.txt +3 -0
  6. sage/all__sagemath_symbolics.py +17 -0
  7. sage/calculus/all.py +14 -0
  8. sage/calculus/calculus.py +2838 -0
  9. sage/calculus/desolvers.py +1864 -0
  10. sage/calculus/predefined.py +51 -0
  11. sage/calculus/tests.py +225 -0
  12. sage/calculus/var.cpython-314t-aarch64-linux-musl.so +0 -0
  13. sage/calculus/var.pyx +401 -0
  14. sage/dynamics/all__sagemath_symbolics.py +6 -0
  15. sage/dynamics/complex_dynamics/all.py +5 -0
  16. sage/dynamics/complex_dynamics/mandel_julia.py +765 -0
  17. sage/dynamics/complex_dynamics/mandel_julia_helper.cpython-314t-aarch64-linux-musl.so +0 -0
  18. sage/dynamics/complex_dynamics/mandel_julia_helper.pyx +1034 -0
  19. sage/ext/all__sagemath_symbolics.py +1 -0
  20. sage/ext_data/kenzo/CP2.txt +45 -0
  21. sage/ext_data/kenzo/CP3.txt +349 -0
  22. sage/ext_data/kenzo/CP4.txt +4774 -0
  23. sage/ext_data/kenzo/README.txt +49 -0
  24. sage/ext_data/kenzo/S4.txt +20 -0
  25. sage/ext_data/magma/latex/latex.m +1021 -0
  26. sage/ext_data/magma/latex/latex.spec +1 -0
  27. sage/ext_data/magma/sage/basic.m +356 -0
  28. sage/ext_data/magma/sage/sage.spec +1 -0
  29. sage/ext_data/magma/spec +9 -0
  30. sage/geometry/all__sagemath_symbolics.py +8 -0
  31. sage/geometry/hyperbolic_space/all.py +5 -0
  32. sage/geometry/hyperbolic_space/hyperbolic_coercion.py +755 -0
  33. sage/geometry/hyperbolic_space/hyperbolic_constants.py +5 -0
  34. sage/geometry/hyperbolic_space/hyperbolic_geodesic.py +2419 -0
  35. sage/geometry/hyperbolic_space/hyperbolic_interface.py +206 -0
  36. sage/geometry/hyperbolic_space/hyperbolic_isometry.py +1083 -0
  37. sage/geometry/hyperbolic_space/hyperbolic_model.py +1502 -0
  38. sage/geometry/hyperbolic_space/hyperbolic_point.py +621 -0
  39. sage/geometry/riemannian_manifolds/all.py +7 -0
  40. sage/geometry/riemannian_manifolds/parametrized_surface3d.py +1632 -0
  41. sage/geometry/riemannian_manifolds/surface3d_generators.py +461 -0
  42. sage/interfaces/all__sagemath_symbolics.py +1 -0
  43. sage/interfaces/magma.py +2991 -0
  44. sage/interfaces/magma_free.py +90 -0
  45. sage/interfaces/maple.py +1402 -0
  46. sage/interfaces/mathematica.py +1345 -0
  47. sage/interfaces/mathics.py +1312 -0
  48. sage/interfaces/sympy.py +1398 -0
  49. sage/interfaces/sympy_wrapper.py +197 -0
  50. sage/interfaces/tides.py +938 -0
  51. sage/libs/all__sagemath_symbolics.py +6 -0
  52. sage/manifolds/all.py +7 -0
  53. sage/manifolds/calculus_method.py +553 -0
  54. sage/manifolds/catalog.py +437 -0
  55. sage/manifolds/chart.py +4010 -0
  56. sage/manifolds/chart_func.py +3416 -0
  57. sage/manifolds/continuous_map.py +2183 -0
  58. sage/manifolds/continuous_map_image.py +155 -0
  59. sage/manifolds/differentiable/affine_connection.py +2475 -0
  60. sage/manifolds/differentiable/all.py +1 -0
  61. sage/manifolds/differentiable/automorphismfield.py +1383 -0
  62. sage/manifolds/differentiable/automorphismfield_group.py +604 -0
  63. sage/manifolds/differentiable/bundle_connection.py +1445 -0
  64. sage/manifolds/differentiable/characteristic_cohomology_class.py +1840 -0
  65. sage/manifolds/differentiable/chart.py +1241 -0
  66. sage/manifolds/differentiable/curve.py +1028 -0
  67. sage/manifolds/differentiable/de_rham_cohomology.py +541 -0
  68. sage/manifolds/differentiable/degenerate.py +559 -0
  69. sage/manifolds/differentiable/degenerate_submanifold.py +1668 -0
  70. sage/manifolds/differentiable/diff_form.py +1660 -0
  71. sage/manifolds/differentiable/diff_form_module.py +1062 -0
  72. sage/manifolds/differentiable/diff_map.py +1315 -0
  73. sage/manifolds/differentiable/differentiable_submanifold.py +291 -0
  74. sage/manifolds/differentiable/examples/all.py +1 -0
  75. sage/manifolds/differentiable/examples/euclidean.py +2517 -0
  76. sage/manifolds/differentiable/examples/real_line.py +897 -0
  77. sage/manifolds/differentiable/examples/sphere.py +1186 -0
  78. sage/manifolds/differentiable/examples/symplectic_space.py +187 -0
  79. sage/manifolds/differentiable/examples/symplectic_space_test.py +40 -0
  80. sage/manifolds/differentiable/integrated_curve.py +4035 -0
  81. sage/manifolds/differentiable/levi_civita_connection.py +841 -0
  82. sage/manifolds/differentiable/manifold.py +4254 -0
  83. sage/manifolds/differentiable/manifold_homset.py +1826 -0
  84. sage/manifolds/differentiable/metric.py +3032 -0
  85. sage/manifolds/differentiable/mixed_form.py +1507 -0
  86. sage/manifolds/differentiable/mixed_form_algebra.py +559 -0
  87. sage/manifolds/differentiable/multivector_module.py +800 -0
  88. sage/manifolds/differentiable/multivectorfield.py +1522 -0
  89. sage/manifolds/differentiable/poisson_tensor.py +268 -0
  90. sage/manifolds/differentiable/pseudo_riemannian.py +755 -0
  91. sage/manifolds/differentiable/pseudo_riemannian_submanifold.py +1839 -0
  92. sage/manifolds/differentiable/scalarfield.py +1343 -0
  93. sage/manifolds/differentiable/scalarfield_algebra.py +472 -0
  94. sage/manifolds/differentiable/symplectic_form.py +912 -0
  95. sage/manifolds/differentiable/symplectic_form_test.py +220 -0
  96. sage/manifolds/differentiable/tangent_space.py +412 -0
  97. sage/manifolds/differentiable/tangent_vector.py +616 -0
  98. sage/manifolds/differentiable/tensorfield.py +4665 -0
  99. sage/manifolds/differentiable/tensorfield_module.py +963 -0
  100. sage/manifolds/differentiable/tensorfield_paral.py +2450 -0
  101. sage/manifolds/differentiable/tensorfield_paral_test.py +16 -0
  102. sage/manifolds/differentiable/vector_bundle.py +1725 -0
  103. sage/manifolds/differentiable/vectorfield.py +1717 -0
  104. sage/manifolds/differentiable/vectorfield_module.py +2445 -0
  105. sage/manifolds/differentiable/vectorframe.py +1832 -0
  106. sage/manifolds/family.py +270 -0
  107. sage/manifolds/local_frame.py +1490 -0
  108. sage/manifolds/manifold.py +3090 -0
  109. sage/manifolds/manifold_homset.py +452 -0
  110. sage/manifolds/operators.py +359 -0
  111. sage/manifolds/point.py +994 -0
  112. sage/manifolds/scalarfield.py +3718 -0
  113. sage/manifolds/scalarfield_algebra.py +629 -0
  114. sage/manifolds/section.py +3111 -0
  115. sage/manifolds/section_module.py +831 -0
  116. sage/manifolds/structure.py +229 -0
  117. sage/manifolds/subset.py +2721 -0
  118. sage/manifolds/subsets/all.py +1 -0
  119. sage/manifolds/subsets/closure.py +131 -0
  120. sage/manifolds/subsets/pullback.py +883 -0
  121. sage/manifolds/topological_submanifold.py +891 -0
  122. sage/manifolds/trivialization.py +733 -0
  123. sage/manifolds/utilities.py +1348 -0
  124. sage/manifolds/vector_bundle.py +1347 -0
  125. sage/manifolds/vector_bundle_fiber.py +332 -0
  126. sage/manifolds/vector_bundle_fiber_element.py +111 -0
  127. sage/matrix/all__sagemath_symbolics.py +1 -0
  128. sage/matrix/matrix_symbolic_dense.cpython-314t-aarch64-linux-musl.so +0 -0
  129. sage/matrix/matrix_symbolic_dense.pxd +6 -0
  130. sage/matrix/matrix_symbolic_dense.pyx +1030 -0
  131. sage/matrix/matrix_symbolic_sparse.cpython-314t-aarch64-linux-musl.so +0 -0
  132. sage/matrix/matrix_symbolic_sparse.pxd +6 -0
  133. sage/matrix/matrix_symbolic_sparse.pyx +1038 -0
  134. sage/modules/all__sagemath_symbolics.py +1 -0
  135. sage/modules/vector_callable_symbolic_dense.py +105 -0
  136. sage/modules/vector_symbolic_dense.py +116 -0
  137. sage/modules/vector_symbolic_sparse.py +118 -0
  138. sage/rings/all__sagemath_symbolics.py +4 -0
  139. sage/rings/asymptotic/all.py +6 -0
  140. sage/rings/asymptotic/asymptotic_expansion_generators.py +1485 -0
  141. sage/rings/asymptotic/asymptotic_ring.py +4858 -0
  142. sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py +4106 -0
  143. sage/rings/asymptotic/growth_group.py +5373 -0
  144. sage/rings/asymptotic/growth_group_cartesian.py +1400 -0
  145. sage/rings/asymptotic/term_monoid.py +5205 -0
  146. sage/rings/function_field/all__sagemath_symbolics.py +2 -0
  147. sage/rings/polynomial/all__sagemath_symbolics.py +1 -0
  148. sage/symbolic/all.py +15 -0
  149. sage/symbolic/assumptions.py +987 -0
  150. sage/symbolic/benchmark.py +93 -0
  151. sage/symbolic/callable.py +456 -0
  152. sage/symbolic/callable.pyi +66 -0
  153. sage/symbolic/comparison_impl.pyi +38 -0
  154. sage/symbolic/complexity_measures.py +35 -0
  155. sage/symbolic/constants.py +1286 -0
  156. sage/symbolic/constants_c_impl.pyi +10 -0
  157. sage/symbolic/expression_conversion_algebraic.py +310 -0
  158. sage/symbolic/expression_conversion_sympy.py +317 -0
  159. sage/symbolic/expression_conversions.py +1727 -0
  160. sage/symbolic/function_factory.py +355 -0
  161. sage/symbolic/function_factory.pyi +41 -0
  162. sage/symbolic/getitem_impl.pyi +24 -0
  163. sage/symbolic/integration/all.py +1 -0
  164. sage/symbolic/integration/external.py +271 -0
  165. sage/symbolic/integration/integral.py +1075 -0
  166. sage/symbolic/maxima_wrapper.py +162 -0
  167. sage/symbolic/operators.py +267 -0
  168. sage/symbolic/operators.pyi +61 -0
  169. sage/symbolic/pynac_constant_impl.pyi +13 -0
  170. sage/symbolic/pynac_function_impl.pyi +8 -0
  171. sage/symbolic/random_tests.py +461 -0
  172. sage/symbolic/relation.py +2062 -0
  173. sage/symbolic/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  174. sage/symbolic/ring.pxd +5 -0
  175. sage/symbolic/ring.pyi +110 -0
  176. sage/symbolic/ring.pyx +1393 -0
  177. sage/symbolic/series_impl.pyi +10 -0
  178. sage/symbolic/subring.py +1025 -0
  179. sage/symbolic/symengine.py +19 -0
  180. sage/symbolic/tests.py +40 -0
  181. 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