Skip to content

Teaching examples on the ribbon representation: crossing fault zones, and gouge width - #583

Open
lmoresi wants to merge 4 commits into
developmentfrom
docs/ribbon-teaching-2d
Open

Teaching examples on the ribbon representation: crossing fault zones, and gouge width#583
lmoresi wants to merge 4 commits into
developmentfrom
docs/ribbon-teaching-2d

Conversation

@lmoresi

@lmoresi lmoresi commented Aug 16, 2026

Copy link
Copy Markdown
Member

Two pages in docs/advanced/, built on the finite-width (ribbon) fault representation. Each tests a prediction rather than illustrating one. Scripts and full working notes live in ~/+Simulations/ribbon_network_2d/.

crossing-fault-zones.md — the measurement #544 asked for

The algebra comes first, and it reframes the question. In plane strain the deviatoric strain-rate space is two-dimensional, and rotating the material by θ rotates a state in it by 2θ. A weak plane is compliant in exactly one mode, so it occupies a single line in that space; two planes separated by Δ in the rock are separated by 2Δ there.

So Δ = 0 and Δ = 90 are the same case — shear on a plane with normal x̂ is shear on a plane with normal ŷ. The 90-degree X that "high angle" suggests is the one geometry where the two rules provably coincide, and the acceptance test as #544 proposed it would have measured nothing.

Checked numerically against the shipped Mühlhaus–Moresi tensor. Two by-products: #539's eta -> 1/(4 eta) substitution is confirmed to round-off, and the orthotropic tensor is itself a TI tensor in 2-D, so it needs no new constitutive machinery — read off an effective director and effective η₀, η₁.

The measurement. Two ribbons crossing at the box centre, fused into one zone, five rheologies per angle on one mesh, differing only in the overlap cells, against a no-fault control on that same mesh. Metric is dissipation weakening, which has no probe geometry in it.

Δ 10° 20° 30° 45° 60° 75° 90°
nearest / orthotropic 70.0% 81.6% 86.2% 93.0% 97.1% 99.2% 100.0%

The Δ = 90 row is the experiment's negative control and it passes exactly — the two dissipations agree to seven significant figures. The algebra requires it, nothing was tuned to produce it, and it is what licenses the other six rows.

The error is largest where the issue expected none. The per-cell tensors differ most at 45°, and the curve shows no feature there. The overlap area goes as 1/sin Δ — 141 overlap cells at 10° against 24 at 90° — so the area wins. The geometry to worry about is the shallow crossing.

Resolution. The host mesh does not enter at all: 0.04, 0.03 and 0.02 give the same ratio to four significant figures, because the embedded zone mesh is identical in all three. The zone mesh does, and refining it always moves the nearest-fault rule closer to the orthotropic one — 70.0 → 73.8 → 75.1% at Δ = 10, converging near 76%. The sweep table is therefore a set of bounds, and the corrected headline is that the rule loses about a quarter of the network's weakening at the worst angle, not a third.

gouge-zones.md — what the matched collapse loses

The collapse eta_I = eta_1 / w is checked rather than assumed: it reproduces slip to 1.7% at w = 0.002 and 12% at w = 0.02, behaving as the w → 0 limit it is.

It preserves the ratio η₁/w and destroys the pair. So the gouge's own temperature excess,

Delta T = eta_1 V^2 / (8 kappa) = (eta_I V^2 / 8 kappa) * w

is proportional to the width at fixed interface law and is zero for a contact at every width. Matched to 1% at three widths with nothing fitted — η₁ and κ are set, V and ΔT are measured independently.

Separately and more sharply: a transport equation posed on a split-node mesh sees a perfect insulator. Plain conduction, uniform diffusivity, no fault properties anywhere, no mechanics — the split mesh loses 19% of the wall flux and develops a temperature discontinuity of 0.47 across the fault. The plain-mesh control reproduces the analytic flux exactly (−0.010000), so that is the mesh and not the solver.

