From 9188230ad869f2ea9a9d0248cb63a7882cfe387f Mon Sep 17 00:00:00 2001 From: FEniCS GitHub Actions Date: Mon, 16 Oct 2023 19:03:50 +0000 Subject: [PATCH] C++ FEniCS/dolfinx@a34b0c963ca80ce7ee9b11b6d2b8e9f888f95eeb --- .../demo_biharmonic.py | 2 +- .../demo_stokes.py | 2 +- .../demo_elasticity.py | 4 +- .../demo_mixed-poisson.ipynb | 6 +- .../demo_poisson.py | 4 +- .../demo_cahn-hilliard.py | 2 +- .../demo_tnt-elements.py | 2 +- dolfinx/main/python/_modules/dolfinx/fem.html | 6 +- .../main/python/_modules/dolfinx/fem/bcs.html | 14 +-- .../python/_modules/dolfinx/fem/forms.html | 6 +- .../python/_modules/dolfinx/fem/function.html | 89 +++----------- .../main/python/_modules/dolfinx/mesh.html | 1 - .../main/python/_modules/dolfinx/plot.html | 4 +- .../_sources/demos/demo_biharmonic.md.txt | 2 +- .../_sources/demos/demo_cahn-hilliard.md.txt | 2 +- .../_sources/demos/demo_elasticity.md.txt | 4 +- .../python/_sources/demos/demo_poisson.md.txt | 4 +- .../python/_sources/demos/demo_stokes.md.txt | 2 +- .../_sources/demos/demo_tnt-elements.md.txt | 2 +- .../main/python/demos/demo_biharmonic.html | 2 +- .../main/python/demos/demo_cahn-hilliard.html | 2 +- .../main/python/demos/demo_elasticity.html | 4 +- dolfinx/main/python/demos/demo_poisson.html | 4 +- dolfinx/main/python/demos/demo_stokes.html | 2 +- .../main/python/demos/demo_tnt-elements.html | 2 +- .../main/python/generated/dolfinx.fem.html | 113 ++++++------------ .../main/python/generated/dolfinx.plot.html | 2 +- dolfinx/main/python/genindex.html | 28 ++--- dolfinx/main/python/objects.inv | Bin 7344 -> 7331 bytes dolfinx/main/python/searchindex.js | 2 +- 30 files changed, 106 insertions(+), 213 deletions(-) diff --git a/dolfinx/main/python/_downloads/2582f4d86e9cdad523ac798f84ed8877/demo_biharmonic.py b/dolfinx/main/python/_downloads/2582f4d86e9cdad523ac798f84ed8877/demo_biharmonic.py index 63b88a529..b04e6bc16 100644 --- a/dolfinx/main/python/_downloads/2582f4d86e9cdad523ac798f84ed8877/demo_biharmonic.py +++ b/dolfinx/main/python/_downloads/2582f4d86e9cdad523ac798f84ed8877/demo_biharmonic.py @@ -126,7 +126,7 @@ # We begin by using {py:func}`create_rectangle # ` to create a rectangular # {py:class}`Mesh ` of the domain, and creating a -# finite element {py:class}`FunctionSpaceBase ` +# finite element {py:class}`FunctionSpace ` # $V$ on the mesh. msh = mesh.create_rectangle(comm=MPI.COMM_WORLD, diff --git a/dolfinx/main/python/_downloads/56ce7e71d8c71b4d8ef7c699176dd4fd/demo_stokes.py b/dolfinx/main/python/_downloads/56ce7e71d8c71b4d8ef7c699176dd4fd/demo_stokes.py index 41c40ecc6..b93635d36 100644 --- a/dolfinx/main/python/_downloads/56ce7e71d8c71b4d8ef7c699176dd4fd/demo_stokes.py +++ b/dolfinx/main/python/_downloads/56ce7e71d8c71b4d8ef7c699176dd4fd/demo_stokes.py @@ -124,7 +124,7 @@ def lid_velocity_expression(x): return np.stack((np.ones(x.shape[1]), np.zeros(x.shape[1]))) # - -# Two {py:class}`function spaces ` are +# Two {py:class}`function spaces ` are # defined using different finite elements. `P2` corresponds to a # continuous piecewise quadratic basis (vector) and `P1` to a continuous # piecewise linear basis (scalar). diff --git a/dolfinx/main/python/_downloads/67f8546536727bd5386a27073bd16e12/demo_elasticity.py b/dolfinx/main/python/_downloads/67f8546536727bd5386a27073bd16e12/demo_elasticity.py index 6bba4254d..cbbf2acb4 100644 --- a/dolfinx/main/python/_downloads/67f8546536727bd5386a27073bd16e12/demo_elasticity.py +++ b/dolfinx/main/python/_downloads/67f8546536727bd5386a27073bd16e12/demo_elasticity.py @@ -28,7 +28,7 @@ import dolfinx import ufl from dolfinx import la -from dolfinx.fem import (Expression, Function, FunctionSpaceBase, dirichletbc, +from dolfinx.fem import (Expression, Function, FunctionSpace, dirichletbc, form, functionspace, locate_dofs_topological) from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, set_bc) @@ -53,7 +53,7 @@ # modes. -def build_nullspace(V: FunctionSpaceBase): +def build_nullspace(V: FunctionSpace): """Build PETSc nullspace for 3D elasticity""" # Create vectors that will span the nullspace diff --git a/dolfinx/main/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb b/dolfinx/main/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb index a58d2ee6a..d27746541 100644 --- a/dolfinx/main/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb +++ b/dolfinx/main/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ce68694f", + "id": "374302b8", "metadata": {}, "source": [ "# Mixed formulation for the Poisson equation" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "a0015332", + "id": "d50ade29", "metadata": {}, "source": [ "This demo illustrates how to solve Poisson equation using a mixed\n", @@ -89,7 +89,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cad6b09f", + "id": "123f3b00", "metadata": {}, "outputs": [], "source": [ diff --git a/dolfinx/main/python/_downloads/b94ac7be61dc3726ca331afd20f195d2/demo_poisson.py b/dolfinx/main/python/_downloads/b94ac7be61dc3726ca331afd20f195d2/demo_poisson.py index d06eb4876..1fe5c8349 100644 --- a/dolfinx/main/python/_downloads/b94ac7be61dc3726ca331afd20f195d2/demo_poisson.py +++ b/dolfinx/main/python/_downloads/b94ac7be61dc3726ca331afd20f195d2/demo_poisson.py @@ -13,7 +13,7 @@ # This demo is implemented in {download}`demo_poisson.py`. It # illustrates how to: # -# - Create a {py:class}`function space ` +# - Create a {py:class}`function space ` # - Solve a linear partial differential equation # # ## Equation and problem definition @@ -76,7 +76,7 @@ # We create a rectangular {py:class}`Mesh ` using # {py:func}`create_rectangle `, and # create a finite element {py:class}`function space -# ` $V$ on the mesh. +# ` $V$ on the mesh. # + msh = mesh.create_rectangle(comm=MPI.COMM_WORLD, diff --git a/dolfinx/main/python/_downloads/e8b180b39a27d7b04c2f666d14475ee3/demo_cahn-hilliard.py b/dolfinx/main/python/_downloads/e8b180b39a27d7b04c2f666d14475ee3/demo_cahn-hilliard.py index 1320def3e..c6d061ba5 100644 --- a/dolfinx/main/python/_downloads/e8b180b39a27d7b04c2f666d14475ee3/demo_cahn-hilliard.py +++ b/dolfinx/main/python/_downloads/e8b180b39a27d7b04c2f666d14475ee3/demo_cahn-hilliard.py @@ -150,7 +150,7 @@ # A unit square mesh with 96 cells edges in each direction is created, # and on this mesh a -# {py:class}`FunctionSpaceBase ` `ME` is built +# {py:class}`FunctionSpace ` `ME` is built # using a pair of linear Lagrange elements. msh = create_unit_square(MPI.COMM_WORLD, 96, 96, CellType.triangle) diff --git a/dolfinx/main/python/_downloads/f6f3cc4d9540871af057920d1ddb5561/demo_tnt-elements.py b/dolfinx/main/python/_downloads/f6f3cc4d9540871af057920d1ddb5561/demo_tnt-elements.py index 018fb86e7..0a9f4d2b6 100644 --- a/dolfinx/main/python/_downloads/f6f3cc4d9540871af057920d1ddb5561/demo_tnt-elements.py +++ b/dolfinx/main/python/_downloads/f6f3cc4d9540871af057920d1ddb5561/demo_tnt-elements.py @@ -216,7 +216,7 @@ def create_tnt_quad(degree): # the solution. -def poisson_error(V: fem.FunctionSpaceBase): +def poisson_error(V: fem.FunctionSpace): msh = V.mesh u, v = TrialFunction(V), TestFunction(V) diff --git a/dolfinx/main/python/_modules/dolfinx/fem.html b/dolfinx/main/python/_modules/dolfinx/fem.html index 4f99e355e..2748f6fba 100644 --- a/dolfinx/main/python/_modules/dolfinx/fem.html +++ b/dolfinx/main/python/_modules/dolfinx/fem.html @@ -94,8 +94,7 @@

