Differential Form Modules

The set \(\Lambda^p(U, \Phi)\) of \(p\)-forms 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 \(\Lambda^p(U, \Phi)\):

  • DiffFormModule for differential forms with values on a generic (in practice, not parallelizable) differentiable manifold \(M\)
  • DiffFormFreeModule for differential forms with values on a parallelizable manifold \(M\)

AUTHORS:

  • Eric Gourgoulhon (2015): initial version
  • Travis Scrimshaw (2016): review tweaks

REFERENCES:

class sage.manifolds.differentiable.diff_form_module.DiffFormFreeModule(vector_field_module, degree)

Bases: sage.tensor.modules.ext_pow_free_module.ExtPowerFreeModule

Free module of differential forms of a given degree \(p\) (\(p\)-forms) 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\), the set \(\Lambda^p(U, \Phi)\) of \(p\)-forms along \(U\) with values on \(M\) is a free module over \(C^k(U)\), the commutative algebra of differentiable scalar fields on \(U\) (see DiffScalarFieldAlgebra). The standard case of \(p\)-forms 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\)).

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

This is a Sage parent class, whose element class is DiffFormParal.

INPUT:

  • vector_field_module – free module \(\mathcal{X}(U,\Phi)\) of vector fields along \(U\) associated with the map \(\Phi: U \rightarrow V\)
  • degree – positive integer; the degree \(p\) of the differential forms

EXAMPLES:

Free module of 2-forms 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.diff_form_module(2) ; A
Free module /\^2(M) of 2-forms on the 3-dimensional differentiable
 manifold M
sage: latex(A)
\Lambda^{2}\left(M\right)

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

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

sage: A(0)
2-form zero on the 3-dimensional differentiable manifold M
sage: A(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-form a on the 3-dimensional differentiable manifold M
sage: a.display()
a = 3*x dx/\dy - z dx/\dz + 4 dy/\dz

An alternative is to construct the 2-form 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 dx/\dy - z dx/\dz + 4 dy/\dz

The module \(\Lambda^1(M)\) is nothing but the dual of \(\mathcal{X}(M)\) (the free module of vector fields on \(M\)):

sage: L1 = M.diff_form_module(1) ; L1
Free module /\^1(M) of 1-forms on the 3-dimensional differentiable
 manifold M
sage: L1 is XM.dual()
True

Since any tensor field of type \((0,1)\) is a 1-form, there is a coercion map from the set \(T^{(0,1)}(M)\) of such tensors to \(\Lambda^1(M)\):

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

There is also a coercion map in the reverse direction:

sage: T01.has_coerce_map_from(L1)
True

For a degree \(p \geq 2\), the coercion holds only in the direction \(\Lambda^p(M) \rightarrow T^{(0,p)}(M)\):

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

The coercion map \(T^{(0,1)}(M) \rightarrow \Lambda^1(M)\) in action:

sage: b = T01([-x,2,3*y], name='b'); b
Tensor field b of type (0,1) on the 3-dimensional differentiable
 manifold M
sage: b.display()
b = -x dx + 2 dy + 3*y dz
sage: lb = L1(b) ; lb
1-form b on the 3-dimensional differentiable manifold M
sage: lb.display()
b = -x dx + 2 dy + 3*y dz

The coercion map \(\Lambda^1(M) \rightarrow T^{(0,1)}(M)\) in action:

sage: tlb = T01(lb); tlb
Tensor field b of type (0,1) on
 the 3-dimensional differentiable manifold M
sage: tlb == b
True

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

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

There is also coercion to subdomains, which is nothing but the restrictionof the differential form to some subset of its domain:

sage: U = M.open_subset('U', coord_def={X: x^2+y^2<1})
sage: B = U.diff_form_module(2) ; B
Free module /\^2(U) of 2-forms 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-form a on the Open subset U of the 3-dimensional differentiable
 manifold M
sage: a_U.display()
a = 3*x dx/\dy - z dx/\dz + 4 dy/\dz
Element

alias of DiffFormParal

class sage.manifolds.differentiable.diff_form_module.DiffFormModule(vector_field_module, degree)

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

Module of differential forms of a given degree \(p\) (\(p\)-forms) 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 \(\Lambda^p(U, \Phi)\) of \(p\)-forms 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\)-forms 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 \(\Lambda^p(U,\Phi)\) in the case where \(M\) is not assumed to be parallelizable; the module \(\Lambda^p(U, \Phi)\) is then not necessarily free. If \(M\) is parallelizable, the class DiffFormFreeModule must be used instead.

