Submanifolds of topological manifolds¶
Given a topological manifold \(M\) over a topological field \(K\), a topological submanifold of \(M\) is defined by a topological manifold \(N\) over the same field \(K\) of dimension lower than the dimension of \(M\) and a topological embedding \(\phi\) from \(N\) to \(M\) (i.e. \(\phi\) is a homeomorphism onto its image).
In the case where the map \(\phi\) is only an embedding locally, it is called an topological immersion, and defines an immersed submanifold.
The global embedding property cannot be checked in sage, so the immersed or
embedded aspect of the manifold must be declared by the user, by calling either
set_embedding()
or
set_immersion()
while declaring the map \(\phi\).
The map \(\phi: N\to M\) can also depend on one or multiple parameters. As long as \(\phi\) remains injective in these parameters, it represents a foliation. The dimension of the foliation is defined as the number of parameters.
AUTHORS:
 Florentin Jaffredo (2018): initial version
REFERENCES:
 J. M. Lee: Introduction to Smooth Manifolds [Lee2013]

class
sage.manifolds.topological_submanifold.
TopologicalSubmanifold
(n, name, field, structure, ambient=None, base_manifold=None, latex_name=None, start_index=0, category=None, unique_tag=None)¶ Bases:
sage.manifolds.manifold.TopologicalManifold
Submanifold of a topological manifold.
Given a topological manifold \(M\) over a topological field \(K\), a topological submanifold of \(M\) is defined by a topological manifold \(N\) over the same field \(K\) of dimension lower than the dimension of \(M\) and a topological embedding \(\phi\) from \(N\) to \(M\) (i.e. \(\phi\) is an homeomorphism onto its image).
In the case where \(\phi\) is only an topological immersion (i.e. is only locally an embedding), one says that \(N\) is an immersed submanifold.
The map \(\phi\) can also depend on one or multiple parameters. As long as \(\phi\) remains injective in these parameters, it represents a foliation. The dimension of the foliation is defined as the number of parameters.
INPUT:
n
– positive integer; dimension of the submanifoldname
– string; name (symbol) given to the submanifoldfield
– field \(K\) on which the submanifold is defined; allowed values are'real'
or an object of typeRealField
(e.g.,RR
) for a manifold over \(\RR\)'complex'
or an object of typeComplexField
(e.g.,CC
) for a manifold over \(\CC\) an object in the category of topological fields (see
Fields
andTopologicalSpaces
) for other types of manifolds
structure
– manifold structure (seeTopologicalStructure
orRealTopologicalStructure
)ambient
– (default:None
) codomain \(M\) of the immersion \(\phi\); must be a topological manifold. IfNone
, it is set toself
base_manifold
– (default:None
) if notNone
, must be a topological manifold; the created object is then an open subset ofbase_manifold
latex_name
– (default:None
) string; LaTeX symbol to denote the submanifold; if none are provided, it is set toname
start_index
– (default: 0) integer; lower value of the range of indices used for “indexed objects” on the submanifold, e.g., coordinates in a chartcategory
– (default:None
) to specify the category; ifNone
,Manifolds(field)
is assumed (see the categoryManifolds
)unique_tag
– (default:None
) tag used to force the construction of a new object when all the other arguments have been used previously (withoutunique_tag
, theUniqueRepresentation
behavior inherited fromManifoldSubset
viaTopologicalManifold
would return the previously constructed object corresponding to these arguments)
EXAMPLES:
Let \(N\) be a 2dimensional submanifold of a 3dimensional manifold \(M\):
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: N 2dimensional topological submanifold N immersed in the 3dimensional topological manifold M sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart()
Let us define a 1dimensional foliation indexed by \(t\):
sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u, v, t+u^2+v^2]}) sage: phi.display() N > M (u, v) > (x, y, z) = (u, v, u^2 + v^2 + t)
The foliation inverse maps are needed for computing the adapted chart on the ambient manifold:
sage: phi_inv = M.continuous_map(N, {(CM, CN): [x, y]}) sage: phi_inv.display() M > N (x, y, z) > (u, v) = (x, y) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: phi_inv_t.display() M > R (x, y, z) > x^2  y^2 + z
\(\phi\) can then be declared as an embedding \(N\to M\):
sage: N.set_embedding(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t})
The foliation can also be used to find new charts on the ambient manifold that are adapted to the foliation, i.e. in which the expression of the immersion is trivial. At the same time, the appropriate coordinate changes are computed:
sage: N.adapted_chart() [Chart (M, (u_M, v_M, t_M))] sage: M.atlas() [Chart (M, (x, y, z)), Chart (M, (u_M, v_M, t_M))] sage: len(M.coord_changes()) 2
The foliation parameters are always added as the last coordinates.
See also