Source code for dolfinx.fem

 from dolfinx.fem.dofmap import DofMap
 from dolfinx.fem.forms import Form, extract_function_spaces, form
 from dolfinx.fem.function import (Constant, ElementMetaData, Expression,
-                                  Function, FunctionSpace, FunctionSpaceBase,
-                                  VectorFunctionSpace, functionspace)
+                                  Function, FunctionSpace, functionspace)
 
 
 
[docs]def create_sparsity_pattern(a: Form): @@ -117,8 +116,7 @@

Source code for dolfinx.fem

 
 __all__ = [
     "Constant", "Expression", "Function", "ElementMetaData", "create_matrix",
-    "functionspace", "FunctionSpace", "FunctionSpaceBase", "VectorFunctionSpace",
-    "create_sparsity_pattern",
+    "functionspace", "FunctionSpace", "create_sparsity_pattern",
     "assemble_scalar", "assemble_matrix", "assemble_vector", "apply_lifting", "set_bc",
     "DirichletBC", "dirichletbc", "bcs_by_block", "DofMap", "Form",
     "form", "IntegralType", "create_vector",
diff --git a/dolfinx/main/python/_modules/dolfinx/fem/bcs.html b/dolfinx/main/python/_modules/dolfinx/fem/bcs.html
index 7a1e3603c..6794824a7 100644
--- a/dolfinx/main/python/_modules/dolfinx/fem/bcs.html
+++ b/dolfinx/main/python/_modules/dolfinx/fem/bcs.html
@@ -100,8 +100,8 @@ 

Source code for dolfinx.fem.bcs

 from dolfinx import cpp as _cpp
 
 
-
[docs]def locate_dofs_geometrical(V: typing.Union[dolfinx.fem.FunctionSpaceBase, - typing.Iterable[dolfinx.fem.FunctionSpaceBase]], +
[docs]def locate_dofs_geometrical(V: typing.Union[dolfinx.fem.FunctionSpace, + typing.Iterable[dolfinx.fem.FunctionSpace]], marker: typing.Callable) -> np.ndarray: """Locate degrees-of-freedom geometrically using a marker function. @@ -132,8 +132,8 @@

Source code for dolfinx.fem.bcs

         return _cpp.fem.locate_dofs_geometrical(_V, marker)
-
[docs]def locate_dofs_topological(V: typing.Union[dolfinx.fem.FunctionSpaceBase, - typing.Iterable[dolfinx.fem.FunctionSpaceBase]], +
[docs]def locate_dofs_topological(V: typing.Union[dolfinx.fem.FunctionSpace, + typing.Iterable[dolfinx.fem.FunctionSpace]], entity_dim: int, entities: numpy.typing.NDArray[np.int32], remote: bool = True) -> np.ndarray: """Locate degrees-of-freedom belonging to mesh entities topologically. @@ -194,14 +194,14 @@

Source code for dolfinx.fem.bcs

         return self._cpp_object.value
 
     @property
-    def function_space(self) -> dolfinx.fem.FunctionSpaceBase:
+    def function_space(self) -> dolfinx.fem.FunctionSpace:
         """The function space on which the boundary condition is defined"""
         return self._cpp_object.function_space
[docs]def dirichletbc(value: typing.Union[Function, Constant, np.ndarray], dofs: numpy.typing.NDArray[np.int32], - V: typing.Optional[dolfinx.fem.FunctionSpaceBase] = None) -> DirichletBC: + V: typing.Optional[dolfinx.fem.FunctionSpace] = None) -> DirichletBC: """Create a representation of Dirichlet boundary condition which is imposed on a linear system. @@ -259,7 +259,7 @@

Source code for dolfinx.fem.bcs

     return DirichletBC(bc)
-
[docs]def bcs_by_block(spaces: typing.Iterable[typing.Union[dolfinx.fem.FunctionSpaceBase, None]], +
[docs]def bcs_by_block(spaces: typing.Iterable[typing.Union[dolfinx.fem.FunctionSpace, None]], bcs: typing.Iterable[DirichletBC]) -> typing.List[typing.List[DirichletBC]]: """Arrange Dirichlet boundary conditions by the function space that they constrain. diff --git a/dolfinx/main/python/_modules/dolfinx/fem/forms.html b/dolfinx/main/python/_modules/dolfinx/fem/forms.html index e16ca1af8..786ccb6d7 100644 --- a/dolfinx/main/python/_modules/dolfinx/fem/forms.html +++ b/dolfinx/main/python/_modules/dolfinx/fem/forms.html @@ -94,7 +94,7 @@

Source code for dolfinx.fem.forms

 from dolfinx import cpp as _cpp
 from dolfinx import default_scalar_type, jit
 from dolfinx.fem import IntegralType
-from dolfinx.fem.function import FunctionSpaceBase
+from dolfinx.fem.function import FunctionSpace
 
 if typing.TYPE_CHECKING:
     from dolfinx.fem import function
@@ -137,7 +137,7 @@ 

Source code for dolfinx.fem.forms

         return self._cpp_object.rank
 
     @property
-    def function_spaces(self) -> typing.List[FunctionSpaceBase]:
+    def function_spaces(self) -> typing.List[FunctionSpace]:
         """Function spaces on which this form is defined"""
         return self._cpp_object.function_spaces
 
@@ -268,7 +268,7 @@ 

Source code for dolfinx.fem.forms

 
 
[docs]def extract_function_spaces(forms: typing.Union[typing.Iterable[Form], # type: ignore [return] typing.Iterable[typing.Iterable[Form]]], - index: int = 0) -> typing.Iterable[typing.Union[None, function.FunctionSpaceBase]]: + index: int = 0) -> typing.Iterable[typing.Union[None, function.FunctionSpace]]: """Extract common function spaces from an array of forms. If `forms` is a list of linear form, this function returns of list of the corresponding test functions. If `forms` is a 2D array of bilinear diff --git a/dolfinx/main/python/_modules/dolfinx/fem/function.html b/dolfinx/main/python/_modules/dolfinx/fem/function.html index 61ab028ad..40b75970b 100644 --- a/dolfinx/main/python/_modules/dolfinx/fem/function.html +++ b/dolfinx/main/python/_modules/dolfinx/fem/function.html @@ -86,7 +86,6 @@

Source code for dolfinx.fem.function

 from __future__ import annotations
 
 import typing
-import warnings
 from functools import singledispatch
 
 import numpy as np
@@ -309,7 +308,7 @@ 

Source code for dolfinx.fem.function

         return self._cpp_object.value_size
 
     @property
-    def argument_function_space(self) -> typing.Optional[FunctionSpaceBase]:
+    def argument_function_space(self) -> typing.Optional[FunctionSpace]:
         """The argument function space if expression has argument"""
         return self._argument_function_space
 
@@ -335,7 +334,7 @@ 

Source code for dolfinx.fem.function

 
     """
 
-    def __init__(self, V: FunctionSpaceBase, x: typing.Optional[la.Vector] = None,
+    def __init__(self, V: FunctionSpace, x: typing.Optional[la.Vector] = None,
                  name: typing.Optional[str] = None, dtype: typing.Optional[npt.DTypeLike] = None):
         """Initialize a finite element Function.
 
@@ -396,7 +395,7 @@ 

Source code for dolfinx.fem.function

             self._petsc_x.destroy()
 
     @property
-    def function_space(self) -> FunctionSpaceBase:
+    def function_space(self) -> FunctionSpace:
         """The FunctionSpace that the Function is defined on"""
         return self._V
 
@@ -556,7 +555,7 @@ 

Source code for dolfinx.fem.function

 
 
[docs] def collapse(self) -> Function: u_collapsed = self._cpp_object.collapse() - V_collapsed = FunctionSpaceBase(self.function_space._mesh, self.ufl_element(), u_collapsed.function_space) + V_collapsed = FunctionSpace(self.function_space._mesh, self.ufl_element(), u_collapsed.function_space) return Function(V_collapsed, la.Vector(u_collapsed.x))
@@ -580,7 +579,7 @@

Source code for dolfinx.fem.function

                   element: typing.Union[ufl.FiniteElementBase, ElementMetaData,
                                         typing.Tuple[str, int, typing.Tuple, bool]],
                   form_compiler_options: typing.Optional[dict[str, typing.Any]] = None,
-                  jit_options: typing.Optional[dict[str, typing.Any]] = None) -> FunctionSpaceBase:
+                  jit_options: typing.Optional[dict[str, typing.Any]] = None) -> FunctionSpace:
     """Create a finite element function space.
 
     Args:
@@ -633,33 +632,10 @@ 

Source code for dolfinx.fem.function

     except TypeError:
         cppV = _cpp.fem.FunctionSpace_float32(mesh._cpp_object, cpp_element, cpp_dofmap)
 
-    return FunctionSpaceBase(mesh, ufl_e, cppV)
+ return FunctionSpace(mesh, ufl_e, cppV)
-
[docs]def FunctionSpace(mesh: Mesh, - element: typing.Union[ufl.FiniteElementBase, ElementMetaData, - typing.Tuple[str, int, typing.Tuple, bool]], - form_compiler_options: typing.Optional[dict[str, typing.Any]] = None, - jit_options: typing.Optional[dict[str, typing.Any]] = None) -> FunctionSpaceBase: - """Create a finite element function space. - - .. deprecated:: 0.7 - Use :func:`functionspace` (no caps) instead. - - Args: - mesh: Mesh that space is defined on - element: Finite element description - form_compiler_options: Options passed to the form compiler - jit_options: Options controlling just-in-time compilation - - Returns: - A function space. - - """ - return functionspace(mesh, element, form_compiler_options, jit_options)
- - -
[docs]class FunctionSpaceBase(ufl.FunctionSpace): +
[docs]class FunctionSpace(ufl.FunctionSpace): """A space on which Functions (fields) can be defined.""" def __init__(self, mesh: Mesh, element: ufl.FiniteElementBase, @@ -683,7 +659,7 @@

Source code for dolfinx.fem.function

         self._mesh = mesh
         super().__init__(ufl_domain, element)
 
-
[docs] def clone(self) -> FunctionSpaceBase: +
[docs] def clone(self) -> FunctionSpace: """Create a new FunctionSpace :math:`W` which shares data with this FunctionSpace :math:`V`, but with a different unique integer ID. @@ -706,14 +682,14 @@

Source code for dolfinx.fem.function

         except TypeError:
             Vcpp = _cpp.fem.FunctionSpace_float32(
                 self._cpp_object.mesh, self._cpp_object.element, self._cpp_object.dofmap)
-        return FunctionSpaceBase(self._mesh, self.ufl_element(), Vcpp)
+ return FunctionSpace(self._mesh, self.ufl_element(), Vcpp)
@property def num_sub_spaces(self) -> int: """Number of sub spaces.""" return self.element.num_sub_elements -
[docs] def sub(self, i: int) -> FunctionSpaceBase: +
[docs] def sub(self, i: int) -> FunctionSpace: """Return the i-th sub space. Args: @@ -726,13 +702,13 @@

Source code for dolfinx.fem.function

         assert self.ufl_element().num_sub_elements > i
         sub_element = self.ufl_element().sub_elements[i]
         cppV_sub = self._cpp_object.sub([i])
-        return FunctionSpaceBase(self._mesh, sub_element, cppV_sub)
+ return FunctionSpace(self._mesh, sub_element, cppV_sub)
-
[docs] def component(self): +
[docs] def component(self): """Return the component relative to the parent space.""" return self._cpp_object.component()
-
[docs] def contains(self, V) -> bool: +
[docs] def contains(self, V) -> bool: """Check if a space is contained in, or is the same as (identity), this space. @@ -753,7 +729,7 @@

Source code for dolfinx.fem.function

         """Comparison for inequality."""
         return super().__ne__(other) or self._cpp_object != other._cpp_object
 
-
[docs] def ufl_function_space(self) -> ufl.FunctionSpace: +
[docs] def ufl_function_space(self) -> ufl.FunctionSpace: """UFL function space.""" return self
@@ -772,7 +748,7 @@

Source code for dolfinx.fem.function

         """Mesh on which the function space is defined."""
         return self._mesh
 
-
[docs] def collapse(self) -> tuple[FunctionSpaceBase, np.ndarray]: +
[docs] def collapse(self) -> tuple[FunctionSpace, np.ndarray]: """Collapse a subspace and return a new function space and a map from new to old dofs. @@ -782,10 +758,10 @@

Source code for dolfinx.fem.function

 
         """
         cpp_space, dofs = self._cpp_object.collapse()
-        V = FunctionSpaceBase(self._mesh, self.ufl_element(), cpp_space)
+        V = FunctionSpace(self._mesh, self.ufl_element(), cpp_space)
         return V, dofs
-
[docs] def tabulate_dof_coordinates(self) -> npt.NDArray[np.float64]: +
[docs] def tabulate_dof_coordinates(self) -> npt.NDArray[np.float64]: """Tabulate the coordinates of the degrees-of-freedom in the function space. Returns: @@ -797,37 +773,6 @@

Source code for dolfinx.fem.function

 
          """
         return self._cpp_object.tabulate_dof_coordinates()
- - -
[docs]def VectorFunctionSpace(mesh: Mesh, - element: typing.Union[ElementMetaData, typing.Tuple[str, int]], - dim: typing.Optional[int] = None) -> FunctionSpaceBase: - """Create a vector finite element (composition of scalar elements) function space. - - .. deprecated:: 0.7 - Use :func:`FunctionSpace` with a shape argument instead. - - Args: - mesh: Mesh that space is defined on - element: Finite element description. Must be a scalar element, - e.g. Lagrange. - dim: Dimension of the vector, e.g. number of vector components. - It defaults to the geometric dimension of the mesh. - - Returns: - A blocked vector function space. - - """ - warnings.warn('This method is deprecated. Use FunctionSpace with an element shape argument instead', - DeprecationWarning, stacklevel=2) - ed = ElementMetaData(*element) - e = basix.ufl.element(ed.family, mesh.basix_cell(), ed.degree, gdim=mesh.geometry.dim) - if len(e.value_shape) != 0: - raise ValueError("Cannot create vector element containing a non-scalar.") - ufl_e = basix.ufl.element(ed.family, mesh.basix_cell(), ed.degree, - shape=(mesh.geometry.dim,) if dim is None else (dim,), - gdim=mesh.geometry.dim) - return FunctionSpace(mesh, ufl_e)
diff --git a/dolfinx/main/python/_modules/dolfinx/mesh.html b/dolfinx/main/python/_modules/dolfinx/mesh.html index 69f023ab6..bd62aadea 100644 --- a/dolfinx/main/python/_modules/dolfinx/mesh.html +++ b/dolfinx/main/python/_modules/dolfinx/mesh.html @@ -84,7 +84,6 @@

Source code for dolfinx.mesh

 
 from __future__ import annotations
 
-
 import typing
 
 import numpy as np
diff --git a/dolfinx/main/python/_modules/dolfinx/plot.html b/dolfinx/main/python/_modules/dolfinx/plot.html
index 05021fb56..212b90574 100644
--- a/dolfinx/main/python/_modules/dolfinx/plot.html
+++ b/dolfinx/main/python/_modules/dolfinx/plot.html
@@ -165,8 +165,8 @@ 

Source code for dolfinx.plot

     return topology.reshape(-1), cell_types, msh.geometry.x
-@vtk_mesh.register(fem.FunctionSpaceBase) -def _(V: fem.FunctionSpaceBase, entities=None): +@vtk_mesh.register(fem.FunctionSpace) +def _(V: fem.FunctionSpace, entities=None): """Creates a VTK mesh topology (topology array and array of cell types) that is based on the degree-of-freedom coordinates. diff --git a/dolfinx/main/python/_sources/demos/demo_biharmonic.md.txt b/dolfinx/main/python/_sources/demos/demo_biharmonic.md.txt index be7128333..f0a78be05 100644 --- a/dolfinx/main/python/_sources/demos/demo_biharmonic.md.txt +++ b/dolfinx/main/python/_sources/demos/demo_biharmonic.md.txt @@ -124,7 +124,7 @@ from petsc4py.PETSc import ScalarType # type: ignore We begin by using {py:func}`create_rectangle ` to create a rectangular {py:class}`Mesh ` of the domain, and creating a -finite element {py:class}`FunctionSpaceBase ` +finite element {py:class}`FunctionSpace ` $V$ on the mesh. ```python diff --git a/dolfinx/main/python/_sources/demos/demo_cahn-hilliard.md.txt b/dolfinx/main/python/_sources/demos/demo_cahn-hilliard.md.txt index 285d8f809..fbaab8ea4 100644 --- a/dolfinx/main/python/_sources/demos/demo_cahn-hilliard.md.txt +++ b/dolfinx/main/python/_sources/demos/demo_cahn-hilliard.md.txt @@ -152,7 +152,7 @@ theta = 0.5 # time stepping family, e.g. theta=1 -> backward Euler, theta=0.5 - A unit square mesh with 96 cells edges in each direction is created, and on this mesh a -{py:class}`FunctionSpaceBase ` `ME` is built +{py:class}`FunctionSpace ` `ME` is built using a pair of linear Lagrange elements. ```python diff --git a/dolfinx/main/python/_sources/demos/demo_elasticity.md.txt b/dolfinx/main/python/_sources/demos/demo_elasticity.md.txt index 0f5c6f671..832bf3038 100644 --- a/dolfinx/main/python/_sources/demos/demo_elasticity.md.txt +++ b/dolfinx/main/python/_sources/demos/demo_elasticity.md.txt @@ -28,7 +28,7 @@ import numpy as np import dolfinx import ufl from dolfinx import la -from dolfinx.fem import (Expression, Function, FunctionSpaceBase, dirichletbc, +from dolfinx.fem import (Expression, Function, FunctionSpace, dirichletbc, form, functionspace, locate_dofs_topological) from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, set_bc) @@ -53,7 +53,7 @@ spanned by six vectors -- three translation modes and three rotation modes. ```python -def build_nullspace(V: FunctionSpaceBase): +def build_nullspace(V: FunctionSpace): """Build PETSc nullspace for 3D elasticity""" # Create vectors that will span the nullspace diff --git a/dolfinx/main/python/_sources/demos/demo_poisson.md.txt b/dolfinx/main/python/_sources/demos/demo_poisson.md.txt index ece2c17cb..8b38bc2be 100644 --- a/dolfinx/main/python/_sources/demos/demo_poisson.md.txt +++ b/dolfinx/main/python/_sources/demos/demo_poisson.md.txt @@ -13,7 +13,7 @@ jupytext: This demo is implemented in {download}`demo_poisson.py`. It illustrates how to: -- Create a {py:class}`function space ` +- Create a {py:class}`function space ` - Solve a linear partial differential equation ## Equation and problem definition @@ -75,7 +75,7 @@ from petsc4py.PETSc import ScalarType # type: ignore We create a rectangular {py:class}`Mesh ` using {py:func}`create_rectangle `, and create a finite element {py:class}`function space -` $V$ on the mesh. +` $V$ on the mesh. ```python msh = mesh.create_rectangle(comm=MPI.COMM_WORLD, diff --git a/dolfinx/main/python/_sources/demos/demo_stokes.md.txt b/dolfinx/main/python/_sources/demos/demo_stokes.md.txt index be8c1a1a2..b8de84898 100644 --- a/dolfinx/main/python/_sources/demos/demo_stokes.md.txt +++ b/dolfinx/main/python/_sources/demos/demo_stokes.md.txt @@ -130,7 +130,7 @@ def lid_velocity_expression(x): return np.stack((np.ones(x.shape[1]), np.zeros(x.shape[1]))) ``` -Two {py:class}`function spaces ` are +Two {py:class}`function spaces ` are defined using different finite elements. `P2` corresponds to a continuous piecewise quadratic basis (vector) and `P1` to a continuous piecewise linear basis (scalar). diff --git a/dolfinx/main/python/_sources/demos/demo_tnt-elements.md.txt b/dolfinx/main/python/_sources/demos/demo_tnt-elements.md.txt index 35ba513a1..a9fb0a9aa 100644 --- a/dolfinx/main/python/_sources/demos/demo_tnt-elements.md.txt +++ b/dolfinx/main/python/_sources/demos/demo_tnt-elements.md.txt @@ -222,7 +222,7 @@ as input, and solves a Poisson problem and returns the $L_2$ error of the solution. ```python -def poisson_error(V: fem.FunctionSpaceBase): +def poisson_error(V: fem.FunctionSpace): msh = V.mesh u, v = TrialFunction(V), TestFunction(V) diff --git a/dolfinx/main/python/demos/demo_biharmonic.html b/dolfinx/main/python/demos/demo_biharmonic.html index 9badc067c..d1ad677ae 100644 --- a/dolfinx/main/python/demos/demo_biharmonic.html +++ b/dolfinx/main/python/demos/demo_biharmonic.html @@ -233,7 +233,7 @@

Implementationcreate_rectangle to create a rectangular Mesh of the domain, and creating a -finite element FunctionSpaceBase +finite element FunctionSpace \(V\) on the mesh.

msh = mesh.create_rectangle(comm=MPI.COMM_WORLD,
                             points=((0.0, 0.0), (1.0, 1.0)), n=(32, 32),
diff --git a/dolfinx/main/python/demos/demo_cahn-hilliard.html b/dolfinx/main/python/demos/demo_cahn-hilliard.html
index f62408d0f..a65290a77 100644
--- a/dolfinx/main/python/demos/demo_cahn-hilliard.html
+++ b/dolfinx/main/python/demos/demo_cahn-hilliard.html
@@ -273,7 +273,7 @@ 

ImplementationFunctionSpaceBase ME is built +FunctionSpace ME is built using a pair of linear Lagrange elements.

msh = create_unit_square(MPI.COMM_WORLD, 96, 96, CellType.triangle)
 P1 = element("Lagrange", msh.basix_cell(), 1)
diff --git a/dolfinx/main/python/demos/demo_elasticity.html b/dolfinx/main/python/demos/demo_elasticity.html
index 84261c84b..7cf3d081a 100644
--- a/dolfinx/main/python/demos/demo_elasticity.html
+++ b/dolfinx/main/python/demos/demo_elasticity.html
@@ -160,7 +160,7 @@ 

Elasticity using algebraic multigridimport dolfinx import ufl from dolfinx import la -from dolfinx.fem import (Expression, Function, FunctionSpaceBase, dirichletbc, +from dolfinx.fem import (Expression, Function, FunctionSpace, dirichletbc, form, functionspace, locate_dofs_topological) from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, set_bc) @@ -183,7 +183,7 @@

Create the operator near-nullspacePETSc.NullSpace object for a 3D elasticity problem. The nullspace is spanned by six vectors – three translation modes and three rotation modes.

-
def build_nullspace(V: FunctionSpaceBase):
+
def build_nullspace(V: FunctionSpace):
     """Build PETSc nullspace for 3D elasticity"""
 
     # Create vectors that will span the nullspace
diff --git a/dolfinx/main/python/demos/demo_poisson.html b/dolfinx/main/python/demos/demo_poisson.html
index 105e32d3b..78c667cce 100644
--- a/dolfinx/main/python/demos/demo_poisson.html
+++ b/dolfinx/main/python/demos/demo_poisson.html
@@ -132,7 +132,7 @@ 

Poisson equationdemo_poisson.py. It illustrates how to:

@@ -188,7 +188,7 @@

ImplementationMesh using create_rectangle, and -create a finite element function space \(V\) on the mesh.

+create a finite element function space \(V\) on the mesh.

msh = mesh.create_rectangle(comm=MPI.COMM_WORLD,
                             points=((0.0, 0.0), (2.0, 1.0)), n=(32, 16),
                             cell_type=mesh.CellType.triangle)
diff --git a/dolfinx/main/python/demos/demo_stokes.html b/dolfinx/main/python/demos/demo_stokes.html
index 164ff7bd3..e1cd20122 100644
--- a/dolfinx/main/python/demos/demo_stokes.html
+++ b/dolfinx/main/python/demos/demo_stokes.html
@@ -247,7 +247,7 @@ 

Implementationreturn np.stack((np.ones(x.shape[1]), np.zeros(x.shape[1])))

-

Two function spaces are +

Two function spaces are defined using different finite elements. P2 corresponds to a continuous piecewise quadratic basis (vector) and P1 to a continuous piecewise linear basis (scalar).

diff --git a/dolfinx/main/python/demos/demo_tnt-elements.html b/dolfinx/main/python/demos/demo_tnt-elements.html index 9a754c7f7..732e131f9 100644 --- a/dolfinx/main/python/demos/demo_tnt-elements.html +++ b/dolfinx/main/python/demos/demo_tnt-elements.html @@ -324,7 +324,7 @@

Comparing TNT elements and Q elements\(L_2\) error of the solution.

-
def poisson_error(V: fem.FunctionSpaceBase):
+
def poisson_error(V: fem.FunctionSpace):
     msh = V.mesh
     u, v = TrialFunction(V), TestFunction(V)
 
diff --git a/dolfinx/main/python/generated/dolfinx.fem.html b/dolfinx/main/python/generated/dolfinx.fem.html
index 91aa0414c..408dd11b0 100644
--- a/dolfinx/main/python/generated/dolfinx.fem.html
+++ b/dolfinx/main/python/generated/dolfinx.fem.html
@@ -169,7 +169,7 @@
 
 
-property function_space: FunctionSpaceBase
+property function_space: FunctionSpace

The function space on which the boundary condition is defined

@@ -317,7 +317,7 @@
-property argument_function_space: Optional[FunctionSpaceBase]
+property argument_function_space: Optional[FunctionSpace]

The argument function space if expression has argument

@@ -408,7 +408,7 @@
-property function_spaces: List[FunctionSpaceBase]
+property function_spaces: List[FunctionSpace]

Function spaces on which this form is defined

@@ -485,7 +485,7 @@
-property function_space: FunctionSpaceBase
+property function_space: FunctionSpace

The FunctionSpace that the Function is defined on

@@ -561,31 +561,9 @@ -
-
-dolfinx.fem.FunctionSpace(mesh: Mesh, element: Union[ufl.FiniteElementBase, ElementMetaData, Tuple[str, int, Tuple, bool]], form_compiler_options: Optional[dict[str, Any]] = None, jit_options: Optional[dict[str, Any]] = None) FunctionSpaceBase[source]
-

Create a finite element function space.

-
-

Deprecated since version 0.7: Use functionspace() (no caps) instead.

-
-
-
Parameters:
-
    -
  • mesh – Mesh that space is defined on

  • -
  • element – Finite element description

  • -
  • form_compiler_options – Options passed to the form compiler

  • -
  • jit_options – Options controlling just-in-time compilation

  • -
-
-
Returns:
-

A function space.

-
-
-
-
-
-class dolfinx.fem.FunctionSpaceBase(mesh: Mesh, element: ufl.FiniteElementBase, cppV: Union[_cpp.fem.FunctionSpace_float32, _cpp.fem.FunctionSpace_float64])[source]
+
+class dolfinx.fem.FunctionSpace(mesh: Mesh, element: ufl.FiniteElementBase, cppV: Union[_cpp.fem.FunctionSpace_float32, _cpp.fem.FunctionSpace_float64])[source]

Bases: FunctionSpace

A space on which Functions (fields) can be defined.

Create a finite element function space.

@@ -604,8 +582,8 @@
-
-clone() FunctionSpaceBase[source]
+
+clone() FunctionSpace[source]

Create a new FunctionSpace \(W\) which shares data with this FunctionSpace \(V\), but with a different unique integer ID.

This function is helpful for defining mixed problems and using @@ -624,8 +602,8 @@

-
-collapse() tuple[dolfinx.fem.function.FunctionSpaceBase, numpy.ndarray][source]
+
+collapse() tuple[dolfinx.fem.function.FunctionSpace, numpy.ndarray][source]

Collapse a subspace and return a new function space and a map from new to old dofs.

@@ -637,14 +615,14 @@
-
-component()[source]
+
+component()[source]

Return the component relative to the parent space.

-
-contains(V) bool[source]
+
+contains(V) bool[source]

Check if a space is contained in, or is the same as (identity), this space.

@@ -658,32 +636,32 @@
-
-property dofmap: DofMap
+
+property dofmap: DofMap

Degree-of-freedom map associated with the function space.

-
-property element
+
+property element

Function space finite element.

-
-property mesh: Mesh
+
+property mesh: Mesh

Mesh on which the function space is defined.

-
-property num_sub_spaces: int
+
+property num_sub_spaces: int

Number of sub spaces.

-
-sub(i: int) FunctionSpaceBase[source]
+
+sub(i: int) FunctionSpace[source]

Return the i-th sub space.

Parameters:
@@ -696,8 +674,8 @@
-
-tabulate_dof_coordinates() ndarray[Any, dtype[float64]][source]
+
+tabulate_dof_coordinates() ndarray[Any, dtype[float64]][source]

Tabulate the coordinates of the degrees-of-freedom in the function space.

Returns:
@@ -712,8 +690,8 @@
-
-ufl_function_space() FunctionSpace[source]
+
+ufl_function_space() FunctionSpace[source]

UFL function space.

@@ -760,29 +738,6 @@ -
-
-dolfinx.fem.VectorFunctionSpace(mesh: Mesh, element: Union[ElementMetaData, Tuple[str, int]], dim: Optional[int] = None) FunctionSpaceBase[source]
-

Create a vector finite element (composition of scalar elements) function space.

-
-

Deprecated since version 0.7: Use FunctionSpace() with a shape argument instead.

-
-
-
Parameters:
-
    -
  • mesh – Mesh that space is defined on

  • -
  • element – Finite element description. Must be a scalar element, -e.g. Lagrange.

  • -
  • dim – Dimension of the vector, e.g. number of vector components. -It defaults to the geometric dimension of the mesh.

  • -
-
-
Returns:
-

A blocked vector function space.

-
-
-
-
dolfinx.fem.apply_lifting(b: ndarray, a: List[Form], bcs: List[List[DirichletBC]], x0: Optional[List[ndarray]] = None, scale: float = 1.0, constants=None, coeffs=None) None[source]
@@ -878,7 +833,7 @@
-dolfinx.fem.bcs_by_block(spaces: Iterable[Optional[FunctionSpaceBase]], bcs: Iterable[DirichletBC]) List[List[DirichletBC]][source]
+dolfinx.fem.bcs_by_block(spaces: Iterable[Optional[FunctionSpace]], bcs: Iterable[DirichletBC]) List[List[DirichletBC]][source]

Arrange Dirichlet boundary conditions by the function space that they constrain.

Given a sequence of function spaces spaces and a sequence of @@ -940,7 +895,7 @@

-dolfinx.fem.dirichletbc(value: Union[Function, Constant, np.ndarray], dofs: numpy.typing.NDArray[np.int32], V: Optional[dolfinx.fem.FunctionSpaceBase] = None) DirichletBC[source]
+dolfinx.fem.dirichletbc(value: Union[Function, Constant, np.ndarray], dofs: numpy.typing.NDArray[np.int32], V: Optional[dolfinx.fem.FunctionSpace] = None) DirichletBC[source]

Create a representation of Dirichlet boundary condition which is imposed on a linear system.

@@ -965,7 +920,7 @@
-dolfinx.fem.extract_function_spaces(forms: Union[Iterable[Form], Iterable[Iterable[Form]]], index: int = 0) Iterable[Union[None, function.FunctionSpaceBase]][source]
+dolfinx.fem.extract_function_spaces(forms: Union[Iterable[Form], Iterable[Iterable[Form]]], index: int = 0) Iterable[Union[None, function.FunctionSpace]][source]

Extract common function spaces from an array of forms. If forms is a list of linear form, this function returns of list of the corresponding test functions. If forms is a 2D array of bilinear @@ -1003,7 +958,7 @@

-dolfinx.fem.functionspace(mesh: Mesh, element: Union[ufl.FiniteElementBase, ElementMetaData, Tuple[str, int, Tuple, bool]], form_compiler_options: Optional[dict[str, Any]] = None, jit_options: Optional[dict[str, Any]] = None) FunctionSpaceBase[source]
+dolfinx.fem.functionspace(mesh: Mesh, element: Union[ufl.FiniteElementBase, ElementMetaData, Tuple[str, int, Tuple, bool]], form_compiler_options: Optional[dict[str, Any]] = None, jit_options: Optional[dict[str, Any]] = None) FunctionSpace[source]

Create a finite element function space.

Parameters:
@@ -1022,7 +977,7 @@
-dolfinx.fem.locate_dofs_geometrical(V: Union[FunctionSpaceBase, Iterable[FunctionSpaceBase]], marker: Callable) ndarray[source]
+dolfinx.fem.locate_dofs_geometrical(V: Union[FunctionSpace, Iterable[FunctionSpace]], marker: Callable) ndarray[source]

Locate degrees-of-freedom geometrically using a marker function.

Parameters:
@@ -1049,7 +1004,7 @@
-dolfinx.fem.locate_dofs_topological(V: Union[FunctionSpaceBase, Iterable[FunctionSpaceBase]], entity_dim: int, entities: ndarray[Any, dtype[int32]], remote: bool = True) ndarray[source]
+dolfinx.fem.locate_dofs_topological(V: Union[FunctionSpace, Iterable[FunctionSpace]], entity_dim: int, entities: ndarray[Any, dtype[int32]], remote: bool = True) ndarray[source]

Locate degrees-of-freedom belonging to mesh entities topologically.

Parameters:
diff --git a/dolfinx/main/python/generated/dolfinx.plot.html b/dolfinx/main/python/generated/dolfinx.plot.html index 6ef59b68d..618d3ac1a 100644 --- a/dolfinx/main/python/generated/dolfinx.plot.html +++ b/dolfinx/main/python/generated/dolfinx.plot.html @@ -116,7 +116,7 @@
dolfinx.plot.vtk_mesh(msh: Mesh, dim: Optional[int] = None, entities=None)[source]
-dolfinx.plot.vtk_mesh(V: FunctionSpaceBase, entities=None)
+dolfinx.plot.vtk_mesh(V: FunctionSpace, entities=None)

Create vtk mesh topology data for mesh entities of a given dimension. The vertex indices in the returned topology array are the indices for the associated entry in the mesh geometry.

diff --git a/dolfinx/main/python/genindex.html b/dolfinx/main/python/genindex.html index b5cc2731c..1a9ab8631 100644 --- a/dolfinx/main/python/genindex.html +++ b/dolfinx/main/python/genindex.html @@ -344,7 +344,7 @@

C

  • (class in dolfinx.mesh)
  • -
  • clone() (dolfinx.fem.FunctionSpaceBase method) +
  • clone() (dolfinx.fem.FunctionSpace method)
  • close() (dolfinx.cpp.io.FidesWriter_float32 method) @@ -401,7 +401,7 @@

    C

  • (dolfinx.fem.Function method)
  • -
  • (dolfinx.fem.FunctionSpaceBase method) +
  • (dolfinx.fem.FunctionSpace method)
  • column_index_map() (dolfinx.cpp.la.SparsityPattern method) @@ -429,7 +429,7 @@

    C

  • compute_closest_entity() (in module dolfinx.cpp.geometry) @@ -499,7 +499,7 @@

    C

  • convergence_criterion (dolfinx.cpp.nls.petsc.NewtonSolver property) @@ -759,7 +759,7 @@

    D

  • (dolfinx.cpp.mesh.Geometry_float64 property)
  • -
  • (dolfinx.fem.FunctionSpaceBase property) +
  • (dolfinx.fem.FunctionSpace property)
  • @@ -1039,7 +1039,7 @@

    E

  • ElementDofLayout (class in dolfinx.cpp.fem) @@ -1228,15 +1228,13 @@

    F

  • (dolfinx.fem.Form property)
  • -
  • FunctionSpace() (in module dolfinx.fem) +
  • FunctionSpace (class in dolfinx.fem)
  • functionspace() (in module dolfinx.fem)
  • FunctionSpace_float32 (class in dolfinx.cpp.fem)
  • FunctionSpace_float64 (class in dolfinx.cpp.fem) -
  • -
  • FunctionSpaceBase (class in dolfinx.fem)
  • @@ -1692,7 +1690,7 @@

    M

  • (dolfinx.fem.Form property)
  • -
  • (dolfinx.fem.FunctionSpaceBase property) +
  • (dolfinx.fem.FunctionSpace property)
  • Mesh_float32 (class in dolfinx.cpp.mesh) @@ -1943,7 +1941,7 @@

    N

  • (dolfinx.cpp.fem.FiniteElement_float64 property)
  • -
  • num_sub_spaces (dolfinx.fem.FunctionSpaceBase property) +
  • num_sub_spaces (dolfinx.fem.FunctionSpace property)
  • @@ -2346,7 +2344,7 @@

    S

  • (dolfinx.fem.Function method)
  • -
  • (dolfinx.fem.FunctionSpaceBase method) +
  • (dolfinx.fem.FunctionSpace method)
  • symmetry (dolfinx.fem.ElementMetaData attribute) @@ -2364,7 +2362,7 @@

    T

  • tetrahedron (dolfinx.cpp.mesh.CellType attribute) @@ -2465,7 +2463,7 @@

    U

    • -
    • ufl_function_space() (dolfinx.fem.FunctionSpaceBase method) +
    • ufl_function_space() (dolfinx.fem.FunctionSpace method)
    • ufl_id() (dolfinx.mesh.MeshTags method)
    • @@ -2602,8 +2600,6 @@

      V

    • Vector_float32 (class in dolfinx.cpp.la)
    • Vector_float64 (class in dolfinx.cpp.la) -
    • -
    • VectorFunctionSpace() (in module dolfinx.fem)
    • vertex (dolfinx.cpp.fem.IntegralType attribute) diff --git a/dolfinx/main/python/objects.inv b/dolfinx/main/python/objects.inv index e7fc0d2a9d3f61e04cc1201818e46c7bca0b9cd2..bebb38e41d6a02cbb519b5d4226dd8ad2d38f84a 100644 GIT binary patch delta 7097 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