Tangent-Space Automorphism Fields

The class AutomorphismField implements fields of automorphisms of tangent spaces to a generic (a priori not parallelizable) differentiable manifold, while the class AutomorphismFieldParal is devoted to fields of automorphisms of tangent spaces to a parallelizable manifold. The latter play the important role of transitions between vector frames sharing the same domain on a differentiable manifold.

AUTHORS:

  • Eric Gourgoulhon (2015): initial version
  • Travis Scrimshaw (2016): review tweaks
class sage.manifolds.differentiable.automorphismfield.AutomorphismField(vector_field_module, name=None, latex_name=None)

Bases: sage.manifolds.differentiable.tensorfield.TensorField

Field of automorphisms of tangent spaces to a generic (a priori not parallelizable) differentiable manifold.

Given a differentiable manifold \(U\) and a differentiable map \(\Phi: U \rightarrow M\) to a differentiable manifold \(M\), a field of tangent-space automorphisms along \(U\) with values on \(M \supset\Phi(U)\) is a differentiable map

\[a:\ U \longrightarrow T^{(1,1)} M,\]

with \(T^{(1,1)} M\) being the tensor bundle of type \((1,1)\) over \(M\), such that

\[\forall p \in U,\ a(p) \in \mathrm{Aut}(T_{\Phi(p)} M),\]

i.e. \(a(p)\) is an automorphism of the tangent space to \(M\) at the point \(\Phi(p)\).

The standard case of a field of tangent-space automorphisms on a manifold 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

If \(M\) is parallelizable, then AutomorphismFieldParal 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\)
  • name – (default: None) name given to the field
  • latex_name – (default: None) LaTeX symbol to denote the field; if none is provided, the LaTeX symbol is set to name
  • is_identity – (default: False) determines whether the constructed object is a field of identity automorphisms

EXAMPLES:

Field of tangent-space automorphisms 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: a = M.automorphism_field(name='a') ; a
Field of tangent-space automorphisms a on the 2-dimensional
 differentiable manifold M
sage: a.parent()
General linear group of the Module X(M) of vector fields on the
 2-dimensional differentiable manifold M

We first define the components of \(a\) with respect to the coordinate frame on \(U\):

sage: eU = c_xy.frame() ; eV = c_uv.frame()
sage: a[eU,:] = [[1,x], [0,2]]

It is equivalent to pass the components while defining \(a\):

sage: a = M.automorphism_field({eU: [[1,x], [0,2]]}, name='a')

We then set the components with respect to the coordinate frame on \(V\) by extending the expressions of the components in the corresponding subframe on \(W = U \cap V\):

sage: W = U.intersection(V)
sage: a.add_comp_by_continuation(eV, W, c_uv)

At this stage, the automorphism field \(a\) is fully defined:

sage: a.display(eU)
a = d/dx*dx + x d/dx*dy + 2 d/dy*dy
sage: a.display(eV)
a = (1/4*u + 1/4*v + 3/2) d/du*du + (-1/4*u - 1/4*v - 1/2) d/du*dv
 + (1/4*u + 1/4*v - 1/2) d/dv*du + (-1/4*u - 1/4*v + 3/2) d/dv*dv

In particular, we may ask for its inverse on the whole manifold \(M\):

sage: ia = a.inverse() ; ia
Field of tangent-space automorphisms a^(-1) on the 2-dimensional
 differentiable manifold M
sage: ia.display(eU)
a^(-1) = d/dx*dx - 1/2*x d/dx*dy + 1/2 d/dy*dy
sage: ia.display(eV)
a^(-1) = (-1/8*u - 1/8*v + 3/4) d/du*du + (1/8*u + 1/8*v + 1/4) d/du*dv
 + (-1/8*u - 1/8*v + 1/4) d/dv*du + (1/8*u + 1/8*v + 3/4) d/dv*dv

Equivalently, one can use the power minus one to get the inverse:

sage: ia is a^(-1)
True

or the operator ~:

sage: ia is ~a
True
add_comp(basis=None)

Return the components of self w.r.t. a given module basis for assignment, keeping the components w.r.t. other bases.

To delete the components w.r.t. other bases, use the method set_comp() instead.

INPUT:

  • basis – (default: None) basis in which the components are defined; if none is provided, the components are assumed to refer to the module’s default basis

Warning

