Reviewed closed-solid implicit contact: bounded nonconvex candidate¶
Status: experimental source candidate on feat/implicit-contact-parity; not a
0.4.3 release capability, general CAD contact, or Abaqus parity claim.
Why this is a separate geometry contract¶
An oriented open triangle sheet does not define a solid interior. Averaging
normals at a noncoplanar edge invents a gap law. A certified convex solid has
an efficient support-plane interior law, but that law cannot represent a
reentrant corner. closed_triangulated_rigid_solid(...) therefore accepts a
closed, consistently oriented triangle manifold with connected vertex links
and positive oriented volume only when the caller explicitly sets
reviewed_embedded=True. Point-touching shells fail before a solve. The
topology check does not prove absence of self-intersection, nested
component correctness or CAD fitness; the caller attests embedding after
review. closed_triangulated_rigid_solid_from_mesh(...) retains imported
source SHA-256, format and coordinate scale and does not automatically infer
that attestation from an STL file.
The vertex-link requirement is scoped to a closed shell. An open Q1
reference patch may have two corner-adjacent pieces used only for distance
search; forcing the closed-solid rule on every open triangle surface broke
that existing search case in remote CI. The corrected preflight retains
closed-shell rejection and preserves open-patch search. Open surface summaries
state manifold_scope="edge_incidence_only" rather than implying a
closed-solid vertex certificate.
At every Newton trial, an exact triangle BVH finds the nearest surface point.
A point certified beyond the complete tool AABB is exterior. The default
winding_reference sign path then uses a direct oriented-solid-angle sum
inside the AABB to classify outside (winding 0) or inside (winding 1).
An explicit angle_weighted_pseudonormal option instead uses the nearest
face/edge/vertex normal, with direct winding when the dot product is near
roundoff. It is valid under the separately reviewed embedded-manifold
assumption; it does not provide the winding path's per-query malformed-
geometry evidence. The two methods have different scientific checkpoint
identities. Positive signed distance is admissible, negative is
penetration. Distinct equidistant nearest points and ambiguous sign reject
the trial instead of selecting an arbitrary normal. A shared nearest point on
two triangles is allowed even when their facet normals differ: the physical
signed-distance gradient comes from the point-to-feature vector. Coplanar
triangulation seams are not physical edges. A subdivided straight sharp edge
remains an edge, not an artificial vertex.
Within a unique nearest-feature branch, the face Hessian is zero. For an edge
with unit tangent e and signed gap g, the Hessian is
sign(g) * (I - e⊗e - n⊗n) / abs(g); for a vertex it is
sign(g) * (I - n⊗n) / abs(g). The same residual and tangent enter the existing
reference-area penalty Operator, finite-J2 Newton/line search, prescribed
tool force--moment--work ledger, atomic accepted State, rollback and serial
checkpoint. At a geometrically nonsmooth point on the surface, the Hessian is
undefined and the trial is rejected. No normal is smoothed across materials,
features or facets.
The default direct winding sum costs O(number of facets) per query. The
opt-in nearest-feature sign has O(1) query work after O(facets) angle-weighted
normal preparation, but the nearest-point BVH still dominates some cases.
The fast route follows the proof of Bærentzen and Aanæs (2005)
for an embedded, outward-oriented closed two-manifold. The constructor checks
topology and orientation but does not prove non-self-intersection; the
caller must review that assumption before opting in. A fast sign on a bad
mesh is not made trustworthy by matching one short test.
A seeded 2,000-query regression now concentrates logarithmically from
1e-8 to 1e-1 reference lengths around the L-prism's reentrant edge;
opt-in pseudonormal and direct winding agree on validity, status, signed
gap and normal for these sampled points. This is a local near-feature
screen, not an embedding certificate or an exhaustive proof of sign parity.
For a convex tool, prefer the separately certified
convex_polyhedral_rigid_surface(...) path: its support-plane interior law
has a defined deterministic limiting branch at an interior face-distance
tie. The general nearest-point law deliberately rejects such a tie rather
than claiming equivalent active-set convergence.
Local evidence and limits¶
Focused source tests check interior/exterior classification of an L-prism,
reentrant-edge, reentrant-vertex and coplanar-seam responses, subdivided physical edges,
outward-orientation and review requirements, rigid-motion objectivity,
finite-difference tangent and work conjugacy. The edge force, potential and
tangent also match independent quadratic radial-distance oracles. A real
DOLFINx boundary quadrature Operator checks the reentrant-edge tangent at
current displacement. An ordinary serial finite-J2 model.step() uses the
reviewed L-prism's flat face, agrees with the equivalent planar tool and
restores a checkpoint. A separate affine-periodic finite-J2 Step checks
TᵀR≈0 for the total material-plus-contact residual and the same planar
limit. Bounded Coulomb friction on an active locally planar face uses the
existing fixed-old-state tangent and accepted tangential State. An active
physical edge or vertex rejects the trial and rolls back; sharp-feature
friction is not approximated by the planar law. A bounded two-rank preflight
rejects this serial-only implicit path before a solve. A separate
six-increment ordinary finite-J2 Step now has an active reentrant-edge
quadrature point at the accepted final state, nonzero equivalent plastic strain,
and positive accepted tool work. Its current contact tangent agrees with a
fixed-branch directional finite difference at that accepted state. The
assembled material-plus-contact Newton matrix also agrees with a finite
difference when the preceding accepted J2 state is held fixed. Reloading
from the final accepted yield-surface state is a branch kink and is not that
discrete-update tangent test. A halfway
checkpoint/restart reproduces its
final displacement, committed material state and tool work. An injected
post-energy-record failure restores the previous accepted displacement,
material state, tool pose and work. This is a small
manufactured FE regression; it does not establish a mesh, penalty or
increment limit, a same-input Abaqus comparison, or robust convergence across
arbitrary active-set switches.
With the same active reentrant edge under prescribed translation plus a small rotation, a separate accepted-state regression independently integrates the unsmoothed point tractions about the current tool reference point. Its force and moment agree with the provider dual, and the fixed-displacement contact potential derivative agrees with their generalized work. This checks a current smooth branch of the nonsmooth geometry, not work convergence through a feature switch.
A separate three-dimensional pressure-controlled block uses only tangential
restraints on its opposite face, so no hidden normal support can carry the
imposed force. With the reviewed L-prism's planar face active, the integrated
contact resultant balances the independently prescribed 0.5 unit load,
and the reference-area mean penetration is 0.5 / penalty across two tetrahedral
mesh densities and penalties 500, 1,000 and 2,000. This follows the load-balance
check used in Abaqus' finite-sliding deformable/rigid verification,
but our model is a different manufactured input. It validates normal-force
assembly on a flat branch, not the reentrant-edge constitutive response or a
same-deck code comparison.
An exploratory fixed-geometry sensitivity screen used the same unit-cube finite-J2 fixture, tool travel, material and serial backend. These are dimensionless fixture values, not a physical reference solution:
| Cells per cube edge | Penalty | Increments | Final x-contact force | Max PEEQ | Tool work | Active reentrant edge points |
|---|---|---|---|---|---|---|
| 1 | 20 | 6 | -0.307884 | 0.004631 | 0.010731 | 1 |
| 1 | 20 | 12 | -0.308336 | 0.004577 | 0.010243 | 1 |
| 1 | 20 | 24 | -0.307757 | 0.004755 | 0.010383 | 1 |
| 1 | 20 | 48 | -0.307564 | 0.004770 | 0.010388 | 1 |
| 1 | 40 | 6 | -0.570216 | 0.008949 | 0.019391 | 1 |
| 2 | 20 | 6 | -0.307543 | 0.006715 | 0.008196 | 0 |
The 24→48 increment comparison changes the x-force by about 0.063%, max PEEQ by 0.32% and tool work by 0.049%; that is only a single-mesh load-path screen. The penalty change materially alters the result, and the refined mesh samples a different active contact feature. The mechanical energy residual also is not monotonically reduced by these increments; no complete energy-closure or spatial-convergence assertion follows from this table.
A further same-geometry, penalty-20, 12-increment diagnostic exposes the sharp-feature integration problem rather than closing it:
| Cell divisions per cube edge | Element/face quadrature | x-force | Max PEEQ | Tool work | Active points | Active edge points |
|---|---|---|---|---|---|---|
| 2 | tetra/default | -0.307580 | 0.006719 | 0.008062 | 10 | 0 |
| 3 | tetra/default | -0.351190 | 0.008529 | 0.008856 | 22 | 0 |
| 4 | tetra/default | -0.338940 | 0.008319 | 0.008825 | 42 | 0 |
| 5 | tetra/default | -0.319805 | 0.008538 | 0.008474 | 65 | 1 |
| 2 | Hex8/2×2 | -0.336987 | 0.007088 | 0.008496 | 6 | 0 |
| 2 | Hex8/3×3 | -0.361257 | 0.007248 | 0.009105 | 14 | 0 |
| 2 | Hex8/4×4 | -0.272692 | 0.005181 | 0.008063 | 31 | 1 |
| 3 | Hex8/2×2 | -0.347405 | 0.007775 | 0.008763 | 14 | 0 |
| 3 | Hex8/3×3 | -0.328525 | 0.007376 | 0.008784 | 36 | 0 |
| 3 | Hex8/4×4 | -0.316077 | 0.007179 | 0.008636 | 60 | 0 |
These are isolated source-checkout screens, not a mesh/face-rule convergence
sequence: the sampled active feature and the force change nonmonotonically.
The accepted SimulationResult now reports raw active face/edge/vertex
quadrature counts for this reviewed closed-solid route; it classifies coplanar
triangle seams as faces and does not relabel the point samples as a continuous
pressure map. This makes the failure mode visible without changing the model.
The present point-quadrature Operator is therefore not promoted for a
sharp-edge-dominated structural response on this evidence. An optional
positive-weight Basix degree-5/7 triangle rule is now available for
tetrahedral CG1/CG2 traces, in addition to the existing Hex8 face rules.
It preserves the default three-point triangle rule and enters checkpoint
identity. CG1/CG2 reference-area and planar-force checks pass, as does a
two-rank CG1 partition-canonical point-ID/weight check; the implicit
solver remains serial. On the same tetrahedral 12-increment fixture,
degree 7 gives x-force
-0.336957, -0.319265, -0.320473 for 2, 3, 4 cell divisions; the 3→4
values are close but the 2→3 change is about 5.3%, max PEEQ still changes,
and one physical edge point appears or disappears with sampling. Degree 5
gives -0.334865 and -0.328318 for 2 and 3 divisions. These are
diagnostics, not a converged method or a reason to change the default.
The public manufactured example exposes the rule without changing solver code:
python examples/finite_j2_closed_concave_contact.py --cells 3 --increments 12 --output /tmp/contact-default
and the same command with --contact-quadrature-degree 7 --output /tmp/contact-degree7
write separate XDMF/manifest outputs. This makes the face-rule sensitivity
reproducible without interpreting the option as an accuracy certificate.
Both 3-cell/12-increment public runs completed in this worktree. The default
three-point rule gave x-resultant -0.3511900373, zero sampled reentrant-edge
points and maximum PEEQ 0.0085291430; the positive degree-7 rule gave
-0.3192648429, one sampled edge point and maximum PEEQ 0.0082096584.
The result manifests identify their different face rules. This approximately
9.1% force difference at a fixed mesh is evidence of unresolved contact
integration sensitivity, not a degree-7 accuracy gain.
Keeping the 12-increment path, penalty and degree-7 rule fixed, the public
example at 5 and 6 cells per axis gave x-resultants -0.3248313540 and
-0.3268716591, sampled physical-edge counts 1 and 3, and maximum PEEQ
0.0085586637 and 0.0088500549. The six-cell default-rule counterpart
gave x-resultant -0.3431021957, zero sampled edge points and maximum PEEQ
0.0089111601. Thus even the six-cell rules differ by about 4.7% in
x-resultant; closer degree-7 forces between successive meshes do not certify
contact-footprint or plastic-history convergence.
At six cells and degree 7, a fixed-mesh penalty bracket of 10/20/40 gave
x-resultants -0.1712914511, -0.3268716591, -0.5945569639, maximum
penetrations 0.04883127, 0.04738339, 0.04491391, and maximum PEEQ
0.00452155, 0.00885005, 0.01589832. The prescribed tool translation
is 0.055 in this dimensionless fixture, so these are large penetration
fractions and a deliberately soft algorithmic test, not a hard-contact
reference. All three Steps complete; none provides a penalty-limit
certificate. A release benchmark must choose physically meaningful scaling
and show simultaneous penetration, force and history convergence.
This distinction also matters for cross-solver comparison: Abaqus documents
hard, direct, augmented-Lagrange and penalty enforcement as distinct
Standard choices;
matching geometry alone does not make a soft penalty fixture a same-input
hard-contact reference.
At six cells, degree 7 and penalty 20, repeating with 24 rather than 12
increments gave x-resultant -0.3268696751, maximum PEEQ 0.0088462369,
maximum penetration 0.04738336 and tool work 0.0086537641, compared with
-0.3268716591, 0.0088500549, 0.04738339 and 0.0086516508 at 12.
This narrow path-step screen is much less sensitive than the face rule or
penalty bracket; further increment reduction alone will not cure the exposed
contact-integration and penalty-limit gap.
An exploratory degree-7, six-cell trial at penalty 200 fails at load factor
0.5 with both 12 and 24 fixed increments. After the general finite-J2
failure-diagnostic repair, the reported cause is line search found no
acceptable trial step at residual 0.00039544 for the 12-increment attempt;
it is not silently counted as an accepted result. A dedicated regression
checks the rejection reason reaches the event/exception and that accepted
state rolls back. This failure does not establish whether a physically
scaled hard-contact formulation would converge under another method.
The existing line_search="basic" full-Newton policy, now selectable in the
public research example with --line-search basic, does complete the same
six-cell/12-increment degree-7 fixture at penalties 200, 1000 and 10000.
Reducing the backtracking minimum step from 1/128 to 1e-4 in a one-off
diagnostic still rejected near load factor 0.5; the issue is not merely that
the default minimum step is too large.
Their x-resultants are -1.82327209, -3.11990251, -3.94146457;
maximum penetrations are 0.03414494, 0.01850543, 0.00543376 and
maximum PEEQ values are 0.04199805, 0.06374637, 0.08467591.
The penalty response has not plateaued and plastic history remains
strongly parameter-dependent. This comparison isolates the backtracking
globalization issue; a successful full-Newton path is neither a proof that
basic is universally robust nor a hard-contact accuracy certificate.
At penalty 200, repeating the full-Newton run with 24 instead of 12
increments gave x-resultant -1.82503468, maximum PEEQ 0.04178001 and
maximum penetration 0.03418063; it is a narrow path-step check, not spatial
or penalty convergence.
An exact-head installed-wheel control at the same six-cell mesh, 12 increments,
penalty 200 and basic Newton policy compared the three supported face rules:
| Triangle rule | x-resultant | max PEEQ | max penetration | active reentrant-edge points |
|---|---|---|---|---|
| default degree 2 | -1.81303789 | 0.04410058 | 0.03238988 | 0 |
| opt-in degree 5 | -1.82587935 | 0.04396510 | 0.03360974 | 1 |
| opt-in degree 7 | -1.82327209 | 0.04199805 | 0.03414494 | 0 |
The x-force changes by about 0.14% from degree 5 to 7 relative to the
degree-7 value, but maximum PEEQ changes by about 4.7%; physical edge-point
count is not monotone with quadrature degree. These are discrete-rule
sensitivity data, not quadrature convergence or a resolved contact
boundary. Higher degree alone cannot be the default numerical-method fix.
The same fixture at penalty 200, 12 increments, degree-7 quadrature and
basic Newton was refined without changing its physical or algorithmic
inputs. Cells 3--8 came from the installed wheel; cells 10--20 were rerun on
the final candidate source:
For each new row, run
PYTHONPATH=src python examples/finite_j2_closed_concave_contact.py --cells N --increments 12 --penalty 200 --contact-quadrature-degree 7 --line-search basic --output OUTPUT
with N=10,12,14,16,20 on the candidate branch; the fourteen-cell face-rule
control substitutes degree 5 and changes nothing else.
| Cells per axis | x-resultant | max PEEQ | max penetration | active reentrant-edge points |
|---|---|---|---|---|
| 3 | -2.01339621 | 0.03934018 | 0.03311168 | 0 |
| 4 | -1.85720972 | 0.04151851 | 0.03215686 | 0 |
| 5 | -1.84844562 | 0.04281734 | 0.03307059 | 0 |
| 6 | -1.82327209 | 0.04199805 | 0.03414494 | 0 |
| 8 | -1.77276480 | 0.04609411 | 0.03439900 | 1 |
| 10 | -1.76727530 | 0.04587753 | 0.03447152 | 1 |
| 12 | -1.75368614 | 0.04897816 | 0.03454590 | 2 |
| 14 | -1.73441914 | 0.05089190 | 0.03538630 | 2 |
| 16 | -1.73535783 | 0.05478494 | 0.03550203 | 5 |
| 20 | -1.72154804 | 0.05989208 | 0.03524172 | 8 |
From six to eight cells the force magnitude changes by 2.77% and maximum PEEQ by 9.75%. The ten-cell maximum PEEQ initially falls, then rises by 6.76% from ten to twelve cells and by another 3.91% from twelve to fourteen; the active reentrant-edge sample count changes as well. The ten- through twenty-cell rows were rerun on the candidate source at identical physical and algorithmic inputs; the only core changes since the earlier installed-wheel eight-cell row are result-axis unit metadata, not numerical assembly. This extends the non-convergence evidence; it does not identify the asymptotic solution, separate spatial error from penalty error, or validate the full-Newton policy for other models.
The 16→20-cell x-resultant changes by about 0.80%, while maximum PEEQ rises about 9.3% and the sampled reentrant-edge points increase from five to eight. Apparent force stabilization alone is therefore not a validated damage or plastic-history limit.
The growing single-point maximum is also not, by itself, proof of a defective material integrator. Abaqus' own adaptive-remeshing guidance warns that idealized reentrant corners and sharp-edge contact can create stress singularities that mesh refinement will not remove. That guidance does not prove this particular finite-J2 plastic field is singular. The next acceptance screen must therefore report both contact force/work and volume-weighted plasticity statistics, plus a fixed physical-distance or fixed physical-volume gauge away from the sharp feature; a changing maximum alone cannot pass or fail the continuum model. Introducing a tool fillet is an explicit geometry/model change and requires a separate same-input study.
For a reproducible fixed-reference-volume screen, use the raw PEEQ and
physical_weights arrays in each exported fields.integration-points.h5.
Select integration points with reference x>0.75 and
sqrt((y-0.35)^2+(z-0.19)^2)<0.15, then compute
results.weighted_field_statistics(PEEQ[mask], physical_weights[mask],
quantiles=(0.95,), location="integration_points", representation="raw")
without smoothing. At 10/12/14 cells the
selected physical volumes are 0.0179167/0.0179398/0.0176597; weighted
means are 0.0303778/0.0298773/0.0297985, and weighted 95th percentiles
are 0.0376683/0.0366638/0.0372699. The corresponding individual maxima
rise 0.0458775/0.0489782/0.0508919. The gauge mean changes by about
1.9% from ten to fourteen cells while the maximum rises about 10.9%.
This does not prove the corner is singular or that the contact solution
has converged: the fixed physical selection itself has discretization error,
the x-resultant still moves, and the penalty and time-increment limits remain
unchecked on this mesh range. It does identify a more meaningful companion
metric than an unqualified single-point maximum.
At fourteen cells, changing only the positive triangle rule from degree 7 to
degree 5 gives x-resultant -1.73819547 instead of -1.73441914 (about
0.22% difference), maximum PEEQ 0.05169160 instead of 0.05089190 (about
1.57% difference), and one rather than two active reentrant-edge points.
Both runs completed with twelve accepted increments. This narrows, but does
not close, the face-rule uncertainty at that mesh; it is not a contact-patch
or penalty-convergence certificate.
The same fixed-input degree-5 control at twenty cells completed all twelve
increments with x-resultant -1.72217799, maximum PEEQ 0.05988269, maximum
penetration 0.03524783 and one sampled active reentrant-edge point. Relative
to the recorded degree-7 twenty-cell run (-1.72154804, 0.05989208,
0.03524172, eight edge points), the resultant changes by about 0.037% and
maximum PEEQ by about 0.016%. This rules out a large degree-5 versus
degree-7 difference at this mesh as the sole explanation for the rising
meshwise maximum, but not contact integration error in general: both rules
can miss the same moving feature geometry. The twenty-cell degree-5 fixed
near-edge reference-volume gauge has physical volume 0.01765625, weighted
mean PEEQ 0.02941569 and weighted 95th percentile 0.03713449; compare
like-for-like with the completed degree-7 run: the selected physical volume is
also 0.01765625, mean PEEQ is 0.02941838 and weighted 95th percentile is
0.03696220. The mean differs by about 0.0091%; the two 95th percentiles
still differ by about 0.46%. Neither number establishes convergence of the
moving contact boundary.
Penalty sensitivity is a more serious unresolved limit in this same fixture.
The fourteen-cell, degree-7, twelve-increment, basic-Newton runs were
repeated on the same candidate source at penalties 200, 1000 and 5000. The
serialized model/solver contracts are identical after removing only the
penalty value, its derived pair identity and run-generated increment
diagnostics. All three runs accepted twelve increments. The raw integration
point gauge is the same fixed reference volume 0.01765974 in each run:
| Penalty | x-contact resultant | max penetration | penetration / cell edge | max PEEQ | gauge weighted mean PEEQ | gauge weighted 95th PEEQ | relative mechanical-energy residual |
|---|---|---|---|---|---|---|---|
| 200 | -1.73441914 | 0.03538630 | 0.49541 | 0.05089190 | 0.02979850 | 0.03726994 | 0.00018379 |
| 1000 | -2.93708275 | 0.02191363 | 0.30679 | 0.08222936 | 0.04526075 | 0.05444669 | 0.00018347 |
| 5000 | -3.51400294 | 0.01115067 | 0.15611 | 0.11161214 | 0.05056697 | 0.06206926 | 0.00051198 |
The nominal cell edge is 1/14; the penetration ratio is only a descriptive
screen, not an automatically acceptable threshold. The x-resultant still
changes about 19.6% between 1000 and 5000, and the
fixed-gauge mean PEEQ changes about 11.7%. Even a volume-weighted local
response has not reached a penalty plateau. Stable-looking meshwise gauge
statistics at one penalty and a small energy residual cannot justify a
hard-contact, damage or external-solver parity claim. A controlled
mesh-by-penalty matrix and a penetration tolerance tied to physical
dimensions are prerequisites. These are dimensionless manufactured-fixture
numbers, not a recommended penalty for a physical model.
One deliberately higher-penalty diagnostic used the installed 8a38b79c
native wheel on that same fourteen-cell geometry and degree-7 rule, with
penalty 20000 and the explicitly selected GMRES/GAMG linear policy. It did
not produce an accepted final response: twelve fixed increments with basic
Newton reached the 25-iteration limit at load factor 1/6 (residual
3.14522e-4 versus threshold 3.69969e-8). With the existing backtracking
policy, twelve increments failed at factor 1/2 because no trial step was
acceptable (residual 5.59598e-3); refining to 24 fixed increments still
failed at factor 3/8 (residual 1.68247e-3). These failures show that
simply increasing the penalty did not provide a usable limit for this fixed
setup. They do not prove that every globalization, mesh or enforcement
method must fail. No force, work or plasticity number is reported for any
failed path. Further promotion should compare a separately specified
penetration-controlled enforcement method, with its own multiplier State,
trial/commit/rollback and restart identity, rather than hiding a penalty
increase or an algorithm switch inside the existing pair.
For that comparison, the smallest sound implementation is a separate,
opt-in normal-enforcement contract on a fixed reference trace, initially
frictionless analytical-plane contact. With a frozen nonnegative multiplier
lambda_old during each Newton solve, use the active pressure
p = max(0, lambda_old - k*g) for the existing signed gap g (positive
outside). The corresponding local augmented potential is
(p*p - lambda_old*lambda_old)/(2*k); its displacement derivative must
produce the same residual, and its active fixed-multiplier derivative must
produce the same tangent. This is an algorithmic Lagrangian, not a new
physical stored-energy claim or a substitute for the accepted work ledger.
An augmentation cycle may stage
lambda_trial = max(0, lambda_old - k*g_converged) only after that
Newton solve converges. Accepting the increment requires both the global
residual and a separately specified penetration/complementarity tolerance;
only then may the Procedure commit displacement, material and multiplier
State together. A failed Newton or augmentation cycle restores all three.
The multiplier's stable quadrature IDs, units, penalty, tolerance and
augmentation policy belong in checkpoint identity. This first gate needs an
independent spring/plane solution, finite-difference total tangent, reaction,
work, retry and restart tests before finite-J2 composition. It must not be
silently enabled on the moving convex-feature partition: its quadrature
locations and point IDs change between trials, so transferring multiplier
history needs a separate conservative basis/mapping and verification.
This design follows the distinction between penalty approximation and
augmentation iterations in
Abaqus' contact-control documentation,
but the cited product does not validate this proposed AgentFEM algorithm.
The penalty-1000 twenty-cell extension, with the same rule, twelve increments
and basic Newton policy, also completes. Relative to fourteen cells at that
penalty, the x-resultant changes from -2.93708275 to -2.87969817 (about
1.95% in magnitude), maximum penetration from 0.02191363 to 0.02277766,
and the single-point maximum PEEQ from 0.08222936 to 0.09040997. On the
same fixed-reference gauge, the twenty-cell physical volume is 0.01765625,
weighted mean PEEQ 0.04483478 and weighted 95th percentile 0.05461449;
the fourteen-cell mean is 0.04526075. Thus a relatively steady regional
plasticity measure still accompanies a moving peak and resultant. At twenty
cells, increasing penalty 200 to 1000 changes the x-resultant by about 67%
and this gauge mean by about 52%; mesh refinement at one penalty does not
remove the separate penalty error. The twenty-cell penalty-200 archive was
produced before the example gained explicit scientific-input logging; its
physical/solver settings and core numerical code are unchanged, but unlike
the fourteen-cell three-penalty matrix it is not an identical result-manifest
revision.
The exported raw integration-point PEEQ field gives a useful countercheck
against over-interpreting the single maximum. Using each point's exported
physical-volume weight, the degree-7 volume-weighted means for cells
8/10/12/14 are 0.01639180/0.01665422/0.01665232/0.01655183;
the corresponding weighted 99th percentiles are
0.03980527/0.03964740/0.03891682/0.03953172.
At fourteen cells the degree-5 mean is 0.01661404 and its weighted 99th
percentile is 0.03959502. The whole-volume distribution is more stable than
the local maximum in this fixed-penalty screen, but the changing resultant,
edge sampling and maximum forbid a general contact or hotspot convergence
claim. All four integration-point archives report total volume one; no
smoothed nodal field was used for these statistics.
Backtracking remains the example default.
Any new globalization should compare the accepted path, total residual,
contact work, plastic history and cutback behavior against both policies;
silently falling back to a full Newton step after rejected backtracking is
not justified by this one fixture.
PETSc SNES offers line-search and
trust-region Newton variants, but adopting one is a Procedure integration
task: every trial must re-evaluate the current contact branch and material
from fixed accepted State, and only a converged increment may commit either.
Its bound-constrained VI solvers are not a drop-in switch for this
displacement-only penalty formulation; they require a different algebraic
constraint/unknown contract. First compare a bounded trust-region prototype
against the existing backtracking and full-Newton paths without changing the
contact law or silently accepting a different plastic trajectory.
The next numerical-method experiment
must distinguish a contact-boundary/feature-aware integration strategy from a
different physical model, preserve residual--tangent consistency and compare
like-for-like force, moment, plastic history and work. The refined-boundary
quadrature and contact-patch discussion of
Duong, De Lorenzis and Sauer motivates
that experiment; it is not validation of an implementation here.
The independent comparison of segment-based, element-based and hybrid
integration by Farah, Popp and Wall
also identifies contact-zone boundaries as an accuracy and cost decision.
It supports testing a local partition, not claiming that the particular
clipped-penalty algorithm here was validated by their mortar study.
The bounded next algorithmic slice is frictionless adaptive boundary
integration, not an implicit change of every model's default rule: locate
the zero-gap and nearest-feature transitions on each candidate slave face,
subdivide only crossing faces with positive reference-area weights, and use
the same frozen trial partition for residual and consistent tangent. A changed
partition requires a fresh Newton trial, and an accepted result must record
its integration identity and coverage diagnostics. Validate a uniform planar
patch first, then a manufactured sharp-feature cut against independent
high-resolution surface integration, then force/moment/work and mesh/penalty
sensitivity. Stateful friction must not inherit changing point identities
without an explicit State transfer rule. This is a design gate, not code
claimed by the present candidate.
An independent, research-only affine P1 triangle oracle now fixes the
smallest contact-boundary problem before changing the Step. For the unit
reference triangle and planar gap g(x,y)=x-a, exact clipping of g<0
gives active area a-a²/2 and reference-area penalty potential
a³/6-a⁴/24 at unit penalty. tools/verify_contact_boundary_quadrature.py
computes that clipped potential, nodal residual and fixed-branch tangent with
positive degree-two subtriangle quadrature; nine tests check analytical
area/potential, potential and residual derivatives, nodal-force conservation,
vertex-order invariance, open/full limits and invalid inputs. At a=0.05,
full-face Basix degree-two and degree-five
rules both return zero potential, while the analytical and clipped values
are 2.057291666666667e-5. Degree seven captures only about 1.24% of that
value, and degree thirteen overshoots it by about 5.65%. This manufactured
counterexample explains why raising a whole-face quadrature degree is not a
general answer to narrow contact strips. It does not certify a production
adaptive contact Operator: the current oracle has a fixed planar gap and no
curved tool, nearest-feature transition, Newton partition identity, friction
State transfer, mesh convergence or global force/work acceptance. None of
the production defaults or public capability claims change on this evidence.
The present tests are local software evidence, not an independent structural benchmark. NAFEMS contact benchmarks motivate same-input comparison; a reference number from a different model cannot validate this implementation. Code_Aster SSNP154 publishes an Abaqus/MARC contact-friction comparison for a 2D plane-strain roller and distinguishes extrapolated bulk stress from contact-multiplier pressure, including mesh-dependent oscillations. It is useful for designing the future independent benchmark and choosing like-for-like observables, but its reported displacement/pressure numbers are not a reference for our 3D finite-J2, reference-area penalty fixture. Abaqus' own contact-control documentation distinguishes finite-sliding surface, edge and vertex cases. The exact solid-angle construction follows the geometric winding-number formulation described by Jacobson et al., while VTK's polyhedron note documents the triangle solid-angle primitive. Those references motivate the algorithm; they do not certify our contact solver.
An isolated native Apple Silicon 0.4.4.dev0 wheel built from Git commit
ce1dc177 has SHA-256
116dffa0c6336b982392cc01ba80e24c28e0fea260766a9296bb38ff9e7e2489.
Installed outside the checkout, it imports both _hex_native and
_body_pipeline; the ordinary three-increment finite-J2 L-prism Step
completes with accepted load factor 1 and tool work
0.0016303122370297336 in the dimensionless flat-face fixture. This is an
installed-package smoke, not a global active reentrant-edge solve, an
independent reference or Windows/Linux qualification.
The later isolated native wheel from commit db87ea56 has SHA-256
2dd1ab6213ecadb459fa10a7b0ac08051f67a3ba6fd8f2cc18c1e7e893d3c08d.
It was installed outside the checkout and, with the native _hex_native and
_body_pipeline modules present, ran the six-increment active-edge plastic
fixture: maximum PEEQ 0.004630797762548862, active edge True, accepted
tool work 0.010730556638046503. The standalone public-API
examples/finite_j2_closed_concave_contact.py also ran from that isolated
installation at 24 increments and exported an XDMF field file plus result
manifest. These are Mac installed-package checks of a manufactured
problem, not release-platform or industrial accuracy evidence.
An isolated native Mac wheel from f34a926d has SHA-256
a2a56e7ccfcb9c024ddc385342207eeaa55ac4aa07b6671414c3e77aef38f873.
Its installed package path, not the checkout, supplied the public affine-J2
model.step() runtime for five moving-friction, reduced-Jacobian and restart
regressions; all five passed. _hex_native and _body_pipeline imported from
the same isolated installation. This verifies packaging of the bounded serial
entry point, not other operating systems, MPI contact, or full-scale accuracy.
The same wheel ran the standalone public example at six increments with an
active reentrant edge and wrote fields.xdmf, its HDF5 payloads and
result.json: maximum PEEQ 0.004630797762550675, tool work
0.010730556638046358. Its own result scope remains
serial_manufactured_fixture_not_external_validation.
The 2c8be39f source archive has SHA-256
b8e666a2edd52e3dbdb3bae16902f4a1e630746b08802da024aef639d839c6df.
The platform wheel built from that archive has SHA-256
47fe7c08f87971bfac44e0af2c9e1f3037f78f017aefda610b9b0a3fcbfbd6d8
and includes _hex_native, _body_pipeline, and _q1_native. Installed in
an isolated environment outside the checkout, its python -I import resolved
to that environment's site-packages, and the same six-increment public example
completed with one active reentrant-edge quadrature point, maximum PEEQ
0.004630797762550675, tool work 0.010730556638046358, and
fields.xdmf, both HDF5 payloads, and result.json. This closes the
2c8be39f Mac installed-package smoke, not independent physical validation
or cross-platform numerical acceptance. Three selected public-Step tests run
under the isolated interpreter's -I mode also passed: opt-in tetrahedral
quadrature with restart identity, globally active reentrant-edge J2 contact,
and two moving tools with atomic restart.
The subsequent cfec462e source archive has SHA-256
1869fc3ef8abcab4c1b8d3dffd462b4ce64bae55d574d68fd4792f10efc234ff;
its native Mac wheel has SHA-256
ec6a532a51b22f15eb9a8ed976765f6a8bb8abee86b267a2aecbf649b10fcb1c.
The wheel was installed in a new isolated environment, all three native
modules imported from its site-packages, and three public-Step tests passed
under python -I, including the example's default/degree-7 face-rule
exports. The non-MPI installed-wheel release_gate.py --dist ... --smoke
completed, including its representative workflows and project templates;
the report is retained at
/private/tmp/agentfem-contact-release-smoke-cfec462e.json on this host.
This is Mac package/workflow acceptance; it does not complete the
independent contact physics, cross-platform or distributed implicit gates.
The source-side serial checkpoint policy also passed every=1, keep_last=1:
only the final v2 artifact remained and its accepted Coulomb history restored.
portable=True is correctly rejected at preflight for an external contact
Operator; a serial v2 file must not be described as MPI-rank portable.
An opposed active frictionless sphere plus moving frictional plane also kept
separate pair States through a v2 restart and reproduced the final field and
accepted sliding dissipation. This is a two-tool composition check, not a
general multi-body or distributed-contact benchmark.
An additional affine-periodic check places an active reentrant edge opposite
an active analytical sphere. Both contact duals remain named separately from
the periodic dual, the total material-plus-both-contacts residual reduces to
zero, and a serial checkpoint reproduces displacement and committed J2 State.
It does not establish convergence across an edge transition or distributed
multi-tool assembly.
Changing the Coulomb coefficient invalidates the scientific restart identity;
corrupting the second pair's checkpoint data rejects the entire load before
the first pair's friction State can remain half-restored. An injected late
second-pair commit failure likewise restores the previous material, field,
pose and friction boundary.
The nonsymmetric affine Coulomb tangent rejects CG at construction; a serial
GMRES/ILU solve matches direct LU in displacement, accepted friction
dissipation and rigid-tool path work on the same fixed-input Step.
The public affine friction solve_result(output=..., strict_output=True)
path also writes XDMF/HDF5 field artifacts while retaining separate raw
contact-point diagnostics; this is a final accepted field view, not a
time-history export or a first-law verification.
The affine Procedure now checks an external Operator's in-memory State
snapshot/restore pair before allowing commit_accepted, and checks its durable
accepted snapshot/restore pair before checkpoint publication. A deliberately
incomplete provider fails before numerical work or an output artifact, rather
than producing an unrollable accepted increment.
The next sharp-feature friction gate is not a normal-averaging patch. Abaqus' contact overview describes distinct finite-sliding surface, edge and vertex formulations, while its contact-controls guide distinguishes force redistribution smoothness at sliding transitions. We therefore retain the current fail-closed physical-edge friction boundary until an explicit transition law, generalized tangent, force/work audit and cross-feature convergence reference are available. Smoothing a geometric normal alone would change the model without establishing those contracts.
Sign-query performance experiment, not a whole-Step speed claim¶
tools/benchmark_closed_solid_projection.py fixes the L-prism geometry,
random seed, inside/outside query distribution and repeated local timings. On
this Apple Silicon host, with 5,000 queries and median of three in-process
trials, it measured:
| Facets | Full direct projection | BVH nearest search | Direct winding | Experimental BVH ray parity |
|---|---|---|---|---|
| 320 | 0.613 s | 0.435 s | 0.169 s | not screened in the final table |
| 1,280 | 0.963 s | 0.533 s | 0.416 s | 0.635 s |
| 5,120 | 2.115 s | 0.554 s | 1.525 s | 0.684 s |
The Möller–Trumbore ray/triangle method motivated the strict-interior crossing prototype. It agrees with direct winding on all 5,000 sampled queries at each of the two ray-screened densities and defers grazing rays, but a parity sign does not preserve the direct winding path's query-time evidence for malformed or multiply wound geometry. It is therefore kept only in the research benchmark tool, not in the installed solver. The 1,280-facet local result is slower, the 5,120-facet local result has not been shown to improve a whole accepted Newton Step, and no cross-machine claim is made. This experiment does identify nearest-feature search as another substantial cost, not just the O(facets) sign calculation.
An exact, cheaper prefilter now classifies a query as exterior only when its reference-frame point lies strictly beyond the complete tool AABB with a tolerance margin. It still computes the current nearest point and normal; inside the AABB, direct winding and ambiguous-sign rejection remain mandatory. Fixed and moving-tool tests verify identical signed gaps for certified exterior points. A frozen-wheel versus candidate-source local comparison on this Mac, 5,120 facets, 5,000 fixed-seed queries and three medians yielded:
| Query distribution | Pre-shortcut full projection | Exact-AABB shortcut full projection |
|---|---|---|
| Half strictly outside the tool AABB | 2.085 s | 1.334 s |
| All within the AABB | 2.063 s | 2.092 s |
The first row is about 36% faster for that local geometry query, not a whole Newton step or application. The second row is a control showing no useful gain when the certificate cannot apply (the small difference is timing noise). This safe screen does not replace the unpromoted experimental ray classifier.
The angle-weighted pseudonormal theorem offers a different route: its sign
can be computed from the same nearest feature already found by the BVH.
sign_method="angle_weighted_pseudonormal" is an explicit opt-in on the
reviewed closed solid; direct winding stays default. The option preserves
identical signed gaps and final material/tool-work responses in the 2,000
fixed-seed concave/reentrant-vertex queries per fixture and the six-increment
active-edge finite-J2 Step. A 5,120-facet, 5,000-query, three-median local
run on this Mac measured default full projection 2.062 s versus opt-in
0.584 s (3.53× geometry-query speedup). These are fixed-input local
measurements, not a whole accepted Newton-Step or cross-machine claim.
Neither option certifies the input mesh is free of self-intersection, but
direct winding retains stronger query-time evidence on malformed geometry.
An additional whole-Step screen, including finite-J2 material updates,
Newton and contact but excluding export, used the same 5,120-facet tool and
24 accepted increments. Three in-process repetitions on this Mac gave:
| FE cells per axis | Contact-active points | Default winding Step | Opt-in pseudonormal Step | Ratio |
|---|---|---|---|---|
| 1 | 4 | 1.323 s | 0.684 s | 1.94× |
| 2 | 10 | 3.719 s | 1.567 s | 2.37× |
| 3 | 22 | 8.169 s | 3.278 s | 2.49× |
tools/benchmark_closed_j2_step.py recreates the model for each repetition,
times solve_result() only, and rejects any difference in final displacement,
material state, accepted count, active count or tool work. This is evidence
that the local sign cost can matter at Step level on this manufactured
contact-heavy problem, not a general 2× promise: a real tool, larger FE
mesh, different hardware or different contact density can change the ratio.
The three-cell row was run later with the same 5,120-facet tool, 24 accepted
increments and three repetitions; its final tool work was 0.008853793023137713
for both modes. A 1,280-facet control at that FE size measured 4.482 versus
3.090 seconds (1.45×), showing the benefit depends on tool facet count.
After the affine result-diagnostic extension, the same three-cell source-side
screen repeated with 5,120 facets and three medians at 8.241 versus 3.292
seconds (2.50×); both modes again gave tool work
0.008853793023137713. The small absolute-time drift from the prior run is
not evidence of a portable regression or speed gain.
The fast option's numerical reproducibility on a large independent model
and malformed-mesh robustness remain open release gates.
Fixed-input implicit linear-solver screen¶
The manufactured finite-J2/L-prism example now exposes an explicit
--linear-policy gmres_gamg option alongside its unchanged direct LU
default. The option lowers to the existing public
solvers.LinearSolverOptions(ksp_type="gmres", pc_type="gamg", rtol=1e-8,
max_it=500) contract; it does not introduce a contact-specific solver.
The finite-J2 Step reports reference_rigid_body_3d near-nullspace for the
iterative route. This follows PETSc's GAMG elasticity guidance
and the DOLFINx elasticity example,
but those sources do not predict AgentFEM's performance.
On this Apple Silicon host, with one MPI rank and the same mesh, tool,
penalty 1000, degree-7 contact rule, twelve accepted increments, basic
Newton policy and OMP_NUM_THREADS=1, OPENBLAS_NUM_THREADS=1,
VECLIB_MAXIMUM_THREADS=1, the serialized model contracts differ only in
the declared linear strategy and its derived preconditioner evidence:
| Cells per axis | Newton iterations, both | direct accepted-Step seconds | GMRES/GAMG accepted-Step seconds | direct linear seconds | GMRES/GAMG linear seconds |
|---|---|---|---|---|---|
| 14 | 72 | 118.71 | 88.18 | 33.83 | 3.32 |
| 20 | 76 | 512.41 | 234.99 | 289.29 | 11.50 |
The measured accepted-Step reduction is about 25.7% at fourteen cells and
54.1% at twenty cells; the larger case is 2.18× faster by this Step-only
timer, not by an end-to-end installed-project timer. At twenty cells the
maximum nodal displacement difference is 7.19e-16, maximum raw
integration-point PEEQ difference 1.09e-14, and maximum raw S-field
component difference 9.63e-12. At fourteen cells the displacement/PEEQ
maxima differ by 1.19e-15/9.46e-15. Final contact resultant,
penetration, tool work and mechanical-energy residual also match within
floating-point tolerance; the large-case serialized manifests do not by
themselves prove every intermediate energy sample equal. The example now
opts into the existing include_histories=True manifest contract; a small
six-increment direct/iterative regression compares each accepted tool-work,
contact-potential, plastic-dissipation and energy-residual sample. A
one-cell control had no meaningful gain (0.093 versus 0.097 Step seconds).
These are one-run-per-policy, same-host screens, not cross-platform medians;
GAMG convergence, memory and gain depend on problem scale, PETSc build,
constraints and material tangent. Keep the default and require a recorded,
explicit selection rather than silently switching algorithms. The example's
scientific_inputs fingerprint changes with the linear policy.
An independent paired repetition used the installed native wheel from
clean numerical source 8a38b79c, in the same Apple Silicon FEniCSx
environment and with the same declared non-solver scientific inputs (their
canonical JSON SHA-256 matches across policies). It timed the entire example
process with /usr/bin/time -p as well as summing accepted Step attempts:
| Cells per axis | Policy | Accepted Step seconds | Linear solve seconds | Process wall seconds | Newton iterations |
|---|---|---|---|---|---|
| 14 | direct LU | 115.79 | 33.28 | 146.79 | 72 |
| 14 | GMRES/GAMG | 85.42 | 3.26 | 116.15 | 72 |
| 20 | direct LU | 511.89 | 290.49 | 577.13 | 76 |
| 20 | GMRES/GAMG | 232.16 | 11.49 | 297.58 | 76 |
This repetition gives about 20.9% and 48.4% process-wall reductions at
14 and 20 cells, respectively. h5diff -d 1e-10 finds no differences in
any exported field dataset at either size. Across the four accepted histories
contact_potential, tool_work, plastic_dissipation and
mechanical_energy_residual, the largest per-sample absolute difference is
1.11e-16 on the twenty-cell pair. Both paired tests ran direct first, so
cache/warmup order was not counterbalanced; these remain two observations per
policy on one machine, not a portable distribution or end-to-end project
benchmark. The contact and material laws are unchanged, and the unresolved
penalty-limit failure still blocks physics promotion.
Open work before broader admission: independent same-input force/displacement comparison; controlled geometry, mesh, penalty and increment sensitivity; whole-Step speed and malformed-mesh robustness of the opt-in sign path; distributed ownership and cross-rank restart. Sharp-feature friction, deformable master, self-contact and arbitrary unreviewed STL remain unsupported. Do not promote this branch into a release merely because a small Newton solve completes.
Nine-gate local-parity map¶
This candidate advances the previously agreed bounded contact roadmap; the gates are not interchangeable. Status refers to demonstrated evidence, not planned code:
| Gate | Current evidence | Remaining boundary |
|---|---|---|
| 1. Same-input benchmark contract | The manufactured L-prism fixture and outputs are frozen in test/example code. | No independent Abaqus/Code_Aster same-input result or agreed dimensional acceptance tolerance. |
| 2. Existing candidate audit | Ordinary Step, tool work, restart and current-trial geometry are reused; no parallel solver path was added. | Broader scientific promotion review remains separate. |
| 3. Geometry and feature transitions | Unique nearest face/edge/vertex branches, coplanar seams, non-manifold vertex rejection and a globally active reentrant edge pass. | Self-intersection is caller-attested; medial-axis ties reject; no arbitrary CAD guarantee. |
| 4. Implicit total operator and State | Full J2-plus-contact tangent passes fixed-old-state difference; an active sharp edge passes periodic MPC total-residual, reduced contact tangent and fixed-old-state material-plus-contact reduced Jacobian differences; accepted failure rolls back. Active-edge translation/rotation has an independently integrated force/moment and a matching fixed-displacement work derivative. A bounded three-plane convex-corner Step now also passes total-Jacobian difference, force--moment work derivative and interrupted restart. | These remain manufactured serial fixtures; nonconvex feature-switch and larger mesh convergence are separate gates. |
| 5. Multiple rigid pairs | Named planar/convex tool work and atomic restart tests pass; mixed active concave-plus-moving-plane J2 pair keeps separate work, summed tangent and checkpoint restart. An active reentrant edge opposite an active sphere also passes periodic total-residual reduction and serial J2 restart. | Large mixed contact-set scaling and independent multi-tool reference remain untested. |
| 6. Friction | A finite-J2 strong-BC Step with a reviewed closed concave solid on a planar face matches the convex limit in displacement and friction dissipation for translated and slightly rotated tools under both sign modes; the fixed-old-state tangent and interrupted restart pass. The serial affine-periodic J2 path now commits a moving-plane Coulomb State, reduces its contact tangent by TᵀKT, checkpoints it in v2 and atomically rejects corrupt State; reviewed triangle and closed-concave planar faces match the same plane limit. An active reentrant edge rejects without partial State. |
The planar law does not include changing-normal terms at a physical edge or vertex; general sharp-feature friction, distributed affine contact and a full thermodynamic path audit remain unsupported. |
| 7. Material/time composition | Active-edge finite-J2 plastic path passes; explicit contact/material lifecycle is a separate existing route. | No generic historical implicit material or explicit general-closed-tool composition. |
| 8. Independent acceptance and speed | Directional analytical checks, fixed-seed geometry timing and a manufactured whole-Step opt-in/default comparison are recorded; 24→48 increment screen is narrow. A fixed-geometry mesh/face-rule screen exposes nonmonotone active-feature sampling. At penalty 200 the degree-5/7 twenty-cell resultant and fixed-volume mean PEEQ nearly coincide, but active edge counts differ. A same-source fourteen-cell 200/1000/5000 penalty screen changes force, penetration and fixed-gauge plasticity substantially without a plateau. The independent clipped-face oracle proves that ordinary whole-face rules can miss a narrow active contact strip entirely. | No independent full-geometry comparison, sharp-feature spatial/penalty convergence, industrial whole-step speed claim or release-grade energy closure. |
| 9. Product boundary | Public-API examples export XDMF/manifest from an isolated native Mac wheel. The clean numerical source 8a38b79c passes installed-wheel macOS platform acceptance, four project templates and a two-rank generic MPI smoke. The installed wheel also runs the new convex-feature finite-J2 Step and the opt-in GMRES/GAMG L-prism fixture. Unsupported distributed implicit/friction combinations still preflight-reject. |
Linux/Windows installed numerical acceptance and final remote CI remain version gates; the generic MPI smoke does not validate distributed implicit contact, and a local Mac smoke is not cross-platform release approval. |
The table intentionally refuses to turn one successful six- or 24-increment fixture into an Abaqus General Contact equivalence claim.
The public L-prism example now registers its generated mesh resolution,
boundary selections, material, contact pair, reference-area quadrature,
increment path and Newton controls with the existing
SimulationResult.add_scientific_inputs contract. Its small serial smoke
produces scientific_inputs.complete=true; changing only the contact face rule
changes the recorded content fingerprint. This fixes an output provenance
omission in the example, not missing continuum validation or a general
automatic-deck importer. Here complete means all declared inputs are
content-addressable; it cannot certify that an application omitted no input.
Trial active-boundary integration (bounded source candidate)¶
The first production-path slice of the boundary-integration repair is an
explicit contact_integration="planar_active_partition" option. It is admitted
only for serial, frictionless, scalar-penalty analytical-plane contact on an affine CG1
tetrahedral slave triangle with the default positive degree-two rule. At each
Newton trial the current planar gap is evaluated at the three slave vertices;
only a sign-crossing face is clipped in reference barycentric coordinates.
Positive degree-two quadrature on each active subtriangle then uses the same
trial trace for the contact residual, tangent, force, moment, potential and
accepted-point output. Open/full faces retain their ordinary trace. The
friction State and its stable point IDs are deliberately excluded. The
accepted checkpoint identity includes this selected integration mode.
The elementary narrow-strip oracle, g=x-a on a unit triangle, has exact
active area a-a²/2 and potential k(a³/6-a⁴/24); the new path matches it
through widths 0.0001–0.2. A real DOLFINx unit-cube boundary test with
a=0.05 catches contact that whole-face quadrature reports as zero, and its
finite-difference tangent agrees with the moving trial partition. A small
ordinary finite-J2 Step and checkpoint rule-identity test pass. This repairs
one reproducible blind spot, not the L-tool or hard-contact convergence gate.
Curved tools, nearest-feature transitions, Q1/CG2 faces, friction and MPI remain
outside this method; do not infer general coverage from the affine proof.
tools/verify_contact_feature_transition.py records why the next slice is
not a mechanical reuse of the zero-gap clipper. For the active two-plane gap
g=|x-c|-a on a unit reference triangle, moving the sharp feature leaves
the exact integrated tangent zero, while a fixed-branch bulk tangent alone is
2ka(1-c). An equal negative line contribution at the still-compressed
feature switch is necessary. At the zero-gap boundary that line term instead
vanishes. A sharp-tool partition must therefore integrate both positive
area subcells and the consistent feature-interface tangent, or explicitly use
and validate a different nonlinear method; simply cutting at the feature and
reusing the planar tangent would claim a false Jacobian.
tools/verify_two_plane_contact_integration.py extends that scalar
counterexample to the full three-node vector residual and Hessian on a
reference triangle with two affine competing plane gaps. It partitions the
negative-gap area by the dominant feature, integrates each subpolygon with
positive degree-two quadrature, and adds a separate Gauss line integral on
the compressed feature switch. The line term is proportional to the common
negative gap and the outer product of the two normal jumps. It vanishes on
the zero-gap contour but not on an interior compressed feature transition.
Independent analytic potential/translation derivatives, directional finite
differences, symmetry, feature-order and vertex-order checks pass. A
manufactured nine-DOF spring-supported triangle reaches a global stationary
state with this full tangent; its energy and nodal force match separately
split one-dimensional surface integration, and its assembled Jacobian matches
a directional difference. A further manufactured one-tetrahedron linear
elasticity fixture reaches equilibrium with the same contact integral. Its
hand-derived bulk stiffness agrees with an independent DOLFINx UFL/PETSc
assembly. These are not finite-J2, reviewed L-prism or external-solver
comparisons. The oracle rejects a nonunique boundary-aligned feature switch
rather than claiming a two-sided tangent. It remains an independent
research-only two-plane reference, separate from the bounded convex Step
mode below: the reviewed L-prism's nearest-edge and nearest-vertex distances
are nonlinear, and its full feature graph, coverage, friction State and
global convergence remain unproved.
Certified convex bounded-feature trial integration¶
The next bounded production-path slice is an opt-in
contact_integration="convex_feature_partition" for frictionless scalar-penalty
contact against an already certified closed-convex tool. It supports affine
CG1 tetrahedral slave triangles with the default reference-area rule and one
MPI rank. At each current trial the tool's distinct support-plane gaps are
evaluated at the three slave vertices. Each positive-area dominant plane
receives a polygonal active subcell and positive degree-two quadrature; the
sum of those areas is checked against an independently clipped convex active
region. A face with more than four positive-area dominant planes rejects
instead of guessing a subset. Each pair of active planes switching across a
compressed dominant line contributes the affine feature term to the same
contact Newton matrix. An independent symmetric convex-corner fixture checks
exact potential and total force as well as five directional tangent differences
with three positive-area dominant planes. A four-feature rectangular window
additionally matches exact energy and real FEniCSx tangent differences; a
five-feature prism rejects instead of selecting an arbitrary subset. Five
perturbed corner states also
pass directional tangent differences. A real DOLFINx tetrahedral boundary
Operator with three crossing features passes the assembled contact tangent
difference; the manufactured geometry offsets its switches from the slave
facet boundary, where the two-sided tangent is intentionally undefined.
The same three-feature local patch preserves penalty energy and rotates its
nodal force under prescribed rigid-body translation and rotation. All six
slave-triangle vertex orderings give the same energy and permuted nodal forces.
An ordinary finite-J2 Step with that moving three-feature corner accepts two
increments; a saved first-increment checkpoint resumes to the same final
displacement and tool work as an uninterrupted run. Its assembled total
material-plus-contact Newton matrix matches a fixed-old-state directional
residual difference, and its moving-tool force--moment action matches a
finite difference of the contact potential. An injected contact-trial failure
leaves the previously accepted displacement, material State and tool work
unchanged before retry.
Four positive-area dominant planes still reject.
A boundary-aligned undefined
two-sided switch also rejects. The default Gauss route is unchanged.
An axis-aligned convex box with a narrow interior slab gives the independent two-plane oracle's potential, nodal force and full tangent. A real DOLFINx boundary Operator catches a strip missed by whole-face Gauss and its directional tangent matches the moving trial residual. A two-increment ordinary finite-J2 Step has an active feature line; its full material-plus- contact PETSc matrix matches a fixed-old-state residual difference. The same option composes with the serial affine-periodic J2 route: the full material-plus-contact residual is reduced by the existing MPC and its total reduced Jacobian passes a fixed-old-state directional difference. Prescribed rotation, force--moment work derivative, and interrupted serial checkpoint match their continuous controls. The fixed tool's distinct support planes are prepared once per Operator, while the current trial partition and projection are recomputed; a disagreement between their selected active features rejects the trial. The chosen integration enters checkpoint identity and exported point IDs are accepted-snapshot-local. These are bounded software/numerical tests: they do not establish general convex-tool multi-feature coverage, nonconvex L-prism accuracy, spatial/penalty convergence, sharp-edge friction or Abaqus parity.
Methodological context: Farah, Popp & Wall (2015),
doi:10.1007/s00466-014-1093-2, compares segment- and element-based mortar
integration; Duong, De Lorenzis & Sauer (2017), arXiv:1712.01179, discusses
refined boundary quadrature for more general contact. Neither paper validates
the present implementation, whose scope is narrower and independently tested.
The committed ede47723 two-feature source candidate passed 212 targeted real-FEniCSx
serial regressions, strict documentation build and targeted Ruff checks. Its
native Apple Silicon wheel has SHA-256
be5871036ca1b23cf0942ecdc79244d8bd8071554b107448dcf06225c7f16bbb;
the matching source archive has SHA-256
7d1789b88549ecb7924b8af1b1739c19a5c23043b21ef1ba99c3db8a1bf7a197.
An isolated python -I import resolved to the installed wheel, its native
Hex/body modules imported, the new example completed two increments with two
active feature lines and emitted XDMF, quadrature payloads, contact samples
and a result manifest. All 13 new-path tests also passed from the isolated
wheel, without source-path injection. The existing non-MPI release_gate.py
installed-wheel smoke passed with all four project templates; its report is
/private/tmp/agentfem-feature-release-smoke-ede47723.json on this host.
These are package and local workflow checks, not Linux/Windows evidence,
external solver parity, a converged sharp-feature solution or permission to
promote this experiment as a stable release.
The subsequent three-feature extension passed 183 focused real-FEniCSx serial
tests spanning the contact Operator, finite-J2 Step, periodic MPC, work and
existing contact modes, along with targeted Ruff and a strict docs build.
The later clean numerical source 8a38b79c passed 101 related real-FEniCSx
tests, targeted Ruff and a strict docs build. Its native Apple Silicon wheel
has SHA-256 24db75ef48d7dbef04a6ae7a5e3d26f712def9bd0c79e36ed08515906088acaf;
the matching source archive has SHA-256
1b375c32ca8323a84795cfa6f3add6afa0e6d7df38e99beb76d7b02c829f135e.
From the clean Git checkout, the release gate (--dist, --smoke,
--mpi-ranks 2, --require-platform macos) passed for that exact wheel:
installed-wheel identity,
all four ordinary project templates and a two-rank generic elasticity MPI
smoke. The installed-wheel import was independently resolved to scratch
site-packages, not checkout src; the convex-feature finite-J2 example
accepted two increments with two feature lines, and the L-prism example
accepted two increments with opt-in GMRES/GAMG. The first attempt to run the
platform gate from a Git-less source archive reported source_commit=null and
failed the provenance requirement even though its numerical smoke passed;
rerunning from clean commit 8a38b79c resolved that test-setup error. Neither
package check establishes sharp-feature convergence, distributed implicit
contact, cross-platform acceptance or independent Abaqus parity.