Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8c6f918
Netgen: curved meshes from Mesh constructor and refine_marked_elements
pbrubeck Feb 27, 2026
db3396f
tests
pbrubeck Feb 27, 2026
9fa8a49
Merge branch 'main' into pbrubeck/netgen-bendy-mesh
pbrubeck Mar 11, 2026
86a1af2
update
pbrubeck Mar 11, 2026
3488bc4
clean up
pbrubeck Mar 11, 2026
bb668a5
sanitise refine_marked_elements
pbrubeck Mar 11, 2026
74ea35d
attempt to fix netgen MeshHierarchy
pbrubeck Mar 11, 2026
c592b66
fixes
pbrubeck Mar 12, 2026
574be15
fix
pbrubeck Mar 12, 2026
f56305c
WIP
pbrubeck Mar 13, 2026
e877b90
Fixes
pbrubeck Mar 13, 2026
7be7a75
merge conflict
pbrubeck Mar 16, 2026
d1b8c4c
Fixes
pbrubeck Mar 18, 2026
8f404e1
tidy
pbrubeck Mar 18, 2026
9250727
tidy
pbrubeck Mar 18, 2026
f1cd773
update demo
pbrubeck Mar 18, 2026
dcbffae
Merge branch 'main' into pbrubeck/netgen-bendy-mesh
pbrubeck Mar 18, 2026
e58dd9c
review comments
pbrubeck Mar 18, 2026
546f11a
fix
pbrubeck Mar 18, 2026
8d917e7
Remove branching
pbrubeck Mar 19, 2026
942ae51
Update demos/netgen/netgen_mesh.py.rst
pbrubeck Mar 19, 2026
d8fc40b
Update demos/netgen/netgen_mesh.py.rst
pbrubeck Mar 19, 2026
2551b9d
Update firedrake/mesh.py
pbrubeck Mar 19, 2026
a6d3171
Update tests/firedrake/multigrid/test_netgen_gmg.py
pbrubeck Mar 19, 2026
9a4dc3a
Fix
pbrubeck Mar 20, 2026
b4dc822
fix docs
pbrubeck Mar 20, 2026
b82acba
fix
pbrubeck Mar 21, 2026
2b116d5
fixes
pbrubeck Mar 21, 2026
c44acf4
Merge branch 'main' into pbrubeck/netgen-bendy-mesh
pbrubeck Mar 24, 2026
ac9808b
docs
pbrubeck Mar 24, 2026
2acdb11
gdim -> tdim
pbrubeck Mar 25, 2026
613e187
ngsPETSc CI can only run the gmg test with two processes, so we do th…
pbrubeck Mar 25, 2026
8ef6ada
Ensure netgen parallel tests run with 2 processes
pbrubeck Mar 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions firedrake/mesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -2994,9 +2994,10 @@ def refine_marked_elements(self, mark, netgen_flags=None):
utils.check_netgen_installed()

if netgen_flags is None:
netgen_flags = {}
netgen_flags = self.netgen_flags
DistParams = self._distribution_parameters
els = {2: self.netgen_mesh.Elements2D, 3: self.netgen_mesh.Elements3D}
netgen_mesh = self.netgen_mesh.Copy()
els = {2: netgen_mesh.Elements2D, 3: netgen_mesh.Elements3D}
dim = self.geometric_dimension
refine_faces = netgen_flags.get("refine_faces", False)
if dim in [2, 3]:
Expand All @@ -3019,12 +3020,14 @@ def refine_marked_elements(self, mark, netgen_flags=None):
else:
el.refine = False
if not refine_faces and dim == 3:
self.netgen_mesh.Elements2D().NumPy()["refine"] = 0
self.netgen_mesh.Refine(adaptive=True)
netgen_mesh.Elements2D().NumPy()["refine"] = 0
netgen_mesh.Refine(adaptive=True)
mark = mark-np.ones(mark.shape)
return fd.Mesh(self.netgen_mesh, distribution_parameters=DistParams, comm=self.comm)
return fd.Mesh(netgen_mesh, distribution_parameters=DistParams,
netgen_flags=netgen_flags, comm=self.comm)
return fd.Mesh(netgen.libngpy._meshing.Mesh(dim),
distribution_parameters=DistParams, comm=self.comm)
distribution_parameters=DistParams,
netgen_flags=netgen_flags, comm=self.comm)
else:
raise NotImplementedError("No implementation for dimension other than 2 and 3.")

