Vector Field Modules

The set of vector fields along a differentiable manifold \(U\) with values on a differentiable manifold \(M\) via a differentiable map \(\Phi: U \to M\) (possibly \(U = M\) and \(\Phi=\mathrm{Id}_M\)) is a module over the algebra \(C^k(U)\) of differentiable scalar fields on \(U\). If \(\Phi\) is the identity map, this module is considered a Lie algebroid under the Lie bracket \([\ ,\ ]\) (cf. Wikipedia article Lie_algebroid). It is a free module if and only if \(M\) is parallelizable. Accordingly, there are two classes for vector field modules:

  • VectorFieldModule for vector fields with values on a generic (in practice, not parallelizable) differentiable manifold \(M\).
  • VectorFieldFreeModule for vector fields with values on a parallelizable manifold \(M\).

AUTHORS:

  • Eric Gourgoulhon, Michal Bejger (2014-2015): initial version
  • Travis Scrimshaw (2016): structure of Lie algebroid (trac ticket #20771)

REFERENCES:

sage.manifolds.differentiable.vectorfield_module.VectorFieldFreeModule

Free module of vector fields along a differentiable manifold \(U\) with values on a parallelizable manifold \(M\), via a differentiable map \(U \rightarrow M\).

Given a differentiable map

\[\Phi:\ U \longrightarrow M\]

the vector field module \(\mathfrak{X}(U,\Phi)\) is the set of all vector fields of the type

\[v:\ U \longrightarrow TM\]

(where \(TM\) is the tangent bundle of \(M\)) such that

\[\forall p \in U,\ v(p) \in T_{\Phi(p)} M,\]

where \(T_{\Phi(p)} M\) is the tangent space to \(M\) at the point \(\Phi(p)\).

Since \(M\) is parallelizable, the set \(\mathfrak{X}(U,\Phi)\) is a free module over \(C^k(U)\), the ring (algebra) of differentiable scalar fields on \(U\) (see DiffScalarFieldAlgebra). In fact, it carries the structure of a finite-dimensional Lie algebroid (cf. Wikipedia article Lie_algebroid).

The standard case of vector fields on a differentiable manifold corresponds to \(U=M\) and \(\Phi = \mathrm{Id}_M\); we then denote \(\mathfrak{X}(M,\mathrm{Id}_M)\) by merely \(\mathfrak{X}(M)\). Other common cases are \(\Phi\) being an immersion and \(\Phi\) being a curve in \(M\) (\(U\) is then an open interval of \(\RR\)).

Note

If \(M\) is not parallelizable, the class VectorFieldModule should be used instead, for \(\mathfrak{X}(U,\Phi)\) is no longer a free module.

INPUT:

  • domain – differentiable manifold \(U\) along which the vector fields are defined
  • dest_map – (default: None) destination map \(\Phi:\ U \rightarrow M\) (type: DiffMap); if None, it is assumed that \(U=M\) and \(\Phi\) is the identity map of \(M\) (case of vector fields on \(M\))

EXAMPLES:

Module of vector fields on \(\RR^2\):

sage: M = Manifold(2, 'R^2')
sage: cart.<x,y> = M.chart()  # Cartesian coordinates on R^2
sage: XM = M.vector_field_module() ; XM
Free module X(R^2) of vector fields on the 2-dimensional differentiable
 manifold R^2
sage: XM.category()
Category of finite dimensional modules
 over Algebra of differentiable scalar fields
 on the 2-dimensional differentiable manifold R^2
sage: XM.base_ring() is M.scalar_field_algebra()
True

Since \(\RR^2\) is obviously parallelizable, XM is a free module:

sage: isinstance(XM, FiniteRankFreeModule)
True

Some elements:

sage: XM.an_element().display()
2 d/dx + 2 d/dy
sage: XM.zero().display()
zero = 0
sage: v = XM([-y,x]) ; v
Vector field on the 2-dimensional differentiable manifold R^2
sage: v.display()
-y d/dx + x d/dy

An example of module of vector fields with a destination map \(\Phi\) different from the identity map, namely a mapping \(\Phi: I \rightarrow \RR^2\), where \(I\) is an open interval of \(\RR\):

sage: I = Manifold(1, 'I')
sage: canon.<t> = I.chart('t:(0,2*pi)')
sage: Phi = I.diff_map(M, coord_functions=[cos(t), sin(t)], name='Phi',
....:                      latex_name=r'\Phi') ; Phi
Differentiable map Phi from the 1-dimensional differentiable manifold
 I to the 2-dimensional differentiable manifold R^2
sage: Phi.display()
Phi: I --> R^2
   t |--> (x, y) = (cos(t), sin(t))
sage: XIM = I.vector_field_module(dest_map=Phi) ; XIM
Free module X(I,Phi) of vector fields along the 1-dimensional
 differentiable manifold I mapped into the 2-dimensional differentiable
 manifold R^2
sage: XIM.category()
Category of finite dimensional modules
 over Algebra of differentiable scalar fields
 on the 1-dimensional differentiable manifold I

The rank of the free module \(\mathfrak{X}(I,\Phi)\) is the dimension of the manifold \(\RR^2\), namely two:

sage: XIM.rank()
2

A basis of it is induced by the coordinate vector frame of \(\RR^2\):

sage: XIM.bases()
[Vector frame (I, (d/dx,d/dy)) with values on the 2-dimensional
 differentiable manifold R^2]

Some elements of this module:

sage: XIM.an_element().display()
2 d/dx + 2 d/dy
sage: v = XIM([t, t^2]) ; v
Vector field along the 1-dimensional differentiable manifold I with
 values on the 2-dimensional differentiable manifold R^2
sage: v.display()
t d/dx + t^2 d/dy

The test suite is passed:

sage: TestSuite(XIM).run()

Let us introduce an open subset of \(J\subset I\) and the vector field module corresponding to the restriction of \(\Phi\) to it:

sage: J = I.open_subset('J', coord_def= {canon: t<pi})
sage: XJM = J.vector_field_module(dest_map=Phi.restrict(J)); XJM
Free module X(J,Phi) of vector fields along the Open subset J of the
 1-dimensional differentiable manifold I mapped into the 2-dimensional
 differentiable manifold R^2

We have then:

sage: XJM.default_basis()
Vector frame (J, (d/dx,d/dy)) with values on the 2-dimensional
 differentiable manifold R^2
sage: XJM.default_basis() is XIM.default_basis().restrict(J)
True
sage: v.restrict(J)
Vector field along the Open subset J of the 1-dimensional
 differentiable manifold I with values on the 2-dimensional
 differentiable manifold R^2
sage: v.restrict(J).display()
t d/dx + t^2 d/dy

Let us now consider the module of vector fields on the circle \(S^1\); we start by constructing the \(S^1\) manifold:

sage: M = Manifold(1, 'S^1')
sage: U = M.open_subset('U')  # the complement of one point
sage: c_t.<t> =  U.chart('t:(0,2*pi)') # the standard angle coordinate
sage: V = M.open_subset('V') # the complement of the point t=pi
sage: M.declare_union(U,V)   # S^1 is the union of U and V
sage: c_u.<u> = V.chart('u:(0,2*pi)') # the angle t-pi
sage: t_to_u = c_t.transition_map(c_u, (t-pi,), intersection_name='W',
....:                     restrictions1 = t!=pi, restrictions2 = u!=pi)
sage: u_to_t = t_to_u.inverse()
sage: W = U.intersection(V)

\(S^1\) cannot be covered by a single chart, so it cannot be covered by a coordinate frame. It is however parallelizable and we introduce a global vector frame as follows. We notice that on their common subdomain, \(W\), the coordinate vectors \(\partial/\partial t\) and \(\partial/\partial u\) coincide, as we can check explicitly:

sage: c_t.frame()[0].display(c_u.frame().restrict(W))
d/dt = d/du

Therefore, we can extend \(\partial/\partial t\) to all \(V\) and hence to all \(S^1\), to form a vector field on \(S^1\) whose components w.r.t. both \(\partial/\partial t\) and \(\partial/\partial u\) are 1:

sage: e = M.vector_frame('e')
sage: U.set_change_of_frame(e.restrict(U), c_t.frame(),
....:                       U.tangent_identity_field())
sage: V.set_change_of_frame(e.restrict(V), c_u.frame(),
....:                       V.tangent_identity_field())
sage: e[0].display(c_t.frame())
e_0 = d/dt
sage: e[0].display(c_u.frame())
e_0 = d/du

Equipped with the frame \(e\), the manifold \(S^1\) is manifestly parallelizable:

sage: M.is_manifestly_parallelizable()
True

Consequently, the module of vector fields on \(S^1\) is a free module:

sage: XM = M.vector_field_module() ; XM
Free module X(S^1) of vector fields on the 1-dimensional differentiable
 manifold S^1
sage: isinstance(XM, FiniteRankFreeModule)
True
sage: XM.category()
Category of finite dimensional modules
 over Algebra of differentiable scalar fields
 on the 1-dimensional differentiable manifold S^1
sage: XM.base_ring() is M.scalar_field_algebra()
True

The zero element:

sage: z = XM.zero() ; z
Vector field zero on the 1-dimensional differentiable manifold S^1
sage: z.display()
zero = 0
sage: z.display(c_t.frame())
zero = 0

The module \(\mathfrak{X}(S^1)\) coerces to any module of vector fields defined on a subdomain of \(S^1\), for instance \(\mathfrak{X}(U)\):

sage: XU = U.vector_field_module() ; XU
Free module X(U) of vector fields on the Open subset U of the
 1-dimensional differentiable manifold S^1
sage: XU.has_coerce_map_from(XM)
True
sage: XU.coerce_map_from(XM)
Coercion map:
  From: Free module X(S^1) of vector fields on the 1-dimensional
   differentiable manifold S^1
  To:   Free module X(U) of vector fields on the Open subset U of the
   1-dimensional differentiable manifold S^1

The conversion map is actually the restriction of vector fields defined on \(S^1\) to \(U\).

The Sage test suite for modules is passed:

sage: TestSuite(XM).run()
sage.manifolds.differentiable.vectorfield_module.VectorFieldModule

Module of vector fields along a differentiable manifold \(U\) with values on a differentiable manifold \(M\), via a differentiable map \(U \rightarrow M\).

Given a differentiable map

\[\Phi:\ U \longrightarrow M,\]

the vector field module \(\mathfrak{X}(U,\Phi)\) is the set of all vector fields of the type

\[v:\ U \longrightarrow TM\]

(where \(TM\) is the tangent bundle of \(M\)) such that

\[\forall p \in U,\ v(p) \in T_{\Phi(p)}M,\]

where \(T_{\Phi(p)}M\) is the tangent space to \(M\) at the point \(\Phi(p)\).

The set \(\mathfrak{X}(U,\Phi)\) is a module over \(C^k(U)\), the ring (algebra) of differentiable scalar fields on \(U\) (see DiffScalarFieldAlgebra). Furthermore, it is a Lie algebroid under the Lie bracket (cf. Wikipedia article Lie_algebroid)

\[[X, Y] = X \circ Y - Y \circ X\]

over the scalarfields if \(\Phi\) is the identity map. That is to say the Lie bracket is antisymmetric, bilinear over the base field, satisfies the Jacobi identity, and \([X, fY] = X(f) Y + f[X, Y]\).

The standard case of vector fields on a differentiable manifold corresponds to \(U = M\) and \(\Phi = \mathrm{Id}_M\); we then denote \(\mathfrak{X}(M,\mathrm{Id}_M)\) by merely \(\mathfrak{X}(M)\). Other common cases are \(\Phi\) being an immersion and \(\Phi\) being a curve in \(M\) (\(U\) is then an open interval of \(\RR\)).

Note

If \(M\) is parallelizable, the class VectorFieldFreeModule should be used instead.

INPUT:

  • domain – differentiable manifold \(U\) along which the vector fields are defined
  • dest_map – (default: None) destination map \(\Phi:\ U \rightarrow M\) (type: DiffMap); if None, it is assumed that \(U = M\) and \(\Phi\) is the identity map of \(M\) (case of vector fields on \(M\))

EXAMPLES:

Module of vector fields on the 2-sphere:

sage: M = Manifold(2, 'M') # the 2-dimensional sphere S^2
sage: U = M.open_subset('U') # complement of the North pole
sage: c_xy.<x,y> = U.chart() # stereographic coordinates from the North pole
sage: V = M.open_subset('V') # complement of the South pole
sage: c_uv.<u,v> = V.chart() # stereographic coordinates from the South pole
sage: M.declare_union(U,V)   # S^2 is the union of U and V
sage: xy_to_uv = c_xy.transition_map(c_uv, (x/(x^2+y^2), y/(x^2+y^2)),
....:                 intersection_name='W', restrictions1= x^2+y^2!=0,
....:                 restrictions2= u^2+v^2!=0)
sage: uv_to_xy = xy_to_uv.inverse()
sage: XM = M.vector_field_module() ; XM
Module X(M) of vector fields on the 2-dimensional differentiable
 manifold M

\(\mathfrak{X}(M)\) is a module over the algebra \(C^k(M)\):

sage: XM.category()
Category of modules over Algebra of differentiable scalar fields on the
 2-dimensional differentiable manifold M
sage: XM.base_ring() is M.scalar_field_algebra()
True

\(\mathfrak{X}(M)\) is not a free module:

sage: isinstance(XM, FiniteRankFreeModule)
False

because \(M = S^2\) is not parallelizable:

sage: M.is_manifestly_parallelizable()
False

On the contrary, the module of vector fields on \(U\) is a free module, since \(U\) is parallelizable (being a coordinate domain):

sage: XU = U.vector_field_module()
sage: isinstance(XU, FiniteRankFreeModule)
True
sage: U.is_manifestly_parallelizable()
True

The zero element of the module:

sage: z = XM.zero() ; z
Vector field zero on the 2-dimensional differentiable manifold M
sage: z.display(c_xy.frame())
zero = 0
sage: z.display(c_uv.frame())
zero = 0

The module \(\mathfrak{X}(M)\) coerces to any module of vector fields defined on a subdomain of \(M\), for instance \(\mathfrak{X}(U)\):

sage: XU.has_coerce_map_from(XM)
True
sage: XU.coerce_map_from(XM)
Coercion map:
  From: Module X(M) of vector fields on the 2-dimensional
   differentiable manifold M
  To:   Free module X(U) of vector fields on the Open subset U of the
   2-dimensional differentiable manifold M

The conversion map is actually the restriction of vector fields defined on \(M\) to \(U\).