Bundle Connections

Let \(E \to M\) be a smooth vector bundle of rank \(n\) over a smooth manifold \(M\) and over a non-discrete topological field \(K\) (typically \(K=\RR\) or \(K=\CC\)). A bundle connection on this vector bundle is a \(K\)-linear map

\[\nabla : C^\infty(M;E) \to C^\infty(M;E \otimes T^*M)\]

such that the Leibniz rule applies for each scalar field \(f \in C^\infty(M)\) and section \(s \in C^\infty(M;E)\):

\[\nabla(f \, s) = f \cdot \nabla s + s \otimes \mathrm{d}f .\]

If \(e\) is a local frame on \(E\), we have

\[\nabla e_i = \sum^n_{j=1} e_j \otimes \omega^j_i ,\]

and the corresponding \(n \times n\)-matrix \((\omega^j_i)_{i,j}\) consisting of one forms is called connection matrix of \(\nabla\) with respect to \(e\).

AUTHORS:

  • Michael Jung (2019) : initial version
class sage.manifolds.differentiable.bundle_connection.BundleConnection(vbundle, name, latex_name=None)

Bases: sage.structure.sage_object.SageObject

An instance of this class represents a bundle connection \(\nabla\) on a smooth vector bundle \(E \to M\).

INPUT:

  • vbundle – the vector bundle on which the connection is defined (must be an instance of class DifferentiableVectorBundle)
  • name – name given to the bundle connection
  • latex_name – (default: None) LaTeX symbol to denote the bundle connection; if None, it is set to name

EXAMPLES:

Define a bundle connection on a rank 2 vector bundle over some 3-dimensional smooth manifold:

sage: M = Manifold(3, 'M', start_index=1)
sage: X.<x,y,z> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: e = E.local_frame('e') # standard frame for E
sage: nab = E.bundle_connection('nabla', latex_name=r'\nabla'); nab
Bundle connection nabla on the Differentiable real vector bundle E -> M
 of rank 2 over the base space 3-dimensional differentiable manifold M

The bundle connection is specified by the connection 1-forms:

sage: a = M.one_form([x*z, y*z, z^2], name='a')
sage: b = M.one_form([x, x^2, x^3], name='b')
sage: nab.set_connection_form(1, 2, a)
sage: nab.set_connection_form(1, 1, b)

From this, the connection 2-forms can be derived:

sage: for i in E.irange():
....:     for j in E.irange():
....:         print(nab.curvature_form(i ,j).display())
curvature (1,1) of bundle connection nabla w.r.t. Local frame
 (E|_M, (e_1,e_2)) = 2*x dx/\dy + 3*x^2 dx/\dz
curvature (1,2) of bundle connection nabla w.r.t. Local frame
 (E|_M, (e_1,e_2)) = (x^3 - x*y)*z dx/\dy + (x^4*z - x*z^2 - x) dx/\dz +
 (x^3*y*z - x^2*z^2 - y) dy/\dz
curvature (2,1) of bundle connection nabla w.r.t. Local frame
 (E|_M, (e_1,e_2)) = 0
curvature (2,2) of bundle connection nabla w.r.t. Local frame
 (E|_M, (e_1,e_2)) = 0

They certainly obey the structure equation:

sage: omega = nab.connection_form
sage: check = []
sage: for i in E.irange():  # long time
....:     for j in E.irange():
....:         check.append(nab.curvature_form(i,j,e) == \
....:                       omega(i,j,e).exterior_derivative() + \
....:         sum(omega(k,j,e).wedge(omega(i,k,e)) for k in E.irange()))
sage: check  # long time
[True, True, True, True]
add_connection_form(i, j, form, frame=None)

Assign the connection 1-form corresponding to the given index and local frame.

See method connection_forms() for details about the definition of the connection forms.

To delete the connection forms in other frames, use the method set_connection_form() instead.

INPUT:

  • i, j – indices identifying the 1-form \(\omega^i_j\)
  • frame – (default: None) local frame in which the connection 1-form is defined; if None, the default frame of the vector bundle is assumed.

Warning

If the connection has already forms in other frames, it is the user’s responsibility to make sure that the 1-forms to be added are consistent with them.

