Section Modules#

The set of sections over a vector bundle $$E \to M$$ of class $$C^k$$ on a domain $$U \in M$$ is a module over the algebra $$C^k(U)$$ of scalar fields on $$U$$.

Depending on the domain, there are two classes of section modules:

AUTHORS:

• Michael Jung (2019): initial version

class sage.manifolds.section_module.SectionFreeModule(vbundle, domain)[source]#

Free module of sections over a vector bundle $$E \to M$$ of class $$C^k$$ on a domain $$U \in M$$ which admits a trivialization or local frame.

The section module $$C^k(U;E)$$ is the set of all $$C^k$$-maps, called sections, of type

$s: U \longrightarrow E$

such that

$\forall p \in U,\ s(p) \in E_p,$

where $$E_p$$ is the vector bundle fiber of $$E$$ at the point $$p$$.

Since the domain $$U$$ admits a local frame, the corresponding vector bundle $$E|_U \to U$$ is trivial and $$C^k(U;E)$$ is a free module over $$C^k(U)$$.

Note

If $$E|_U$$ is not trivial, the class SectionModule should be used instead, for $$C^k(U;E)$$ is no longer a free module.

INPUT:

• vbundle – vector bundle $$E$$ on which the sections takes its values

• domain – (default: None) subdomain $$U$$ of the base space on which the sections are defined

EXAMPLES:

Module of sections on the 2-rank trivial vector bundle over the Euclidean plane $$\RR^2$$:

sage: M = Manifold(2, 'R^2', structure='top')
sage: c_cart.<x,y> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: e = E.local_frame('e') # Trivializes the vector bundle
sage: C0 = E.section_module(); C0
Free module C^0(R^2;E) of sections on the 2-dimensional topological
manifold R^2 with values in the real vector bundle E of rank 2
sage: C0.category()
Category of finite dimensional modules over Algebra of scalar fields on
the 2-dimensional topological manifold R^2
sage: C0.base_ring() is M.scalar_field_algebra()
True

>>> from sage.all import *
>>> M = Manifold(Integer(2), 'R^2', structure='top')
>>> c_cart = M.chart(names=('x', 'y',)); (x, y,) = c_cart._first_ngens(2)
>>> E = M.vector_bundle(Integer(2), 'E')
>>> e = E.local_frame('e') # Trivializes the vector bundle
>>> C0 = E.section_module(); C0
Free module C^0(R^2;E) of sections on the 2-dimensional topological
manifold R^2 with values in the real vector bundle E of rank 2
>>> C0.category()
Category of finite dimensional modules over Algebra of scalar fields on
the 2-dimensional topological manifold R^2
>>> C0.base_ring() is M.scalar_field_algebra()
True


The vector bundle admits a global frame and is therefore trivial:

sage: E.is_manifestly_trivial()
True

>>> from sage.all import *
>>> E.is_manifestly_trivial()
True


Since the vector bundle is trivial, its section module of global sections is a free module:

sage: isinstance(C0, FiniteRankFreeModule)
True

>>> from sage.all import *
>>> isinstance(C0, FiniteRankFreeModule)
True


Some elements are:

sage: C0.an_element().display()
2 e_0 + 2 e_1
sage: C0.zero().display()
zero = 0
sage: s = C0([-y,x]); s
Section on the 2-dimensional topological manifold R^2 with values in the
real vector bundle E of rank 2
sage: s.display()
-y e_0 + x e_1

>>> from sage.all import *
>>> C0.an_element().display()
2 e_0 + 2 e_1
>>> C0.zero().display()
zero = 0
>>> s = C0([-y,x]); s
Section on the 2-dimensional topological manifold R^2 with values in the
real vector bundle E of rank 2
>>> s.display()
-y e_0 + x e_1


The rank of the free module equals the rank of the vector bundle:

sage: C0.rank()
2

>>> from sage.all import *
>>> C0.rank()
2


The basis is given by the definition above:

sage: C0.bases()
[Local frame (E|_R^2, (e_0,e_1))]

>>> from sage.all import *
>>> C0.bases()
[Local frame (E|_R^2, (e_0,e_1))]


The test suite is passed as well:

sage: TestSuite(C0).run()

>>> from sage.all import *
>>> TestSuite(C0).run()

Element[source]#

alias of TrivialSection

base_space()[source]#

Return the base space of the sections in this module.

EXAMPLES:

