Source code for openpnm.network._delaunay_voronoi_dual
import numpy as np
from openpnm.network import Network
from openpnm._skgraph.generators.tools import parse_points
from openpnm._skgraph.generators import voronoi_delaunay_dual
from openpnm.utils import Docorator
__all__ = ['DelaunayVoronoiDual']
docstr = Docorator()
[docs]
@docstr.dedent
class DelaunayVoronoiDual(Network):
r"""
Combined and interconnected Voronoi and Delaunay tessellations
Parameters
----------
points : array_like or int
Can either be an N-by-3 array of point coordinates which will be used,
or a scalar value indicating the number of points to generate
shape : array_like
The size and shape of the domain:
========== ============================================================
shape result
========== ============================================================
[x, y, z] A 3D cubic domain of dimension x, y and z
[x, y, 0] A 2D square domain of size x by y
========== ============================================================
trim : bool, optional
If ``True`` then all vertices laying outside the domain will
be removed. This is only useful if ``reflect=True``.
reflect : bool, optional
If ``True`` then the base points will be reflected across
all the faces of the domain prior to performing the tessellation. This
feature is best combined with ``trim=True``.
f : float
The fraction of points which should be reflected. The default is 1 which
reflects all the points in the domain, but this can lead to a lot of
unnecessary points, so setting to 0.1 or 0.2 helps speed, but risks that
the tessellation may not have smooth faces if not enough points are
reflected.
relaxation : int
The number of time to iteratively relax the base points by moving them to
the centroid of their respective Voronoi hulls. The default it 0.
%(Network.parameters)s
Notes
-----
A Delaunay tessellation is performed on a set of base points then the
corresponding Voronoi diagram is generated. Finally, each Delaunay node
is connected to its neighboring Voronoi vertices to create interconnections
between the two networks.
All pores and throats are labelled according to their network (i.e.
'pore.delaunay'), so they can be each assigned to a different Geometry.
"""
def __init__(
self,
shape,
points,
trim=True,
reflect=True,
f=1,
relaxation=0,
**kwargs
):
super().__init__(**kwargs)
net, vor, tri = voronoi_delaunay_dual(
shape=shape,
points=points,
trim=trim,
reflect=reflect,
relaxation=relaxation,
f=f,
node_prefix='pore',
edge_prefix='throat',
)
self.update(net)
self._post_init()
self.vor = vor
self.tri = tri
[docs]
def find_throat_facets(self, throats=None):
r"""
Finds the indicies of the Voronoi nodes that define the facet or
ridge between the Delaunay nodes connected by the given throat.
Parameters
----------
throats : array_like
The throats whose facets are sought. The given throats should be
from the 'delaunay' network. If no throats are specified, all
'delaunay' throats are assumed.
Notes
-----
The method is not well optimized as it scans through each given throat
inside a for-loop, so it could be slow for large networks.
"""
if throats is None:
throats = self.throats('delaunay')
temp = []
tvals = self['throat.interconnect'].astype(int)
am = self.create_adjacency_matrix(weights=tvals, fmt='lil',
drop_zeros=True)
for t in throats:
P12 = self['throat.conns'][t]
Ps = list(set(am.rows[P12][0]).intersection(am.rows[P12][1]))
temp.append(Ps)
return np.array(temp, dtype=object)
[docs]
def find_pore_hulls(self, pores=None):
r"""
Finds the indices of the Voronoi nodes that define the convex hull
around the given Delaunay nodes.
Parameters
----------
pores : array_like
The pores whose convex hull are sought. The given pores should be
from the 'delaunay' network. If no pores are given, then the hull
is found for all 'delaunay' pores.
Notes
-----
This metod is not fully optimized as it scans through each pore in a
for-loop, so could be slow for large networks.
"""
if pores is None:
pores = self.pores('delaunay')
temp = []
tvals = self['throat.interconnect'].astype(int)
am = self.create_adjacency_matrix(weights=tvals, fmt='lil',
drop_zeros=True)
for p in pores:
Ps = am.rows[p]
temp.append(Ps)
return np.array(temp, dtype=object)