Submanifolds of topological manifolds - Manifolds

Skip to content
Back to top
View this page
Edit this page

# 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

- Eric Gourgoulhon (2018-2019): add documentation

- Matthias Koeppe (2021): open subsets of submanifolds

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: `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 a 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 submanifold

  - `name` – string; name (symbol) given to the submanifold

  - `field` – field \(K\) on which the submanifold is defined; allowed values are

    - `'real'` or an object of type `RealField` (e.g., `RR`) for a manifold over \(\RR\)

    - `'complex'` or an object of type `ComplexField` (e.g., `CC`) for a manifold over \(\CC\)

    - an object in the category of topological fields (see `Fields` and `TopologicalSpaces`) for other types of manifolds

  - `structure` – manifold structure (see `TopologicalStructure` or `RealTopologicalStructure`)

  - `ambient` – (default: `None`) codomain \(M\) of the immersion \(\phi\); must be a topological manifold. If `None`, it is set to `self`

  - `base_manifold` – (default: `None`) if not `None`, must be a topological manifold; the created object is then an open subset of `base_manifold`

  - `latex_name` – (default: `None`) string; LaTeX symbol to denote the submanifold; if none are provided, it is set to `name`

  - `start_index` – (default: 0) integer; lower value of the range of indices used for “indexed objects” on the submanifold, e.g., coordinates in a chart

  - `category` – (default: `None`) to specify the category; if `None`, `Manifolds(field)` is assumed (see the category `Manifolds`)

  - `unique_tag` – (default: `None`) tag used to force the construction of a new object when all the other arguments have been used previously (without `unique_tag`, the `UniqueRepresentation` behavior inherited from `ManifoldSubset` via `TopologicalManifold` would return the previously constructed object corresponding to these arguments)

  EXAMPLES:

  Let \(N\) be a 2-dimensional submanifold of a 3-dimensional manifold \(M\):

  Sage

      sage: M = Manifold(3, 'M', structure='topological')
      sage: N = Manifold(2, 'N', ambient=M, structure='topological')
      sage: N
      2-dimensional topological submanifold N immersed in the 3-dimensional
       topological manifold M
      sage: CM.<x,y,z> = M.chart()
      sage: CN.<u,v> = N.chart()

  Python

      >>> from sage.all import *
      >>> M = Manifold(Integer(3), 'M', structure='topological')
      >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
      >>> N
      2-dimensional topological submanifold N immersed in the 3-dimensional
       topological manifold M
      >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
      >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)

  Let us define a 1-dimensional foliation indexed by \(t\):

  Sage

      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)

  [Python]

      >>> from sage.all import *
      >>> t = var('t')
      >>> phi = N.continuous_map(M, {(CN,CM): [u, v, t+u**Integer(2)+v**Integer(2)]})
      >>> 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

      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: z-x^2-y^2})
      sage: phi_inv_t.display()
      M → ℝ
      (x, y, z) ↦ -x^2 - y^2 + z

  Python

      >>> from sage.all import *
      >>> phi_inv = M.continuous_map(N, {(CM, CN): [x, y]})
      >>> phi_inv.display()
      M → N
         (x, y, z) ↦ (u, v) = (x, y)
      >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
      >>> phi_inv_t.display()
      M → ℝ
      (x, y, z) ↦ -x^2 - y^2 + z

  \(\phi\) can then be declared as an embedding \(N\to M\):

  Sage

      sage: N.set_embedding(phi, inverse=phi_inv, var=t,
      ....:                 t_inverse={t: phi_inv_t})

  [Python]

      >>> from sage.all import *
      >>> 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

      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

  Python

      >>> from sage.all import *
      >>> N.adapted_chart()
      [Chart (M, (u_M, v_M, t_M))]
      >>> M.atlas()
      [Chart (M, (x, y, z)), Chart (M, (u_M, v_M, t_M))]
      >>> len(M.coord_changes())
      2

  The foliation parameters are always added as the last coordinates.

  See also

  `manifold`

  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 \(m-n\) 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_{m-n})\) on \(M\) such that \((x_1,\ldots,x_n)\) are coordinates on \(N\) and \((t_1,\ldots,t_{m-n})\) are the \(m-n\) 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 adapted 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_{m-n})\). If `None`, `"_" + self.ambient()._name` is used

    - `latex_postscript` – (default: `None`) string defining the LaTeX name of the coordinates of the adapted 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_{m-n})\), If `None`, `"_" + self.ambient()._latex_()` is used

    OUTPUT: list of adapted charts on \(M\) created from the charts of `self`

    EXAMPLES:

    Sage

        sage: M = Manifold(3, 'M', structure='topological',
        ....:              latex_name=r"\mathcal{M}")
        sage: N = Manifold(2, 'N', ambient=M, structure='topological')
        sage: N
        2-dimensional topological submanifold N immersed in the
         3-dimensional 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: z-x^2-y^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]

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological',
        ...              latex_name=r"\mathcal{M}")
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> N
        2-dimensional topological submanifold N immersed in the
         3-dimensional topological manifold M
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> N.set_embedding(phi, inverse=phi_inv, var=t,
        ...                 t_inverse={t:phi_inv_t})
        >>> N.adapted_chart()
        [Chart (M, (u_M, v_M, t_M))]
        >>> 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

        sage: M.atlas()
        [Chart (M, (x, y, z)), Chart (M, (u_M, v_M, t_M))]
        sage: N.atlas()
        [Chart (N, (u, v))]

    [Python]

        >>> from sage.all import *
        >>> M.atlas()
        [Chart (M, (x, y, z)), Chart (M, (u_M, v_M, t_M))]
        >>> N.atlas()
        [Chart (N, (u, v))]

    The names of the adapted coordinates can be customized:

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> N.adapted_chart(postscript='1', latex_postscript='_1')
        [Chart (M, (u1, v1, t1))]
        >>> 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

        sage: M = Manifold(3, 'M', structure='topological')
        sage: N = Manifold(2, 'N', ambient=M, structure='topological')
        sage: N.ambient()
        3-dimensional topological manifold M

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> N.ambient()
        3-dimensional topological manifold M

  as_subset()

    Return `self` as a subset of the ambient manifold.

    `self` must be an embedded submanifold.

    EXAMPLES:

    Sage

        sage: M = Manifold(2, 'M', structure='topological')
        sage: N = Manifold(1, 'N', ambient=M, structure='topological')
        sage: CM.<x,y> = M.chart()
        sage: CN.<u> = N.chart(coord_restrictions=lambda u: [u > -1, u < 1])
        sage: phi = N.continuous_map(M, {(CN,CM): [u, u^2]})
        sage: N.set_embedding(phi)
        sage: N
        1-dimensional topological submanifold N
          embedded in the 2-dimensional topological manifold M
        sage: N.as_subset()
        Image of the Continuous map
          from the 1-dimensional topological submanifold N
            embedded in the 2-dimensional topological manifold M
          to the 2-dimensional topological manifold M

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(2), 'M', structure='topological')
        >>> N = Manifold(Integer(1), 'N', ambient=M, structure='topological')
        >>> CM = M.chart(names=('x', 'y',)); (x, y,) = CM._first_ngens(2)
        >>> CN = N.chart(coord_restrictions=lambda u: [u > -Integer(1), u < Integer(1)], names=('u',)); (u,) = CN._first_ngens(1)
        >>> phi = N.continuous_map(M, {(CN,CM): [u, u**Integer(2)]})
        >>> N.set_embedding(phi)
        >>> N
        1-dimensional topological submanifold N
          embedded in the 2-dimensional topological manifold M
        >>> N.as_subset()
        Image of the Continuous map
          from the 1-dimensional topological submanifold N
            embedded in the 2-dimensional topological manifold M
          to the 2-dimensional 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

        sage: M = Manifold(3, 'M', structure='topological')
        sage: N = Manifold(2, 'N', ambient=M, structure='topological')
        sage: N
        2-dimensional topological submanifold N immersed in the
         3-dimensional 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: z-x^2-y^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

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> N
        2-dimensional topological submanifold N immersed in the
         3-dimensional topological manifold M
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> N.set_immersion(phi, inverse=phi_inv, var=t,
        ...                 t_inverse={t: phi_inv_t})
        >>> N._immersed
        True
        >>> N._embedded
        False
        >>> N.declare_embedding()
        >>> N._immersed
        True
        >>> N._embedded
        True

  embedding()

    Return the embedding of `self` into the ambient manifold.

    EXAMPLES:

    Sage

        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: z-x^2-y^2})
        sage: N.set_embedding(phi, inverse=phi_inv, var=t,
        ....:                 t_inverse={t: phi_inv_t})
        sage: N.embedding()
        Continuous map from the 2-dimensional topological submanifold N
         embedded in the 3-dimensional topological manifold M to the
         3-dimensional topological manifold M

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> N.set_embedding(phi, inverse=phi_inv, var=t,
        ...                 t_inverse={t: phi_inv_t})
        >>> N.embedding()
        Continuous map from the 2-dimensional topological submanifold N
         embedded in the 3-dimensional topological manifold M to the
         3-dimensional topological manifold M

  immersion()

    Return the immersion of `self` into the ambient manifold.

    EXAMPLES:

    Sage

        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: z-x^2-y^2})
        sage: N.set_immersion(phi, inverse=phi_inv, var=t,
        ....:                 t_inverse={t: phi_inv_t})
        sage: N.immersion()
        Continuous map from the 2-dimensional topological submanifold N
         immersed in the 3-dimensional topological manifold M to the
         3-dimensional topological manifold M

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> N.set_immersion(phi, inverse=phi_inv, var=t,
        ...                 t_inverse={t: phi_inv_t})
        >>> N.immersion()
        Continuous map from the 2-dimensional topological submanifold N
         immersed in the 3-dimensional topological manifold M to the
         3-dimensional topological manifold M

  open_subset(name, latex_name=None, coord_def={}, supersets=None)

    Create an open subset of the manifold.

    An open subset is a set that is (i) included in the manifold and (ii) open with respect to the manifold’s topology. It is a topological manifold by itself.

    As `self` is a submanifold of its ambient manifold, the new open subset is also considered a submanifold of that. Hence the returned object is an instance of `TopologicalSubmanifold`.

    INPUT:

    - `name` – name given to the open subset

    - `latex_name` – (default: `None`) LaTeX symbol to denote the subset; if none are provided, it is set to `name`

    - `coord_def` – (default: {}) definition of the subset in terms of coordinates; `coord_def` must a be dictionary with keys charts on the manifold and values the symbolic expressions formed by the coordinates to define the subset

    - `supersets` – (default: only `self`) list of sets that the new open subset is a subset of

    OUTPUT: the open subset, as an instance of `TopologicalSubmanifold`

    EXAMPLES:

    Sage

        sage: M = Manifold(3, 'M', structure='topological')
        sage: N = Manifold(2, 'N', ambient=M, structure='topological'); N
        2-dimensional topological submanifold N immersed in the
         3-dimensional topological manifold M
        sage: S = N.subset('S'); S
        Subset S of the
         2-dimensional topological submanifold N immersed in the
          3-dimensional topological manifold M
        sage: O = N.subset('O', is_open=True); O  # indirect doctest
        Open subset O of the
         2-dimensional topological submanifold N immersed in the
          3-dimensional topological manifold M

        sage: phi = N.continuous_map(M)
        sage: N.set_embedding(phi)
        sage: N
        2-dimensional topological submanifold N embedded in the
         3-dimensional topological manifold M
        sage: S = N.subset('S'); S
        Subset S of the
         2-dimensional topological submanifold N embedded in the
          3-dimensional topological manifold M
        sage: O = N.subset('O', is_open=True); O  # indirect doctest
        Open subset O of the
         2-dimensional topological submanifold N embedded in the
          3-dimensional topological manifold M

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological'); N
        2-dimensional topological submanifold N immersed in the
         3-dimensional topological manifold M
        >>> S = N.subset('S'); S
        Subset S of the
         2-dimensional topological submanifold N immersed in the
          3-dimensional topological manifold M
        >>> O = N.subset('O', is_open=True); O  # indirect doctest
        Open subset O of the
         2-dimensional topological submanifold N immersed in the
          3-dimensional topological manifold M

        >>> phi = N.continuous_map(M)
        >>> N.set_embedding(phi)
        >>> N
        2-dimensional topological submanifold N embedded in the
         3-dimensional topological manifold M
        >>> S = N.subset('S'); S
        Subset S of the
         2-dimensional topological submanifold N embedded in the
          3-dimensional topological manifold M
        >>> O = N.subset('O', is_open=True); O  # indirect doctest
        Open subset O of the
         2-dimensional topological submanifold N embedded in the
          3-dimensional 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 2-dimensional surfaces embedded in 3-dimensional 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 plot

    - `v` – iterable of the values taken by the second coordinate of the surface to plot

    - `chart1` – (default: `None`) chart in which `u` and `v` are considered. By default, the default chart of the submanifold is used

    - `chart2` – (default: `None`) chart in the codomain of the embedding. By default, the default chart of the codomain is used

    - `**kwargs` – other arguments as used in `ParametricSurface`

    EXAMPLES:

    Sage

        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: z-x^2-y^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

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient = M, structure='topological')
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> N.set_embedding(phi, inverse=phi_inv, var=t,
        ...                 t_inverse = {t:phi_inv_t})
        >>> N.adapted_chart()
        [Chart (M, (u_M, v_M, t_M))]
        >>> P0 = N.plot({t:Integer(0)}, srange(-Integer(1), Integer(1), RealNumber('0.1')), srange(-Integer(1), Integer(1), RealNumber('0.1')),
        ...             CN, CM, opacity=RealNumber('0.3'), mesh=True)
        >>> P1 = N.plot({t:Integer(1)}, srange(-Integer(1), Integer(1), RealNumber('0.1')), srange(-Integer(1), Integer(1), RealNumber('0.1')),
        ...             CN, CM, opacity=RealNumber('0.3'), mesh=True)
        >>> P2 = N.plot({t:Integer(2)}, srange(-Integer(1), Integer(1), RealNumber('0.1')), srange(-Integer(1), Integer(1), RealNumber('0.1')),
        ...             CN, CM, opacity=RealNumber('0.3'), mesh=True)
        >>> P3 = N.plot({t:Integer(3)}, srange(-Integer(1), Integer(1), RealNumber('0.1')), srange(-Integer(1), Integer(1), RealNumber('0.1')),
        ...             CN, CM, opacity=RealNumber('0.3'), mesh=True)
        >>> P0 + P1 + P2 + P3
        Graphics3d Object

    See also

    `ParametricSurface`

  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\) from `self` to `self.ambient()`

    - `inverse` – (default: `None`) continuous map from `self.ambient()` to `self`, 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 parameter `t`, one can write `var=t` as a shortcut for `var=[t]`

    - `t_inverse` – (default: `None`) dictionary of scalar fields on `self.ambient()` providing the values of the parameters involved in the definition of \(\phi\) (case of foliation), the keys being the parameters

    EXAMPLES:

    Sage

        sage: M = Manifold(3, 'M', structure='topological')
        sage: N = Manifold(2, 'N', ambient=M, structure='topological')
        sage: N
        2-dimensional topological submanifold N immersed in the
         3-dimensional 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: z-x^2-y^2})
        sage: phi_inv_t.display()
        M → ℝ
        (x, y, z) ↦ -x^2 - y^2 + z
        sage: N.set_embedding(phi, inverse=phi_inv, var=t,
        ....:                 t_inverse={t: phi_inv_t})

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> N
        2-dimensional topological submanifold N immersed in the
         3-dimensional topological manifold M
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi.display()
        N → M
           (u, v) ↦ (x, y, z) = (u, v, u^2 + v^2 + t)
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv.display()
        M → N
            (x, y, z) ↦ (u, v) = (x, y)
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> phi_inv_t.display()
        M → ℝ
        (x, y, z) ↦ -x^2 - y^2 + z
        >>> N.set_embedding(phi, inverse=phi_inv, var=t,
        ...                 t_inverse={t: phi_inv_t})

    Now `N` appears as an embedded submanifold:

    Sage

        sage: N
        2-dimensional topological submanifold N embedded in the
         3-dimensional topological manifold M

    [Python]

        >>> from sage.all import *
        >>> N
        2-dimensional topological submanifold N embedded in the
         3-dimensional 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\) from `self` to `self.ambient()`

    - `inverse` – (default: `None`) continuous map from `self.ambient()` to `self`, 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 parameter `t`, one can write `var=t` as a shortcut for `var=[t]`

    - `t_inverse` – (default: `None`) dictionary of scalar fields on `self.ambient()` providing the values of the parameters involved in the definition of \(\phi\) (case of foliation), the keys being the parameters

    EXAMPLES:

    Sage

        sage: M = Manifold(3, 'M', structure='topological')
        sage: N = Manifold(2, 'N', ambient=M, structure='topological')
        sage: N
        2-dimensional topological submanifold N immersed in the
         3-dimensional 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: z-x^2-y^2})
        sage: phi_inv_t.display()
        M → ℝ
        (x, y, z) ↦ -x^2 - y^2 + z
        sage: N.set_immersion(phi, inverse=phi_inv, var=t,
        ....:                 t_inverse={t: phi_inv_t})

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(3), 'M', structure='topological')
        >>> N = Manifold(Integer(2), 'N', ambient=M, structure='topological')
        >>> N
        2-dimensional topological submanifold N immersed in the
         3-dimensional topological manifold M
        >>> CM = M.chart(names=('x', 'y', 'z',)); (x, y, z,) = CM._first_ngens(3)
        >>> CN = N.chart(names=('u', 'v',)); (u, v,) = CN._first_ngens(2)
        >>> t = var('t')
        >>> phi = N.continuous_map(M, {(CN,CM): [u,v,t+u**Integer(2)+v**Integer(2)]})
        >>> phi.display()
        N → M
           (u, v) ↦ (x, y, z) = (u, v, u^2 + v^2 + t)
        >>> phi_inv = M.continuous_map(N, {(CM,CN): [x,y]})
        >>> phi_inv.display()
        M → N
            (x, y, z) ↦ (u, v) = (x, y)
        >>> phi_inv_t = M.scalar_field({CM: z-x**Integer(2)-y**Integer(2)})
        >>> phi_inv_t.display()
        M → ℝ
        (x, y, z) ↦ -x^2 - y^2 + z
        >>> N.set_immersion(phi, inverse=phi_inv, var=t,
        ...                 t_inverse={t: phi_inv_t})