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:
SectionModule
for local sections over a non-trivial part of a topological vector bundleSectionFreeModule
for local sections over a trivial part of a topological vector bundle
AUTHORS:
Michael Jung (2019): initial version
- class sage.manifolds.section_module.SectionFreeModule(vbundle, domain)[source]¶
Bases:
FiniteRankFreeModule
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 valuesdomain
– (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 basislatex_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; ifNone
,symbol
is used in place oflatex_symbol
indices
– (default:None
; used only ifsymbol
is a single string) tuple of strings representing the indices labelling the elements of the basis; ifNone
, the indices will be generated as integers within the range declared onself
latex_indices
– (default:None
) tuple of strings representing the indices for the LaTeX symbols of the elements of the basis; ifNone
,indices
is used insteadsymbol_dual
– (default:None
) same assymbol
but for the dual basis; ifNone
,symbol
must be a string and is used for the common base of the symbols of the elements of the dual basislatex_symbol_dual
– (default:None
) same aslatex_symbol
but for the dual basis
OUTPUT:
a
LocalFrame
representing a basis onself
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:
instance of
FreeModuleBasis
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]¶
Set 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:
basis
– instance ofFreeModuleBasis
representing a basis onself
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]¶
Bases:
UniqueRepresentation
,Parent
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 valuesdomain
– (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\).
- 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