sage: M = Manifold(3, 'M', structure='top')
sage: U = M.open_subset('U')
sage: E = U.vector_bundle(2, 'E')
sage: C0 = E.section_module(force_free=True); C0
Free module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real
vector bundle E of rank 2
sage: C0.base_space()
Open subset U of the 3-dimensional topological manifold M

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> U = M.open_subset('U')
>>> E = U.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module(force_free=True); C0
Free module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real
vector bundle E of rank 2
>>> C0.base_space()
Open subset U of the 3-dimensional topological manifold M

basis(symbol=None, latex_symbol=None, from_frame=None, indices=None, latex_indices=None, symbol_dual=None, latex_symbol_dual=None)[source]#

Define a basis of self.

A basis of the section module is actually a local frame on the differentiable manifold $$U$$ over which the section module is defined.

If the basis specified by the given symbol already exists, it is simply returned. If no argument is provided the module’s default basis is returned.

INPUT:

• symbol – (default: None) either a string, to be used as a common base for the symbols of the elements of the basis, or a tuple of strings, representing the individual symbols of the elements of the basis

• latex_symbol – (default: None) either a string, to be used as a common base for the LaTeX symbols of the elements of the basis, or a tuple of strings, representing the individual LaTeX symbols of the elements of the basis; if None, symbol is used in place of latex_symbol

• indices – (default: None; used only if symbol is a single string) tuple of strings representing the indices labelling the elements of the basis; if None, the indices will be generated as integers within the range declared on self

• latex_indices – (default: None) tuple of strings representing the indices for the LaTeX symbols of the elements of the basis; if None, indices is used instead

• symbol_dual – (default: None) same as symbol but for the dual basis; if None, symbol must be a string and is used for the common base of the symbols of the elements of the dual basis

• latex_symbol_dual – (default: None) same as latex_symbol but for the dual basis

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M', structure='top')
sage: E = M.vector_bundle(2, 'E')
sage: C0 = E.section_module(force_free=True)
sage: e = C0.basis('e'); e
Local frame (E|_M, (e_0,e_1))

>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M', structure='top')
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module(force_free=True)
>>> e = C0.basis('e'); e
Local frame (E|_M, (e_0,e_1))


See LocalFrame for more examples and documentation.

default_frame()[source]#

Return the default basis of the free module self.

The default basis is simply a basis whose name can be skipped in methods requiring a basis as an argument. By default, it is the first basis introduced on the module. It can be changed by the method set_default_basis().

OUTPUT:

EXAMPLES:

At the module construction, no default basis is assumed:

sage: M = FiniteRankFreeModule(ZZ, 2, name='M', start_index=1)
sage: M.default_basis()
No default basis has been defined on the
Rank-2 free module M over the Integer Ring

>>> from sage.all import *
>>> M = FiniteRankFreeModule(ZZ, Integer(2), name='M', start_index=Integer(1))
>>> M.default_basis()
No default basis has been defined on the
Rank-2 free module M over the Integer Ring


The first defined basis becomes the default one:

sage: e = M.basis('e') ; e
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring
sage: M.default_basis()
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring
sage: f =  M.basis('f') ; f
Basis (f_1,f_2) on the Rank-2 free module M over the Integer Ring
sage: M.default_basis()
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring

>>> from sage.all import *
>>> e = M.basis('e') ; e
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring
>>> M.default_basis()
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring
>>> f =  M.basis('f') ; f
Basis (f_1,f_2) on the Rank-2 free module M over the Integer Ring
>>> M.default_basis()
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring

domain()[source]#

Return the domain of the section module.

EXAMPLES:

sage: M = Manifold(3, 'M', structure='top')
sage: U = M.open_subset('U')
sage: E = M.vector_bundle(2, 'E')
sage: C0_U = E.section_module(domain=U, force_free=True); C0_U
Free module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real vector
bundle E of rank 2
sage: C0_U.domain()
Open subset U of the 3-dimensional topological manifold M

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> U = M.open_subset('U')
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0_U = E.section_module(domain=U, force_free=True); C0_U
Free module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real vector
bundle E of rank 2
>>> C0_U.domain()
Open subset U of the 3-dimensional topological manifold M

set_default_frame(basis)[source]#

Sets the default basis of self.

The default basis is simply a basis whose name can be skipped in methods requiring a basis as an argument. By default, it is the first basis introduced on the module.

INPUT:

EXAMPLES:

Changing the default basis on a rank-3 free module:

