LaGriT V3.3.4 Release Notes (in development)
This page collects the changes since the V3.3.3 release (tag V3.3.3, January 2024). V3.3.4 is not yet released: the CMake project version is 3.3.4, and entries are added as pull requests merge. Pull requests still in review are listed separately at the end.
Previous release LaGriT V3.3.3 Jan 4, 2024
New commands and options
- improve_tets (#296): improves the worst tetrahedra of a mesh, by quality = the smallest sine of the dihedral angles, with smoothing and flips that keep the vertex set (Klingner and Shewchuk, IMR 2007). Boundary and interface vertices slide in their plane or line; a pset limits the work. See IMPROVE_TETS.md.
- quality / minsine (#296): the smallest dihedral-angle sine of each cell.
- cmo / addatt / edge_lengths_min, edge_lengths_max, edge_lengths_mean (#300).
- createpts / poisson_disk in 3D (#290, Poisson 3D sampling), with input checks that stop with an error instead of crashing on bad 3D input (#302).
- Input lines up to 1024 characters (#299; 80 before). Longer lines are refused, and a token cut at 32 characters gives a WARNING.
- examples/dfn_tets (#304): scripts that build 3D Poisson disk tet meshes around a DFN.
Fixes
- connect: a negative or huge imt is refused with an error instead of crashing (#297, issue #240).
- hextotet / grid2grid: prism to 14 (issue #214) and pyramid to 4 wrote past their arrays; options that do not fit the cells are refused (#298).
- eltset: inter and not with three or more sets gave wrong results without a message (#301). ELTSET2.md and PSET.md document the set logic.
- triangulate (issues #239, #57), a crash in cmo / copy (issue #6), macOS .stor output, the Poisson sampler, createpts checks (#292).
- interpolate and refine fixes (#293).
- Compiler fixes (#260, clang flag -Wno-error=implicit-int; #264).
Build and tests
- CMake builds Exodus as an option; src/fc_mangle.h is generated by CMake and no longer tracked (#295).
- New test suite test/suite, with independent checks and a results page per suite, and CI that runs it (#294).
sh test/suite/run_all.sh runs every suite; the level01 tests run inside it as test_lagrit_upstream. New suites since: test_avs_io (#305), test_hextotet (#298), test_set_logic (#301), test_edge_lengths (#300), test_input_lines (#299), test_improve_tets, test_element_angles and test_crush_thin_tets (#296).
- Each suite’s results page is now
summary.html in the suite’s own folder (it was logs/summary.html; that file now forwards to it), linked from test/suite/summary.html. Every page opens with a “What it does” paragraph and describes each test, and every test that writes a mesh or a vertex set shows a picture of it (new pictures: test_avs_io, test_element_angles, test_improve_tets, test_set_logic, test_connect_options, test_connect_exact, test_connect_hull, test_predicates). New page for test_poisson_command_errors, with LaGriT’s message for each deck.
Changes in behaviour
- Input lines longer than 1024 characters are refused; before, characters past column 80 were dropped without a warning (#299).
- eltset inter and not with three or more sets now give the documented result (#301).
In review (open pull requests)
- 2D connect: exact, complete and fast. For points in a coordinate plane, 2D connect gives the exact Delaunay triangulation of the convex hull, and its time grows linearly with the number of points (256,000 random points: 1.5 s, was 35 s on a Mac). See connect_notes.
- #312 the enclosing triangle is placed inside the box far from the origin (UTM coordinates gave no triangles).
- #313 exact in-circle and orientation tests (src/lg_predicates2d.c); the triangles along the convex hull are added and the mesh flipped to Delaunay (src/lg_connect2d_hull.c); connect no longer runs recon / 0 for such points. New suite test_connect_2d.
- #314 more than 100 points are inserted in a BRIO order (src/lg_brio_order.c); new option connect / old_order keeps the earlier order.
- Changes users will see: a few more triangles along the hull; where points are exactly cocircular (a regular grid) a square may be split along the other diagonal; two new lines in connect’s output. level01 references updated: connect_errors, intersect, intrp_2D_sizes, pflotran_stor, recon1.
- 3D connect insertion order (#316, on top of #314): more than 100 points inserted in a 3D BRIO order (lg_brio_order3);
old_order works in 3D too; the vertex-type test itsttp has a fast path for the names asked most, and 3D connect tests interfaces once per vertex. 256,000 random points: 2.7 s, was 14.0 s (whole run, Linux sandbox); 3D growth N^1.05 to N^1.10 for every input order (was up to N^1.3). Meshes change only where points are exactly cospherical (a cube of a regular grid splits into 5 or 6 tets, either Delaunay); level01 references updated for that: addmesh_add, cmo_addatt_normals, connect_cube, hybrid_volume, rmpoint, setpts, smooth. Also fixed there: delaunay.f and delaunay2d_lg.f sized a work array by nnodes, but points added by fix_small_tets / fix_small_triangles_lg are numbered above it, so connect wrote past the array (MMVERIFY “Array epilog overwritten”, then a stop; seen with all points on a sphere).
- connect options (#317, on top of #316): noadd, check_interface and old_order may be anywhere in the command, in 2D and 3D, in any combination (before: noadd and check_interface only as the last token in 3D, so not both; noadd only as token 18 in 2D, so
connect / noadd added points in 2D). A point range or pset right after connect (connect / 1,0,0, connect / pset,get,name, as CONNECT1.md shows) is read as the point range (before: no tets, or every point connected). The coordinates of the enclosing tetrahedron or triangle are deprecated (a WARNING); fewer than 12 (3D) or 9 (2D) numbers after the point range give a WARNING and are ignored (before: 12 numbers were read whatever was there, so connect / delaunay / 1,0,0 / noadd made no tets). check_interface in 2D gives a WARNING. New suite test_connect_options (11 of its 20 decks fail with V3.3.4).
- Exact tests are exact in every case (2D, src/lg_predicates2d.c from #313, and 3D connect / exact): when double-double arithmetic cannot decide an orientation, in-circle or in-sphere test, it is now decided in integer arithmetic (src/lg_exact_int.h) instead of being taken as a tie. Before, near-ties below about 1e-28 of the determinant’s size counted as ties: on a grid moved by multiples of 2**-40, 2D connect left 1 edge and 3D connect / exact 163 faces just non-Delaunay. New suite test_predicates compares every answer with rational arithmetic on adversarial inputs: 341 of 40,000 2D tests and 147 of 20,000 3D tests were wrong before (most with coordinates of wildly different scales), none now. New decks test_connect_2d cd13_dyadic and test_connect_exact dyad, j14.
- 3D connect fills to the convex hull (branch connect3d-hull, on top of connect3d-exact-opt): the tets lost with the enclosing tetrahedron are put back by gift wrapping with the exact tests (src/lg_connect3d_hull.c); they are Delaunay, so with exact the mesh is the Delaunay tetrahedralization of the convex hull. Missing before: 1.3% of the hull volume for random points, 7.7% for a 100 x 1 x 1 box; now 0 (pockets flatter than 1e-6 left open: 4e-7 for a grid jittered by 1e-6). Many added tets are thin, as Delaunay tets along a hull are. New option connect / nohull keeps the old mesh. (Nov 4: the fill no longer resizes the mesh object’s arrays in the middle of connect unless it adds tets, and then grows only the element arrays; resizing every array there made refine_recon_quality fail on macOS.) Cost: within the timing noise at 256,000 points. New suite test_connect_hull.
- Small fixes (branch small-fixes, on top of #317): TRANS.md had zero and center swapped (zero moves the minimum corner to the origin, center the midpoint) and listed a keyword enter that does not exist. 2D connect’s interface pass tests each vertex’s interface type once per pass instead of three times per triangle (same meshes; no measurable time change after #316’s itsttp fast path).
- connect / exact (branch connect3d-exact-opt, on top of small-fixes): a new option for 3D connect. The in-sphere and orientation tests are exact (src/lg_predicates3d.c, as 2D has had since #313) and no points are added in small tets, so the result is the Delaunay tetrahedralization of the points. On a 12 x 12 x 12 grid jittered by 1e-9, plain connect leaves 3,953 faces not Delaunay, adds 281 points and leaves 4 points out; connect / exact adds and loses none and is exactly Delaunay. The connect step does about 9% more work for ordinary point sets (the quick circumcentre test, with an error bound stored per tet, decides almost every case), about 35% for a lattice with a binary spacing such as 10 or 0.5, and about twice the work (about 50% more time) for a lattice with a spacing such as 1/63, whose exact ties must each be proved zero in integer arithmetic. Off by default: plain connect is unchanged. New suite test_connect_exact (exact rational checks).
- #315 recon accepts vertices with imt 0 (no more “MMGETBLK: ERROR! FATAL … matrecon”).
- #303 createpts / poisson_disk / 3d_box: h_lookup octree, a lean octree for the h field and the neighbour search, with a maximal fill.
- #306, #307, #308 read / avs and dump / avs: errors instead of crashes and wrong meshes; restructured code; read about 3 times and dump about 2.5 times faster, output byte-identical. read / avs requires a named, empty mesh object (to join meshes, use addmesh / append).
Known issues
- 3D connect (without exact) on nearly regular grids (a grid jittered by 1e-6 to 1e-9): a few vertices can be dudded (2 to 4 of 3,375, also in V3.3.4), or many points added by the small-tet pass (419 for 1e-9). V3.3.4 made no tets at all for 1e-9 and crashed for one 1e-6 grid (the work-array overrun fixed in #316). The tolerance in-sphere test decides these near-ties; connect / exact avoids them, but on input meant to be cospherical and coplanar (the createpts rtp sphere) its Delaunay tets can be flat to round-off.
- 3D connect without exact: not exactly Delaunay where points are nearly cospherical (a grid jittered by 1e-9: 2,977 faces). Thin tets along the convex hull were lost with the enclosing tetrahedron (1.3% of the hull volume for random points); the 3D hull fill (in review) puts them back.
- 2D connect of points in a tilted plane still uses the tolerance tests and recon / 0.
Log summary
Pull requests merged since V3.3.3 (dependabot updates of the documentation site not listed):
| Date |
PR |
Title |
| 2026-11-02 |
#305 |
test/suite: add test_avs_io, read / avs and dump / avs |
| 2026-11-02 |
#304 |
examples/dfn_tets: 3D Poisson disk tet meshes around a DFN |
| 2026-11-02 |
#302 |
poisson_disk: stop with an error instead of crashing on bad 3D input |
| 2026-11-02 |
#301 |
eltset: inter and not with three or more sets; document set logic |
| 2026-11-02 |
#300 |
cmo / addatt: edge_lengths_min, edge_lengths_max, edge_lengths_mean |
| 2026-11-02 |
#299 |
Input lines: use lines up to 1024 characters, refuse longer ones; warn on cut tokens |
| 2026-11-02 |
#298 |
hextotet / grid2grid: fix prism to 14 (#214) and pyramid to 4 |
| 2026-11-02 |
#297 |
connect: refuse negative or huge imt instead of crashing (#240) |
| 2026-11-02 |
#296 |
improve_tets, crush_thin_tets fixes, cell angle fixes, quality / minsine |
| 2026-11-02 |
#295 |
CMake Exodus build |
| 2026-10-21 |
#294 |
Test suite in test/suite, and CI that runs it |
| 2026-10-21 |
#293 |
Interpolate refine fixes |
| 2026-10-20 |
#292 |
Fixes: triangulate (#239, #57), cmo/copy crash (#6), macOS .stor, Poisson sampler; createpts checks |
| 2026-03-27 |
#290 |
Poisson 3D sampling |
| 2025-01-09 |
#275 |
Lagrit site dev |
| 2024-05-06 |
#267 |
Ehinrichs/testing |
| 2024-05-06 |
#266 |
Ehinrichs/debug |
| 2024-04-23 |
#264 |
Updated files to fix compiler issues |
| 2024-04-22 |
#262, #263 |
Tam debug, and its revert |
| 2024-04-19 |
#261 |
Ehinrichs/dev |
| 2024-04-17 |
#260 |
Check clang version and add flag -Wno-error=implicit-int |
git log --merges --format="%ad %s %b" --date=short V3.3.3..master