Skip to content

Commit c16ad9d

Browse files
committed
Reorganise how netgen meshes are curved
1 parent 1bd16e3 commit c16ad9d

2 files changed

Lines changed: 33 additions & 16 deletions

File tree

firedrake/mesh.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2994,7 +2994,7 @@ def refine_marked_elements(self, mark, netgen_flags=None):
29942994
utils.check_netgen_installed()
29952995

29962996
if netgen_flags is None:
2997-
netgen_flags = {}
2997+
netgen_flags = self.netgen_flags
29982998
DistParams = self._distribution_parameters
29992999
netgen_mesh = self.netgen_mesh.Copy()
30003000
els = {2: netgen_mesh.Elements2D, 3: netgen_mesh.Elements3D}
@@ -3023,9 +3023,11 @@ def refine_marked_elements(self, mark, netgen_flags=None):
30233023
netgen_mesh.Elements2D().NumPy()["refine"] = 0
30243024
netgen_mesh.Refine(adaptive=True)
30253025
mark = mark-np.ones(mark.shape)
3026-
return fd.Mesh(netgen_mesh, distribution_parameters=DistParams, comm=self.comm)
3026+
return fd.Mesh(netgen_mesh, distribution_parameters=DistParams,
3027+
netgen_flags=netgen_flags, comm=self.comm)
30273028
return fd.Mesh(netgen.libngpy._meshing.Mesh(dim),
3028-
distribution_parameters=DistParams, comm=self.comm)
3029+
distribution_parameters=DistParams,
3030+
netgen_flags=netgen_flags, comm=self.comm)
30293031
else:
30303032
raise NotImplementedError("No implementation for dimension other than 2 and 3.")
30313033

@@ -3432,6 +3434,24 @@ def Mesh(meshfile, **kwargs):
34323434

34333435
if from_netgen:
34343436
mesh.netgen_mesh = netgen_firedrake_mesh.meshMap.ngMesh
3437+
mesh.netgen_flags = netgen_flags
3438+
3439+
# Curve the mesh, if requested
3440+
degree = netgen_flags.get("degree", 1)
3441+
if degree != 1:
3442+
permutation_tol = netgen_flags.get("permutation_tol", 1e-8)
3443+
cg = netgen_flags.get("cg", False)
3444+
ho_field = mesh.curve_field(
3445+
order=degree,
3446+
permutation_tol=permutation_tol,
3447+
cg_field=cg
3448+
)
3449+
temp = Mesh(ho_field, distribution_parameters=mesh._distribution_parameters,
3450+
comm=mesh.comm)
3451+
temp.netgen_mesh = mesh.netgen_mesh
3452+
temp.netgen_flags = netgen_flags
3453+
temp._tolerance = mesh.tolerance
3454+
mesh = temp
34353455

34363456
mesh.submesh_parent = submesh_parent
34373457
mesh._tolerance = tolerance

firedrake/mg/netgen.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,11 @@ def NetgenHierarchy(mesh, levs, flags, distribution_parameters=None):
266266
parameters.update(mesh._distribution_parameters)
267267
parameters["partition"] = False
268268
# Curve the mesh
269-
if order[0] > 1:
270-
ho_field = mesh.curve_field(
271-
order=order[0],
272-
permutation_tol=permutation_tol,
273-
cg_field=cg
274-
)
275-
temp = fd.Mesh(ho_field, distribution_parameters=parameters, comm=comm)
276-
temp.netgen_mesh = mesh.netgen_mesh
277-
temp._tolerance = mesh.tolerance
269+
if order[0] != mesh.coordinates.function_space().ufl_element().degree():
270+
temp_flags = dict(flags)
271+
temp_flags['degree'] = order[0]
272+
temp = fd.Mesh(mesh.netgen_mesh, distribution_parameters=parameters,
273+
netgen_flags=temp_flags, comm=comm)
278274
mesh = temp
279275
# Make a plex (cdm) without overlap.
280276
dm_cell_type, = mesh.dm_cell_types
@@ -313,15 +309,16 @@ def NetgenHierarchy(mesh, levs, flags, distribution_parameters=None):
313309
raise ValueError("Only 2D and 3D meshes can be optimised.")
314310
mesh.netgen_mesh = ngmesh
315311
# Curve the mesh
316-
if order[l+1] > 1:
312+
if order[l+1] != mesh.coordinates.function_space().ufl_element().degree():
317313
logger.info("\t\t\tCurving the mesh ...")
318314
tic = time.time()
319315
if snap == "geometry":
316+
temp_flags = dict(flags)
317+
temp_flags['degree'] = order[l+1]
320318
mesh = fd.Mesh(
321-
mesh.curve_field(order=order[l+1],
322-
location_tol=location_tol,
323-
permutation_tol=permutation_tol),
319+
mesh.netgen_mesh,
324320
distribution_parameters=parameters,
321+
netgen_flags=temp_flags,
325322
comm=comm)
326323
elif snap == "coarse":
327324
mesh = snapToCoarse(ho_field, mesh, order[l+1], snap_smoothing, cg)

0 commit comments

Comments
 (0)