Source code for openpnm.visualization._conduit_visualizer

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import PatchCollection
from matplotlib.patches import Circle, Polygon, Rectangle

from openpnm._skgraph.tools import rotate_coords
from openpnm.models.geometry import throat_endpoints, throat_length
from openpnm.network import Network
from openpnm.topotools import find_connected_sites

__all__ = [
    'draw_conduit',
]


[docs] def draw_conduit(network, throat): """Draws a subset of a network given throat numbers.""" pn = network P1, P2 = find_connected_sites(g=pn, bonds=throat) new_net = Network(coords=pn.coords[[P1, P2], :], conns=np.atleast_2d([0, 1])) new_net.regenerate_models() new_net['pore.diameter'] = pn['pore.diameter'][[P1, P2]] new_net['throat.diameter'] = [pn['throat.diameter'][throat]] new_net['throat.length'] = throat_length.circles_and_rectangles(new_net) new_net['throat.endpoints'] = throat_endpoints.spheres_and_cylinders(new_net) Pcrds = np.vstack((pn.coords[0, :], pn.coords[0, :])) Pcrds[1, :] = Pcrds[1, :] + np.array([new_net['throat.spacing'], 0, 0]) fig, ax = plt.subplots(figsize=[10, 5]) patches = [] for i, P in enumerate([0, 1]): x, y, r = Pcrds[P, 0], Pcrds[P, 1], new_net['pore.diameter'][P]/2 circle = Circle((x, y), r) patches.append(circle) Tcrds = np.vstack(list(new_net['throat.endpoints'].values())) Tcrds = rotate_coords(Tcrds, b=270) H = new_net['throat.diameter'][0] W = new_net['throat.length'][0] R1 = new_net['pore.diameter'][0]/2 R2 = new_net['pore.diameter'][1]/2 rect = Rectangle(xy=(Tcrds[0, 0], Tcrds[0, 1]-H/2), height=H, width=W) patches.append(rect) p = PatchCollection(patches, alpha=0.5, edgecolor='k', linewidth=3) p.set_array([1, 1, 2]) p.cmap = plt.cm.bwr ax.add_collection(p) ax.scatter(*Pcrds[0, :2], marker='+', c='k', s=100) ax.scatter(*Pcrds[1, :2], marker='+', c='k', s=100) left = min(Pcrds[:, 0])-R1 right = max(Pcrds[:, 0])+R2 ax.set_xlim([left - abs(left-right)/32, right + abs(left-right)/32]) temp = (Pcrds[:, 1]).mean() ax.set_ylim([temp - abs(left-right)/4, temp + abs(left-right)/4]) ax.annotate(text='', xy=Pcrds[0, :2], xytext=(Pcrds[0, 0], Pcrds[0, 1]-R1), arrowprops=dict(arrowstyle='<-', lw=2)) ax.annotate(text=f"{R1}", xy=Pcrds[0, :2], xytext=(Pcrds[0, 0], Pcrds[0, 1]-R1/2), textcoords='data') return ax