@@ -131,36 +131,32 @@ def MeshHierarchy(mesh, refinement_levels,
131131 raise RuntimeError ("Cannot create a NetgenHierarchy from a mesh that has not been generated by\
132132 Netgen." )
133133
134+ mesh_with_overlap = mesh
135+ mesh .init ()
136+ dm_cell_type , = mesh .dm_cell_types
137+ tdim = mesh .topology_dm .getDimension ()
138+ # Virtually "invert" addOverlap.
139+ # -- This is algorithmically guaranteed.
140+ mesh = firedrake .Submesh (mesh_with_overlap , tdim , dm_cell_type , label_name = "celltype" , ignore_label_halo = True )
134141 cdm = mesh .topology_dm
142+ cdm .removeLabel ("pyop2_core" )
143+ cdm .removeLabel ("pyop2_owned" )
144+ cdm .removeLabel ("pyop2_ghost" )
135145 cdm .setRefinementUniform (True )
136146 dms = []
137147 if mesh .comm .size > 1 and mesh ._grown_halos :
138148 raise RuntimeError ("Cannot refine parallel overlapped meshes "
139149 "(make sure the MeshHierarchy is built immediately after the Mesh)" )
140- parameters = {}
141- if distribution_parameters is not None :
142- parameters .update (distribution_parameters )
143- else :
144- parameters .update (mesh ._distribution_parameters )
145-
146- parameters ["partition" ] = False
147- distribution_parameters = parameters
148-
149150 if callbacks is not None :
150151 before , after = callbacks
151152 else :
152153 before = after = lambda dm , i : None
153-
154154 for i in range (refinement_levels * refinements_per_level ):
155155 if i % refinements_per_level == 0 :
156156 before (cdm , i )
157157 rdm = cdm .refine ()
158158 if i % refinements_per_level == 0 :
159159 after (rdm , i )
160- rdm .removeLabel ("pyop2_core" )
161- rdm .removeLabel ("pyop2_owned" )
162- rdm .removeLabel ("pyop2_ghost" )
163-
164160 dms .append (rdm )
165161 cdm = rdm
166162 # Fix up coords if refining embedded circle or sphere
@@ -172,20 +168,38 @@ def MeshHierarchy(mesh, refinement_levels,
172168 coords = cdm .getCoordinatesLocal ().array .reshape (- 1 , mesh .geometric_dimension ())
173169 scale = mesh ._radius / np .linalg .norm (coords , axis = 1 ).reshape (- 1 , 1 )
174170 coords *= scale
175-
176- meshes = [mesh ] + [mesh_builder (dm , dim = mesh .geometric_dimension (),
177- distribution_parameters = distribution_parameters ,
178- reorder = reorder , comm = mesh .comm )
179- for dm in dms ]
180-
181- lgmaps = []
182- for i , m in enumerate (meshes ):
183- no = impl .create_lgmap (m .topology_dm )
171+ lgmaps_without_overlap = [
172+ impl .create_lgmap (dm ) for dm in [mesh .topology_dm ] + dms
173+ ]
174+ parameters = {}
175+ if distribution_parameters is not None :
176+ parameters .update (distribution_parameters )
177+ else :
178+ parameters .update (mesh_with_overlap ._distribution_parameters )
179+ parameters ["partition" ] = False
180+ meshes = [mesh_with_overlap ] + [
181+ mesh_builder (
182+ dm ,
183+ dim = mesh_with_overlap .geometric_dimension (),
184+ distribution_parameters = parameters ,
185+ reorder = reorder ,
186+ comm = mesh .comm ,
187+ )
188+ for dm in dms
189+ ]
190+ for m in meshes :
184191 m .init ()
185- o = impl .create_lgmap (m .topology_dm )
192+ #distribution_parameters_noop={
193+ # "partition": False,
194+ # "overlap_type": (firedrake.mesh.DistributedMeshOverlapType.NONE, 0),
195+ #}
196+ lgmaps_with_overlap = []
197+ for i , m in enumerate (meshes ):
198+ lgmaps_with_overlap .append (impl .create_lgmap (m .topology_dm ))
186199 m .topology_dm .setRefineLevel (i )
187- lgmaps .append ((no , o ))
188-
200+ lgmaps = [
201+ (no , o ) for no , o in zip (lgmaps_without_overlap , lgmaps_with_overlap )
202+ ]
189203 coarse_to_fine_cells = []
190204 fine_to_coarse_cells = [None ]
191205 for (coarse , fine ), (clgmaps , flgmaps ) in zip (zip (meshes [:- 1 ], meshes [1 :]),
0 commit comments