Things recorded so they are not re-derived

  • clearance is not monotone: a 30° crossing builds only at 1.3, a 45° one at 1.0 but not 1.3. Walk a ladder and record which value was used.
  • A fixed probe standoff is wrong at a shallow crossing — a probe at 0.75 w from one trace sits inside the other ribbon and read 0.006 against a peak of 0.18. Even walked clear of the union, the local probe cannot be trusted at the crossing itself, which is why the metric is a dissipation.
  • The rotated contact path builds its own prefixed KSP that stokes.petsc_options never reaches; on its default the velocity sub-solve hit its 200-iteration cap and warned while the outer SNES still reported convergence. Use _rotated_use_lu at this size, and take the verdict from the constraint (the no-opening leak, 5.5e-17 here) rather than from a SNES reason that does not describe that solver.
  • Do not take a dissipation profile through uw.function.evaluate — it L2-projects derivative composites (uw.function.evaluate returns negative values for a squared DERIVATIVE expression #491) and the smoothing lands on the structure being measured. Project to discontinuous degree 0, where the L2 projection is the cell average.

Not included

Example 3 of the session plan (a large-scale single surface, where the contact should win outright) is blocked on #553 — the contact cannot daylight, and daylighting is the use case.

Underworld development team with AI support from Claude Code

…h is for

Two pages built on the finite-width (ribbon) representation, each testing
a prediction rather than illustrating one.

crossing-fault-zones.md answers the open question in #544: where two
fused zones overlap, does the nearest-fault director reproduce an
orthotropic treatment?

The algebra comes first and reframes the question. In plane strain the
deviatoric strain-rate space is two-dimensional and a rotation by theta
rotates a state in it by 2 theta, so a weak plane occupies one LINE in
that space and two planes separated by Delta in the rock are separated by
2 Delta there. Delta = 0 and Delta = 90 are therefore the same case, and
the 90-degree X that "high angle" suggests is the one geometry where the
rules provably coincide. Checked against the shipped Muehlhaus-Moresi
tensor, which also confirms the eta -> 1/(4 eta) substitution of #539 and
shows the orthotropic tensor is itself a TI tensor in 2-D, so it needs no
new constitutive machinery.

Measured on one mesh per angle, with the rules differing ONLY in the
overlap cells and referenced to a no-fault control: the nearest-fault
rule recovers 70% of the network's weakening at a 10-degree crossing,
rising monotonically to exactly 100% at 90 degrees, where the two
dissipations agree to seven significant figures. That null is required by
the algebra and nothing was tuned to produce it.

The error is largest where the issue expected none. The per-cell tensors
differ most at 45 degrees, but the overlap AREA goes as 1/sin(Delta) and
the area wins, so the case to worry about is the shallow crossing.

gouge-zones.md takes the matched collapse eta_I = eta_1 / w and measures
what it loses. It reproduces slip to 1.7% at w = 0.002 and 12% at
w = 0.02, behaving as the w -> 0 limit it is. It preserves the ratio
eta_1 / w and destroys the pair, so the gouge's own temperature excess,
eta_1 V^2 / 8 kappa, is unrecoverable from a contact - matched to 1% at
three widths with nothing fitted. Separately, a transport equation posed
on a split-node mesh sees a perfect insulator: plain conduction with
uniform diffusivity and no fault properties anywhere loses 19% of the
flux and develops a temperature discontinuity of 0.47.

Both pages record their resolution controls. The host mesh does not enter
the crossing result at all (three host sizes give the same ratio to four
figures); the zone mesh does, and refining it moves the nearest-fault
rule closer to the orthotropic one, so the quoted percentages are bounds
rather than estimates.

Scripts and full working notes: ~/+Simulations/ribbon_network_2d/

Underworld development team with AI support from Claude Code
…ere is where they converge

The overlap is a few tens of cells at a zone mesh of w/4, so the sweep
table needed a refinement study before its numbers could be read as
measurements. Halving the zone mesh twice at the two angles that carry
the argument:

  Delta = 10:  70.0 -> 73.8 -> 75.1%   (overlap 141 -> 522 -> 2051 cells)
  Delta = 45:  88.2 -> 93.0 -> 94.5%

The increments contract about threefold in both cases, extrapolating to
roughly 76% and 95%. Refinement always moves the nearest-fault rule
CLOSER to the orthotropic one, so the sweep overstates the error
everywhere.

Corrected headline: the rule loses about a quarter of the network's
weakening at the worst crossing angle, not a third. The structure of the
result is unchanged - monotone in the crossing angle, exactly zero at 90
degrees, and largest at shallow crossings rather than high-angle ones.

The host mesh does not enter the answer at all: 0.04, 0.03 and 0.02 give
the same ratio to four significant figures because the embedded zone mesh
is identical in all three. That is the embedding contract holding, and it
is worth having as a measurement.

Underworld development team with AI support from Claude Code
Copilot AI lite review requested due to automatic review settings August 16, 2026 09:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…e is no external reference

Three additions from reviewing the diff wide.

The 90-degree null is a property of the two-dimensional deviatoric space
and nothing on the page said so. In 3-D that space has five dimensions,
two weak planes at any angle occupy different subspaces, and there is no
null at all. A reader carrying "a 90-degree crossing is safe" into a 3-D
model would be wrong, so the page now refuses that reading explicitly.

There is no external reference solution for what an overlap should be,
and there cannot be one without modelling the fabric. Both orthotropic
constructions are assumptions, so the measurement is a distance to a
choice rather than to a truth. What makes it readable is that the two
choices differ by a factor of two in overlap weakness and still bracket
the answer tightly, which is now stated where the constructions are
introduced rather than left for the reader to infer from the tables.

At a shallow crossing the whole signal is a difference of about 0.03
between dissipations that agree to 1%. That is now said next to the
metric, along with what makes it readable - the exact analytic control
and the refinement study.

Underworld development team with AI support from Claude Code
@lmoresi

lmoresi commented Aug 16, 2026

Copy link
Copy Markdown
Member Author

Adversarial review

Reviewed wide — the diff, the two sweeps behind it, #544, #539, #553, and the split-node and fault-network pages this one links to. Findings first, then what we could not fault.

Fixed in 519743e

The central algebraic result is two-dimensional and the page did not say so. The 90-degree null exists because the deviatoric space here has two dimensions, so two lines in it either coincide or do not. In 3-D that space has five dimensions, two weak planes at any angle occupy different subspaces, and there is no null. A reader taking "a 90-degree crossing is safe" into a 3-D model would be wrong, and the page as written invited exactly that. It now refuses the reading explicitly.

We measured a distance to a choice and reported it as a distance to an answer. There is no external reference for what an overlap should be, and there cannot be one without modelling the fabric — both orthotropic constructions are assumptions. The page said "neither is obviously right" in passing and then quoted percentages as if one were. What actually carries the argument is that the two constructions differ by a factor of two in overlap weakness and still bracket the answer tightly (61.8% against 70.0% at the worst angle; 92.3% against 93.0% at 45 degrees), so the conclusion is insensitive to the assumed part. That inference was available in the tables and left for the reader to make; it is now stated.

The headline is a small difference of larger numbers. At Δ = 10 the dissipations are 3.9521 and 3.9225 against a control of 4.0000 — the entire signal is about 0.03 between numbers agreeing to 1%. Now said next to the metric, with what makes it readable: the control hits the analytic 4.000000 exactly, and the refinement study moves the ratio in a controlled, contracting sequence.

Standing limitations, not fixed

One point along the fault carries the gouge oracle. ΔT is measured at the fault midpoint only. The 1% agreement at three widths is strong, but nothing checks that it holds toward the tips where slip and therefore Φ fall away. The claim is about the peak, which is the quantity of interest, so this is scope rather than error — but it is untested scope.

The gouge oracle's input is a probe. ΔT = η₁V²/8κ takes V from a velocity-jump probe with the ribbon's standoff convention, and V enters squared. The 1% agreement is therefore also a check on that probe, not only on the physics. It cannot be disentangled from the data we have.

The sweep confounds crossing angle with fault orientation — unavoidable geometrically, since the pair is symmetric about the loading axes and two planes cannot change their mutual angle while both keep their orientation. Stated on the page; worth repeating that no absolute slip should be compared across angles.

What survived

  • The Δ = 90 null (3.243286 against 3.243286, seven significant figures) is required by the algebra, was predicted before it was run, and nothing in the setup was tuned toward it. It is the strongest thing here.
  • The host-mesh independence (three sizes, same ratio to four figures) is a genuine check on the embedding contract rather than a convenience.
  • The no-fault control landing on the analytic 4.000000 validates the dissipation integral independently.
  • On the gouge side, the plain-mesh conduction control reproducing −0.010000 exactly is what makes the split-mesh insulation result attributable to the mesh and not the solver. Without it the 19% flux deficit would be an assertion.

Related, unblocked by this PR

#544 has its measurement and a recommendation; it can close on a modelling decision rather than more work. #539 is confirmed incidentally — the eta -> 1/(4 eta) substitution reproduces the compliance to round-off, and the director round-trips exactly mod 90 degrees. #553 still gates the third teaching example; nothing here moves it.

Underworld development team with AI support from Claude Code

… model cannot do

The crossing-zones page measured overlap rheologies in pure extension
and found the differences modest. That test was too kind, and the page
now says so: the configuration is maximally symmetric about the load and
the drive carries no rotation. This commit adds the test that removes
both - a shear box (driven plates, open sides, spin in the kinematics)
holding an asymmetric Y: a sub-horizontal main fault at 20/30/40 degrees
with a horizontal branch fusing into it - and the verdict inverts.

Measured, all from the P0 cell strain rate, isotropic bands as the
reference:

- The junction is a slip exchanger. The reference's main-fault slip at
  the junction RISES as the fault becomes misoriented: the well-oriented
  branch hands its offset into the main, the isotropic corner rotating
  the deformation. The TI variants collapse against it - 77% / 46% / 19%
  of the reference at theta = 20/30/40 - and the three overlap rules are
  indistinguishable from one another throughout. The overlap tensor was
  never the dominant term; the arms' constraint is. Mechanism: a slip
  gradient along a fault is a volumetric exchange, which is exactly the
  mode the crack constraint removes.

- The peak is an exit throat with a law. It sits at r = 2.1 w up the
  main arm - self-similar across a fourfold width sweep - where the
  fused Y narrows back to one band, and its intensity is
  gamma = (s_main + s_branch) / w to 10% with nothing fitted. As w -> 0
  the throat slides onto the corner and diverges: a branch point is a
  corner singularity of the continuum problem and the band width is its
  regularisation length. Junction width is a process-zone size, not a
  numerical parameter.

- The country rock feels the difference as a pattern, not a magnitude.
  Matrix stress means agree to 2-4% across all cases; the locked TI
  junctions park a wall-rock stress concentration at the elbow that the
  reference does not have, and trade it for tip lobes as the junction is
  freed. Ranking by peak stress alone orders the models backwards.

- Offered plasticity, the crack model builds a bypass. A threshold
  damage law nucleates at the TI junction's stress blob and marches a
  front along the shear plane, re-routing the network around the
  misoriented fault. The negative control (same law on the reference)
  grows faults at their free tips only - the physical pattern - with the
  junction silent. Both models grow tips; only the constrained model
  manufactures growth at junctions.

The page closes with the frame that organises the whole comparison: the
split surface and the TI band are crack models (hard and soft forms of
the same kinematic constraint) and the isotropic band is not, so crack
assumptions fight each other at branches. Choosing rules follow:
surfaces for large-scale networks of distinct well-oriented segments;
ribbons with TI where a zone should stay crack-like and isotropic where
it must evolve internally; joins made kinematically compatible - bent in
to meet tangentially, with damage zones sized as process zones - rather
than patched after the fact.

Scripts and caches: ~/+Simulations/ribbon_network_2d/ (branch_study.py,
branch_width.py, branch_damage.py).

Underworld development team with AI support from Claude Code
@lmoresi

lmoresi commented Aug 17, 2026

Copy link
Copy Markdown
Member Author

The scope of this PR grew with the live sessions it documents; a summary of what it now contains, in reading order:

  1. crossing-fault-zones.md — overlap rheologies for fused zones in pure extension: the 2-D deviatoric algebra (90° crossings are degenerate; the discriminating angle is 45°), the measured sweep with its exact Δ=90° null, the resolution study making every quoted percentage a bound, and a postscript stating plainly that this test's symmetric, rotation-free frame flattered the constrained models.
  2. gouge-zones.md — what the collapse to a surface preserves (slip, to its w→0 limit) and destroys (the interior: gouge ΔT = η₁V²/8κ matched to 1% with nothing fitted; a split-node mesh as a perfect insulator for any second equation).
  3. fault-branching-junctions.md (this commit) — the shear-box study that decides: the junction as a slip exchanger the crack constraint cannot run, the exit-throat law and the corner singularity it implies, the matrix-stress pattern flip, the damage experiment with negative control, and the choosing rules that follow from "two of these are crack models and one is not".

The instruments changed under review as defects were found and fixed: all strain-rate work is P0 cell projections (local, validated to 7e-16 on a linear field); τ-P1 recovery is retained only where it is sound (isotropic media, traction diagnostics) with its failure across director interfaces documented; band structure (union-jack vs ladder) is verified per build, never assumed from the size parameter.

Underworld development team with AI support from Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants