# Multivector Field Modules#

The set $$A^p(U, \Phi)$$ of $$p$$-vector fields along a differentiable manifold $$U$$ with values on a differentiable manifold $$M$$ via a differentiable map $$\Phi:\ U \rightarrow M$$ (possibly $$U = M$$ and $$\Phi = \mathrm{Id}_M$$) is a module over the algebra $$C^k(U)$$ of differentiable scalar fields on $$U$$. It is a free module if and only if $$M$$ is parallelizable. Accordingly, two classes implement $$A^p(U,\Phi)$$:

AUTHORS:

• Eric Gourgoulhon (2017): initial version

REFERENCES:

class sage.manifolds.differentiable.multivector_module.MultivectorFreeModule(vector_field_module, degree)[source]#

Free module of multivector fields of a given degree $$p$$ ($$p$$-vector fields) along a differentiable manifold $$U$$ with values on a parallelizable manifold $$M$$.

Given a differentiable manifold $$U$$ and a differentiable map $$\Phi:\; U \rightarrow M$$ to a parallelizable manifold $$M$$ of dimension $$n$$, the set $$A^p(U, \Phi)$$ of $$p$$-vector fields (i.e. alternating tensor fields of type $$(p,0)$$) along $$U$$ with values on $$M$$ is a free module of rank $$\binom{n}{p}$$ over $$C^k(U)$$, the commutative algebra of differentiable scalar fields on $$U$$ (see DiffScalarFieldAlgebra). The standard case of $$p$$-vector fields on a differentiable manifold $$M$$ corresponds to $$U = M$$ and $$\Phi = \mathrm{Id}_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

This class implements $$A^p(U, \Phi)$$ in the case where $$M$$ is parallelizable; $$A^p(U, \Phi)$$ is then a free module. If $$M$$ is not parallelizable, the class MultivectorModule must be used instead.

INPUT:

• vector_field_module – free module $$\mathfrak{X}(U,\Phi)$$ of vector fields along $$U$$ associated with the map $$\Phi: U \rightarrow V$$

• degree – positive integer; the degree $$p$$ of the multivector fields

EXAMPLES:

Free module of 2-vector fields on a parallelizable 3-dimensional manifold:

sage: M = Manifold(3, 'M')
sage: X.<x,y,z> = M.chart()
sage: XM = M.vector_field_module() ; XM
Free module X(M) of vector fields on the 3-dimensional
differentiable manifold M
sage: A = M.multivector_module(2) ; A
Free module A^2(M) of 2-vector fields on the 3-dimensional
differentiable manifold M
sage: latex(A)
A^{2}\left(M\right)

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M')
>>> X = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = X._first_ngens(3)
>>> XM = M.vector_field_module() ; XM
Free module X(M) of vector fields on the 3-dimensional
differentiable manifold M
>>> A = M.multivector_module(Integer(2)) ; A
Free module A^2(M) of 2-vector fields on the 3-dimensional
differentiable manifold M
>>> latex(A)
A^{2}\left(M\right)


A is nothing but the second exterior power of XM, i.e. we have $$A^{2}(M) = \Lambda^2(\mathfrak{X}(M))$$ (see ExtPowerFreeModule):

sage: A is XM.exterior_power(2)
True

>>> from sage.all import *
>>> A is XM.exterior_power(Integer(2))
True


$$A^{2}(M)$$ is a module over the algebra $$C^k(M)$$ of (differentiable) scalar fields on $$M$$:

sage: A.category()
Category of finite dimensional modules over Algebra of
differentiable scalar fields on the 3-dimensional
differentiable manifold M
sage: CM = M.scalar_field_algebra() ; CM
Algebra of differentiable scalar fields on the 3-dimensional
differentiable manifold M
sage: A in Modules(CM)
True
sage: A.base_ring()
Algebra of differentiable scalar fields on
the 3-dimensional differentiable manifold M
sage: A.base_module()
Free module X(M) of vector fields on
the 3-dimensional differentiable manifold M
sage: A.base_module() is XM
True
sage: A.rank()
3

>>> from sage.all import *
>>> A.category()
Category of finite dimensional modules over Algebra of
differentiable scalar fields on the 3-dimensional
differentiable manifold M
>>> CM = M.scalar_field_algebra() ; CM
Algebra of differentiable scalar fields on the 3-dimensional
differentiable manifold M
>>> A in Modules(CM)
True
>>> A.base_ring()
Algebra of differentiable scalar fields on
the 3-dimensional differentiable manifold M
>>> A.base_module()
Free module X(M) of vector fields on
the 3-dimensional differentiable manifold M
>>> A.base_module() is XM
True
>>> A.rank()
3


Elements can be constructed from $$A$$. In particular, 0 yields the zero element of $$A$$:

sage: A(0)
2-vector field zero on the 3-dimensional differentiable
manifold M
sage: A(0) is A.zero()
True

>>> from sage.all import *
>>> A(Integer(0))
2-vector field zero on the 3-dimensional differentiable
manifold M
>>> A(Integer(0)) is A.zero()
True


while non-zero elements are constructed by providing their components in a given vector frame:

sage: comp = [[0,3*x,-z],[-3*x,0,4],[z,-4,0]]
sage: a = A(comp, frame=X.frame(), name='a') ; a
2-vector field a on the 3-dimensional differentiable manifold M
sage: a.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z

>>> from sage.all import *
>>> comp = [[Integer(0),Integer(3)*x,-z],[-Integer(3)*x,Integer(0),Integer(4)],[z,-Integer(4),Integer(0)]]
>>> a = A(comp, frame=X.frame(), name='a') ; a
2-vector field a on the 3-dimensional differentiable manifold M
>>> a.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z


An alternative is to construct the 2-vector field from an empty list of components and to set the nonzero nonredundant components afterwards:

sage: a = A([], name='a')
sage: a[0,1] = 3*x  # component in the manifold's default frame
sage: a[0,2] = -z
sage: a[1,2] = 4
sage: a.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z

>>> from sage.all import *
>>> a = A([], name='a')
>>> a[Integer(0),Integer(1)] = Integer(3)*x  # component in the manifold's default frame
>>> a[Integer(0),Integer(2)] = -z
>>> a[Integer(1),Integer(2)] = Integer(4)
>>> a.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z


The module $$A^1(M)$$ is nothing but $$\mathfrak{X}(M)$$ (the free module of vector fields on $$M$$):

sage: A1 = M.multivector_module(1) ; A1
Free module X(M) of vector fields on the 3-dimensional
differentiable manifold M
sage: A1 is XM
True

>>> from sage.all import *
>>> A1 = M.multivector_module(Integer(1)) ; A1
Free module X(M) of vector fields on the 3-dimensional
differentiable manifold M
>>> A1 is XM
True


There is a coercion map $$A^p(M) \rightarrow T^{(p,0)}(M)$$:

sage: T20 = M.tensor_field_module((2,0)); T20
Free module T^(2,0)(M) of type-(2,0) tensors fields on the
3-dimensional differentiable manifold M
sage: T20.has_coerce_map_from(A)
True

>>> from sage.all import *
>>> T20 = M.tensor_field_module((Integer(2),Integer(0))); T20
Free module T^(2,0)(M) of type-(2,0) tensors fields on the
3-dimensional differentiable manifold M
>>> T20.has_coerce_map_from(A)
True


but of course not in the reverse direction, since not all contravariant tensor field is alternating:

sage: A.has_coerce_map_from(T20)
False

>>> from sage.all import *
>>> A.has_coerce_map_from(T20)
False


The coercion map $$A^2(M) \rightarrow T^{(2,0)}(M)$$ in action:

