Uh oh!
There was an error while loading. Please reload this page.
skills: adapt engines, band pinning, FMG on adapt children — brought current; plasticity-solvers rewritten (#454) - #489
Merged
Conversation
adapt-on-top-faults - engines section: nvb vs edge_split, both parallel in 2-D and 3-D and bit-confluent; edge_split has no conforming closure so refinement cannot escape the marked region, and marks on the DIAMETER (the volume proxy reported the target met while the mesh was 3.2x coarser across the feature). - repair=True: gates on reducing the largest angle, NOT on Delaunay. Delaunay maximises the minimum angle while P1 depends on the maximum, and flipping a gmsh mesh toward Delaunay raised the 99th-percentile max angle. Worth it on a poor base (156 -> 115 degrees, slivers 3.84% -> 0.00%), marginal on a clean one, and it gives up bit-confluence, so it is opt-in. - relax on a mesh refined onto an interface makes things WORSE (+77% leak); pin_bands is the fix. - new section on sizing the band and representing the fault margin: the -2 Cov(eta, edot) leak metric, why a within-cell marking rule loses to the plain distance size field, why the optimal band width depends on which objective you pick, and what a step-edged margin buys and costs. - gotchas: Mesh(dm) takes the DM over (bare SIGSEGV if you keep using the old handle); Mesh(dm) without boundaries= loses the boundary enum; evaluate() "Total components 8 != 6" on a variable-heavy mesh. adaptive-meshing - PIN THE INTERFACE section for relax(pin_bands=...), including the signed-vs-unsigned distance rule and the pinned_labels merge trap. - cross-reference to nonlinear-solver for the FMG setup. nonlinear-solver - new section: FMG on an adapt-on-top child. The child carries its own graded custom-P tail and solvers pick it up automatically; the base must have refinement>=1; a base-only tail triples the V-cycle count; V-cycle counts are insensitive to element quality (a pass, not a failed measurement) so use GAMG as the quality probe; relax can trip #424 into the dense RBF fallback; repair invalidates the any-degree transfer but not the vertex prolongation. - cross-references to adapt-on-top-faults and adaptive-meshing. Underworld development team with AI support from Claude Code
lmoresi
commented
Aug 2, 2026
MemberAuthor
Adversarial reviewEvery command/API/flag the skills teach exists in #488's diff or on development — Two doc-level overclaims, both tied to #488 defects:
Merge strictly after #488 (else the skills document nonexistent features). Holding with it. |
adapt-on-top-faults: the rotated free-slip path now picks up an adapt child's mesh-owned MG tail automatically (custom_mg.build_transfers, the #467 fix) — the "FUNDAMENTAL, not a quick fix" gotcha row was describing a bug that is gone. Point the band-sizing section at the interface-alignment primitives that now exist (place_sheet / place_thin_volume / remove_embedded, #517-#526). nonlinear-solver: three stale claims corrected — rotated free-slip is no longer the exception to the automatic tail pickup (#467); the adapt tail is one MG level per DOUBLING of h, not per refinement generation (mg_coarsening_ratio=2.0, #515); refinement=0 still yields a hierarchy that starts at the base, so "no coarse grid" overstated it. Three capabilities that landed since the branch: preconditioner="gamg" is respected on adapt children (#530), single-field FMG (#478/#534), and solver.pc_fallbacks as the observability hook (#534). The supersession note no longer names the removed in-SNES ramp API. Underworld development team with AI support from Claude Code
…asured Fixes#454. The skill taught the retired yield-homotopy doctrine in ~8 places, headlined by an enable method that no longer exists in src/ and an in-SNES delta-ramp that is separately proven to diverge. The doctrine rested on a unit-scaling error: re-measured on the corrected problem, the delta-march never succeeded where a direct hard-Min solve failed, and the ruling was to regularise the problem, not the solver. Rewritten around the evidence: Newton with the automatic Picard entry (Picard is an entry requirement, not an accelerator), rescue on failure OR stagnation, grid sequencing as the validated warm start, the per-model tangent table, and the #475 yield_mode / yield_smoother / yield_anchor substrate presented as a modelling choice with the multi-solve-only discipline for any delta march. yield_continuation is described honestly per open issue #473 (the cold-start guarantee does not hold on a Piecewise yield stress; the step control is effectively one-shot). Floors updated to the post-#475 semantics (viscosity_min_rounding). Kept: the Newton-confirmation check, the VEP-indefinite ruling, the SNESFAS ruling, the Picard-folklore footnote. Underworld development team with AI support from Claude Code
The recipe's step 2 still presented solve(homotopy=True) as the default
entry point ("one call - automatic"), which is the retracted doctrine in
its post-API form: the evidence that recommended a delta-march first
rested on a unit-scaling error, and the driver's cold-start guarantee is
broken (issue #473). The step now escalates honestly - grid sequencing
first, the delta-continuation as rescue of last resort with the #473
caveat stated - and the Layer-2 status note carries the same demotion.
The delta-discipline itself (constant per solve, never in-SNES) is
unchanged; plasticity-solvers holds the ruling and evidence.
Underworld development team with AI support from Claude CodeUh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR #489 body draft (updated for the combined skills tidy)
Title suggestion: skills: parallel adapt engines, band pinning, FMG on adapt children — brought current, plus the #454 plasticity-solvers rewrite
Fixes#454.
What this PR now carries
Two layers on the same branch, so one PR lands a consistent skill set:
1. The original three-file content (unchanged in substance)
(
relax(pin_bands=...),label_interface_band, the +77 % / 1343→965straddling-cell measurements). Verified accurate against current development,
merged as-is — Adapt-review fixes: collective pinned-band verdicts, partition-independent pinning, explicit-GAMG opt-out, the #492 CI disarm #530's collective/partition-independent pinning only made it
more true.
nvbvsedge_split,repair=),band pinning, and band sizing (leak = −2 Cov(η, ε̇)).
the mesh-owned custom-P tail, the 3D: shape relaxation can break the custom-P FMG build (zero-column transfer) — silent GAMG fallback #424 rbf cliff, repair vs the any-degree
transfer).
2. Currency fixes (development moved since the branch)
Each correction, with its one-line rationale:
FMG under rotated free-slip is "FUNDAMENTAL, not a quick fix"; Rotated free-slip silently ignores a mesh-owned custom-FMG hierarchy (adapt children fall back to GAMG) #467 fixed it —
the rotated path now resolves hierarchies through the same
custom_mg.build_transfersrule and picks up an adapt child's tailautomatically (
rotated_bc._build_rotated_custom_Pl). The plain-refined-meshcase still needs
set_custom_fmg, and the skill now says exactly that.named "align the interface with element boundaries" as an exact fix with no way
to do it;
place_sheet/place_thin_volume/remove_embedded(
utilities/place_surface.py, place_sheet: the 3-D placed surface (serial), with a gated gmsh cavity fill #517–Outcropping zones: the fault zone leaves its band on the surface #526) now exist, so it points at them.under rotated free-slip" was actively steering users away from a path that now
works (Rotated free-slip silently ignores a mesh-owned custom-FMG hierarchy (adapt children fall back to GAMG) #467); corrected.
_adapt_nestedsubsample the tail (mg_coarsening_ratio=2.0default;per-pass levels measured 2.3–7.3× slower). The "don't hand it a base-only
tail" advice stands.
refinement>=1overstatement: withrefinement=0the tail is
[base] + intermediate doubling levels, so the hierarchy starts atthe base — deeper uniform tails help, but "no coarse grid" was not true.
preconditioner="gamg"is respected on adapt children (Adapt-review fixes: collective pinned-band verdicts, partition-independent pinning, explicit-GAMG opt-out, the #492 CI disarm #530 — previouslysilently clobbered, so the skill's own GAMG-probe advice was unfollowable);
single-field
preconditioner="fmg"overmesh.dm_hierarchy(Geometric multigrid is unreachable for every single-field solver, even when explicitly requested (the #276 lockout) #478/Solver options: fallback observability, tolerance ownership, the single-field FMG unlock, and multiplier_schur_pc verified (#478 #483 #484 #486) #534); andsolver.pc_fallbacksas the observability hook for every degradation,including the 3D: shape relaxation can break the custom-P FMG build (zero-column transfer) — silent GAMG fallback #424 barycentric→rbf retry (Solver options: fallback observability, tolerance ownership, the single-field FMG unlock, and multiplier_schur_pc verified (#478 #483 #484 #486) #534).
3. The #454 rewrite of plasticity-solvers
The skill headlined
cm.enable_yield_homotopy()— an API that does not exist insrc/— and taught the in-SNES δ-ramp doctrine in ~8 places. Per the issue'srescope: the doctrine rested on a unit-scaling error, and the corrected-scaling
evidence runs against it (the δ-march never succeeded where a direct hard-Min
solve failed; direct is 4–5× faster where both work; ruling — regularise the
problem, not the solver).
Rewritten around what the campaigns measured:
start takes one Picard step automatically; Picard is an entry requirement, not
an accelerator (front-loading it measured pure waste where Newton works).
picard=N/consistent_jacobian="continuation"— admissible uselessness never trips aFAIL reason, so failure-only rescue is not enough.
→ linear-exact RBF transfer → fine; hand-rolled, since
-snes_grid_sequencedoes not work on UW3 meshes).
yield_mode/yield_smoother/yield_anchor, δ asa recompile-free constant) presented as a modelling choice, with the
multi-solve-only discipline for any δ-march (never ramp inside one SNES solve).
yield_continuationdescribed honestly per open yield_continuation: the documented cold-start guarantee does not hold, and the step control is effectively one-shot #473: the documentedcold-start guarantee does not hold on a
Piecewiseyield stress, and the stepcontrol is effectively one-shot. The latched
snes_max_itwart (yield_anchor follow-ups from the #475 review: snes_max_it latch resurrect, side-attribution docstring, small validation gaps #490) is nottaught as a feature.
viscosity_min_roundingkeepsshear_viscosity_mindifferentiable at δ = 0, where the default rounding vanishes.
confirm-you-are-running-Newton check, the SNESFAS ruling, the Picard-folklore
footnote.
Sanity:
enable_yield_homotopy— zero matches across all skill files;Null_Boundary— zero matches.Underworld development team with AI support from Claude Code