Source code for openpnm.network._cubic_template

import logging
import numpy as np
from openpnm.network import Network
from openpnm._skgraph.generators import cubic_template
from openpnm._skgraph.queries import find_coordination
from openpnm._skgraph.tools import dimensionality, find_surface_nodes


__all__ = ['CubicTemplate']


[docs] class CubicTemplate(Network): r""" Simple cubic lattice with arbitrary domain shape specified by a template image The class creates a standard Cubic network the same shape as the provided image, then trims pores from the network that are not in the mask. Parameters ---------- template : array_like The array (image) describing the desired shape of the domain. All locations in the image that are marked as ``True`` are kept while the rest of trimmed to yeild the shape. spacing : array_like, optional The spacing between pore centers in each direction. If not given, then [1, 1, 1] is assumed. name : str An optional name for the object to help identify it. If not given, one will be generated. Notes ----- The other arguments are the same as ``Cubic`` except that ``shape`` is inferred from the ``template`` image. """ def __init__(self, template, spacing=[1, 1, 1], label_surface_pores=False, **kwargs): super().__init__(**kwargs) template = np.atleast_3d(template) net = cubic_template(template=template, spacing=spacing, node_prefix='pore', edge_prefix='throat') self.update(net) if not label_surface_pores: return self['pore.surface'] = find_surface_nodes(self) ndims = dimensionality(self).sum() max_neighbors = 6 if ndims == 3 else 4 num_neighbors = find_coordination(self, nodes=self.Ps) mask_internal_surface = (num_neighbors < max_neighbors) & ~self["pore.surface"] self.set_label("pore.internal_surface", pores=mask_internal_surface)