sage: T20 = M.tensor_field_module((2,0)) ; T20
Free module T^(2,0)(M) of type-(2,0) tensors fields on the
3-dimensional differentiable manifold M
sage: ta = T20(a) ; ta
Tensor field a of type (2,0) on the 3-dimensional differentiable
manifold M
sage: ta.display()
a = 3*x ∂/∂x⊗∂/∂y - z ∂/∂x⊗∂/∂z - 3*x ∂/∂y⊗∂/∂x + 4 ∂/∂y⊗∂/∂z
+ z ∂/∂z⊗∂/∂x - 4 ∂/∂z⊗∂/∂y
sage: a.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z
sage: ta.symmetries()  # the antisymmetry is preserved
no symmetry;  antisymmetry: (0, 1)

>>> from sage.all import *
>>> T20 = M.tensor_field_module((Integer(2),Integer(0))) ; T20
Free module T^(2,0)(M) of type-(2,0) tensors fields on the
3-dimensional differentiable manifold M
>>> ta = T20(a) ; ta
Tensor field a of type (2,0) on the 3-dimensional differentiable
manifold M
>>> ta.display()
a = 3*x ∂/∂x⊗∂/∂y - z ∂/∂x⊗∂/∂z - 3*x ∂/∂y⊗∂/∂x + 4 ∂/∂y⊗∂/∂z
+ z ∂/∂z⊗∂/∂x - 4 ∂/∂z⊗∂/∂y
>>> a.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z
>>> ta.symmetries()  # the antisymmetry is preserved
no symmetry;  antisymmetry: (0, 1)


There is also coercion to subdomains, which is nothing but the restriction of the multivector field to some subset of its domain:

sage: U = M.open_subset('U', coord_def={X: x^2+y^2<1})
sage: B = U.multivector_module(2) ; B
Free module A^2(U) of 2-vector fields on the Open subset U of the
3-dimensional differentiable manifold M
sage: B.has_coerce_map_from(A)
True
sage: a_U = B(a) ; a_U
2-vector field a on the Open subset U of the 3-dimensional
differentiable manifold M
sage: a_U.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z

>>> from sage.all import *
>>> U = M.open_subset('U', coord_def={X: x**Integer(2)+y**Integer(2)<Integer(1)})
>>> B = U.multivector_module(Integer(2)) ; B
Free module A^2(U) of 2-vector fields on the Open subset U of the
3-dimensional differentiable manifold M
>>> B.has_coerce_map_from(A)
True
>>> a_U = B(a) ; a_U
2-vector field a on the Open subset U of the 3-dimensional
differentiable manifold M
>>> a_U.display()
a = 3*x ∂/∂x∧∂/∂y - z ∂/∂x∧∂/∂z + 4 ∂/∂y∧∂/∂z

Element[source]#

alias of MultivectorFieldParal

class sage.manifolds.differentiable.multivector_module.MultivectorModule(vector_field_module, degree)[source]#

Module of multivector fields of a given degree $$p$$ ($$p$$-vector fields) along a differentiable manifold $$U$$ with values on a differentiable manifold $$M$$.

Given a differentiable manifold $$U$$ and a differentiable map $$\Phi: U \rightarrow M$$ to a differentiable manifold $$M$$, the set $$A^p(U, \Phi)$$ of $$p$$-vector fields (i.e. alternating tensor fields of type $$(p,0)$$) along $$U$$ with values on $$M$$ is a module over $$C^k(U)$$, the commutative algebra of differentiable scalar fields on $$U$$ (see DiffScalarFieldAlgebra). The standard case of $$p$$-vector fields on a differentiable manifold $$M$$ corresponds to $$U = M$$ and $$\Phi = \mathrm{Id}_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

This class implements $$A^p(U,\Phi)$$ in the case where $$M$$ is not assumed to be parallelizable; the module $$A^p(U, \Phi)$$ is then not necessarily free. If $$M$$ is parallelizable, the class MultivectorFreeModule must be used instead.

INPUT:

• vector_field_module – module $$\mathfrak{X}(U, \Phi)$$ of vector fields along $$U$$ with values on $$M$$ via the map $$\Phi: U \rightarrow M$$

