Multivector Field Modules - Manifolds

Skip to content
Back to top
View this page
Edit this page

# 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)\):

- `MultivectorModule` for \(p\)-vector fields with values on a generic (in practice, not parallelizable) differentiable manifold \(M\)

- `MultivectorFreeModule` for \(p\)-vector fields with values on a parallelizable manifold \(M\)

AUTHORS:

- Eric Gourgoulhon (2017): initial version

REFERENCES:

- R. L. Bishop and S. L. Goldberg (1980) [BG1980]

- C.-M. Marle (1997) [Mar1997]

class sage.manifolds.differentiable.multivector_module.MultivectorFreeModule(vector_field_module, degree)

  Bases: `ExtPowerFreeModule`

  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

      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)

  Python

      >>> 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

      sage: A is XM.exterior_power(2)
      True

  [Python]

      >>> 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

      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

  Python

      >>> 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

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

  [Python]

      >>> 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 nonzero elements are constructed by providing their components in a given vector frame:

  Sage

      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

  Python

      >>> 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

      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

  [Python]

      >>> 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

      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

  Python

      >>> 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

      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

  [Python]

      >>> 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

      sage: A.has_coerce_map_from(T20)
      False

  Python

      >>> 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

      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)

  [Python]

      >>> 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

      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

  Python

      >>> 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

    alias of `MultivectorFieldParal`

class sage.manifolds.differentiable.multivector_module.MultivectorModule(vector_field_module, degree)

  Bases: `UniqueRepresentation`, `Parent`

  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

      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)

  Python

      >>> 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

      sage: A is XM.exterior_power(2)
      True

  [Python]

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

  Modules of multivector fields are unique:

  Sage

      sage: A is M.multivector_module(2)
      True

  Python

      >>> 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

      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

  [Python]

      >>> 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

      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

  Python

      >>> 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 nonzero elements are constructed by providing their components in a given vector frame:

  Sage

      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

  [Python]

      >>> 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

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

  Python

      >>> from sage.all import *
      >>> a = A([], name='a')
      >>> a[eU,Integer(0),Integer(1)] = Integer(3)*x
      >>> a.add_comp_by_continuation(eV, W, c_uv)
      >>> 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

      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

  [Python]

      >>> 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

      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

  Python

      >>> 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

      sage: A.has_coerce_map_from(T20)
      False

  [Python]

      >>> 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

      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

  Python

      >>> 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

      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

  [Python]

      >>> 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

    alias of `MultivectorField`

  base_module()

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

    OUTPUT:

    - a `VectorFieldModule` representing the module on which `self` is defined

    EXAMPLES:

    Sage

        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

    Python

        >>> 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()

    Return the degree of the multivector fields in `self`.

    OUTPUT: integer \(p\) such that `self` is a set of \(p\)-vector fields

    EXAMPLES:

    Sage

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

    Python

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

  zero()

    Return the zero of `self`.

    EXAMPLES:

    Sage

        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

    Python

        >>> 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