Source code for simudo.fem.mesh_data
from cached_property import cached_property
import dolfin
from ..util import SetattrInitMixin
__all__ = ['MeshData']
[docs]class MeshData(SetattrInitMixin):
'''Holds mesh and topology data relating to a particular dolfin mesh.
Attributes
----------
mesh: dolfin.Mesh
The mesh itself.
cell_function: dolfin.CellFunction
Subdomain cell markers.
facet_function: dolfin.FacetFunction
Subdomain boundary facet markers.
region_name_to_cvs: dict
{region_name: set_of_cell_values}
facets_name_to_fvs: dict
{facets_name: {(facet_value, sign), ...}}
facets_manager: FacetsManager
Relation information between cell and facet values.
material_to_region_map: dict
Mapping from material to abstract CellRegion.
mesh_unit: pint.Quantity
Mesh length unit.
'''
[docs] def evaluate_topology(self, region):
'''\
Evaluate a topological region.
Parameters
----------
region: :py:class:`.topology.CellRegion` or :py:class:`.topology.FacetRegion`
Topological region.
Returns
-------
geometrical_values: set
The return value depends on the type of the :code:`region` argument.
- If the region is a :py:class:`.topology.CellRegion`, return a
set of cell values (values in :py:attr:`~cell_function`).
- If the region is a :py:class:`.topology.FacetRegion`, return a
set of tuples :code:`(facet_value, sign)` where
:code:`facet_value` is a facet value (value in
:py:attr:`~facet_function`), and :code:`sign` is either
:code:`+1` or :code:`-1` depending on whether the facet
orientation matches the boundary orientation.
'''
return region.evaluate(dict(
region_name_to_cvs=self.region_name_to_cvs,
facets_name_to_fvs=self.facets_name_to_fvs,
facets_manager=self.facets_manager))
@cached_property
def cell_to_cells_adjacency_via_facet(self):
mesh = self.mesh
D = mesh.topology().dim()
# Initialize adjacency graph between facets and cells
mesh.init(D-1, D)
# Initialize adjacency graph between cells and cells
mesh.init(D, D)
cell_neighbors = [[] for i in range(mesh.num_cells())]
for facet in dolfin.facets(mesh):
l = facet.entities(D)
if len(l) == 2:
a, b = l
cell_neighbors[a].append(b)
cell_neighbors[b].append(a)
return cell_neighbors