adapted_chart
(postscript=None, latex_postscript=None)¶ Create charts and changes of charts in the ambient manifold adapted to the foliation.
A manifold \(M\) of dimension \(m\) can be foliated by submanifolds \(N\) of dimension \(n\). The corresponding embedding needs \(mn\) free parameters to describe the whole manifold.
A chart adapted to the foliation is a set of coordinates \((x_1,\ldots,x_n,t_1,\ldots,t_{mn})\) on \(M\) such that \((x_1,\ldots,x_n)\) are coordinates on \(N\) and \((t_1,\ldots,t_{mn})\) are the \(mn\) free parameters of the foliation.
Provided that an embedding with free variables is already defined, this function constructs such charts and coordinates changes whenever it is possible.
If there are restrictions of the coordinates on the starting chart, these restrictions are also propagated.
INPUT:
postscript
– (default:None
) string defining the name of the coordinates of the adapated chart. This string will be appended to the names of the coordinates \((x_1,\ldots,x_n)\) and of the parameters \((t_1,\ldots,t_{mn})\). IfNone
,"_" + self.ambient()._name
is usedlatex_postscript
– (default:None
) string defining the LaTeX name of the coordinates of the adapated chart. This string will be appended to the LaTeX names of the coordinates \((x_1,\ldots,x_n)\) and of the parameters \((t_1,\ldots,t_{mn})\), IfNone
,"_" + self.ambient()._latex_()
is used
OUTPUT:
 list of adapted charts on \(M\) created from the charts of
self
EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological", ....: latex_name=r"\mathcal{M}") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: N 2dimensional topological submanifold N immersed in the 3dimensional topological manifold M sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: N.set_embedding(phi, inverse=phi_inv, var=t, ....: t_inverse={t:phi_inv_t}) sage: N.adapted_chart() [Chart (M, (u_M, v_M, t_M))] sage: latex(_) \left[\left(\mathcal{M},({{u}_{\mathcal{M}}}, {{v}_{\mathcal{M}}}, {{t}_{\mathcal{M}}})\right)\right]
The adapted chart has been added to the atlas of
M
:sage: M.atlas() [Chart (M, (x, y, z)), Chart (M, (u_M, v_M, t_M))] sage: N.atlas() [Chart (N, (u, v))]
The names of the adapted coordinates can be customized:
sage: N.adapted_chart(postscript='1', latex_postscript='_1') [Chart (M, (u1, v1, t1))] sage: latex(_) \left[\left(\mathcal{M},({{u}_1}, {{v}_1}, {{t}_1})\right)\right]

ambient
()¶ Return the manifold in which
self
is immersed or embedded.EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: N.ambient() 3dimensional topological manifold M

declare_embedding
()¶ Declare that the immersion provided by
set_immersion()
is in fact an embedding.A topological embedding is a continuous map that is a homeomorphism onto its image. A differentiable embedding is a topological embedding that is also a differentiable immersion.
EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: N 2dimensional topological submanifold N immersed in the 3dimensional topological manifold M sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: N.set_immersion(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t}) sage: N._immersed True sage: N._embedded False sage: N.declare_embedding() sage: N._immersed True sage: N._embedded True

embedding
()¶ Return the embedding of
self
into the ambient manifold.EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: N.set_embedding(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t}) sage: N.embedding() Continuous map from the 2dimensional topological submanifold N embedded in the 3dimensional topological manifold M to the 3dimensional topological manifold M

immersion
()¶ Return the immersion of
self
into the ambient manifold.EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: N.set_immersion(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t}) sage: N.immersion() Continuous map from the 2dimensional topological submanifold N immersed in the 3dimensional topological manifold M to the 3dimensional topological manifold M

