33PETSc DMPlex using the petsc4py interface.
44'''
55import itertools
6+ import warnings
67import numpy as np
78from petsc4py import PETSc
89import netgen .meshing as ngm
@@ -47,7 +48,7 @@ def build2DCells(coordinates, sIndicies, cell_indicies, start_end):
4748 if np .linalg .det (A ) > 0 :
4849 cells [i ] = cell
4950 else :
50- cells [i ] = np .array ([cell [0 ],cell [2 ],cell [1 ]])
51+ cells [i ] = np .array ([cell [0 ], cell [2 ], cell [1 ]])
5152 else :
5253 raise RuntimeError ("We only support triangles." )
5354 return cells
@@ -77,7 +78,7 @@ def build3DCells(coordinates, sIndicies, cell_indicies, start_end):
7778 if np .linalg .det (A ) > 0 :
7879 cells [i ] = cell
7980 else :
80- cells [i ] = np .array ([cell [0 ],cell [1 ],cell [2 ], cell [2 ]])
81+ cells [i ] = np .array ([cell [0 ], cell [1 ], cell [2 ], cell [2 ]])
8182 else :
8283 raise RuntimeError ("We only support tets." )
8384 return cells
@@ -86,22 +87,19 @@ def build2DCells(coordinates, sIndicies, cell_indicies, start_end):
8687 """
8788 Method used to construct 2D cells
8889 """
89- cStart = start_end [0 ]
90- cEnd = start_end [1 ]
90+ cStart , cEnd = start_end
9191 cells = np .zeros ((cell_indicies .shape [0 ], 3 ))
9292 for i in range (cStart ,cEnd ):
9393 sIndex = sIndicies [i ]
9494 if len (sIndex )== 3 :
9595 cell = list (set (cell_indicies [i ]))
9696 A = np .zeros ((2 ,2 ))
97- A [0 ,0 ] = (coordinates [cell [1 ]]- coordinates [cell [0 ]])[0 ]
98- A [0 ,1 ] = (coordinates [cell [1 ]]- coordinates [cell [0 ]])[1 ]
99- A [1 ,0 ] = (coordinates [cell [2 ]]- coordinates [cell [1 ]])[0 ]
100- A [1 ,1 ] = (coordinates [cell [2 ]]- coordinates [cell [1 ]])[1 ]
97+ for i in range (2 ):
98+ A [i , :] = coordinates [cell [i + 1 ]] - coordinates [cell [i ]]
10199 if np .linalg .det (A ) > 0 :
102100 cells [i ] = cell
103101 else :
104- cells [i ] = np .array ([cell [0 ],cell [2 ],cell [1 ]])
102+ cells [i ] = np .array ([cell [0 ], cell [2 ], cell [1 ]])
105103 else :
106104 raise RuntimeError ("We only support triangles." )
107105 return cells
@@ -110,27 +108,19 @@ def build3DCells(coordinates, sIndicies, cell_indicies, start_end):
110108 """
111109 Method used to construct 3D cells
112110 """
113- cStart = start_end [0 ]
114- cEnd = start_end [1 ]
111+ cStart , cEnd = start_end
115112 cells = np .zeros ((cell_indicies .shape [0 ], 4 ))
116113 for i in range (cStart ,cEnd ):
117114 sIndex = sIndicies [i ]
118115 if len (sIndex )== 4 :
119116 cell = list (set (cell_indicies [i ]))
120117 A = np .zeros ((3 ,3 ))
121- A [0 ,0 ] = (coordinates [cell [1 ]]- coordinates [cell [0 ]])[0 ]
122- A [0 ,1 ] = (coordinates [cell [1 ]]- coordinates [cell [0 ]])[1 ]
123- A [0 ,2 ] = (coordinates [cell [1 ]]- coordinates [cell [0 ]])[2 ]
124- A [1 ,0 ] = (coordinates [cell [2 ]]- coordinates [cell [1 ]])[0 ]
125- A [1 ,1 ] = (coordinates [cell [2 ]]- coordinates [cell [1 ]])[1 ]
126- A [1 ,2 ] = (coordinates [cell [2 ]]- coordinates [cell [1 ]])[2 ]
127- A [2 ,0 ] = (coordinates [cell [3 ]]- coordinates [cell [2 ]])[0 ]
128- A [2 ,1 ] = (coordinates [cell [3 ]]- coordinates [cell [2 ]])[1 ]
129- A [2 ,2 ] = (coordinates [cell [3 ]]- coordinates [cell [2 ]])[2 ]
118+ for i in range (3 ):
119+ A [i , :] = coordinates [cell [i + 1 ]] - coordinates [cell [i ]]
130120 if np .linalg .det (A ) > 0 :
131121 cells [i ] = cell
132122 else :
133- cells [i ] = np .array ([cell [0 ],cell [1 ],cell [3 ], cell [2 ]])
123+ cells [i ] = np .array ([cell [0 ], cell [1 ], cell [3 ], cell [2 ]])
134124 else :
135125 raise RuntimeError ("We only support tets." )
136126 return cells
@@ -284,6 +274,8 @@ def createPETScDMPlex(self, mesh):
284274 self .ngMesh = mesh .ngmesh
285275 else :
286276 self .ngMesh = mesh
277+ if len (self .ngMesh .GetIdentifications ()) > 0 :
278+ warnings .warn ("Periodic meshes are not supported by ngsPETSc" , RuntimeWarning )
287279 comm = self .comm
288280 self .geo = self .ngMesh .GetGeometry ()
289281 if self .ngMesh .dim == 3 :
0 commit comments