If the automorphism field has already components in other bases, it is the user’s responsibility to make sure that the components to be added are consistent with them.

OUTPUT:

  • components in the given basis, as an instance of the class Components; if such components did not exist previously, they are created

EXAMPLES:

sage: M = Manifold(2, 'M') # the 2-dimensional sphere S^2
sage: U = M.open_subset('U') # complement of the North pole
sage: c_xy.<x,y> = U.chart() # stereographic coordinates from the North pole
sage: V = M.open_subset('V') # complement of the South pole
sage: c_uv.<u,v> = V.chart() # stereographic coordinates from the South pole
sage: M.declare_union(U,V)   # S^2 is the union of U and V
sage: e_uv = c_uv.frame()
sage: a= M.automorphism_field(name='a')
sage: a.add_comp(e_uv)
2-indices components w.r.t. Coordinate frame (V, (d/du,d/dv))
sage: a.add_comp(e_uv)[0,0] = u+v
sage: a.add_comp(e_uv)[1,1] = u+v
sage: a.display(e_uv)
a = (u + v) d/du*du + (u + v) d/dv*dv

Setting the components in a new frame:

sage: e = V.vector_frame('e')
sage: a.add_comp(e)
2-indices components w.r.t. Vector frame (V, (e_0,e_1))
sage: a.add_comp(e)[0,1] = u*v
sage: a.add_comp(e)[1,0] = u*v
sage: a.display(e)
a = u*v e_0*e^1 + u*v e_1*e^0

The components with respect to e_uv are kept:

sage: a.display(e_uv)
a = (u + v) d/du*du + (u + v) d/dv*dv

Since the identity map is a special element, its components cannot be changed:

sage: id = M.tangent_identity_field()
sage: id.add_comp(e)[0,1] = u*v
Traceback (most recent call last):
...
AssertionError: the components of the identity map cannot be changed
inverse()

Return the inverse automorphism of self.

EXAMPLES:

