forked from 1b-agent/fieldcraft-upstream
mesh: faster tet improvement (#84)
Profile-driven (thin-ribs: 76% of the improvement in the topological operations, most of it in face removal walking whole edge rings to find one neighbour; pinhole-block: 44% in the smoothing passes). Same results, less work: - face removal finds the sandwiched face across a ring edge through the tetrahedron it already holds (O(1) instead of an edge ring), keeps the candidate tetrahedra of ring edges between rounds and updates the removed worst incrementally; - Klincsek's table for edge removal starts at the quality to beat, so triangles that cannot help are never evaluated; - a change clock per vertex: a topological operation (per tetrahedron, per edge, per face and side) or a smoothing that failed is not tried again until a tetrahedron it reads changes (exact: the operations are functions of that region; checked by re-running them); - the quality of a live tetrahedron is cached per slot until one of its vertices is touched; - smoothing line searches stop at the first tetrahedron that does not beat the worst, and gradients are computed only near the worst; - the journal saves the free list's tail instead of the whole list. For the clock to be exact, the quality is the same bits for every listing of a tetrahedron with the same orientation (corners in a canonical even order), and a closed edge ring starts at its smallest vertex. Changed results: - smoothing uses the analytic gradient of the smallest dihedral sine (Klingner and Shewchuk 2007 §3.1; Freitag and Ollivier-Gooch 1997) instead of central differences (kept for flat or inverted tetrahedra); - the composite insertion runs its topological passes on the new vertex's tetrahedra below the threshold, and smooths the neighbours whose star has one, as the passes do. Tests: analytic gradient against central differences, quality the same for every even reordering, cached qualities equal fresh ones after improvement, rollbacks restore every slot; the washer fingerprint moves (the same on arm64 and x86-64). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
1 parent
4329630943
commit
e4290c7366
10 files changed
+587
-106
No files matched your search
@@ -398,7 +398,8 @@ Delaunay methods with Voronoi/ODT improvement, then (2) all-hex and hex-dominant
|
||||
- **Implemented** in `fieldcraft-mesh::tet::{ops, improve}` from the two papers: Klincsek's dynamic programming for edge
|
||||
removal (interior edges; boundary edges of one flat B-rep face end in a 2-2 flip), multi-face removal grown greedily
|
||||
over the sandwiched faces, nonsmooth optimization smoothing (active set, smallest vector of the convex hull of the
|
||||
active gradients, line search; gradients by central differences), and the composite vertex insertion with rollback
|
||||
active gradients, line search; analytic gradients of the active measure, as §3.1 and Freitag–Ollivier-Gooch 1997
|
||||
use), and the composite vertex insertion with rollback
|
||||
(barycentres of boundary faces, of the tetrahedron, midpoints of boundary edges, and a point inside off a flat
|
||||
boundary edge). Deviations: the inserted vertex takes the Delaunay cavity rather than the optimal cut of §3.4; each pass
|
||||
smooths and flips the tetrahedra below sin 40° and inserts only when the worst did not improve; passes and the
|
||||
@@ -407,7 +408,11 @@ Delaunay methods with Voronoi/ODT improvement, then (2) all-hex and hex-dominant
|
||||
angle fine, one corner nearly flat; Shewchuk 2002); the scaled Jacobian analysts check (Knupp 2001, B6.6) catches
|
||||
them, and with the weight it decides only near that limit. Every operation is a checked replacement of a region
|
||||
(positive by exact `orient3d`, faces matched with opposite orientation, removed vertices fully inside), so the mesh is
|
||||
valid after each step.
|
||||
valid after each step. Speed (#84): an operation (topological, per tetrahedron, edge and face; or a smoothing) that
|
||||
failed is not tried again until a tetrahedron it reads changes (a change clock per vertex; exact, because the
|
||||
operations are functions of that region and the quality is computed on the corners in a canonical order), live
|
||||
tetrahedra's qualities are cached, Klincsek's table starts at the quality to beat, and the composite insertion runs
|
||||
its flips and neighbour smoothing only where a tetrahedron is below the threshold.
|
||||
|
||||
**A3.7 Cheng, Dey, Edelsbrunner, Facello, Teng 2000, Sliver exudation.** **Verdict: reference.**
|
||||
- **Citation.** J. ACM 47(5):883–904, 2000. DOI [10.1145/355483.355487](https://doi.org/10.1145/355483.355487).
|
||||
|
||||
Reference in new issue
Block a user