INPUT:

  • vector_field_module – module \(\mathcal{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 differential forms

EXAMPLES:

Module of 2-forms 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.diff_form_module(2) ; A
Module /\^2(M) of 2-forms on the 2-dimensional differentiable manifold M
sage: latex(A)
\Lambda^{2}\left(M\right)

Modules of differential forms are unique:

sage: A is M.diff_form_module(2)
True

\(\Lambda^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

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

sage: z = A(0) ; z
2-form 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

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-form a on the 2-dimensional differentiable manifold M
sage: a.add_comp_by_continuation(eV, W, c_uv) # finishes the initialization of a
sage: a.display(eU)
a = 3*x dx/\dy
sage: a.display(eV)
a = (-3/4*u - 3/4*v) du/\dv

An alternative is to construct the 2-form 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.add_comp_by_continuation(eV, W, c_uv)
sage: a.display(eU)
a = 3*x dx/\dy
sage: a.display(eV)
a = (-3/4*u - 3/4*v) du/\dv

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

sage: L1 = M.diff_form_module(1) ; L1
Module /\^1(M) of 1-forms on the 2-dimensional differentiable manifold M
sage: L1 is XM.dual()
True

Since any tensor field of type \((0,1)\) is a 1-form, there is a coercion map from the set \(T^{(0,1)}(M)\) of such tensors to \(\Lambda^1(M)\):

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

There is also a coercion map in the reverse direction:

sage: T01.has_coerce_map_from(L1)
True

For a degree \(p \geq 2\), the coercion holds only in the direction \(\Lambda^p(M)\rightarrow T^{(0,p)}(M)\):

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

The coercion map \(T^{(0,1)}(M) \rightarrow \Lambda^1(M)\) in action:

sage: b = T01([y,x], frame=eU, name='b') ; b
Tensor field b of type (0,1) on the 2-dimensional differentiable
 manifold M
sage: b.add_comp_by_continuation(eV, W, c_uv)
sage: b.display(eU)
b = y dx + x dy
sage: b.display(eV)
b = 1/2*u du - 1/2*v dv
sage: lb = L1(b) ; lb
1-form b on the 2-dimensional differentiable manifold M
sage: lb.display(eU)
b = y dx + x dy
sage: lb.display(eV)
b = 1/2*u du - 1/2*v dv

The coercion map \(\Lambda^1(M) \rightarrow T^{(0,1)}(M)\) in action:

sage: tlb = T01(lb) ; tlb
Tensor field b of type (0,1) on the 2-dimensional differentiable
 manifold M
sage: tlb.display(eU)
b = y dx + x dy
sage: tlb.display(eV)
b = 1/2*u du - 1/2*v dv
sage: tlb == b
True

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

sage: ta = T02(a) ; ta
Tensor field a of type (0,2) on the 2-dimensional differentiable
 manifold M
sage: ta.display(eU)
a = 3*x dx*dy - 3*x dy*dx
sage: a.display(eU)
a = 3*x dx/\dy
sage: ta.display(eV)
a = (-3/4*u - 3/4*v) du*dv + (3/4*u + 3/4*v) dv*du
sage: a.display(eV)
a = (-3/4*u - 3/4*v) du/\dv

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

sage: L2U = U.diff_form_module(2) ; L2U
Free module /\^2(U) of 2-forms on the Open subset U of the
 2-dimensional differentiable manifold M
sage: L2U.has_coerce_map_from(A)
True
sage: a_U = L2U(a) ; a_U
2-form a on the Open subset U of the 2-dimensional differentiable
 manifold M
sage: a_U.display(eU)
a = 3*x dx/\dy
Element

alias of DiffForm

base_module()

Return the vector field module on which the differential form module is constructed.

OUTPUT:

  • a VectorFieldModule representing the module on which the differential form module is defined

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: A2 = M.diff_form_module(2) ; A2
Module /\^2(M) of 2-forms 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.diff_form_module(2) ; A2U
Module /\^2(U) of 2-forms 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
degree()

Return the degree of the differential forms in the module.

OUTPUT:

  • integer \(p\) such that the module is a set of \(p\)-forms

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: M.diff_form_module(1).degree()
1
sage: M.diff_form_module(2).degree()
2
sage: M.diff_form_module(3).degree()
3
zero()

Return the zero of self.

EXAMPLES:

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