diff --git a/meshmode/mesh/__init__.py b/meshmode/mesh/__init__.py index 2347a87a7a287f0fc4d23dc60a167799b1b34eb5..6bd4b92492de942de1ca0c388207d63d44257973 100644 --- a/meshmode/mesh/__init__.py +++ b/meshmode/mesh/__init__.py @@ -344,7 +344,6 @@ class Mesh(Record): return self._element_connectivity - # Design experience: Try not to add too many global data structures to the # mesh. Let the element groups be responsible for that at the mesh level. # @@ -423,6 +422,10 @@ def _compute_connectivity_from_vertices(mesh): for ivertex in grp.vertex_indices[iel_grp]: element_to_element[iel_base + iel_grp].update( vertex_to_element[ivertex]) + + for iel, neighbors in enumerate(element_to_element): + neighbors.remove(iel) + lengths = [len(el_list) for el_list in element_to_element] neighbors_starts = np.cumsum( np.array([0] + lengths, dtype=mesh.element_id_dtype)) diff --git a/meshmode/mesh/visualization.py b/meshmode/mesh/visualization.py index 2b19da7f38c77d0a9d44af862a3164978e5b3ab2..8966861b168f5d740a099e5ec4ad80baccdba4b0 100644 --- a/meshmode/mesh/visualization.py +++ b/meshmode/mesh/visualization.py @@ -30,7 +30,7 @@ import numpy as np # {{{ draw_2d_mesh def draw_2d_mesh(mesh, draw_vertex_numbers=True, draw_element_numbers=True, - **kwargs): + draw_connectivity=False, **kwargs): assert mesh.ambient_dim == 2 import matplotlib.pyplot as pt @@ -57,8 +57,7 @@ def draw_2d_mesh(mesh, draw_vertex_numbers=True, draw_element_numbers=True, pt.gca().add_patch(patch) if draw_element_numbers: - centroid = (np.sum(elverts, axis=1) - / elverts.shape[1]) + centroid = (np.sum(elverts, axis=1) / elverts.shape[1]) if len(mesh.groups) == 1: el_label = str(iel) @@ -75,6 +74,42 @@ def draw_2d_mesh(mesh, draw_vertex_numbers=True, draw_element_numbers=True, ha="center", va="center", color="blue", bbox=dict(facecolor='white', alpha=0.5, lw=0)) + if draw_connectivity: + def global_iel_to_group_and_iel(global_iel): + for igrp, grp in enumerate(mesh.groups): + if global_iel < grp.nelements: + return grp, global_iel + global_iel -= grp.nelements + + raise ValueError("invalid element nr") + + cnx = mesh.element_connectivity + + nb_starts = cnx.neighbors_starts + for iel_g in range(mesh.nelements): + for nb_iel_g in cnx.neighbors[nb_starts[iel_g]:nb_starts[iel_g+1]]: + assert iel_g != nb_iel_g + + grp, iel = global_iel_to_group_and_iel(iel_g) + nb_grp, nb_iel = global_iel_to_group_and_iel(nb_iel_g) + + elverts = mesh.vertices[:, grp.vertex_indices[iel]] + nb_elverts = mesh.vertices[:, nb_grp.vertex_indices[nb_iel]] + + centroid = (np.sum(elverts, axis=1) / elverts.shape[1]) + nb_centroid = (np.sum(nb_elverts, axis=1) / nb_elverts.shape[1]) + + dx = nb_centroid - centroid + start = centroid + 0.15*dx + + mag = np.max(np.abs(dx)) + start += 0.05*(np.random.rand(2)-0.5)*mag + dx += 0.05*(np.random.rand(2)-0.5)*mag + + pt.arrow(start[0], start[1], 0.7*dx[0], 0.7*dx[1], + length_includes_head=True, + color="green", head_width=1e-2, lw=1e-2) + # }}} # vim: foldmethod=marker diff --git a/test/test_meshmode.py b/test/test_meshmode.py index 34521057e135ae0e9eae634685f1a4191d44d9ce..6047113c956d1f616c57fc6610b8a75393b90db0 100644 --- a/test/test_meshmode.py +++ b/test/test_meshmode.py @@ -351,7 +351,7 @@ def test_rect_mesh(do_plot=False): if do_plot: from meshmode.mesh.visualization import draw_2d_mesh - draw_2d_mesh(mesh, fill=None) + draw_2d_mesh(mesh, fill=None, draw_connectivity=True) import matplotlib.pyplot as pt pt.show()