# Copyright (C) 2018-2025 Michal Habera and Paul T. Kühner
#
# This file is part of DOLFINx (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
import typing
from collections.abc import Sequence
from mpi4py.MPI import Comm
from basix.finite_element import FiniteElement
from dolfinx.cpp.fem import DofMap as _DofMap
from dolfinx.cpp.fem import create_dofmaps as _create_dofmaps
if typing.TYPE_CHECKING:
import dolfinx.mesh
[docs]
class DofMap:
"""Degree-of-freedom map.
This class handles the mapping of degrees of freedom. It builds a
dof map based on a FiniteElement on a specific mesh.
"""
_cpp_object: _DofMap
def __init__(self, dofmap: _DofMap):
self._cpp_object = dofmap
[docs]
def cell_dofs(self, cell_index: int):
"""Cell local-global dof map
Args:
cell: The cell index.
Returns:
Local-global dof map for the cell (using process-local
indices).
"""
return self._cpp_object.cell_dofs(cell_index)
@property
def bs(self):
"""Block size of the dofmap."""
return self._cpp_object.bs
@property
def dof_layout(self):
"""Layout of dofs on an element."""
return self._cpp_object.dof_layout
@property
def index_map(self):
"""Index map that described the parallel distribution of the
dofmap."""
return self._cpp_object.index_map
@property
def index_map_bs(self):
"""Block size of the index map."""
return self._cpp_object.index_map_bs
@property
def list(self):
"""Adjacency list with dof indices for each cell."""
return self._cpp_object.map()
[docs]
def create_dofmaps(
comm: Comm, topology: "dolfinx.mesh.Topology", elements: Sequence[FiniteElement]
) -> list[DofMap]:
"""Create degree-of-freedom maps on a given topology.
Args:
comm: MPI communicator
topology: Mesh topology
elements: Sequence of elements
Returns:
List of degree-of-freedom maps where the ``i``-th map is the map
for ``elements[i]``.
"""
elements_cpp = [e._cpp_object for e in elements]
cpp_dofmaps = _create_dofmaps(comm, topology._cpp_object, elements_cpp)
return [DofMap(cpp_object) for cpp_object in cpp_dofmaps]