• degree – positive integer; the degree $$p$$ of the multivector fields

EXAMPLES:

Module of 2-vector fields on a non-parallelizable 2-dimensional manifold:

sage: M = Manifold(2, 'M')
sage: U = M.open_subset('U') ; V = M.open_subset('V')
sage: M.declare_union(U,V)   # M is the union of U and V
sage: c_xy.<x,y> = U.chart() ; c_uv.<u,v> = V.chart()
sage: transf = c_xy.transition_map(c_uv, (x+y, x-y),
....:  intersection_name='W', restrictions1= x>0,
....:  restrictions2= u+v>0)
sage: inv = transf.inverse()
sage: W = U.intersection(V)
sage: eU = c_xy.frame() ; eV = c_uv.frame()
sage: XM = M.vector_field_module() ; XM
Module X(M) of vector fields on the 2-dimensional differentiable
manifold M
sage: A = M.multivector_module(2) ; A
Module A^2(M) of 2-vector fields on the 2-dimensional
differentiable manifold M
sage: latex(A)
A^{2}\left(M\right)

>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> U = M.open_subset('U') ; V = M.open_subset('V')
>>> M.declare_union(U,V)   # M is the union of U and V
>>> c_xy = U.chart(names=('x', 'y',)); (x, y,) = c_xy._first_ngens(2); c_uv = V.chart(names=('u', 'v',)); (u, v,) = c_uv._first_ngens(2)
>>> transf = c_xy.transition_map(c_uv, (x+y, x-y),
...  intersection_name='W', restrictions1= x>Integer(0),
...  restrictions2= u+v>Integer(0))
>>> inv = transf.inverse()
>>> W = U.intersection(V)
>>> eU = c_xy.frame() ; eV = c_uv.frame()
>>> XM = M.vector_field_module() ; XM
Module X(M) of vector fields on the 2-dimensional differentiable
manifold M
>>> A = M.multivector_module(Integer(2)) ; A
Module A^2(M) of 2-vector fields on the 2-dimensional
differentiable manifold M
>>> latex(A)
A^{2}\left(M\right)


A is nothing but the second exterior power of XM, i.e. we have $$A^{2}(M) = \Lambda^2(\mathfrak{X}(M))$$:

sage: A is XM.exterior_power(2)
True

>>> from sage.all import *
>>> A is XM.exterior_power(Integer(2))
True


Modules of multivector fields are unique:

sage: A is M.multivector_module(2)
True

>>> from sage.all import *
>>> A is M.multivector_module(Integer(2))
True


$$A^2(M)$$ is a module over the algebra $$C^k(M)$$ of (differentiable) scalar fields on $$M$$:

sage: A.category()
Category of modules over Algebra of differentiable scalar fields
on the 2-dimensional differentiable manifold M
sage: CM = M.scalar_field_algebra() ; CM
Algebra of differentiable scalar fields on the 2-dimensional
differentiable manifold M
sage: A in Modules(CM)
True
sage: A.base_ring() is CM
True
sage: A.base_module()
Module X(M) of vector fields on the 2-dimensional differentiable
manifold M
sage: A.base_module() is XM
True

>>> from sage.all import *
>>> A.category()
Category of modules over Algebra of differentiable scalar fields
on the 2-dimensional differentiable manifold M
>>> CM = M.scalar_field_algebra() ; CM
Algebra of differentiable scalar fields on the 2-dimensional
differentiable manifold M
>>> A in Modules(CM)
True
>>> A.base_ring() is CM
True
>>> A.base_module()
Module X(M) of vector fields on the 2-dimensional differentiable
manifold M
>>> A.base_module() is XM
True


Elements can be constructed from A(). In particular, 0 yields the zero element of A:

sage: z = A(0) ; z
2-vector field zero on the 2-dimensional differentiable
manifold M
sage: z.display(eU)
zero = 0
sage: z.display(eV)
zero = 0
sage: z is A.zero()
True

