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:

class sage.manifolds.differentiable.vectorfield_module.VectorFieldFreeModule(domain, dest_map=None)

Bases: sage.tensor.modules.finite_rank_free_module.FiniteRankFreeModule

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 \(\mathcal{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 \(\mathcal{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 \(\mathcal{X}(M,\mathrm{Id}_M)\) by merely \(\mathcal{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 \(\mathcal{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 \(\mathcal{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 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 \(\mathcal{X}(S^1)\) coerces to any module of vector fields defined on a subdomain of \(S^1\), for instance \(\mathcal{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)
Conversion 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()
Element

alias of VectorFieldParal

ambient_domain()

Return the manifold in which the vector fields of self take their values.

If the module is \(\mathcal{X}(U, \Phi)\), returns the codomain \(M\) of \(\Phi\).

OUTPUT:

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: X.<x,y,z> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.ambient_domain()
3-dimensional differentiable manifold M
sage: U = Manifold(2, 'U')
sage: Y.<u,v> = U.chart()
sage: Phi = U.diff_map(M, {(Y,X): [u+v, u-v, u*v]}, name='Phi')
sage: XU = U.vector_field_module(dest_map=Phi)
sage: XU.ambient_domain()
3-dimensional differentiable manifold M
basis(symbol=None, latex_symbol=None, from_frame=None)

Define a basis of self.

A basis of the vector field module is actually a vector frame along the differentiable manifold \(U\) over which the vector field 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 – (string; default: None) a letter (of a few letters) to denote a generic element of the basis; if None and from_frame = None the module’s default basis is returned
  • latex_symbol – (string; default: None) symbol to denote a generic element of the basis; if None, the value of symbol is used
  • from_frame – (default: None) vector frame \(\tilde{e}\) on the codomain \(M\) of the destination map \(\Phi\) of self; the returned basis \(e\) is then such that for all \(p \in U\), we have \(e(p) = \tilde{e}(\Phi(p))\)

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: e = XM.basis('e'); e
Vector frame (M, (e_0,e_1))

See VectorFrame for more examples and documentation.

destination_map()

Return the differential map associated to self.

The differential map associated to this module is the map

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

such that this module is the set \(\mathcal{X}(U,\Phi)\) 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)\).

OUTPUT:

  • a DiffMap representing the differential map \(\Phi\)

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: X.<x,y,z> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.destination_map()
Identity map Id_M of the 3-dimensional differentiable manifold M
sage: U = Manifold(2, 'U')
sage: Y.<u,v> = U.chart()
sage: Phi = U.diff_map(M, {(Y,X): [u+v, u-v, u*v]}, name='Phi')
sage: XU = U.vector_field_module(dest_map=Phi)
sage: XU.destination_map()
Differentiable map Phi from the 2-dimensional differentiable
 manifold U to the 3-dimensional differentiable manifold M
domain()

Return the domain of the vector fields in self.

If the module is \(\mathcal{X}(U, \Phi)\), returns the domain \(U\) of \(\Phi\).

OUTPUT:

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: X.<x,y,z> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.domain()
3-dimensional differentiable manifold M
sage: U = Manifold(2, 'U')
sage: Y.<u,v> = U.chart()
sage: Phi = U.diff_map(M, {(Y,X): [u+v, u-v, u*v]}, name='Phi')
sage: XU = U.vector_field_module(dest_map=Phi)
sage: XU.domain()
2-dimensional differentiable manifold U
dual_exterior_power(p)

Return the \(p\)-th exterior power of the dual of self.

If the vector field module is \(\mathcal{X}(U,\Phi)\), the \(p\)-th exterior power of its dual is the set \(\Lambda^p(U, \Phi)\) of \(p\)-forms along \(U\) with values on \(\Phi(U)\). It is a module over \(C^k(U)\), the ring (algebra) of differentiable scalar fields on \(U\).

INPUT:

  • p – non-negative integer

OUTPUT:

  • for \(p \geq 1\), a DiffFormFreeModule representing the module \(\Lambda^p(U,\Phi)\); for \(p=0\), the base ring, i.e. \(C^k(U)\), is returned instead

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.dual_exterior_power(2)
Free module /\^2(M) of 2-forms on the 2-dimensional differentiable
 manifold M
sage: XM.dual_exterior_power(1)
Free module /\^1(M) of 1-forms on the 2-dimensional differentiable
 manifold M
sage: XM.dual_exterior_power(1) is XM.dual()
True
sage: XM.dual_exterior_power(0)
Algebra of differentiable scalar fields on the 2-dimensional
 differentiable manifold M
sage: XM.dual_exterior_power(0) is M.scalar_field_algebra()
True

See also

DiffFormFreeModule for more examples and documentation.

general_linear_group()

Return the general linear group of self.

If the vector field module is \(\mathcal{X}(U,\Phi)\), the general linear group is the group \(\mathrm{GL}(\mathcal{X}(U,\Phi))\) of automorphisms of \(\mathcal{X}(U,\Phi)\). Note that an automorphism of \(\mathcal{X}(U,\Phi)\) can also be viewed as a field along \(U\) of automorphisms of the tangent spaces of \(V=\Phi(U)\).

OUTPUT:

EXAMPLE:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.general_linear_group()
General linear group of the Free module X(M) of vector fields on
 the 2-dimensional differentiable manifold M

See also

AutomorphismFieldParalGroup for more examples and documentation.

metric(name, signature=None, latex_name=None)

Construct a pseudo-Riemannian metric (nondegenerate symmetric bilinear form) on the current vector field module.

A pseudo-Riemannian metric of the vector field module is actually a field of tangent-space non-degenerate symmetric bilinear forms along the manifold \(U\) on which the vector field module is defined.

INPUT:

  • name – (string) name given to the metric
  • signature – (integer; default: None) signature \(S\) of the metric: \(S = n_+ - n_-\), where \(n_+\) (resp. \(n_-\)) is the number of positive terms (resp. number of negative terms) in any diagonal writing of the metric components; if signature is not provided, \(S\) is set to the manifold’s dimension (Riemannian signature)
  • latex_name – (string; default: None) LaTeX symbol to denote the metric; if None, it is formed from name

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.metric('g')
Riemannian metric g on the 2-dimensional differentiable manifold M
sage: XM.metric('g', signature=0)
Lorentzian metric g on the 2-dimensional differentiable manifold M

See also

PseudoRiemannianMetricParal for more documentation.

sym_bilinear_form(name=None, latex_name=None)

Construct a symmetric bilinear form on self.

A symmetric bilinear form on the vector field module is actually a field of tangent-space symmetric bilinear forms along the differentiable manifold \(U\) over which the vector field module is defined.

INPUT:

  • name – string (default: None); name given to the automorphism
  • latex_name – string (default: None); LaTeX symbol to denote the automorphism; if None, the LaTeX symbol is set to name

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.sym_bilinear_form(name='a')
Field of symmetric bilinear forms a on the 2-dimensional
 differentiable manifold M

See also

TensorFieldParal for more examples and documentation.

tensor(tensor_type, name=None, latex_name=None, sym=None, antisym=None, specific_type=None)

Construct a tensor on self.

The tensor is actually a tensor field along the differentiable manifold \(U\) over which self is defined.

INPUT:

  • tensor_type – pair (k,l) with k being the contravariant rank and l the covariant rank
  • name – (string; default: None) name given to the tensor
  • latex_name – (string; default: None) LaTeX symbol to denote the tensor; if none is provided, the LaTeX symbol is set to name
  • sym – (default: None) a symmetry or a list of symmetries among the tensor arguments: each symmetry is described by a tuple containing the positions of the involved arguments, with the convention position=0 for the first argument; for instance:
    • sym = (0,1) for a symmetry between the 1st and 2nd arguments
    • sym = [(0,2), (1,3,4)] for a symmetry between the 1st and 3rd arguments and a symmetry between the 2nd, 4th and 5th arguments
  • antisym – (default: None) antisymmetry or list of antisymmetries among the arguments, with the same convention as for sym
  • specific_type – (default: None) specific subclass of TensorFieldParal for the output

OUTPUT:

  • a TensorFieldParal representing the tensor defined on self with the provided characteristics

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.tensor((1,2), name='t')
Tensor field t of type (1,2) on the 2-dimensional differentiable
 manifold M
sage: XM.tensor((1,0), name='a')
Vector field a on the 2-dimensional differentiable manifold M
sage: XM.tensor((0,2), name='a', antisym=(0,1))
2-form a on the 2-dimensional differentiable manifold M

See TensorFieldParal for more examples and documentation.

tensor_from_comp(tensor_type, comp, name=None, latex_name=None)

Construct a tensor on self from a set of components.

The tensor is actually a tensor field along the differentiable manifold \(U\) over which the vector field module is defined. The tensor symmetries are deduced from those of the components.

INPUT:

  • tensor_type – pair \((k,l)\) with \(k\) being the contravariant rank and \(l\) the covariant rank
  • compComponents; the tensor components in a given basis
  • name – string (default: None); name given to the tensor
  • latex_name – string (default: None); LaTeX symbol to denote the tensor; if None, the LaTeX symbol is set to name

OUTPUT:

  • a TensorFieldParal representing the tensor defined on the vector field module with the provided characteristics

EXAMPLES:

A 2-dimensional set of components transformed into a type-\((1,1)\) tensor field:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: XM = M.vector_field_module()
sage: from sage.tensor.modules.comp import Components
sage: comp = Components(M.scalar_field_algebra(), X.frame(), 2,
....:                   output_formatter=XM._output_formatter)
sage: comp[:] = [[1+x, -y], [x*y, 2-y^2]]
sage: t = XM.tensor_from_comp((1,1), comp, name='t'); t
Tensor field t of type (1,1) on the 2-dimensional differentiable
 manifold M
sage: t.display()
t = (x + 1) d/dx*dx - y d/dx*dy + x*y d/dy*dx + (-y^2 + 2) d/dy*dy

The same set of components transformed into a type-\((0,2)\) tensor field:

sage: t = XM.tensor_from_comp((0,2), comp, name='t'); t
Tensor field t of type (0,2) on the 2-dimensional differentiable
 manifold M
sage: t.display()
t = (x + 1) dx*dx - y dx*dy + x*y dy*dx + (-y^2 + 2) dy*dy
tensor_module(k, l)

Return the free module of all tensors of type \((k, l)\) defined on self.

INPUT:

  • k – non-negative integer; the contravariant rank, the tensor type being \((k, l)\)
  • l – non-negative integer; the covariant rank, the tensor type being \((k, l)\)

OUTPUT:

  • a TensorFieldFreeModule representing the free module of type-\((k,l)\) tensors on the vector field module

EXAMPLES:

A tensor field module on a 2-dimensional differentiable manifold:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.tensor_module(1,2)
Free module T^(1,2)(M) of type-(1,2) tensors fields on the
 2-dimensional differentiable manifold M

The special case of tensor fields of type (1,0):

sage: XM.tensor_module(1,0)
Free module X(M) of vector fields on the 2-dimensional
 differentiable manifold M

The result is cached:

sage: XM.tensor_module(1,2) is XM.tensor_module(1,2)
True
sage: XM.tensor_module(1,0) is XM
True

See also

TensorFieldFreeModule for more examples and documentation.

class sage.manifolds.differentiable.vectorfield_module.VectorFieldModule(domain, dest_map=None)

Bases: sage.structure.unique_representation.UniqueRepresentation, sage.structure.parent.Parent

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 \(\mathcal{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 \(\mathcal{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 \(\mathcal{X}(M,\mathrm{Id}_M)\) by merely \(\mathcal{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

\(\mathcal{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

\(\mathcal{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 \(\mathcal{X}(M)\) coerces to any module of vector fields defined on a subdomain of \(M\), for instance \(\mathcal{X}(U)\):

sage: XU.has_coerce_map_from(XM)
True
sage: XU.coerce_map_from(XM)
Conversion 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\).

Element

alias of VectorField

alternating_form(degree, name=None, latex_name=None)

Construct an alternating form on the vector field module.

An alternating form on the vector field module is actually a differential form along the differentiable manifold \(U\) over which the vector field module is defined.

INPUT:

  • degree – the degree of the alternating form (i.e. its tensor rank)
  • name – (string; optional) name given to the alternating form
  • latex_name – (string; optional) LaTeX symbol to denote the alternating form; if none is provided, the LaTeX symbol is set to name

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.alternating_form(2, name='a')
2-form a on the 2-dimensional differentiable manifold M
sage: XM.alternating_form(1, name='a')
1-form a on the 2-dimensional differentiable manifold M

See also

DiffForm for more examples and documentation.

ambient_domain()

Return the manifold in which the vector fields of this module take their values.

If the module is \(\mathcal{X}(U,\Phi)\), returns the codomain \(M\) of \(\Phi\).

OUTPUT:

  • instance of DifferentiableManifold representing the manifold in which the vector fields of this module take their values

EXAMPLES:

sage: M = Manifold(5, 'M')
sage: XM = M.vector_field_module()
sage: XM.ambient_domain()
5-dimensional differentiable manifold M
sage: U = Manifold(2, 'U')
sage: Phi = U.diff_map(M, name='Phi')
sage: XU = U.vector_field_module(dest_map=Phi)
sage: XU.ambient_domain()
5-dimensional differentiable manifold M
automorphism(name=None, latex_name=None)

Construct an automorphism of the vector field module.

An automorphism of the vector field module is actually a field of tangent-space automorphisms along the differentiable manifold \(U\) over which the vector field module is defined.

INPUT:

  • name – (string; optional) name given to the automorphism
  • latex_name – (string; optional) LaTeX symbol to denote the automorphism; if none is provided, the LaTeX symbol is set to name

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.automorphism()
Field of tangent-space automorphisms on the 2-dimensional
 differentiable manifold M
sage: XM.automorphism(name='a')
Field of tangent-space automorphisms a on the 2-dimensional
 differentiable manifold M

See also

AutomorphismField for more examples and documentation.

destination_map()

Return the differential map associated to this module.

The differential map associated to this module is the map

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

such that this module is the set \(\mathcal{X}(U,\Phi)\) 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)\).

OUTPUT:

  • instance of DiffMap representing the differential map \(\Phi\)

EXAMPLES:

sage: M = Manifold(5, 'M')
sage: XM = M.vector_field_module()
sage: XM.destination_map()
Identity map Id_M of the 5-dimensional differentiable manifold M
sage: U = Manifold(2, 'U')
sage: Phi = U.diff_map(M, name='Phi')
sage: XU = U.vector_field_module(dest_map=Phi)
sage: XU.destination_map()
Differentiable map Phi from the 2-dimensional differentiable
 manifold U to the 5-dimensional differentiable manifold M
domain()

Return the domain of the vector fields in this module.

If the module is \(\mathcal{X}(U,\Phi)\), returns the domain \(U\) of \(\Phi\).

OUTPUT:

EXAMPLES:

sage: M = Manifold(5, 'M')
sage: XM = M.vector_field_module()
sage: XM.domain()
5-dimensional differentiable manifold M
sage: U = Manifold(2, 'U')
sage: Phi = U.diff_map(M, name='Phi')
sage: XU = U.vector_field_module(dest_map=Phi)
sage: XU.domain()
2-dimensional differentiable manifold U
dual()

Return the dual module.

EXAMPLE:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.dual()
Module /\^1(M) of 1-forms on the 2-dimensional differentiable
 manifold M
dual_exterior_power(p)

Return the \(p\)-th exterior power of the dual of the vector field module.

If the vector field module is \(\mathcal{X}(U,\Phi)\), the \(p\)-th exterior power of its dual is the set \(\Lambda^p(U, \Phi)\) of \(p\)-forms along \(U\) with values on \(\Phi(U)\). It is a module over \(C^k(U)\), the ring (algebra) of differentiable scalar fields on \(U\).

INPUT:

  • p – non-negative integer

OUTPUT:

  • for \(p \geq 1\), instance of DiffFormModule representing the module \(\Lambda^p(U,\Phi)\); for \(p=0\), the base ring, i.e. \(C^k(U)\), is returned instead

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.dual_exterior_power(2)
Module /\^2(M) of 2-forms on the 2-dimensional differentiable
 manifold M
sage: XM.dual_exterior_power(1)
Module /\^1(M) of 1-forms on the 2-dimensional differentiable
 manifold M
sage: XM.dual_exterior_power(1) is XM.dual()
True
sage: XM.dual_exterior_power(0)
Algebra of differentiable scalar fields on the 2-dimensional
 differentiable manifold M
sage: XM.dual_exterior_power(0) is M.scalar_field_algebra()
True

See also

DiffFormModule for more examples and documentation.

general_linear_group()

Return the general linear group of self.

If the vector field module is \(\mathcal{X}(U,\Phi)\), the general linear group is the group \(\mathrm{GL}(\mathcal{X}(U,\Phi))\) of automorphisms of \(\mathcal{X}(U, \Phi)\). Note that an automorphism of \(\mathcal{X}(U,\Phi)\) can also be viewed as a field along \(U\) of automorphisms of the tangent spaces of \(M \supset \Phi(U)\).

OUTPUT:

EXAMPLE:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.general_linear_group()
General linear group of the Module X(M) of vector fields on the
 2-dimensional differentiable manifold M

See also

AutomorphismFieldGroup for more examples and documentation.

identity_map(name='Id', latex_name=None)

Construct the identity map on the vector field module.

The identity map on the vector field module is actually a field of tangent-space identity maps along the differentiable manifold \(U\) over which the vector field module is defined.

INPUT:

  • name – (string; default: 'Id') name given to the identity map
  • latex_name – (string; optional) LaTeX symbol to denote the identity map; if none is provided, the LaTeX symbol is set to '\mathrm{Id}' if name is 'Id' and to name otherwise

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.identity_map()
Field of tangent-space identity maps on the 2-dimensional
 differentiable manifold M
linear_form(name=None, latex_name=None)

Construct a linear form on the vector field module.

A linear form on the vector field module is actually a field of linear forms (i.e. a 1-form) along the differentiable manifold \(U\) over which the vector field module is defined.

INPUT:

  • name – (string; optional) name given to the linear form
  • latex_name – (string; optional) LaTeX symbol to denote the linear form; if none is provided, the LaTeX symbol is set to name

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.linear_form()
1-form on the 2-dimensional differentiable manifold M
sage: XM.linear_form(name='a')
1-form a on the 2-dimensional differentiable manifold M

See also

DiffForm for more examples and documentation.

metric(name, signature=None, latex_name=None)

Construct a pseudo-Riemannian metric (nondegenerate symmetric bilinear form) on the current vector field module.

A pseudo-Riemannian metric of the vector field module is actually a field of tangent-space non-degenerate symmetric bilinear forms along the manifold \(U\) on which the vector field module is defined.

INPUT:

  • name – (string) name given to the metric
  • signature – (integer; default: None) signature \(S\) of the metric: \(S = n_+ - n_-\), where \(n_+\) (resp. \(n_-\)) is the number of positive terms (resp. number of negative terms) in any diagonal writing of the metric components; if signature is not provided, \(S\) is set to the manifold’s dimension (Riemannian signature)
  • latex_name – (string; default: None) LaTeX symbol to denote the metric; if None, it is formed from name

OUTPUT:

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.metric('g')
Riemannian metric g on the 2-dimensional differentiable manifold M
sage: XM.metric('g', signature=0)
Lorentzian metric g on the 2-dimensional differentiable manifold M

See also

PseudoRiemannianMetric for more documentation.

tensor(tensor_type, name=None, latex_name=None, sym=None, antisym=None, specific_type=None)

Construct a tensor on self.

The tensor is actually a tensor field on the domain of the vector field module.

INPUT:

  • tensor_type – pair (k,l) with k being the contravariant rank and l the covariant rank
  • name – (string; default: None) name given to the tensor
  • latex_name – (string; default: None) LaTeX symbol to denote the tensor; if none is provided, the LaTeX symbol is set to name
  • sym – (default: None) a symmetry or a list of symmetries among the tensor arguments: each symmetry is described by a tuple containing the positions of the involved arguments, with the convention position=0 for the first argument; for instance:
    • sym=(0,1) for a symmetry between the 1st and 2nd arguments
    • sym=[(0,2),(1,3,4)] for a symmetry between the 1st and 3rd arguments and a symmetry between the 2nd, 4th and 5th arguments
  • antisym – (default: None) antisymmetry or list of antisymmetries among the arguments, with the same convention as for sym
  • specific_type – (default: None) specific subclass of TensorField for the output

OUTPUT:

  • instance of TensorField representing the tensor defined on the vector field module with the provided characteristics

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.tensor((1,2), name='t')
Tensor field t of type (1,2) on the 2-dimensional differentiable
 manifold M
sage: XM.tensor((1,0), name='a')
Vector field a on the 2-dimensional differentiable manifold M
sage: XM.tensor((0,2), name='a', antisym=(0,1))
2-form a on the 2-dimensional differentiable manifold M

See also

TensorField for more examples and documentation.

tensor_module(k, l)

Return the module of type-\((k,l)\) tensors on self.

INPUT:

  • k – non-negative integer; the contravariant rank, the tensor type being \((k,l)\)
  • l – non-negative integer; the covariant rank, the tensor type being \((k,l)\)

OUTPUT:

  • instance of TensorFieldModule representing the module \(T^{(k,l)}(U,\Phi)\) of type-\((k,l)\) tensors on the vector field module

EXAMPLES:

A tensor field module on a 2-dimensional differentiable manifold:

sage: M = Manifold(2, 'M')
sage: XM = M.vector_field_module()
sage: XM.tensor_module(1,2)
Module T^(1,2)(M) of type-(1,2) tensors fields on the 2-dimensional
 differentiable manifold M

The special case of tensor fields of type (1,0):

sage: XM.tensor_module(1,0)
Module X(M) of vector fields on the 2-dimensional differentiable
 manifold M

The result is cached:

sage: XM.tensor_module(1,2) is XM.tensor_module(1,2)
True
sage: XM.tensor_module(1,0) is XM
True

See TensorFieldModule for more examples and documentation.

zero()

Return the zero of self.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()  # makes M parallelizable
sage: XM = M.vector_field_module()
sage: XM.zero()
Vector field zero on the 2-dimensional differentiable manifold M