OUTPUT:

  • connection 1-form \(\omega^i_j\) in the given frame, as an instance of the class DiffForm; if such connection 1-form did not exist previously, it is created. See method connection_forms() for the storage convention of the connection 1-forms.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: e = E.local_frame('e') # standard frame for E
sage: nab = E.bundle_connection('nabla', latex_name=r'\nabla')
sage: a = M.one_form([x^2, x], name='a')
sage: b = M.one_form([y^2, y], name='b')
sage: nab.add_connection_form(0, 1, a, frame=e)
sage: nab.connection_form(0, 1)
1-form a on the 2-dimensional differentiable manifold M

Since e is the vector bundle’s default local frame, its mention may be omitted:

sage: nab.add_connection_form(1, 0, b)
sage: nab.connection_form(1, 0)
1-form b on the 2-dimensional differentiable manifold M

Adding connection 1-forms w.r.t. to another local frame:

sage: f = E.local_frame('f')
sage: nab.add_connection_form(1, 1, a+b, frame=f)
sage: nab.connection_form(1, 1, frame=f)
1-form a+b on the 2-dimensional differentiable manifold M

The forms w.r.t. the frame e have been kept:

sage: nab.connection_form(0, 1, frame=e)
1-form a on the 2-dimensional differentiable manifold M

To delete them, use the method set_connection_form() instead.

connection_form(i, j, frame=None)

Return the connection 1-form corresponding to the given index and local frame.

INPUT:

  • i, j – indices identifying the 1-form \(\omega^i_j\)
  • frame – (default: None) local frame relative to which the connection 1-forms are defined; if None, the default frame of the vector bundle’s corresponding section module is assumed.

OUTPUT:

  • the 1-form \(\omega^i_{\ \, j}\), as an instance of DiffForm

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: e = E.local_frame('e') # standard frame for E
sage: nab = E.bundle_connection('nabla', latex_name=r'\nabla')
sage: a = M.one_form([x^2, x], name='a')
sage: b = M.one_form([y^2, y], name='b')
sage: nab.set_connection_form(0, 1, a)
sage: nab.set_connection_form(1, 0, b)
sage: nab.connection_form(0, 1)
1-form a on the 2-dimensional differentiable manifold M
sage: nab.connection_form(0, 0)
1-form zero on the 2-dimensional differentiable manifold M
connection_forms(frame=None)

Return the connection forms relative to the given frame.

If \(e\) is a local frame on \(E\), we have

\[\nabla e_i = \sum^n_{j=1} e_j \otimes \omega^j_i ,\]

and the corresponding \(n \times n\)-matrix \((\omega^j_i)_{i,j}\) consisting of one forms is called connection matrix of \(\nabla\) with respect to \(e\).

INPUT:

  • frame – (default: None) local frame relative to which the connection forms are required; if none is provided, the vector bundle’s default frame is assumed

OUTPUT:

  • connection forms relative to the frame frame, as a dictionary with tuples \((i, j)\) as key and one forms as instances of diff_form as value representing the matrix entries.

EXAMPLES:

Connection forms of a bundle connection on a rank 2 vector bundle over a 3-dimensional manifold:

sage: M = Manifold(3, 'M', start_index=1)
sage: c_xyz.<x,y,z> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: e = E.local_frame('e')
sage: nab = E.bundle_connection('nabla', r'\nabla')
sage: a = M.one_form([x^2, z, x], name='a')
sage: b = M.one_form([y^2, z, y], name='b')
sage: nab.set_connection_form(1, 1, a)
sage: nab.set_connection_form(2, 2, b)
sage: nab.connection_forms() # random
{(1, 1): 1-form a on the 3-dimensional differentiable manifold M,
 (1, 2): 1-form zero on the 3-dimensional differentiable manifold M,
 (2, 1): 1-form zero on the 3-dimensional differentiable manifold M,
 (2, 2): 1-form b on the 3-dimensional differentiable manifold M}
curvature_form(i, j, frame=None)

Return the curvature 2-form corresponding to the given index and local frame.

The curvature 2-forms with respect to the frame \(e\) are the 2-forms \(\Omega^i_j\) given by the formula

\[\Omega^j_i = \mathrm{d} \omega^j_i + \sum^n_{k=1} \omega^j_k \wedge \omega^k_i\]