Inverse of a field of tangent-space automorphisms 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: W = U.intersection(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: eU = c_xy.frame() ; eV = c_uv.frame()
sage: a = M.automorphism_field({eU: [[1,x], [0,2]]}, name='a')
sage: a.add_comp_by_continuation(eV, W, c_uv)
sage: ia = a.inverse() ; ia
Field of tangent-space automorphisms a^(-1) on the 2-dimensional
 differentiable manifold M
sage: a[eU,:], ia[eU,:]
(
[1 x]  [     1 -1/2*x]
[0 2], [     0    1/2]
)
sage: a[eV,:], ia[eV,:]
(
[ 1/4*u + 1/4*v + 3/2 -1/4*u - 1/4*v - 1/2]
[ 1/4*u + 1/4*v - 1/2 -1/4*u - 1/4*v + 3/2],
[-1/8*u - 1/8*v + 3/4  1/8*u + 1/8*v + 1/4]
[-1/8*u - 1/8*v + 1/4  1/8*u + 1/8*v + 3/4]
)

Let us check that ia is indeed the inverse of a:

sage: s = a.contract(ia)
sage: s[eU,:], s[eV,:]
(
[1 0]  [1 0]
[0 1], [0 1]
)
sage: s = ia.contract(a)
sage: s[eU,:], s[eV,:]
(
[1 0]  [1 0]
[0 1], [0 1]
)

The result is cached:

sage: a.inverse() is ia
True

Instead of inverse(), one can use the power minus one to get the inverse:

sage: ia is a^(-1)
True

or the operator ~:

sage: ia is ~a
True
restrict(subdomain, dest_map=None)

Return the restriction of self to some subdomain.

This is a redefinition of sage.manifolds.differentiable.tensorfield.TensorField.restrict() to take into account the identity map.

INPUT:

  • subdomainDifferentiableManifold open subset \(V\) of self._domain
  • dest_map – (default: None) DiffMap; destination map \(\Phi:\ V \rightarrow N\), where \(N\) is a subdomain of self._codomain; if None, the restriction of self.base_module().destination_map() to \(V\) is used

OUTPUT:

EXAMPLES:

Restrictions of an automorphism field on the 2-sphere:

sage: M = Manifold(2, 'S^2', start_index=1)
sage: U = M.open_subset('U') # the complement of the North pole
sage: stereoN.<x,y> = U.chart()  # stereographic coordinates from the North pole
sage: eN = stereoN.frame() # the associated vector frame
sage: V =  M.open_subset('V') # the complement of the South pole
sage: stereoS.<u,v> = V.chart()  # stereographic coordinates from the South pole
sage: eS = stereoS.frame() # the associated vector frame
sage: transf = stereoN.transition_map(stereoS, (x/(x^2+y^2), y/(x^2+y^2)),
....:                                 intersection_name='W',
....:                                 restrictions1= x^2+y^2!=0,
....:                                 restrictions2= u^2+v^2!=0)
sage: inv = transf.inverse() # transformation from stereoS to stereoN
sage: W = U.intersection(V) # the complement of the North and South poles
sage: stereoN_W = W.atlas()[0]  # restriction of stereo. coord. from North pole to W
sage: stereoS_W = W.atlas()[1]  # restriction of stereo. coord. from South pole to W
sage: eN_W = stereoN_W.frame() ; eS_W = stereoS_W.frame()
sage: a = M.automorphism_field({eN: [[1, atan(x^2+y^2)], [0,3]]},
....:                          name='a')
sage: a.add_comp_by_continuation(eS, W, chart=stereoS); a
Field of tangent-space automorphisms a on the 2-dimensional
 differentiable manifold S^2
sage: a.restrict(U)
Field of tangent-space automorphisms a on the Open subset U of the
 2-dimensional differentiable manifold S^2
sage: a.restrict(U)[eN,:]
[                1 arctan(x^2 + y^2)]
[                0                 3]
sage: a.restrict(V)
Field of tangent-space automorphisms a on the Open subset V of the
 2-dimensional differentiable manifold S^2
sage: a.restrict(V)[eS,:]
[   (u^4 + 10*u^2*v^2 + v^4 + 2*(u^3*v - u*v^3)*arctan(1/(u^2 + v^2)))/(u^4 + 2*u^2*v^2 + v^4)  -(4*u^3*v - 4*u*v^3 + (u^4 - 2*u^2*v^2 + v^4)*arctan(1/(u^2 + v^2)))/(u^4 + 2*u^2*v^2 + v^4)]
[                    4*(u^2*v^2*arctan(1/(u^2 + v^2)) - u^3*v + u*v^3)/(u^4 + 2*u^2*v^2 + v^4) (3*u^4 - 2*u^2*v^2 + 3*v^4 - 2*(u^3*v - u*v^3)*arctan(1/(u^2 + v^2)))/(u^4 + 2*u^2*v^2 + v^4)]
sage: a.restrict(W)
Field of tangent-space automorphisms a on the Open subset W of the
 2-dimensional differentiable manifold S^2
sage: a.restrict(W)[eN_W,:]
[                1 arctan(x^2 + y^2)]
[                0                 3]

Restrictions of the field of tangent-space identity maps:

sage: id = M.tangent_identity_field() ; id
Field of tangent-space identity maps on the 2-dimensional
 differentiable manifold S^2
sage: id.restrict(U)
Field of tangent-space identity maps on the Open subset U of the
 2-dimensional differentiable manifold S^2
sage: id.restrict(U)[eN,:]
[1 0]
[0 1]
sage: id.restrict(V)
Field of tangent-space identity maps on the Open subset V of the
 2-dimensional differentiable manifold S^2
sage: id.restrict(V)[eS,:]
[1 0]
[0 1]
sage: id.restrict(W)[eN_W,:]
[1 0]
[0 1]
sage: id.restrict(W)[eS_W,:]
[1 0]
[0 1]
set_comp(basis=None)

Return the components of self w.r.t. a given module basis for assignment.

The components with respect to other bases are deleted, in order to avoid any inconsistency. To keep them, use the method add_comp() instead.

INPUT:

  • basis – (default: None) basis in which the components are defined; if none is provided, the components are assumed to refer to the module’s default basis

OUTPUT:

  • components in the given basis, as an instance of the class Components; if such components did not exist previously, they are created.

EXAMPLES:

sage: M = Manifold(2, 'M') # the 2-dimensional sphere S^2
sage: U = M.open_subset('U') # complement of the North pole
sage: c_xy.<x,y> = U.chart() # stereographic coordinates from the North pole
sage: V = M.open_subset('V') # complement of the South pole
sage: c_uv.<u,v> = V.chart() # stereographic coordinates from the South pole
sage: M.declare_union(U,V)   # S^2 is the union of U and V
sage: e_uv = c_uv.frame()
sage: a= M.automorphism_field(name='a')
sage: a.set_comp(e_uv)
2-indices components w.r.t. Coordinate frame (V, (d/du,d/dv))
sage: a.set_comp(e_uv)[0,0] = u+v
sage: a.set_comp(e_uv)[1,1] = u+v
sage: a.display(e_uv)
a = (u + v) d/du*du + (u + v) d/dv*dv

Setting the components in a new frame:

sage: e = V.vector_frame('e')
sage: a.set_comp(e)
2-indices components w.r.t. Vector frame (V, (e_0,e_1))
sage: a.set_comp(e)[0,1] = u*v
sage: a.set_comp(e)[1,0] = u*v
sage: a.display(e)
a = u*v e_0*e^1 + u*v e_1*e^0

Since the frames e and e_uv are defined on the same domain, the components w.r.t. e_uv have been erased:

sage: a.display(c_uv.frame())
Traceback (most recent call last):
...
ValueError: no basis could be found for computing the components
 in the Coordinate frame (V, (d/du,d/dv))

Since the identity map is a special element, its components cannot be changed:

sage: id = M.tangent_identity_field()
sage: id.add_comp(e)[0,1] = u*v
Traceback (most recent call last):
...
AssertionError: the components of the identity map cannot be changed
class sage.manifolds.differentiable.automorphismfield.AutomorphismFieldParal(vector_field_module, name=None, latex_name=None)

Bases: sage.tensor.modules.free_module_automorphism.FreeModuleAutomorphism, sage.manifolds.differentiable.tensorfield_paral.TensorFieldParal

Field of tangent-space automorphisms with values on a parallelizable manifold.

Given a differentiable manifold \(U\) and a differentiable map \(\Phi: U \rightarrow M\) to a parallelizable manifold \(M\), a field of tangent-space automorphisms along \(U\) with values on \(M\supset\Phi(U)\) is a differentiable map

\[a:\ U \longrightarrow T^{(1,1)}M\]

(\(T^{(1,1)}M\) being the tensor bundle of type \((1,1)\) over \(M\)) such that

\[\forall p \in U,\ a(p) \in \mathrm{Aut}(T_{\Phi(p)} M)\]

i.e. \(a(p)\) is an automorphism of the tangent space to \(M\) at the point \(\Phi(p)\).

The standard case of a field of tangent-space automorphisms on a manifold 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

If \(M\) is not parallelizable, the class AutomorphismField must be used instead.

INPUT:

  • vector_field_module – free module \(\mathfrak{X}(U,\Phi)\) of vector fields along \(U\) with values on \(M\) via the map \(\Phi\)
  • name – (default: None) name given to the field
  • latex_name – (default: None) LaTeX symbol to denote the field; if none is provided, the LaTeX symbol is set to name

EXAMPLES:

A \(\pi/3\)-rotation in the Euclidean 2-plane:

sage: M = Manifold(2, 'R^2')
sage: c_xy.<x,y> = M.chart()
sage: rot = M.automorphism_field([[sqrt(3)/2, -1/2], [1/2, sqrt(3)/2]],
....:                            name='R'); rot
Field of tangent-space automorphisms R on the 2-dimensional
 differentiable manifold R^2
sage: rot.parent()
General linear group of the Free module X(R^2) of vector fields on the
 2-dimensional differentiable manifold R^2

The inverse automorphism is obtained via the method inverse():

sage: inv = rot.inverse() ; inv
Field of tangent-space automorphisms R^(-1) on the 2-dimensional
 differentiable manifold R^2
sage: latex(inv)
R^{-1}
sage: inv[:]
[1/2*sqrt(3)         1/2]
[       -1/2 1/2*sqrt(3)]
sage: rot[:]
[1/2*sqrt(3)        -1/2]
[        1/2 1/2*sqrt(3)]
sage: inv[:] * rot[:]  # check
[1 0]
[0 1]

Equivalently, one can use the power minus one to get the inverse:

sage: inv is rot^(-1)
True

or the operator ~:

sage: inv is ~rot
True
at(point)

Value of self at a given point.

If the current field of tangent-space automorphisms is

\[a:\ U \longrightarrow T^{(1,1)} M\]

associated with the differentiable map

\[\Phi:\ U \longrightarrow M,\]

where \(U\) and \(M\) are two manifolds (possibly \(U = M\) and \(\Phi = \mathrm{Id}_M\)), then for any point \(p \in U\), \(a(p)\) is an automorphism of the tangent space \(T_{\Phi(p)}M\).

INPUT:

  • pointManifoldPoint; point \(p\) in the domain of the field of automorphisms \(a\)

OUTPUT:

  • the automorphism \(a(p)\) of the tangent vector space \(T_{\Phi(p)}M\)

EXAMPLES:

Automorphism at some point of a tangent space of a 2-dimensional manifold:

sage: M = Manifold(2, 'M')
sage: c_xy.<x,y> = M.chart()
sage: a = M.automorphism_field([[1+exp(y), x*y], [0, 1+x^2]],
....:                          name='a')
sage: a.display()
a = (e^y + 1) d/dx*dx + x*y d/dx*dy + (x^2 + 1) d/dy*dy
sage: p = M.point((-2,3), name='p') ; p
Point p on the 2-dimensional differentiable manifold M
sage: ap = a.at(p) ; ap
Automorphism a of the Tangent space at Point p on the
 2-dimensional differentiable manifold M
sage: ap.display()
a = (e^3 + 1) d/dx*dx - 6 d/dx*dy + 5 d/dy*dy
sage: ap.parent()
General linear group of the Tangent space at Point p on the
 2-dimensional differentiable manifold M

The identity map of the tangent space at point p:

sage: id = M.tangent_identity_field() ; id
Field of tangent-space identity maps on the 2-dimensional
 differentiable manifold M
sage: idp = id.at(p) ; idp
Identity map of the Tangent space at Point p on the 2-dimensional
 differentiable manifold M
sage: idp is M.tangent_space(p).identity_map()
True
sage: idp.display()
Id = d/dx*dx + d/dy*dy
sage: idp.parent()
General linear group of the Tangent space at Point p on the
 2-dimensional differentiable manifold M
sage: idp * ap == ap
True
inverse()

Return the inverse automorphism of self.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: a = M.automorphism_field([[0, 2], [-1, 0]], name='a')
sage: b = a.inverse(); b
Field of tangent-space automorphisms a^(-1) on the 2-dimensional
 differentiable manifold M
sage: b[:]
[  0  -1]
[1/2   0]
sage: a[:]
[ 0  2]
[-1  0]

The result is cached:

sage: a.inverse() is b
True

Instead of inverse(), one can use the power minus one to get the inverse:

sage: b is a^(-1)
True

or the operator ~:

sage: b is ~a
True
restrict(subdomain, dest_map=None)

Return the restriction of self to some subset of its domain.

If such restriction has not been defined yet, it is constructed here.

This is a redefinition of sage.manifolds.differentiable.tensorfield_paral.TensorFieldParal.restrict() to take into account the identity map.

INPUT:

  • subdomainDifferentiableManifold; open subset \(V\) of self._domain
  • dest_map – (default: None) DiffMap destination map \(\Phi:\ V \rightarrow N\), where \(N\) is a subset of self._codomain; if None, the restriction of self.base_module().destination_map() to \(V\) is used

OUTPUT:

EXAMPLES:

Restriction of an automorphism field defined on \(\RR^2\) to a disk:

sage: M = Manifold(2, 'R^2')
sage: c_cart.<x,y> = M.chart() # Cartesian coordinates on R^2
sage: D = M.open_subset('D') # the unit open disc
sage: c_cart_D = c_cart.restrict(D, x^2+y^2<1)
sage: a = M.automorphism_field([[1, x*y], [0, 3]], name='a'); a
Field of tangent-space automorphisms a on the 2-dimensional
 differentiable manifold R^2
sage: a.restrict(D)
Field of tangent-space automorphisms a on the Open subset D of the
 2-dimensional differentiable manifold R^2
sage: a.restrict(D)[:]
[  1 x*y]
[  0   3]

Restriction to the disk of the field of tangent-space identity maps:

sage: id = M.tangent_identity_field() ; id
Field of tangent-space identity maps on the 2-dimensional
 differentiable manifold R^2
sage: id.restrict(D)
Field of tangent-space identity maps on the Open subset D of the
 2-dimensional differentiable manifold R^2
sage: id.restrict(D)[:]
[1 0]
[0 1]
sage: id.restrict(D) == D.tangent_identity_field()
True