# Already the same on every version

From DOLFINx 0.10 on, these work the same way on 0.10, 0.11 and main, so fenicsx-compat has no wrapper for them. Call DOLFINx directly. Older code often still carries version branches for them, which can be deleted.

| To | Call this on every version | Notes |
|---|---|---|
| Get the interpolation points of an element | {py:attr}`V.element.interpolation_points<dolfinx.fem.FiniteElement.interpolation_points>` | A property on the Python {py:class}`FiniteElement<dolfinx.fem.FiniteElement>`. Only the C++ object has the method {py:meth}`V.element._cpp_object.interpolation_points()<dolfinx.cpp.fem.FiniteElement_float64.interpolation_points>`. |
| Build a C++ function space | {py:class}`dolfinx.cpp.fem.FunctionSpace_float64(mesh._cpp_object, element._cpp_object, dofmap._cpp_object)<dolfinx.cpp.fem.FunctionSpace_float64>` | No `value_shape` argument. {py:class}`_float32<dolfinx.cpp.fem.FunctionSpace_float32>` likewise. |
| Count the dofs in an entity's closure | {py:meth}`len(layout.entity_closure_dofs(dim, i))<dolfinx.fem.ElementDofLayout.entity_closure_dofs>` | [`ElementDofLayout.num_entity_closure_dofs`](https://docs.fenicsproject.org/dolfinx/v0.10.0.post5/python/generated/dolfinx.cpp.fem.html#dolfinx.cpp.fem.ElementDofLayout.num_entity_closure_dofs) and [`num_entity_dofs`](https://docs.fenicsproject.org/dolfinx/v0.10.0.post5/python/generated/dolfinx.cpp.fem.html#dolfinx.cpp.fem.ElementDofLayout.num_entity_dofs) only exist in 0.10. {py:meth}`entity_dofs<dolfinx.fem.ElementDofLayout.entity_dofs>` and {py:meth}`entity_closure_dofs<dolfinx.fem.ElementDofLayout.entity_closure_dofs>` exist everywhere. |
| Pack constants and coefficients | {py:func}`dolfinx.fem.pack_constants(form)<dolfinx.fem.pack_constants>`, {py:func}`dolfinx.fem.pack_coefficients(form)<dolfinx.fem.pack_coefficients>` | Public in {py:mod}`dolfinx.fem` everywhere. No need for `dolfinx.cpp.fem.pack_*(form._cpp_object)`. |
| Read gmsh models | {py:mod}`dolfinx.io.gmsh` | [`dolfinx.io.gmshio`](https://docs.fenicsproject.org/dolfinx/v0.9.0/python/generated/dolfinx.io.gmshio.html#module-dolfinx.io.gmshio) no longer exists. {py:func}`model_to_mesh<dolfinx.io.gmsh.model_to_mesh>` returns a {py:class}`MeshData<dolfinx.io.gmsh.MeshData>` named tuple, so the mesh is {py:attr}`.mesh<dolfinx.io.gmsh.MeshData.mesh>`. For the ghost mode, see [`model_to_mesh`](fn-model-to-mesh). |
| Find which process owns points | {py:func}`dolfinx.geometry.determine_point_ownership(mesh, points, padding=tol)<dolfinx.geometry.determine_point_ownership>` | Returns a {py:class}`PointOwnershipData<dolfinx.geometry.PointOwnershipData>` with {py:attr}`src_owner<dolfinx.geometry.PointOwnershipData.src_owner>`, {py:attr}`dest_owner<dolfinx.geometry.PointOwnershipData.dest_owner>`, {py:attr}`dest_points<dolfinx.geometry.PointOwnershipData.dest_points>` and {py:attr}`dest_cells<dolfinx.geometry.PointOwnershipData.dest_cells>`. `padding` has no default. |
| Compute integration entities | {py:func}`dolfinx.fem.compute_integration_domains(integral_type, mesh.topology, entities)<dolfinx.fem.compute_integration_domains>` | Three arguments, no dimension. Takes the Python {py:class}`topology<dolfinx.mesh.Topology>`. Returns a flat array. |
| Build a C++ topology | {py:class}`dolfinx.cpp.mesh.Topology(cell_type, vertex_map, cell_map, cells, original_index)<dolfinx.cpp.mesh.Topology>` | The only constructor; it takes no communicator. The index maps and `cells` must be C++ objects, see [`unwrap_index_map`](fn-unwrap-index-map). |
| Create and assemble blocked or nested PETSc objects | {py:func}`dolfinx.fem.petsc.create_vector(spaces, kind=...)<dolfinx.fem.petsc.create_vector>`, {py:func}`create_matrix(a, kind=...)<dolfinx.fem.petsc.create_matrix>`, {py:func}`assemble_vector(L, kind=...)<dolfinx.fem.petsc.assemble_vector>`, {py:func}`assemble_matrix(a, bcs=...)<dolfinx.fem.petsc.assemble_matrix>` | The [`*_block`](https://docs.fenicsproject.org/dolfinx/v0.9.0/python/generated/dolfinx.fem.petsc.html#module-dolfinx.fem.petsc) and [`*_nest`](https://docs.fenicsproject.org/dolfinx/v0.9.0/python/generated/dolfinx.fem.petsc.html#module-dolfinx.fem.petsc) functions are gone. `kind="nest"` gives a nest object; for one blocked object, `kind="mpi"` is used by scifem on 0.11 and main. |

## Differences with no wrapper

These do differ between versions, and fenicsx-compat does not cover them.

| What | 0.10, 0.11 | main | Portable |
|---|---|---|---|
| Set Dirichlet values in an array | [`dolfinx.fem.set_bc(b, bcs, x0, alpha)`](https://docs.fenicsproject.org/dolfinx/v0.10.0.post5/python/generated/dolfinx.fem.html#dolfinx.fem.set_bc), deprecated in 0.10 | removed | {py:meth}`for bc in bcs: bc.set(b, x0, alpha)<dolfinx.fem.DirichletBC.set>` with `b` a NumPy array. For a PETSc vector, see [`set_bc`](fn-set-bc). |
| Newton solver problem class | [`dolfinx.fem.petsc.NewtonSolverNonlinearProblem`](https://docs.fenicsproject.org/dolfinx/v0.10.0.post5/python/generated/dolfinx.fem.petsc.html#dolfinx.fem.petsc.NewtonSolverNonlinearProblem) | removed | {py:class}`dolfinx.fem.petsc.NonlinearProblem`, which solves with PETSc SNES and has a different interface |
| Point ownership search | [`determine_point_ownership(mesh, points, padding, cells=None)`](https://docs.fenicsproject.org/dolfinx/v0.10.0.post5/python/generated/dolfinx.geometry.html#dolfinx.geometry.determine_point_ownership) | adds {py:func}`find_closest_cell=True<dolfinx.geometry.determine_point_ownership>` | Do not pass `find_closest_cell` |