INPUT:

  • i, j – indices identifying the 2-form \(\Omega^i_j\)
  • frame – (default: None) local frame relative to which the curvature 2-forms are defined; if None, the default frame of the vector bundle is assumed.

OUTPUT:

  • the 2-form \(\Omega^i_j\), as an instance of DiffForm

EXAMPLES:

sage: M = Manifold(2, 'M', start_index=1)
sage: X.<x,y> = M.chart()
sage: E = M.vector_bundle(1, 'E')
sage: nab = E.bundle_connection('nabla', latex_name=r'\nabla')
sage: e = E.local_frame('e')
sage: a = M.one_form([x^2, x], name='a')
sage: nab.set_connection_form(1, 1, a)
sage: curv = nab.curvature_form(1, 1); curv
2-form curvature (1,1) of bundle connection nabla w.r.t. Local
 frame (E|_M, (e_1)) on the 2-dimensional differentiable manifold M
sage: curv.display()
curvature (1,1) of bundle connection nabla w.r.t. Local frame
 (E|_M, (e_1)) = dx/\dy
del_other_forms(frame=None)

Delete all the connection forms but those corresponding to frame.

INPUT:

  • frame – (default: None) local frame, the connection forms w.r.t. which are to be kept; if None, the default frame of the vector bundle is assumed.

EXAMPLES:

We first create two sets of connection coefficients:

sage: M = Manifold(2, 'M', start_index=1)
sage: X.<x,y> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: nab = E.bundle_connection('nabla', latex_name=r'\nabla')
sage: e = E.local_frame('e')
sage: a = M.one_form([x^2, x], name='a')
sage: b = M.one_form([y^2, y], name='b')
sage: nab.set_connection_form(1, 1, a, frame=e)
sage: f = M.vector_frame('f')
sage: nab.add_connection_form(1, 1, b, frame=e)

Let us reset the connection coefficients w.r.t. all frames except for frame e:

sage: nab.del_other_forms(e)
sage: nab.connection_form(1, 1, frame=f)
1-form zero on the 2-dimensional differentiable manifold M
set_connection_form(i, j, form, frame=None)

Return the connection coefficients in a given frame for assignment.

See method connection_forms() for details about the definition of the connection forms.

The connection forms with respect to other frames are deleted, in order to avoid any inconsistency. To keep them, use the method add_connection_form() instead.

INPUT:

  • i, j – indices identifying the 1-form \(\omega^i_j\)
  • frame – (default: None) local frame in which the connection 1-form is defined; if None, the default frame of the vector bundle is assumed.

EXAMPLES:

Setting the connection forms of a bundle connection w.r.t. some local frame:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: e = E.local_frame('e') # standard frame for E
sage: nab = E.bundle_connection('nabla', latex_name=r'\nabla')
sage: a = M.one_form([x^2, x], name='a')
sage: b = M.one_form([y^2, y], name='b')
sage: nab.set_connection_form(0, 1, a, frame=e)
sage: nab.connection_form(0, 1)
1-form a on the 2-dimensional differentiable manifold M

Since e is the vector bundle’s default local frame, its mention may be omitted:

sage: nab.set_connection_form(1, 0, b)
sage: nab.connection_form(1, 0)
1-form b on the 2-dimensional differentiable manifold M

Setting connection 1-forms w.r.t. to another local frame:

sage: f = E.local_frame('f')
sage: nab.set_connection_form(1, 1, a+b, frame=f)
sage: nab.connection_form(1, 1, frame=f)
1-form a+b on the 2-dimensional differentiable manifold M

The forms w.r.t. the frame e have been resetted:

sage: nab.connection_form(0, 1, frame=f)
1-form zero on the 2-dimensional differentiable manifold M

To keep them, use the method add_connection_form() instead.

vector_bundle()

Return the vector bundle on which the bundle connection is defined.

OUTPUT:

EXAMPLES:

sage: M = Manifold(3, 'M', start_index=1)
sage: c_xyz.<x,y,z> = M.chart()
sage: E = M.vector_bundle(2, 'E')
sage: nab = E.bundle_connection('nabla', r'\nabla')
sage: nab.vector_bundle()
Differentiable real vector bundle E -> M of rank 2 over the base
 space 3-dimensional differentiable manifold M