Bundle Connections¶
Let \(E \to M\) be a smooth vector bundle of rank \(n\) over a smooth manifold \(M\) and over a nondiscrete topological field \(K\) (typically \(K=\RR\) or \(K=\CC\)). A bundle connection on this vector bundle is a \(K\)linear map
such that the Leibniz rule applies for each scalar field \(f \in C^\infty(M)\) and section \(s \in C^\infty(M;E)\):
If \(e\) is a local frame on \(E\), we have
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 classDifferentiableVectorBundle
)name
– name given to the bundle connectionlatex_name
– (default:None
) LaTeX symbol to denote the bundle connection; ifNone
, it is set toname
EXAMPLES:
Define a bundle connection on a rank 2 vector bundle over some 3dimensional 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'); nab Bundle connection nabla on the Differentiable real vector bundle E > M of rank 2 over the base space 3dimensional differentiable manifold M
First, let us initialize all connection 1forms w.r.t. the frame
e
to zero:sage: nab[e, :] = [[0, 0], [0, 0]]
This line can be shortened by the following:
sage: nab[e, :] = 0 # initialize to zero
The connection 1forms are now initialized being differential 1forms:
sage: nab[e, 1, 1].parent() Free module Omega^1(M) of 1forms on the 3dimensional differentiable manifold M sage: nab[e, 1, 1].display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = 0
Now, we want to specify some nonzero entries:
sage: nab[e, 1, 2][:] = [x*z, y*z, z^2] sage: nab[e, 2, 1][:] = [x, x^2, x^3] sage: nab[e, 1, 1][:] = [x+z, yz, x*y*z] sage: nab.display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = (x + z) dx + (y  z) dy + x*y*z dz connection (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x*z dx + y*z dy + z^2 dz connection (2,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx + x^2 dy + x^3 dz
Notice, when we omit the frame, the default frame of the vector bundle is assumed (in this case
e
):sage: nab[2, 2].display() connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = 0
The same holds for the assignment:
sage: nab[1, 2] = 0 sage: nab[e, 1, 2].display() connection (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = 0
We can also use
set_connection_form()
to specify the connection 1forms:sage: nab[:] = 0 # reinitialize to zero sage: nab.set_connection_form(1, 2)[:] = [x*z, y*z, z^2] sage: nab.set_connection_form(2, 1)[:] = [x, x^2, x^3] sage: nab[1, 2].display() connection (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x*z dx + y*z dy + z^2 dz sage: nab[2, 1].display() connection (2,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx + x^2 dy + x^3 dz
Note
Notice that list assignments and
set_connection_form()
delete the connection 1forms w.r.t. other frames for consistency reasons. To avoid this behavior,add_connection_form()
must be used instead.By definition, a bundle connection acts on vector fields and sections:
sage: v = M.vector_field((x^2,y^2,z^2), name='v'); v.display() v = x^2 d/dx + y^2 d/dy + z^2 d/dz sage: s = E.section((xy^2, z), name='s'); s.display() s = (y^2 + x) e_1  z e_2 sage: nab_vs = nab(v, s); nab_vs Section nabla_v(s) on the 3dimensional differentiable manifold M with values in the real vector bundle E of rank 2 sage: nab_vs.display() nabla_v(s) = (x^3*z^3  2*y^3 + x^2  (x^2*y^2 + x^3)*z) e_1 + ((y^2  x)*z^4  (x^3*y^2 + y^5  x^4  x*y^3)*z  z^2) e_2
The bundle connection action certainly obeys the defining formula for the connection 1forms:
sage: vframe = X.frame() sage: all(nab(vframe[k], e[i]) == sum(nab[e, i, j](vframe[k])*e[j] ....: for j in E.irange()) ....: for i in E.irange() for k in M.irange()) True
The connection 1forms are computed automatically for different frames:
sage: f = E.local_frame('f', ((1+x^2)*e[1], e[1]e[2])) sage: nab.display(frame=f) connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (f_1,f_2)) = ((x^3 + x)*z + 2*x)/(x^2 + 1) dx + y*z dy + z^2 dz connection (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (f_1,f_2)) = (x^3 + x)*z dx  (x^2 + 1)*y*z dy  (x^2 + 1)*z^2 dz connection (2,1) of bundle connection nabla w.r.t. Local frame (E_M, (f_1,f_2)) = (x*z  x)/(x^2 + 1) dx  (x^2  y*z)/(x^2 + 1) dy  (x^3  z^2)/(x^2 + 1) dz connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (f_1,f_2)) = x*z dx  y*z dy  z^2 dz
The new connection 1forms obey the defining formula, too:
sage: all(nab(vframe[k], f[i]) == sum(nab[f, i, j](vframe[k])*f[j] ....: for j in E.irange()) ....: for i in E.irange() for k in M.irange()) True
After the connection has been specified, the curvature 2forms can be derived:
sage: Omega = nab.curvature_form sage: for i in E.irange(): ....: for j in E.irange(): ....: print(Omega(i ,j, e).display()) curvature (1,1) 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) dx/\dz + (x^3*y*z + x^2*z^2) dy/\dz curvature (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx/\dz  y dy/\dz curvature (2,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 (2,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) dx/\dz + (x^3*y*z  x^2*z^2) dy/\dz
The derived forms certainly obey the structure equations, see
curvature_form()
for details:sage: omega = nab.connection_form sage: check = [] sage: for i in E.irange(): # long time ....: for j in E.irange(): ....: check.append(Omega(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=None, frame=None)¶ Return the connection form \(\omega^j_i\) in a given frame for assignment.
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 1form \(\omega^j_i\)frame
– (default:None
) local frame in which the connection 1form is defined; ifNone
, 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 1forms to be added are consistent with them.
OUTPUT:
connection 1form \(\omega^j_i\) in the given frame, as an instance of the class
DiffForm
; if such connection 1form did not exist previously, it is created. See methodconnection_forms()
for the storage convention of the connection 1forms.
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: nab.add_connection_form(0, 1, frame=e)[:] = [x^2, x] sage: nab[e, 0, 1].display() connection (0,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = x^2 dx + x dy
Since
e
is the vector bundle’s default local frame, its mention may be omitted:sage: nab.add_connection_form(1, 0)[:] = [y^2, y] sage: nab[1, 0].display() connection (1,0) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = y^2 dx + y dy
Adding connection 1forms w.r.t. to another local frame:
sage: f = E.local_frame('f') sage: nab.add_connection_form(1, 1, frame=f)[:] = [x, y] sage: nab[f, 1, 1].display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (f_0,f_1)) = x dx + y dy
The forms w.r.t. the frame
e
have been kept:sage: nab[e, 0, 1].display() connection (0,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = x^2 dx + x dy
To delete them, use the method
set_connection_form()
instead.

connection_form
(i, j, frame=None)¶ Return the connection 1form corresponding to the given index and local frame.
See also
Consult
connection_forms()
for detailed information.INPUT:
i
,j
– indices identifying the 1form \(\omega^j_i\)frame
– (default:None
) local frame relative to which the connection 1forms are defined; ifNone
, the default frame of the vector bundle’s corresponding section module is assumed.
OUTPUT:
the 1form \(\omega^j_i\), 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: nab.set_connection_form(0, 1)[:] = [x^2, x] sage: nab.set_connection_form(1, 0)[:] = [y^2, y] sage: nab.connection_form(0, 1).display() connection (0,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = x^2 dx + x dy sage: nab.connection_form(1, 0).display() connection (1,0) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = y^2 dx + y dy

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\).
If the connection coefficients are not known already, they are computed from the above formula.
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 ofdiff_form
as value representing the matrix entries.
EXAMPLES:
Connection forms of a bundle connection on a rank 2 vector bundle over a 3dimensional 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: nab[:] = 0 # initialize curvature forms sage: forms = nab.connection_forms() sage: [forms[k] for k in sorted(forms)] [1form connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) on the 3dimensional differentiable manifold M, 1form connection (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) on the 3dimensional differentiable manifold M, 1form connection (2,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) on the 3dimensional differentiable manifold M, 1form connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) on the 3dimensional differentiable manifold M]

curvature_form
(i, j, frame=None)¶ Return the curvature 2form corresponding to the given index and local frame.
The curvature 2forms with respect to the frame \(e\) are the 2forms \(\Omega^j_i\) 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 2form \(\Omega^j_i\)frame
– (default:None
) local frame relative to which the curvature 2forms are defined; ifNone
, the default frame of the vector bundle is assumed.
OUTPUT:
the 2form \(\Omega^j_i\), 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: nab.set_connection_form(1, 1)[:] = [x^2, x] sage: curv = nab.curvature_form(1, 1); curv 2form curvature (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1)) on the 2dimensional 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; ifNone
, the default frame of the vector bundle is assumed.
EXAMPLES:
We first create two sets of connection forms:
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: nab.set_connection_form(1, 1, frame=e)[:] = [x^2, x] sage: f = E.local_frame('f') sage: nab.add_connection_form(1, 1, frame=f)[:] = [y^2, y] sage: nab[e, 1, 1].display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x^2 dx + x dy sage: nab[f, 1, 1].display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (f_1,f_2)) = y^2 dx + y dy
Let us delete the connection forms w.r.t. all frames except for frame
e
:sage: nab.del_other_forms(e) sage: nab[e, 1, 1].display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x^2 dx + x dy
The connection forms w.r.t. frame
e
have indeed been deleted:sage: nab[f, :] Traceback (most recent call last): ... ValueError: no basis could be found for computing the components in the Local frame (E_M, (e_1,e_2))

display
(frame=None, vector_frame=None, chart=None, only_nonzero=True)¶ Display all the connection 1forms w.r.t. to a given local frame, one per line.
The output is either textformatted (console mode) or LaTeXformatted (notebook mode).
INPUT:
frame
– (default:None
) local frame of the vector bundle relative to which the connection 1forms are defined; ifNone
, the default frame of the bundle is usedvector_frame
– (default:None
) vector frame of the manifold relative to which the connection 1forms should be displayed; ifNone
, the default frame of the local frame’s domain is usedchart
– (default:None
) chart specifying the coordinate expression of the connection 1forms; ifNone
, the default chart of the domain offrame
is usedonly_nonzero
– (default:True
) boolean; ifTrue
, only nonzero connection coefficients are displayed
EXAMPLES:
Set connection 1forms:
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 3dimensional differentiable manifold M sage: nab[:] = 0 sage: nab[1, 1][:] = [x, y, z] sage: nab[2, 2][:] = [x^2, y^2, z^2]
By default, only the nonzero connection coefficients are displayed:
sage: nab.display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx + y dy + z dz connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x^2 dx + y^2 dy + z^2 dz sage: latex(nab.display()) \begin{array}{lcl} \omega^1_{\ \, 1} = x \mathrm{d} x + y \mathrm{d} y + z \mathrm{d} z \\ \omega^2_{\ \, 2} = x^{2} \mathrm{d} x + y^{2} \mathrm{d} y + z^{2} \mathrm{d} z \end{array}
By default, the displayed connection 1forms are those w.r.t. the default frame of the vector bundle. The aforementioned is therefore equivalent to:
sage: nab.display(frame=E.default_frame()) connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx + y dy + z dz connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x^2 dx + y^2 dy + z^2 dz
Moreover, the connection 1forms are displayed w.r.t. the default vector frame on the local frame’s domain, i.e.:
sage: domain = e.domain() sage: nab.display(vector_frame=domain.default_frame()) connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx + y dy + z dz connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x^2 dx + y^2 dy + z^2 dz
By default, the parameter
only_nonzero
is set toTrue
. Otherwise, the connection 1forms being zero are shown as well:sage: nab.display(only_nonzero=False) connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x dx + y dy + z dz connection (1,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = 0 connection (2,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = 0 connection (2,2) of bundle connection nabla w.r.t. Local frame (E_M, (e_1,e_2)) = x^2 dx + y^2 dy + z^2 dz

set_connection_form
(i, j, form=None, frame=None)¶ Return the connection form \(\omega^j_i\) 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 1form \(\omega^j_i\)frame
– (default:None
) local frame in which the connection 1form is defined; ifNone
, the default frame of the vector bundle is assumed.
OUTPUT:
connection 1form \(\omega^j_i\) in the given frame, as an instance of the class
DiffForm
; if such connection 1form did not exist previously, it is created. See methodconnection_forms()
for the storage convention of the connection 1forms.
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: nab.set_connection_form(0, 1)[:] = [x^2, x] sage: nab[0, 1].display() connection (0,1) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = x^2 dx + x dy
Since
e
is the vector bundle’s default local frame, its mention may be omitted:sage: nab.set_connection_form(1, 0)[:] = [y^2, y] sage: nab[1, 0].display() connection (1,0) of bundle connection nabla w.r.t. Local frame (E_M, (e_0,e_1)) = y^2 dx + y dy
Setting connection 1forms w.r.t. to another local frame:
sage: f = E.local_frame('f') sage: nab.set_connection_form(1, 1, frame=f)[:] = [x, y] sage: nab[f, 1, 1].display() connection (1,1) of bundle connection nabla w.r.t. Local frame (E_M, (f_0,f_1)) = x dx + y dy
The forms w.r.t. the frame
e
have been deleted:sage: nab[e, 0, 1].display() Traceback (most recent call last): ... ValueError: no basis could be found for computing the components in the Local frame (E_M, (f_0,f_1))
To keep them, use the method
add_connection_form()
instead.

vector_bundle
()¶ Return the vector bundle on which the bundle connection is defined.
OUTPUT:
instance of class
DifferentiableVectorBundle
representing the vector bundle on whichself
is defined.
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 3dimensional differentiable manifold M