Skip to content
This repository was archived by the owner on Feb 1, 2023. It is now read-only.

Commit 4ae4ca3

Browse files
author
Michael Jung
committed
default frame added to vector bundles + doctree modified
1 parent 279f428 commit 4ae4ca3

File tree

5 files changed

+147
-4
lines changed

5 files changed

+147
-4
lines changed

src/doc/en/reference/manifolds/diff_manifold.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ Differentiable Manifolds
3030

3131
sage/manifolds/differentiable/differentiable_submanifold
3232

33-
sage/manifolds/differentiable/vector_bundle
33+
diff_vector_bundle
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Differentiable Vector Bundles
2+
=============================
3+
4+
.. toctree::
5+
:maxdepth: 2
6+
7+
sage/manifolds/differentiable/vector_bundle

src/sage/manifolds/differentiable/vector_bundle.py

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,7 @@ def _init_derived(self):
351351
sage: TM._init_derived()
352352
353353
"""
354-
###
355-
# Nothing to do here:
356-
pass
354+
self._def_frame = None
357355

358356
def _repr_(self):
359357
r"""
@@ -1353,3 +1351,87 @@ def destination_map(self):
13531351
13541352
"""
13551353
return self._dest_map
1354+
1355+
def default_frame(self):
1356+
r"""
1357+
Return the default vector frame defined on ``self``.
1358+
1359+
By *vector frame*, it is meant a field on the manifold that provides,
1360+
at each point `p`, a vector basis of the pulled back tangent space at
1361+
`p`.
1362+
1363+
If the destination map is the identity map, the default frame is the
1364+
the first one defined on the manifold, usually the coordinate frame,
1365+
unless it is changed via :meth:`set_default_frame`.
1366+
1367+
If the destination map is non-trivial, the default frame usually must be
1368+
set via :meth:`set_default_frame`.
1369+
1370+
OUTPUT:
1371+
1372+
- a :class:`~sage.manifolds.differentiable.vectorframe.VectorFrame`
1373+
representing the default vector frame
1374+
1375+
EXAMPLES:
1376+
1377+
The default vector frame is often the coordinate frame associated
1378+
with the first chart defined on the manifold::
1379+
1380+
sage: M = Manifold(2, 'M')
1381+
sage: c_xy.<x,y> = M.chart()
1382+
sage: TM = M.tangent_bundle()
1383+
sage: TM.default_frame()
1384+
Coordinate frame (M, (d/dx,d/dy))
1385+
1386+
"""
1387+
def_bframe = self._base_space.default_frame()
1388+
if self._def_frame is None and def_bframe is not None:
1389+
if def_bframe._dest_map == self._dest_map:
1390+
self._def_frame = def_bframe
1391+
return self._def_frame
1392+
1393+
def set_default_frame(self, frame):
1394+
r"""
1395+
Changing the default vector frame on ``self``.
1396+
1397+
.. NOTE::
1398+
1399+
If the destination map is the identity, the default frame of the
1400+
base manifold gets changed here as well.
1401+
1402+
INPUT:
1403+
1404+
- ``frame`` --
1405+
:class:`~sage.manifolds.differentiable.vectorframe.VectorFrame`
1406+
a vector frame defined on the base manifold
1407+
1408+
EXAMPLES:
1409+
1410+
Changing the default frame on the tangent bundle of a 2-dimensional
1411+
manifold::
1412+
1413+
sage: M = Manifold(2, 'M')
1414+
sage: c_xy.<x,y> = M.chart()
1415+
sage: TM = M.tangent_bundle()
1416+
sage: e = TM.vector_frame('e')
1417+
sage: TM.default_frame()
1418+
Coordinate frame (M, (d/dx,d/dy))
1419+
sage: TM.set_default_frame(e)
1420+
sage: TM.default_frame()
1421+
Vector frame (M, (e_0,e_1))
1422+
sage: M.default_frame()
1423+
Vector frame (M, (e_0,e_1))
1424+
1425+
"""
1426+
from sage.manifolds.differentiable.vectorframe import VectorFrame
1427+
if not isinstance(frame, VectorFrame):
1428+
raise TypeError("{} is not a vector frame".format(frame))
1429+
if (not frame._domain.is_subset(self._base_space) or
1430+
frame._dest_map != self._dest_map):
1431+
raise ValueError("the frame must be defined on " +
1432+
"the {}".format(self))
1433+
if self._dest_map.is_identity():
1434+
self._base_space.set_default_frame(frame)
1435+
else:
1436+
frame._fmodule.set_default_basis(frame)
1437+
self._def_frame = frame

src/sage/manifolds/local_frame.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,8 @@ def __init__(self, section_module, symbol, latex_symbol=None, indices=None,
634634
indices=indices, latex_indices=latex_indices,
635635
symbol_dual=symbol_dual,
636636
latex_symbol_dual=latex_symbol_dual)
637+
if self._vbundle._def_frame is None:
638+
self._vbundle._def_frame = self
637639
# The frame is added to the domain's modules of frames, as well as to
638640
# all the superdomain's modules of frames; moreover the first defined
639641
# frame is considered as the default one

src/sage/manifolds/vector_bundle.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ def _init_derived(self):
273273
self._coframes = [] # list of local coframes for self
274274
self._trivial_parts = set() # subsets of base space on which self is
275275
# trivial
276+
self._def_frame = None
276277

277278
def base_space(self):
278279
r"""
@@ -1032,3 +1033,54 @@ def coframes(self):
10321033
10331034
"""
10341035
return list(self._coframes)
1036+
1037+
def default_frame(self):
1038+
r"""
1039+
Return the default frame of on ``self``.
1040+
1041+
OUTPUT:
1042+
1043+
- a local frame as an instance of
1044+
:class:`~sage.manifolds.local_frame.LocalFrame`
1045+
1046+
EXAMPLES::
1047+
1048+
sage: M = Manifold(3, 'M', structure='top')
1049+
sage: E = M.vector_bundle(2, 'E')
1050+
sage: e = E.local_frame('e')
1051+
sage: E.default_frame()
1052+
Local frame (E|_M, (e_0,e_1))
1053+
1054+
"""
1055+
return self._def_frame
1056+
1057+
def set_default_frame(self, frame):
1058+
r"""
1059+
Set the default frame of ``self``.
1060+
1061+
INPUT:
1062+
1063+
- ``frame`` -- a local frame defined on ``self`` as an instance of
1064+
:class:`~sage.manifolds.local_frame.LocalFrame`
1065+
1066+
EXAMPLES::
1067+
1068+
sage: M = Manifold(3, 'M', structure='top')
1069+
sage: E = M.vector_bundle(2, 'E')
1070+
sage: e = E.local_frame('e')
1071+
sage: E.default_frame()
1072+
Local frame (E|_M, (e_0,e_1))
1073+
sage: f = E.local_frame('f')
1074+
sage: E.set_default_frame(f)
1075+
sage: E.default_frame()
1076+
Local frame (E|_M, (f_0,f_1))
1077+
1078+
"""
1079+
from sage.manifolds.local_frame import LocalFrame
1080+
if not isinstance(frame, LocalFrame):
1081+
raise TypeError("{} is not a local frame".format(frame))
1082+
if not frame._domain.is_subset(self._base_space):
1083+
raise ValueError("the frame must be defined on " +
1084+
"the {}".format(self))
1085+
frame._fmodule.set_default_basis(frame)
1086+
self._def_frame = frame

0 commit comments

Comments
 (0)