# Differential Form Modules#

The set $$\Omega^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 $$\Omega^p(U, \Phi)$$:

AUTHORS:

REFERENCES:

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

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$$ of dimension $$n$$, the set $$\Omega^p(U, \Phi)$$ of $$p$$-forms 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$$-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 $$\Omega^p(U, \Phi)$$ in the case where $$M$$ is parallelizable; $$\Omega^p(U, \Phi)$$ is then a free module. If $$M$$ is not parallelizable, the class DiffFormModule must be used instead.

For the special case of 1-forms, use the class VectorFieldDualFreeModule.

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 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 Omega^2(M) of 2-forms on the 3-dimensional differentiable
manifold M
sage: latex(A)
\Omega^{2}\left(M\right)


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

sage: A is XM.dual_exterior_power(2)
True


$$\Omega^{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


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 $$\Omega^1(M)$$ is nothing but the dual of $$\mathfrak{X}(M)$$ (the free module of vector fields on $$M$$):

sage: L1 = M.diff_form_module(1) ; L1
Free module Omega^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, it is also equal to the set $$T^{(0,1)}(M)$$ of such tensors to $$\Omega^1(M)$$:

sage: T01 = M.tensor_field_module((0,1)) ; T01
Free module Omega^1(M) of 1-forms on the 3-dimensional differentiable manifold M
sage: L1 is T01
True


For a degree $$p \geq 2$$, the coercion holds only in the direction $$\Omega^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 $$\Omega^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 restriction of 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 Omega^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)#

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 $$\Omega^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 $$\Omega^p(U,\Phi)$$ in the case where $$M$$ is not assumed to be parallelizable; the module $$\Omega^p(U, \Phi)$$ is then not necessarily free. If $$M$$ is parallelizable, the class DiffFormFreeModule 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 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 Omega^2(M) of 2-forms on the 2-dimensional differentiable
manifold M
sage: latex(A)
\Omega^{2}\left(M\right)


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

sage: A is XM.dual_exterior_power(2)
True


Modules of differential forms are unique:

sage: A is M.diff_form_module(2)
True


$$\Omega^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 initializ. 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.display(eU)
a = 3*x dx∧dy
sage: a.display(eV)
a = (-3/4*u - 3/4*v) du∧dv


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

sage: L1 = M.diff_form_module(1) ; L1
Module Omega^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 $$\Omega^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 $$\Omega^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 \Omega^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.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 $$\Omega^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 $$\Omega^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 Omega^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 self is constructed.

OUTPUT:

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: A2 = M.diff_form_module(2) ; A2
Module Omega^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 Omega^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 self.

OUTPUT:

• integer $$p$$ such that self 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

tensor(*others)#

Return the tensor product of self and others.

EXAMPLES:

sage: M = FiniteRankFreeModule(QQ, 2)
sage: M.tensor_product(M)
Free module of type-(2,0) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_product(M.dual())
Free module of type-(1,1) tensors on the 2-dimensional vector space over the Rational Field
sage: M.dual().tensor_product(M, M.dual())
Free module of type-(1,2) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_product(M.tensor_module(1,2))
Free module of type-(2,2) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_module(1,2).tensor_product(M)
Free module of type-(2,2) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_module(1,1).tensor_product(M.tensor_module(1,2))
Free module of type-(2,3) tensors on the 2-dimensional vector space over the Rational Field

sage: Sym2M = M.tensor_module(2, 0, sym=range(2)); Sym2M
Free module of fully symmetric type-(2,0) tensors on the 2-dimensional vector space over the Rational Field
sage: Sym01x23M = Sym2M.tensor_product(Sym2M); Sym01x23M
Free module of type-(4,0) tensors on the 2-dimensional vector space over the Rational Field,
with symmetry on the index positions (0, 1), with symmetry on the index positions (2, 3)
sage: Sym01x23M._index_maps
((0, 1), (2, 3))

sage: N = M.tensor_module(3, 3, sym=[1, 2], antisym=[3, 4]); N
Free module of type-(3,3) tensors on the 2-dimensional vector space over the Rational Field,
with symmetry on the index positions (1, 2),
with antisymmetry on the index positions (3, 4)
sage: NxN = N.tensor_product(N); NxN
Free module of type-(6,6) tensors on the 2-dimensional vector space over the Rational Field,
with symmetry on the index positions (1, 2), with symmetry on the index positions (4, 5),
with antisymmetry on the index positions (6, 7), with antisymmetry on the index positions (9, 10)
sage: NxN._index_maps
((0, 1, 2, 6, 7, 8), (3, 4, 5, 9, 10, 11))

tensor_product(*others)#

Return the tensor product of self and others.

EXAMPLES:

sage: M = FiniteRankFreeModule(QQ, 2)
sage: M.tensor_product(M)
Free module of type-(2,0) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_product(M.dual())
Free module of type-(1,1) tensors on the 2-dimensional vector space over the Rational Field
sage: M.dual().tensor_product(M, M.dual())
Free module of type-(1,2) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_product(M.tensor_module(1,2))
Free module of type-(2,2) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_module(1,2).tensor_product(M)
Free module of type-(2,2) tensors on the 2-dimensional vector space over the Rational Field
sage: M.tensor_module(1,1).tensor_product(M.tensor_module(1,2))
Free module of type-(2,3) tensors on the 2-dimensional vector space over the Rational Field

sage: Sym2M = M.tensor_module(2, 0, sym=range(2)); Sym2M
Free module of fully symmetric type-(2,0) tensors on the 2-dimensional vector space over the Rational Field
sage: Sym01x23M = Sym2M.tensor_product(Sym2M); Sym01x23M
Free module of type-(4,0) tensors on the 2-dimensional vector space over the Rational Field,
with symmetry on the index positions (0, 1), with symmetry on the index positions (2, 3)
sage: Sym01x23M._index_maps
((0, 1), (2, 3))

sage: N = M.tensor_module(3, 3, sym=[1, 2], antisym=[3, 4]); N
Free module of type-(3,3) tensors on the 2-dimensional vector space over the Rational Field,
with symmetry on the index positions (1, 2),
with antisymmetry on the index positions (3, 4)
sage: NxN = N.tensor_product(N); NxN
Free module of type-(6,6) tensors on the 2-dimensional vector space over the Rational Field,
with symmetry on the index positions (1, 2), with symmetry on the index positions (4, 5),
with antisymmetry on the index positions (6, 7), with antisymmetry on the index positions (9, 10)
sage: NxN._index_maps
((0, 1, 2, 6, 7, 8), (3, 4, 5, 9, 10, 11))

tensor_type()#

Return the tensor type of self if self is a module of 1-forms.

In this case, the pair $$(0, 1)$$ is returned, indicating that the module is identified with the dual of the base module.

For differential forms of other degrees, an exception is raised.

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: M.diff_form_module(1).tensor_type()
(0, 1)
sage: M.diff_form_module(2).tensor_type()
Traceback (most recent call last):
...
NotImplementedError

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

class sage.manifolds.differentiable.diff_form_module.VectorFieldDualFreeModule(vector_field_module)#

Free module of differential 1-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$$ of dimension $$n$$, the set $$\Omega^1(U, \Phi)$$ of 1-forms along $$U$$ with values on $$M$$ is a free module of rank $$n$$ over $$C^k(U)$$, the commutative algebra of differentiable scalar fields on $$U$$ (see DiffScalarFieldAlgebra). The standard case of 1-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 $$\Omega^1(U, \Phi)$$ in the case where $$M$$ is parallelizable; $$\Omega^1(U, \Phi)$$ is then a free module. If $$M$$ is not parallelizable, the class DiffFormModule 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$$

EXAMPLES:

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


A is nothing but the dual of XM (the free module of vector fields on $$M$$) and thus also equal to the 1st exterior power of the dual, i.e. we have $$\Omega^{1}(M) = \Lambda^1(\mathfrak{X}(M)^*) = \mathfrak{X}(M)^*$$ (See ExtPowerDualFreeModule):

sage: A is XM.dual_exterior_power(1)
True


$$\Omega^{1}(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


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

sage: A(0)
1-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 = [3*x,-z,4]
sage: a = A(comp, frame=X.frame(), name='a') ; a
1-form a on the 3-dimensional differentiable manifold M
sage: a.display()
a = 3*x dx - z dy + 4 dz


An alternative is to construct the 1-form from an empty list of components and to set the nonzero nonredundant components afterwards:

sage: a = A([], name='a')
sage: a = 3*x  # component in the manifold's default frame
sage: a = -z
sage: a = 4
sage: a.display()
a = 3*x dx - z dy + 4 dz


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 $$\Omega^1(M)$$:

sage: T01 = M.tensor_field_module((0,1)) ; T01
Free module Omega^1(M) of 1-forms on the 3-dimensional differentiable manifold M
sage: A.has_coerce_map_from(T01)
True


There is also a coercion map in the reverse direction:

sage: T01.has_coerce_map_from(A)
True


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

sage: b = T01([-x,2,3*y], name='b'); b
1-form b on the 3-dimensional differentiable manifold M
sage: b.display()
b = -x dx + 2 dy + 3*y dz
sage: lb = A(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 $$\Omega^1(M) \rightarrow T^{(0,1)}(M)$$ in action:

sage: tlb = T01(lb); tlb
1-form b on the 3-dimensional differentiable manifold M
sage: tlb == b
True

tensor_type()#

Return the tensor type of self.

EXAMPLES:

sage: M = Manifold(3, 'M')
sage: X.<x,y,z> = M.chart()
sage: A = M.vector_field_module().dual(); A
Free module Omega^1(M) of 1-forms on the 3-dimensional differentiable manifold M
sage: A.tensor_type()
(0, 1)