plot
(param, u, v, chart1=None, chart2=None, **kwargs)¶ Plot an embedding.
Plot the embedding defined by the foliation and a set of values for the free parameters. This function can only plot 2dimensional surfaces embedded in 3dimensional manifolds. It ultimately calls
ParametricSurface
.INPUT:
param
– dictionary of values indexed by the free variables appearing in the foliation.u
– iterable of the values taken by the first coordinate of the surface to plotv
– iterable of the values taken by the second coordinate of the surface to plotchart1
– (default:None
) chart in whichu
andv
are considered. By default, the default chart of the submanifold is usedchart2
– (default:None
) chart in the codomain of the embedding. By default, the default chart of the codomain is used**kwargs
– other arguments as used inParametricSurface
EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient = M, structure="topological") sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: N.set_embedding(phi, inverse=phi_inv, var=t, ....: t_inverse = {t:phi_inv_t}) sage: N.adapted_chart() [Chart (M, (u_M, v_M, t_M))] sage: P0 = N.plot({t:0}, srange(1, 1, 0.1), srange(1, 1, 0.1), ....: CN, CM, opacity=0.3, mesh=True) sage: P1 = N.plot({t:1}, srange(1, 1, 0.1), srange(1, 1, 0.1), ....: CN, CM, opacity=0.3, mesh=True) sage: P2 = N.plot({t:2}, srange(1, 1, 0.1), srange(1, 1, 0.1), ....: CN, CM, opacity=0.3, mesh=True) sage: P3 = N.plot({t:3}, srange(1, 1, 0.1), srange(1, 1, 0.1), ....: CN, CM, opacity=0.3, mesh=True) sage: P0 + P1 + P2 + P3 Graphics3d Object
See also

set_embedding
(phi, inverse=None, var=None, t_inverse=None)¶ Register the embedding of an embedded submanifold.
A topological embedding is a continuous map that is a homeomorphism onto its image. A differentiable embedding is a topological embedding that is also a differentiable immersion.
INPUT:
phi
– continuous map \(\phi\) fromself
toself.ambient()
inverse
– (default:None
) continuous map fromself.ambient()
toself
, which once restricted to the image of \(\phi\) is the inverse of \(\phi\) onto its image (NB: no check of this is performed)var
– (default:None
) list of parameters involved in the definition of \(\phi\) (case of foliation); if \(\phi\) depends on a single parametert
, one can writevar=t
as a shortcut forvar=[t]
t_inverse
– (default:None
) dictionary of scalar fields onself.ambient()
providing the values of the parameters involved in the definition of \(\phi\) (case of foliation), the keys being the parameters
EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: N 2dimensional topological submanifold N immersed in the 3dimensional topological manifold M sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi.display() N > M (u, v) > (x, y, z) = (u, v, u^2 + v^2 + t) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv.display() M > N (x, y, z) > (u, v) = (x, y) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: phi_inv_t.display() M > R (x, y, z) > x^2  y^2 + z sage: N.set_embedding(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t})
Now
N
appears as an embbeded submanifold:sage: N 2dimensional topological submanifold N embedded in the 3dimensional topological manifold M

set_immersion
(phi, inverse=None, var=None, t_inverse=None)¶ Register the immersion of the immersed submanifold.
A topological immersion is a continuous map that is locally a topological embedding (i.e. a homeomorphism onto its image). A differentiable immersion is a differentiable map whose differential is injective at each point.
If an inverse of the immersion onto its image exists, it can be registered at the same time. If the immersion depends on parameters, they must also be declared here.
INPUT:
phi
– continuous map \(\phi\) fromself
toself.ambient()
inverse
– (default:None
) continuous map fromself.ambient()
toself
, which once restricted to the image of \(\phi\) is the inverse of \(\phi\) onto its image if the latter exists (NB: no check of this is performed)var
– (default:None
) list of parameters involved in the definition of \(\phi\) (case of foliation); if \(\phi\) depends on a single parametert
, one can writevar=t
as a shortcut forvar=[t]
t_inverse
– (default:None
) dictionary of scalar fields onself.ambient()
providing the values of the parameters involved in the definition of \(\phi\) (case of foliation), the keys being the parameters
EXAMPLES:
sage: M = Manifold(3, 'M', structure="topological") sage: N = Manifold(2, 'N', ambient=M, structure="topological") sage: N 2dimensional topological submanifold N immersed in the 3dimensional topological manifold M sage: CM.<x,y,z> = M.chart() sage: CN.<u,v> = N.chart() sage: t = var('t') sage: phi = N.continuous_map(M, {(CN,CM): [u,v,t+u^2+v^2]}) sage: phi.display() N > M (u, v) > (x, y, z) = (u, v, u^2 + v^2 + t) sage: phi_inv = M.continuous_map(N, {(CM,CN): [x,y]}) sage: phi_inv.display() M > N (x, y, z) > (u, v) = (x, y) sage: phi_inv_t = M.scalar_field({CM: zx^2y^2}) sage: phi_inv_t.display() M > R (x, y, z) > x^2  y^2 + z sage: N.set_immersion(phi, inverse=phi_inv, var=t, ....: t_inverse={t: phi_inv_t})