Skip to content

Commit c974f18

Browse files
authored
Add connectivity computation (#197)
* Add connectivity computation * Add identity computations of connectivity * Fix gmsh import * Fix create connectivity
1 parent ccb4d7c commit c974f18

File tree

10 files changed

+48
-130
lines changed

10 files changed

+48
-130
lines changed

chapter1/complex_mode.ipynb

Lines changed: 13 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,10 @@
3939
},
4040
{
4141
"cell_type": "code",
42-
"execution_count": 1,
42+
"execution_count": null,
4343
"id": "b52b39d9-260d-4c54-b62a-7440c3b92e5a",
4444
"metadata": {},
45-
"outputs": [
46-
{
47-
"name": "stdout",
48-
"output_type": "stream",
49-
"text": [
50-
"float64\n",
51-
"complex128\n"
52-
]
53-
}
54-
],
45+
"outputs": [],
5546
"source": [
5647
"from mpi4py import MPI\n",
5748
"import dolfinx\n",
@@ -80,18 +71,10 @@
8071
},
8172
{
8273
"cell_type": "code",
83-
"execution_count": 2,
74+
"execution_count": null,
8475
"id": "4d5b03e3-4d7f-45b7-95eb-9130a5141f34",
8576
"metadata": {},
86-
"outputs": [
87-
{
88-
"name": "stdout",
89-
"output_type": "stream",
90-
"text": [
91-
"<class 'numpy.complex128'>\n"
92-
]
93-
}
94-
],
77+
"outputs": [],
9578
"source": [
9679
"from petsc4py import PETSc\n",
9780
"from dolfinx.fem.petsc import assemble_vector\n",
@@ -110,7 +93,7 @@
11093
},
11194
{
11295
"cell_type": "code",
113-
"execution_count": 3,
96+
"execution_count": null,
11497
"id": "be8461a0-a089-4ff3-8bc8-61b016407e70",
11598
"metadata": {},
11699
"outputs": [],
@@ -137,19 +120,10 @@
137120
},
138121
{
139122
"cell_type": "code",
140-
"execution_count": 4,
123+
"execution_count": null,
141124
"id": "779ab267-4609-4628-9577-a280b9c18b6d",
142125
"metadata": {},
143-
"outputs": [
144-
{
145-
"name": "stdout",
146-
"output_type": "stream",
147-
"text": [
148-
"{ c_0 * (conj((v_0))) } * dx(<Mesh #0>[everywhere], {})\n",
149-
"{ c_0 * (conj((v_0))) } * dx(<Mesh #0>[everywhere], {})\n"
150-
]
151-
}
152-
],
126+
"outputs": [],
153127
"source": [
154128
"L2 = f * ufl.conj(v) * ufl.dx\n",
155129
"print(L)\n",
@@ -166,78 +140,10 @@
166140
},
167141
{
168142
"cell_type": "code",
169-
"execution_count": 5,
143+
"execution_count": null,
170144
"id": "d61c477a-d364-4a81-9362-42f1eb4cd8ee",
171145
"metadata": {},
172-
"outputs": [
173-
{
174-
"name": "stdout",
175-
"output_type": "stream",
176-
"text": [
177-
"[4.21666667e-03+3.33333333e-05j 1.58750000e-03+8.33333333e-06j\n",
178-
" 4.68333333e-03+1.00000000e-04j 8.13333333e-03+2.66666667e-04j\n",
179-
" 3.35000000e-03+3.33333333e-05j 4.68333333e-03+3.66666667e-04j\n",
180-
" 6.43333333e-03+2.66666667e-04j 8.13333333e-03+8.66666667e-04j\n",
181-
" 2.58333333e-03+3.33333333e-05j 4.68333333e-03+8.33333333e-04j\n",
182-
" 4.93333333e-03+2.66666667e-04j 6.43333333e-03+8.66666667e-04j\n",
183-
" 8.13333333e-03+1.86666667e-03j 1.91666667e-03+3.33333333e-05j\n",
184-
" 4.68333333e-03+1.50000000e-03j 3.63333333e-03+2.66666667e-04j\n",
185-
" 4.93333333e-03+8.66666667e-04j 6.43333333e-03+1.86666667e-03j\n",
186-
" 8.13333333e-03+3.26666667e-03j 1.35000000e-03+3.33333333e-05j\n",
187-
" 4.68333333e-03+2.36666667e-03j 2.53333333e-03+2.66666667e-04j\n",
188-
" 3.63333333e-03+8.66666667e-04j 4.93333333e-03+1.86666667e-03j\n",
189-
" 6.43333333e-03+3.26666667e-03j 8.13333333e-03+5.06666667e-03j\n",
190-
" 8.83333333e-04+3.33333333e-05j 4.68333333e-03+3.43333333e-03j\n",
191-
" 1.63333333e-03+2.66666667e-04j 2.53333333e-03+8.66666667e-04j\n",
192-
" 3.63333333e-03+1.86666667e-03j 4.93333333e-03+3.26666667e-03j\n",
193-
" 6.43333333e-03+5.06666667e-03j 8.13333333e-03+7.26666667e-03j\n",
194-
" 5.16666667e-04+3.33333333e-05j 4.68333333e-03+4.70000000e-03j\n",
195-
" 9.33333333e-04+2.66666667e-04j 1.63333333e-03+8.66666667e-04j\n",
196-
" 2.53333333e-03+1.86666667e-03j 3.63333333e-03+3.26666667e-03j\n",
197-
" 4.93333333e-03+5.06666667e-03j 6.43333333e-03+7.26666667e-03j\n",
198-
" 8.13333333e-03+9.86666667e-03j 2.50000000e-04+3.33333333e-05j\n",
199-
" 4.68333333e-03+6.16666667e-03j 4.33333333e-04+2.66666667e-04j\n",
200-
" 9.33333333e-04+8.66666667e-04j 1.63333333e-03+1.86666667e-03j\n",
201-
" 2.53333333e-03+3.26666667e-03j 3.63333333e-03+5.06666667e-03j\n",
202-
" 4.93333333e-03+7.26666667e-03j 6.43333333e-03+9.86666667e-03j\n",
203-
" 8.13333333e-03+1.28666667e-02j 8.33333333e-05+3.33333333e-05j\n",
204-
" 4.68333333e-03+7.83333333e-03j 1.33333333e-04+2.66666667e-04j\n",
205-
" 4.33333333e-04+8.66666667e-04j 9.33333333e-04+1.86666667e-03j\n",
206-
" 1.63333333e-03+3.26666667e-03j 2.53333333e-03+5.06666667e-03j\n",
207-
" 3.63333333e-03+7.26666667e-03j 4.93333333e-03+9.86666667e-03j\n",
208-
" 6.43333333e-03+1.28666667e-02j 8.13333333e-03+1.62666667e-02j\n",
209-
" 1.25000000e-05+2.50000000e-05j 3.09583333e-03+6.19166667e-03j\n",
210-
" 1.66666667e-05+1.66666667e-04j 1.33333333e-04+8.66666667e-04j\n",
211-
" 4.33333333e-04+1.86666667e-03j 9.33333333e-04+3.26666667e-03j\n",
212-
" 1.63333333e-03+5.06666667e-03j 2.53333333e-03+7.26666667e-03j\n",
213-
" 3.63333333e-03+9.86666667e-03j 4.93333333e-03+1.28666667e-02j\n",
214-
" 6.43333333e-03+1.62666667e-02j 3.91666667e-03+9.36666667e-03j\n",
215-
" 1.66666667e-05+5.00000000e-04j 1.33333333e-04+1.86666667e-03j\n",
216-
" 4.33333333e-04+3.26666667e-03j 9.33333333e-04+5.06666667e-03j\n",
217-
" 1.63333333e-03+7.26666667e-03j 2.53333333e-03+9.86666667e-03j\n",
218-
" 3.63333333e-03+1.28666667e-02j 4.93333333e-03+1.62666667e-02j\n",
219-
" 3.08333333e-03+9.36666667e-03j 1.66666667e-05+1.03333333e-03j\n",
220-
" 1.33333333e-04+3.26666667e-03j 4.33333333e-04+5.06666667e-03j\n",
221-
" 9.33333333e-04+7.26666667e-03j 1.63333333e-03+9.86666667e-03j\n",
222-
" 2.53333333e-03+1.28666667e-02j 3.63333333e-03+1.62666667e-02j\n",
223-
" 2.35000000e-03+9.36666667e-03j 1.66666667e-05+1.76666667e-03j\n",
224-
" 1.33333333e-04+5.06666667e-03j 4.33333333e-04+7.26666667e-03j\n",
225-
" 9.33333333e-04+9.86666667e-03j 1.63333333e-03+1.28666667e-02j\n",
226-
" 2.53333333e-03+1.62666667e-02j 1.71666667e-03+9.36666667e-03j\n",
227-
" 1.66666667e-05+2.70000000e-03j 1.33333333e-04+7.26666667e-03j\n",
228-
" 4.33333333e-04+9.86666667e-03j 9.33333333e-04+1.28666667e-02j\n",
229-
" 1.63333333e-03+1.62666667e-02j 1.18333333e-03+9.36666667e-03j\n",
230-
" 1.66666667e-05+3.83333333e-03j 1.33333333e-04+9.86666667e-03j\n",
231-
" 4.33333333e-04+1.28666667e-02j 9.33333333e-04+1.62666667e-02j\n",
232-
" 7.50000000e-04+9.36666667e-03j 1.66666667e-05+5.16666667e-03j\n",
233-
" 1.33333333e-04+1.28666667e-02j 4.33333333e-04+1.62666667e-02j\n",
234-
" 4.16666667e-04+9.36666667e-03j 1.66666667e-05+6.70000000e-03j\n",
235-
" 1.33333333e-04+1.62666667e-02j 1.83333333e-04+9.36666667e-03j\n",
236-
" 1.66666667e-05+8.43333333e-03j 5.00000000e-05+9.36666667e-03j\n",
237-
" 4.16666667e-06+3.17500000e-03j]\n"
238-
]
239-
}
240-
],
146+
"outputs": [],
241147
"source": [
242148
"J = u_c**2 * ufl.dx\n",
243149
"F = ufl.derivative(J, u_c, ufl.conj(v))\n",
@@ -256,7 +162,7 @@
256162
},
257163
{
258164
"cell_type": "code",
259-
"execution_count": 6,
165+
"execution_count": null,
260166
"id": "eb2357ae-ac71-4407-bf37-432f1b1e31d0",
261167
"metadata": {},
262168
"outputs": [],
@@ -281,18 +187,10 @@
281187
},
282188
{
283189
"cell_type": "code",
284-
"execution_count": 7,
190+
"execution_count": null,
285191
"id": "f51d9a7a-2cde-4d0f-8606-91f91c372c4b",
286192
"metadata": {},
287-
"outputs": [
288-
{
289-
"name": "stdout",
290-
"output_type": "stream",
291-
"text": [
292-
"(0.0007865435216227239+0.0017660156338113711j) 3.553078358632328e-06\n"
293-
]
294-
}
295-
],
193+
"outputs": [],
296194
"source": [
297195
"x = ufl.SpatialCoordinate(mesh)\n",
298196
"u_ex = 0.5 * x[0]**2 + 1j*x[1]**2\n",
@@ -322,6 +220,7 @@
322220
"source": [
323221
"import pyvista\n",
324222
"pyvista.start_xvfb()\n",
223+
"mesh.topology.create_connectivity(mesh.topology.dim, mesh.topology.dim)\n",
325224
"p_mesh = pyvista.UnstructuredGrid(*dolfinx.plot.vtk_mesh(mesh, mesh.topology.dim))\n",
326225
"pyvista_cells, cell_types, geometry = dolfinx.plot.vtk_mesh(V)\n",
327226
"grid = pyvista.UnstructuredGrid(pyvista_cells, cell_types, geometry)\n",

chapter1/complex_mode.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# extension: .py
77
# format_name: light
88
# format_version: '1.5'
9-
# jupytext_version: 1.16.1
9+
# jupytext_version: 1.15.2
1010
# kernelspec:
1111
# display_name: Python 3 (DOLFINx complex)
1212
# language: python
@@ -126,6 +126,7 @@
126126

127127
import pyvista
128128
pyvista.start_xvfb()
129+
mesh.topology.create_connectivity(mesh.topology.dim, mesh.topology.dim)
129130
p_mesh = pyvista.UnstructuredGrid(*dolfinx.plot.vtk_mesh(mesh, mesh.topology.dim))
130131
pyvista_cells, cell_types, geometry = dolfinx.plot.vtk_mesh(V)
131132
grid = pyvista.UnstructuredGrid(pyvista_cells, cell_types, geometry)

chapter1/fundamentals_code.ipynb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@
453453
"source": [
454454
"from dolfinx import plot\n",
455455
"pyvista.start_xvfb()\n",
456+
"domain.topology.create_connectivity(tdim, tdim)\n",
456457
"topology, cell_types, geometry = plot.vtk_mesh(domain, tdim)\n",
457458
"grid = pyvista.UnstructuredGrid(topology, cell_types, geometry)"
458459
]

chapter1/fundamentals_code.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# extension: .py
77
# format_name: light
88
# format_version: '1.5'
9-
# jupytext_version: 1.16.1
9+
# jupytext_version: 1.15.2
1010
# kernelspec:
1111
# display_name: Python 3 (ipykernel)
1212
# language: python
@@ -232,6 +232,7 @@
232232
# + vscode={"languageId": "python"}
233233
from dolfinx import plot
234234
pyvista.start_xvfb()
235+
domain.topology.create_connectivity(tdim, tdim)
235236
topology, cell_types, geometry = plot.vtk_mesh(domain, tdim)
236237
grid = pyvista.UnstructuredGrid(topology, cell_types, geometry)
237238
# -

chapter2/ns_code1.ipynb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@
579579
"glyphs = function_grid.glyph(orient=\"u\", factor=0.2)\n",
580580
"\n",
581581
"# Create a pyvista-grid for the mesh\n",
582+
"mesh.topology.create_connectivity(mesh.topology.dim, mesh.topology.dim)\n",
582583
"grid = pyvista.UnstructuredGrid(*vtk_mesh(mesh, mesh.topology.dim))\n",
583584
"\n",
584585
"# Create plotter\n",

chapter2/ns_code1.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# extension: .py
77
# format_name: light
88
# format_version: '1.5'
9-
# jupytext_version: 1.16.1
9+
# jupytext_version: 1.15.2
1010
# kernelspec:
1111
# display_name: Python 3 (ipykernel)
1212
# language: python
@@ -345,6 +345,7 @@ def u_exact(x):
345345
glyphs = function_grid.glyph(orient="u", factor=0.2)
346346

347347
# Create a pyvista-grid for the mesh
348+
mesh.topology.create_connectivity(mesh.topology.dim, mesh.topology.dim)
348349
grid = pyvista.UnstructuredGrid(*vtk_mesh(mesh, mesh.topology.dim))
349350

350351
# Create plotter

chapter3/em.ipynb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,8 +1077,10 @@
10771077
"source": [
10781078
"pyvista.start_xvfb()\n",
10791079
"plotter = pyvista.Plotter()\n",
1080-
"grid = pyvista.UnstructuredGrid(*vtk_mesh(mesh, mesh.topology.dim))\n",
1081-
"num_local_cells = mesh.topology.index_map(mesh.topology.dim).size_local\n",
1080+
"tdim = mesh.topology.dim\n",
1081+
"mesh.topology.create_connectivity(tdim, tdim)\n",
1082+
"grid = pyvista.UnstructuredGrid(*vtk_mesh(mesh, tdim))\n",
1083+
"num_local_cells = mesh.topology.index_map(tdim).size_local\n",
10821084
"grid.cell_data[\"Marker\"] = ct.values[ct.indices < num_local_cells]\n",
10831085
"grid.set_active_scalars(\"Marker\")\n",
10841086
"actor = plotter.add_mesh(grid, show_edges=True)\n",
@@ -1288,6 +1290,7 @@
12881290
"# We include ghosts cells as we access all degrees of freedom (including ghosts) on each process\n",
12891291
"top_imap = mesh.topology.index_map(mesh.topology.dim)\n",
12901292
"num_cells = top_imap.size_local + top_imap.num_ghosts\n",
1293+
"mesh.topology.create_connectivity(mesh.topology.dim, mesh.topology.dim)\n",
12911294
"midpoints = compute_midpoints(mesh, mesh.topology.dim, np.arange(num_cells, dtype=np.int32))\n",
12921295
"\n",
12931296
"num_dofs = W.dofmap.index_map.size_local + W.dofmap.index_map.num_ghosts\n",

chapter3/em.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# extension: .py
77
# format_name: light
88
# format_version: '1.5'
9-
# jupytext_version: 1.16.1
9+
# jupytext_version: 1.15.2
1010
# kernelspec:
1111
# display_name: Python 3 (ipykernel)
1212
# language: python
@@ -212,8 +212,10 @@
212212

213213
pyvista.start_xvfb()
214214
plotter = pyvista.Plotter()
215-
grid = pyvista.UnstructuredGrid(*vtk_mesh(mesh, mesh.topology.dim))
216-
num_local_cells = mesh.topology.index_map(mesh.topology.dim).size_local
215+
tdim = mesh.topology.dim
216+
mesh.topology.create_connectivity(tdim, tdim)
217+
grid = pyvista.UnstructuredGrid(*vtk_mesh(mesh, tdim))
218+
num_local_cells = mesh.topology.index_map(tdim).size_local
217219
grid.cell_data["Marker"] = ct.values[ct.indices < num_local_cells]
218220
grid.set_active_scalars("Marker")
219221
actor = plotter.add_mesh(grid, show_edges=True)
@@ -312,6 +314,7 @@
312314
# We include ghosts cells as we access all degrees of freedom (including ghosts) on each process
313315
top_imap = mesh.topology.index_map(mesh.topology.dim)
314316
num_cells = top_imap.size_local + top_imap.num_ghosts
317+
mesh.topology.create_connectivity(mesh.topology.dim, mesh.topology.dim)
315318
midpoints = compute_midpoints(mesh, mesh.topology.dim, np.arange(num_cells, dtype=np.int32))
316319

317320
num_dofs = W.dofmap.index_map.size_local + W.dofmap.index_map.num_ghosts

chapter3/subdomains.ipynb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,13 +169,15 @@
169169
"uh = problem.solve()\n",
170170
"\n",
171171
"# Filter out ghosted cells\n",
172-
"num_cells_local = mesh.topology.index_map(mesh.topology.dim).size_local\n",
172+
"tdim = mesh.topology.dim\n",
173+
"num_cells_local = mesh.topology.index_map(tdim).size_local\n",
173174
"marker = np.zeros(num_cells_local, dtype=np.int32)\n",
174175
"cells_0 = cells_0[cells_0 < num_cells_local]\n",
175176
"cells_1 = cells_1[cells_1 < num_cells_local]\n",
176177
"marker[cells_0] = 1\n",
177178
"marker[cells_1] = 2\n",
178-
"topology, cell_types, x = vtk_mesh(mesh, mesh.topology.dim, np.arange(num_cells_local, dtype=np.int32))\n",
179+
"mesh.topology.create_connectivity(tdim, tdim)\n",
180+
"topology, cell_types, x = vtk_mesh(mesh, tdim, np.arange(num_cells_local, dtype=np.int32))\n",
179181
"\n",
180182
"p = pyvista.Plotter(window_size=[800, 800])\n",
181183
"grid = pyvista.UnstructuredGrid(topology, cell_types, x)\n",
@@ -552,9 +554,11 @@
552554
"# As the dolfinx.MeshTag contains a value for every cell in the\n",
553555
"# geometry, we can attach it directly to the grid\n",
554556
"\n",
555-
"topology, cell_types, x = vtk_mesh(mesh, mesh.topology.dim)\n",
557+
"tdim = mesh.topology.dim\n",
558+
"mesh.topology.create_connectivity(tdim, tdim)\n",
559+
"topology, cell_types, x = vtk_mesh(mesh, tdim)\n",
556560
"grid = pyvista.UnstructuredGrid(topology, cell_types, x)\n",
557-
"num_local_cells = mesh.topology.index_map(mesh.topology.dim).size_local\n",
561+
"num_local_cells = mesh.topology.index_map(tdim).size_local\n",
558562
"grid.cell_data[\"Marker\"] = ct.values[ct.indices < num_local_cells]\n",
559563
"grid.set_active_scalars(\"Marker\")\n",
560564
"\n",

chapter3/subdomains.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,15 @@ def Omega_1(x):
106106
uh = problem.solve()
107107

108108
# Filter out ghosted cells
109-
num_cells_local = mesh.topology.index_map(mesh.topology.dim).size_local
109+
tdim = mesh.topology.dim
110+
num_cells_local = mesh.topology.index_map(tdim).size_local
110111
marker = np.zeros(num_cells_local, dtype=np.int32)
111112
cells_0 = cells_0[cells_0 < num_cells_local]
112113
cells_1 = cells_1[cells_1 < num_cells_local]
113114
marker[cells_0] = 1
114115
marker[cells_1] = 2
115-
topology, cell_types, x = vtk_mesh(mesh, mesh.topology.dim, np.arange(num_cells_local, dtype=np.int32))
116+
mesh.topology.create_connectivity(tdim, tdim)
117+
topology, cell_types, x = vtk_mesh(mesh, tdim, np.arange(num_cells_local, dtype=np.int32))
116118

117119
p = pyvista.Plotter(window_size=[800, 800])
118120
grid = pyvista.UnstructuredGrid(topology, cell_types, x)
@@ -277,9 +279,11 @@ def create_mesh(mesh, cell_type, prune_z=False):
277279
# As the dolfinx.MeshTag contains a value for every cell in the
278280
# geometry, we can attach it directly to the grid
279281

280-
topology, cell_types, x = vtk_mesh(mesh, mesh.topology.dim)
282+
tdim = mesh.topology.dim
283+
mesh.topology.create_connectivity(tdim, tdim)
284+
topology, cell_types, x = vtk_mesh(mesh, tdim)
281285
grid = pyvista.UnstructuredGrid(topology, cell_types, x)
282-
num_local_cells = mesh.topology.index_map(mesh.topology.dim).size_local
286+
num_local_cells = mesh.topology.index_map(tdim).size_local
283287
grid.cell_data["Marker"] = ct.values[ct.indices < num_local_cells]
284288
grid.set_active_scalars("Marker")
285289

0 commit comments

Comments
 (0)