>>> from sage.all import *
>>> z = A(Integer(0)) ; z
2-vector field zero on the 2-dimensional differentiable
manifold M
>>> z.display(eU)
zero = 0
>>> z.display(eV)
zero = 0
>>> z is A.zero()
True


while non-zero elements are constructed by providing their components in a given vector frame:

sage: a = A([[0,3*x],[-3*x,0]], frame=eU, name='a') ; a
2-vector field a on the 2-dimensional differentiable manifold M
sage: a.add_comp_by_continuation(eV, W, c_uv) # finishes initializ. of a
sage: a.display(eU)
a = 3*x ∂/∂x∧∂/∂y
sage: a.display(eV)
a = (-3*u - 3*v) ∂/∂u∧∂/∂v

>>> from sage.all import *
>>> a = A([[Integer(0),Integer(3)*x],[-Integer(3)*x,Integer(0)]], frame=eU, name='a') ; a
2-vector field a on the 2-dimensional differentiable manifold M
>>> a.add_comp_by_continuation(eV, W, c_uv) # finishes initializ. of a
>>> a.display(eU)
a = 3*x ∂/∂x∧∂/∂y
>>> a.display(eV)
a = (-3*u - 3*v) ∂/∂u∧∂/∂v


An alternative is to construct the 2-vector field from an empty list of components and to set the nonzero nonredundant components afterwards:

sage: a = A([], name='a')
sage: a[eU,0,1] = 3*x
sage: a.display(eU)
a = 3*x ∂/∂x∧∂/∂y
sage: a.display(eV)
a = (-3*u - 3*v) ∂/∂u∧∂/∂v

>>> from sage.all import *
>>> a = A([], name='a')
>>> a[eU,Integer(0),Integer(1)] = Integer(3)*x
>>> a.display(eU)
a = 3*x ∂/∂x∧∂/∂y
>>> a.display(eV)
a = (-3*u - 3*v) ∂/∂u∧∂/∂v


The module $$A^1(M)$$ is nothing but the dual of $$\mathfrak{X}(M)$$ (the module of vector fields on $$M$$):

sage: A1 = M.multivector_module(1) ; A1
Module X(M) of vector fields on the 2-dimensional differentiable
manifold M
sage: A1 is XM
True

>>> from sage.all import *
>>> A1 = M.multivector_module(Integer(1)) ; A1
Module X(M) of vector fields on the 2-dimensional differentiable
manifold M
>>> A1 is XM
True


There is a coercion map $$A^p(M)\rightarrow T^{(p,0)}(M)$$:

sage: T20 = M.tensor_field_module((2,0)) ; T20
Module T^(2,0)(M) of type-(2,0) tensors fields on the
2-dimensional differentiable manifold M
sage: T20.has_coerce_map_from(A)
True

>>> from sage.all import *
>>> T20 = M.tensor_field_module((Integer(2),Integer(0))) ; T20
Module T^(2,0)(M) of type-(2,0) tensors fields on the
2-dimensional differentiable manifold M
>>> T20.has_coerce_map_from(A)
True


but of course not in the reverse direction, since not all contravariant tensor field is alternating:

sage: A.has_coerce_map_from(T20)
False

>>> from sage.all import *
>>> A.has_coerce_map_from(T20)
False


The coercion map $$A^2(M) \rightarrow T^{(2,0)}(M)$$ in action:

sage: ta = T20(a) ; ta
Tensor field a of type (2,0) on the 2-dimensional differentiable
manifold M
sage: ta.display(eU)
a = 3*x ∂/∂x⊗∂/∂y - 3*x ∂/∂y⊗∂/∂x
sage: a.display(eU)
a = 3*x ∂/∂x∧∂/∂y
sage: ta.display(eV)
a = (-3*u - 3*v) ∂/∂u⊗∂/∂v + (3*u + 3*v) ∂/∂v⊗∂/∂u
sage: a.display(eV)
a = (-3*u - 3*v) ∂/∂u∧∂/∂v

