diff --git a/cmake/SetupCODE.cmake b/cmake/SetupCODE.cmake
index 8143645..c63518a 100644
--- a/cmake/SetupCODE.cmake
+++ b/cmake/SetupCODE.cmake
@@ -5,6 +5,6 @@
# -DLIBNEO_PATH=
local libneo source directory (empty = fetch from git)
# -DTRIANGLE_DIR= prebuilt Triangle directory (see SetupTriangle)
# -DMFEM_DIR= prebuilt MFEM directory (see SetupMFEM)
-set(LIBNEO_REF "a4620f8075698dabafd774859e28e0ae92e8f339" CACHE STRING
+set(LIBNEO_REF "7262c32bf0406594a8ef27e84654d249aef2cb86" CACHE STRING
"libneo branch, tag, or SHA to fetch")
set(LIBNEO_PATH "" CACHE PATH "local libneo source directory (empty = fetch from git)")
diff --git a/src/mephit_mesh.F90 b/src/mephit_mesh.F90
index 152e31e..096a628 100644
--- a/src/mephit_mesh.F90
+++ b/src/mephit_mesh.F90
@@ -3108,6 +3108,17 @@ subroutine write_FreeFem_mesh
theta(:) = linspace(0d0, 2d0 * pi, npt_outer, 0, 1)
bdry_R(npt_inner+1:) = R_mid + R_rad * cos(theta)
bdry_Z(npt_inner+1:) = Z_mid + Z_rad * sin(theta)
+ ! dump the triangulator input so the annulus meshing problem can be
+ ! reproduced without a MEPHIT build, e.g. for mesher comparisons
+ open(newunit = fid, file = decorate_filename('outer_boundary.dat', '', basename_suffix), &
+ status = 'replace', form = 'formatted', action = 'write')
+ write (fid, '(2(1x, i0))') npt_inner, npt_outer
+ ! 17 significant digits so the dump round-trips the double precision input
+ write (fid, '(2(1x, es24.16e3))') R_mid, Z_mid
+ do kpoi = 1, npt_inner + npt_outer
+ write (fid, '(2(1x, es24.16e3))') bdry_R(kpoi), bdry_Z(kpoi)
+ end do
+ close(fid)
call FEM_triangulate_external(npt_inner, npt_outer, bdry_R, bdry_Z, R_mid, Z_mid, &
decorate_filename('outer.msh', '', basename_suffix) // c_null_char)
deallocate(bdry_R, bdry_Z, theta)