sage: M = FiniteRankFreeModule(ZZ, 3, name='M', start_index=1)
sage: e = M.basis('e') ; e
Basis (e_1,e_2,e_3) on the Rank-3 free module M over the Integer Ring
sage: f =  M.basis('f') ; f
Basis (f_1,f_2,f_3) on the Rank-3 free module M over the Integer Ring
sage: M.default_basis()
Basis (e_1,e_2,e_3) on the Rank-3 free module M over the Integer Ring
sage: M.set_default_basis(f)
sage: M.default_basis()
Basis (f_1,f_2,f_3) on the Rank-3 free module M over the Integer Ring

>>> from sage.all import *
>>> M = FiniteRankFreeModule(ZZ, Integer(3), name='M', start_index=Integer(1))
>>> e = M.basis('e') ; e
Basis (e_1,e_2,e_3) on the Rank-3 free module M over the Integer Ring
>>> f =  M.basis('f') ; f
Basis (f_1,f_2,f_3) on the Rank-3 free module M over the Integer Ring
>>> M.default_basis()
Basis (e_1,e_2,e_3) on the Rank-3 free module M over the Integer Ring
>>> M.set_default_basis(f)
>>> M.default_basis()
Basis (f_1,f_2,f_3) on the Rank-3 free module M over the Integer Ring

vector_bundle()[source]#

Return the overlying vector bundle on which the section module is defined.

EXAMPLES:

sage: M = Manifold(3, 'M', structure='top')
sage: E = M.vector_bundle(2, 'E')
sage: C0 = E.section_module(force_free=True); C0
Free module C^0(M;E) of sections on the 3-dimensional topological
manifold M with values in the real vector bundle E of rank 2
sage: C0.vector_bundle()
Topological real vector bundle E -> M of rank 2 over the base space
3-dimensional topological manifold M
sage: E is C0.vector_bundle()
True

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module(force_free=True); C0
Free module C^0(M;E) of sections on the 3-dimensional topological
manifold M with values in the real vector bundle E of rank 2
>>> C0.vector_bundle()
Topological real vector bundle E -> M of rank 2 over the base space
3-dimensional topological manifold M
>>> E is C0.vector_bundle()
True

class sage.manifolds.section_module.SectionModule(vbundle, domain)[source]#

Module of sections over a vector bundle $$E \to M$$ of class $$C^k$$ on a domain $$U \in M$$.

The section module $$C^k(U;E)$$ is the set of all $$C^k$$-maps, called sections, of type

$s: U \longrightarrow E$

such that

$\forall p \in U,\ s(p) \in E_p,$

where $$E_p$$ is the vector bundle fiber of $$E$$ at the point $$p$$.

$$C^k(U;E)$$ is a module over $$C^k(U)$$, the algebra of $$C^k$$ scalar fields on $$U$$.

INPUT:

• vbundle – vector bundle $$E$$ on which the sections takes its values

• domain – (default: None) subdomain $$U$$ of the base space on which the sections are defined

EXAMPLES:

Module of sections on the Möbius bundle:

sage: M = Manifold(1, 'RP^1', structure='top', start_index=1)
sage: U = M.open_subset('U')  # the complement of one point
sage: c_u.<u> =  U.chart() # [1:u] in homogeneous coord.
sage: V = M.open_subset('V') # the complement of the point u=0
sage: M.declare_union(U,V)   # [v:1] in homogeneous coord.
sage: c_v.<v> = V.chart()
sage: u_to_v = c_u.transition_map(c_v, (1/u),
....:                             intersection_name='W',
....:                             restrictions1 = u!=0,
....:                             restrictions2 = v!=0)
sage: v_to_u = u_to_v.inverse()
sage: W = U.intersection(V)
sage: E = M.vector_bundle(1, 'E')
sage: phi_U = E.trivialization('phi_U', latex_name=r'\varphi_U',
....:                          domain=U)
sage: phi_V = E.trivialization('phi_V', latex_name=r'\varphi_V',
....:                          domain=V)
sage: transf = phi_U.transition_map(phi_V, [[u]])
sage: C0 = E.section_module(); C0
Module C^0(RP^1;E) of sections on the 1-dimensional topological manifold
RP^1 with values in the real vector bundle E of rank 1