>>> from sage.all import *
>>> ta = T20(a) ; ta
Tensor field a of type (2,0) on the 2-dimensional differentiable
manifold M
>>> ta.display(eU)
a = 3*x ∂/∂x⊗∂/∂y - 3*x ∂/∂y⊗∂/∂x
>>> a.display(eU)
a = 3*x ∂/∂x∧∂/∂y
>>> ta.display(eV)
a = (-3*u - 3*v) ∂/∂u⊗∂/∂v + (3*u + 3*v) ∂/∂v⊗∂/∂u
>>> a.display(eV)
a = (-3*u - 3*v) ∂/∂u∧∂/∂v


There is also coercion to subdomains, which is nothing but the restriction of the multivector field to some subset of its domain:

sage: A2U = U.multivector_module(2) ; A2U
Free module A^2(U) of 2-vector fields on the Open subset U of
the 2-dimensional differentiable manifold M
sage: A2U.has_coerce_map_from(A)
True
sage: a_U = A2U(a) ; a_U
2-vector field a on the Open subset U of the 2-dimensional
differentiable manifold M
sage: a_U.display(eU)
a = 3*x ∂/∂x∧∂/∂y

>>> from sage.all import *
>>> A2U = U.multivector_module(Integer(2)) ; A2U
Free module A^2(U) of 2-vector fields on the Open subset U of
the 2-dimensional differentiable manifold M
>>> A2U.has_coerce_map_from(A)
True
>>> a_U = A2U(a) ; a_U
2-vector field a on the Open subset U of the 2-dimensional
differentiable manifold M
>>> a_U.display(eU)
a = 3*x ∂/∂x∧∂/∂y

Element[source]#

alias of MultivectorField

base_module()[source]#

Return the vector field module on which the multivector field module self is constructed.

OUTPUT:

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: A2 = M.multivector_module(2) ; A2
Module A^2(M) of 2-vector fields on the 3-dimensional
differentiable manifold M
sage: A2.base_module()
Module X(M) of vector fields on the 3-dimensional
differentiable manifold M
sage: A2.base_module() is M.vector_field_module()
True
sage: U = M.open_subset('U')
sage: A2U = U.multivector_module(2) ; A2U
Module A^2(U) of 2-vector fields on the Open subset U of the
3-dimensional differentiable manifold M
sage: A2U.base_module()
Module X(U) of vector fields on the Open subset U of the
3-dimensional differentiable manifold M

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M')
>>> A2 = M.multivector_module(Integer(2)) ; A2
Module A^2(M) of 2-vector fields on the 3-dimensional
differentiable manifold M
>>> A2.base_module()
Module X(M) of vector fields on the 3-dimensional
differentiable manifold M
>>> A2.base_module() is M.vector_field_module()
True
>>> U = M.open_subset('U')
>>> A2U = U.multivector_module(Integer(2)) ; A2U
Module A^2(U) of 2-vector fields on the Open subset U of the
3-dimensional differentiable manifold M
>>> A2U.base_module()
Module X(U) of vector fields on the Open subset U of the
3-dimensional differentiable manifold M

degree()[source]#

Return the degree of the multivector fields in self.

OUTPUT:

• integer $$p$$ such that self is a set of $$p$$-vector fields

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: M.multivector_module(2).degree()
2
sage: M.multivector_module(3).degree()
3

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M')
>>> M.multivector_module(Integer(2)).degree()
2
>>> M.multivector_module(Integer(3)).degree()
3

zero()[source]#

Return the zero of self.

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: A2 = M.multivector_module(2)
sage: A2.zero()
2-vector field zero on the 3-dimensional differentiable
manifold M

>>> from sage.all import *
>>> M = Manifold(Integer(3), 'M')
>>> A2 = M.multivector_module(Integer(2))
>>> A2.zero()
2-vector field zero on the 3-dimensional differentiable
manifold M