Expand Down Expand Up @@ -3431,6 +3434,24 @@ def Mesh(meshfile, **kwargs):

if from_netgen:
mesh.netgen_mesh = netgen_firedrake_mesh.meshMap.ngMesh
mesh.netgen_flags = netgen_flags

# Curve the mesh, if requested
degree = netgen_flags.get("degree", 1)
if degree != 1:
permutation_tol = netgen_flags.get("permutation_tol", 1e-8)
cg = netgen_flags.get("cg", False)
Comment thread
pbrubeck marked this conversation as resolved.
Outdated
ho_field = mesh.curve_field(
order=degree,
permutation_tol=permutation_tol,
cg_field=cg
)
temp = Mesh(ho_field, distribution_parameters=mesh._distribution_parameters,
comm=mesh.comm)
temp.netgen_mesh = mesh.netgen_mesh
temp.netgen_flags = netgen_flags
temp._tolerance = mesh.tolerance
mesh = temp

mesh.submesh_parent = submesh_parent
mesh._tolerance = tolerance
Expand Down
26 changes: 11 additions & 15 deletions firedrake/mg/netgen.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,6 @@ def NetgenHierarchy(mesh, levs, flags, distribution_parameters=None):
logger.info(f"\tOrder of the hierarchy: {order}")
if isinstance(order, int):
order = [order]*(levs+1)
permutation_tol = flags.get("permutation_tol", 1e-8)
location_tol = flags.get("location_tol", 1e-8)
refType = flags.get("refinement_type", "uniform")
logger.info(f"\tRefinement type: {refType}")
optMoves = flags.get("optimisation_moves", False)
Expand All @@ -266,15 +264,11 @@ def NetgenHierarchy(mesh, levs, flags, distribution_parameters=None):
parameters.update(mesh._distribution_parameters)
parameters["partition"] = False
# Curve the mesh
if order[0] > 1:
ho_field = mesh.curve_field(
order=order[0],
permutation_tol=permutation_tol,
cg_field=cg
)
temp = fd.Mesh(ho_field, distribution_parameters=parameters, comm=comm)
temp.netgen_mesh = mesh.netgen_mesh
temp._tolerance = mesh.tolerance
if order[0] != mesh.coordinates.function_space().ufl_element().degree():
temp_flags = dict(flags)
temp_flags['degree'] = order[0]
temp = fd.Mesh(mesh.netgen_mesh, distribution_parameters=parameters,
netgen_flags=temp_flags, comm=comm)
mesh = temp
# Make a plex (cdm) without overlap.
dm_cell_type, = mesh.dm_cell_types
Expand Down Expand Up @@ -313,17 +307,19 @@ def NetgenHierarchy(mesh, levs, flags, distribution_parameters=None):
raise ValueError("Only 2D and 3D meshes can be optimised.")
mesh.netgen_mesh = ngmesh
# Curve the mesh
if order[l+1] > 1:
if order[l+1] != mesh.coordinates.function_space().ufl_element().degree():
logger.info("\t\t\tCurving the mesh ...")
tic = time.time()
if snap == "geometry":
temp_flags = dict(flags)
temp_flags['degree'] = order[l+1]
mesh = fd.Mesh(
mesh.curve_field(order=order[l+1],
location_tol=location_tol,
permutation_tol=permutation_tol),
mesh.netgen_mesh,
distribution_parameters=parameters,
netgen_flags=temp_flags,
comm=comm)
elif snap == "coarse":
ho_field = meshes[0].coordinates
mesh = snapToCoarse(ho_field, mesh, order[l+1], snap_smoothing, cg)
toc = time.time()
logger.info(f"\t\t\tMeshed curved. Time taken: {toc-tic}")
Expand Down
Loading