Skip to content

Dissipation driven history - #1768

Open
IvarStefansson wants to merge 3 commits into
composed-friction-partitionfrom
dissipation-driven-history
Open

Dissipation driven history#1768
IvarStefansson wants to merge 3 commits into
composed-friction-partitionfrom
dissipation-driven-history

Conversation

@IvarStefansson

Copy link
Copy Markdown
Contributor

Stacked on the composed friction PR — the base branch is composed-friction-partition,
not develop.

Completes the round-2 damage law. The history stops being Archard's load times distance
and becomes the frictional work per unit area, k = mu* sigma_n, with mu* read through
friction_coefficient so the driver cannot drift from the friction bound. A smooth
contact carrying a heavy load then wears more slowly than a rough one under the same load
and slip, which the load-based driver could not express.

mu* may depend on the damage state, so the current step's contribution to Lambda
depends on Lambda. This is implicit, not circular: mu* is non-increasing in the
history, so the residual is strictly decreasing in it and the root is unique.

Commits

MAINT: Store the damage history at all time steps — a prerequisite. The convolution
reaches step i via previous_timestep(i), which rewrites every variable in the
coefficient; once that contains mu* it contains the history, which therefore needs a
stored value at every index rather than the default window of one. Omitting it fails with
a KeyError on the third time step of a run; TestAllTimeStepStorage pins it without a
simulation. Results-neutral on twelve pinned configurations: bit-identical, all 80 arrays.

ENH: Dissipation-driven damage history — the driver, plus two consequences.

The example's wear energies are divided by 100, ratio preserved. Lambda shrinks by
exactly mu*, and Lambda_c is an energy per area, so the scale that produces order-one
softening moves with the driver's definition. Without it the damage state moves by 0.0027
per step against an assertion requiring 0.01.

The exact solution loses its damage machinery, 179 lines. It restated the softening,
the convolution and the driver in numpy, and the new driver would have required the stress
partition and composed friction too, plus a memoised forward recursion for the implicit
step. Not worth building: After multi-PR drift, nothing reads any exact_* damage field, normal_traction
returns zeros so the reference history is identically zero, and every formula it restated
is separately unit-tested against a closed form. EXACT_SOLUTION_METHOD_NAMES now
declares the one quantity that keeps a reference — the damage length, which follows from
the prescribed displacements alone. make_damagesavedata_class gained an optional
exact_names defaulting to all names, so downstream callers supplying their own
references are unaffected. collect_data also loses its hasattr fallback, the last silent-failure path
from the previous round.

Verification

The driver's linearity in traction survives,
because the fixture leaves the transitional traction at its infinite default and the
partition is inert — so rather than deleting that test, its precondition is now explicit
and a counterpart asserts the driver grows faster than the load when the partition is
active.

The floor on the damage history was a clip, whose Jacobian mask uses
strict inequalities, so a history sitting exactly on the floor counted as
clipped and contributed no derivative. Zero is the initial value of every
simulation and the standing value of every cell that has not yet slipped,
and the softening's derivative is largest there, so the damage channel was
absent from the Newton tangent until the first cell slipped -- with the
value correct throughout, so nothing else showed it.

Use maximum with the history as first argument, whose documented
tie-breaking takes the Jacobian from that argument where the two are equal.
A clip with an infinite upper bound was a maximum in any case, so compatible with intended previous behaviour. Also adds two tests.
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.

1 participant