>>> from sage.all import *
>>> M = Manifold(Integer(1), 'RP^1', structure='top', start_index=Integer(1))
>>> U = M.open_subset('U')  # the complement of one point
>>> c_u = U.chart(names=('u',)); (u,) = c_u._first_ngens(1)# [1:u] in homogeneous coord.
>>> V = M.open_subset('V') # the complement of the point u=0
>>> M.declare_union(U,V)   # [v:1] in homogeneous coord.
>>> c_v = V.chart(names=('v',)); (v,) = c_v._first_ngens(1)
>>> u_to_v = c_u.transition_map(c_v, (Integer(1)/u),
...                             intersection_name='W',
...                             restrictions1 = u!=Integer(0),
...                             restrictions2 = v!=Integer(0))
>>> v_to_u = u_to_v.inverse()
>>> W = U.intersection(V)
>>> E = M.vector_bundle(Integer(1), 'E')
>>> phi_U = E.trivialization('phi_U', latex_name=r'\varphi_U',
...                          domain=U)
>>> phi_V = E.trivialization('phi_V', latex_name=r'\varphi_V',
...                          domain=V)
>>> transf = phi_U.transition_map(phi_V, [[u]])
>>> C0 = E.section_module(); C0
Module C^0(RP^1;E) of sections on the 1-dimensional topological manifold
RP^1 with values in the real vector bundle E of rank 1


$$C^0(\RR P^1;E)$$ is a module over the algebra $$C^0(\RR P^1)$$:

sage: C0.category()
Category of modules over Algebra of scalar fields on the 1-dimensional
topological manifold RP^1
sage: C0.base_ring() is M.scalar_field_algebra()
True

>>> from sage.all import *
>>> C0.category()
Category of modules over Algebra of scalar fields on the 1-dimensional
topological manifold RP^1
>>> C0.base_ring() is M.scalar_field_algebra()
True


However, $$C^0(\RR P^1;E)$$ is not a free module:

sage: isinstance(C0, FiniteRankFreeModule)
False

>>> from sage.all import *
>>> isinstance(C0, FiniteRankFreeModule)
False


since the Möbius bundle is not trivial:

sage: E.is_manifestly_trivial()
False

>>> from sage.all import *
>>> E.is_manifestly_trivial()
False


The section module over $$U$$, on the other hand, is a free module since $$E|_U$$ admits a trivialization and therefore has a local frame:

sage: C0_U = E.section_module(domain=U)
sage: isinstance(C0_U, FiniteRankFreeModule)
True

>>> from sage.all import *
>>> C0_U = E.section_module(domain=U)
>>> isinstance(C0_U, FiniteRankFreeModule)
True


The zero element of the module:

sage: z = C0.zero() ; z
Section zero on the 1-dimensional topological manifold RP^1 with values
in the real vector bundle E of rank 1
sage: z.display(phi_U.frame())
zero = 0
sage: z.display(phi_V.frame())
zero = 0

>>> from sage.all import *
>>> z = C0.zero() ; z
Section zero on the 1-dimensional topological manifold RP^1 with values
in the real vector bundle E of rank 1
>>> z.display(phi_U.frame())
zero = 0
>>> z.display(phi_V.frame())
zero = 0


The module $$C^0(M;E)$$ coerces to any module of sections defined on a subdomain of $$M$$, for instance $$C^0(U;E)$$:

sage: C0_U.has_coerce_map_from(C0)
True
sage: C0_U.coerce_map_from(C0)
Coercion map:
From: Module C^0(RP^1;E) of sections on the 1-dimensional topological
manifold RP^1 with values in the real vector bundle E of rank 1
To:   Free module C^0(U;E) of sections on the Open subset U of the
1-dimensional topological manifold RP^1 with values in the real vector
bundle E of rank 1

>>> from sage.all import *
>>> C0_U.has_coerce_map_from(C0)
True
>>> C0_U.coerce_map_from(C0)
Coercion map:
From: Module C^0(RP^1;E) of sections on the 1-dimensional topological
manifold RP^1 with values in the real vector bundle E of rank 1
To:   Free module C^0(U;E) of sections on the Open subset U of the
1-dimensional topological manifold RP^1 with values in the real vector
bundle E of rank 1


The conversion map is actually the restriction of sections defined on $$M$$ to $$U$$.

Element[source]#

alias of Section

base_space()[source]#

Return the base space of the sections in this module.

EXAMPLES:

sage: M = Manifold(3, 'M', structure='top')
sage: U = M.open_subset('U')
sage: E = U.vector_bundle(2, 'E')
sage: C0 = E.section_module(); C0
Module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real vector
bundle E of rank 2
sage: C0.base_space()
Open subset U of the 3-dimensional topological manifold M

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> U = M.open_subset('U')
>>> E = U.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module(); C0
Module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real vector
bundle E of rank 2
>>> C0.base_space()
Open subset U of the 3-dimensional topological manifold M

default_frame()[source]#

Return the default frame defined on self.

EXAMPLES:

Get the default local frame of a non-trivial section module:

sage: M = Manifold(3, 'M', structure='top')
sage: U = M.open_subset('U')
sage: V = M.open_subset('V')
sage: M.declare_union(U, V)
sage: E = M.vector_bundle(2, 'E')
sage: C0 = E.section_module()
sage: e = E.local_frame('e', domain=U)
sage: C0.default_frame()
Local frame (E|_U, (e_0,e_1))

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> U = M.open_subset('U')
>>> V = M.open_subset('V')
>>> M.declare_union(U, V)
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module()
>>> e = E.local_frame('e', domain=U)
>>> C0.default_frame()
Local frame (E|_U, (e_0,e_1))


The local frame is indeed the same, and not a copy:

sage: e is C0.default_frame()
True

>>> from sage.all import *
>>> e is C0.default_frame()
True

domain()[source]#

Return the domain of the section module.

EXAMPLES:

sage: M = Manifold(3, 'M', structure='top')
sage: U = M.open_subset('U')
sage: E = M.vector_bundle(2, 'E')
sage: C0_U = E.section_module(domain=U); C0_U
Module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real vector
bundle E of rank 2
sage: C0_U.domain()
Open subset U of the 3-dimensional topological manifold M

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> U = M.open_subset('U')
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0_U = E.section_module(domain=U); C0_U
Module C^0(U;E) of sections on the Open subset U of the
3-dimensional topological manifold M with values in the real vector
bundle E of rank 2
>>> C0_U.domain()
Open subset U of the 3-dimensional topological manifold M

set_default_frame(basis)[source]#

Set the default local frame on self.

EXAMPLES:

Set a default frame of a non-trivial section module:

sage: M = Manifold(3, 'M', structure='top')
sage: U = M.open_subset('U')
sage: V = M.open_subset('V')
sage: M.declare_union(U, V)
sage: E = M.vector_bundle(2, 'E')
sage: C0 = E.section_module(); C0
Module C^0(M;E) of sections on the 3-dimensional topological
manifold M with values in the real vector bundle E of rank 2
sage: e = E.local_frame('e', domain=U)
sage: C0.set_default_frame(e)
sage: C0.default_frame()
Local frame (E|_U, (e_0,e_1))

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> U = M.open_subset('U')
>>> V = M.open_subset('V')
>>> M.declare_union(U, V)
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module(); C0
Module C^0(M;E) of sections on the 3-dimensional topological
manifold M with values in the real vector bundle E of rank 2
>>> e = E.local_frame('e', domain=U)
>>> C0.set_default_frame(e)
>>> C0.default_frame()
Local frame (E|_U, (e_0,e_1))


The local frame is indeed the same, and not a copy:

sage: e is C0.default_frame()
True

>>> from sage.all import *
>>> e is C0.default_frame()
True


Notice, that the local frame is defined on a subset and is not part of the section module $$C^k(M;E)$$:

sage: C0.default_frame().domain()
Open subset U of the 3-dimensional topological manifold M

>>> from sage.all import *
>>> C0.default_frame().domain()
Open subset U of the 3-dimensional topological manifold M

vector_bundle()[source]#

Return the overlying vector bundle on which the section module is defined.

EXAMPLES:

sage: M = Manifold(3, 'M', structure='top')
sage: E = M.vector_bundle(2, 'E')
sage: C0 = E.section_module(); C0
Module C^0(M;E) of sections on the 3-dimensional topological
manifold M with values in the real vector bundle E of rank 2
sage: C0.vector_bundle()
Topological real vector bundle E -> M of rank 2 over the base space
3-dimensional topological manifold M
sage: E is C0.vector_bundle()
True

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M', structure='top')
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module(); C0
Module C^0(M;E) of sections on the 3-dimensional topological
manifold M with values in the real vector bundle E of rank 2
>>> C0.vector_bundle()
Topological real vector bundle E -> M of rank 2 over the base space
3-dimensional topological manifold M
>>> E is C0.vector_bundle()
True

zero()[source]#

Return the zero of self.

EXAMPLES:

sage: M = Manifold(2, 'M', structure='top')
sage: X.<x,y> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: C0 = E.section_module()
sage: z = C0.zero(); z
Section zero on the 2-dimensional topological manifold M with values
in the real vector bundle E of rank 2
sage: z == 0
True

>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M', structure='top')
>>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
>>> E = M.vector_bundle(Integer(2), 'E')
>>> C0 = E.section_module()
>>> z = C0.zero(); z
Section zero on the 2-dimensional topological manifold M with values
in the real vector bundle E of rank 2
>>> z == Integer(0)
True