ShamNeedlemanTraction#
Source: models/solid_mechanics/traction_separation_law/ShamNeedlemanTraction.py
Tractions for the simplified Sham-Needleman cohesive model, assembled from linear springs placed in series with the cavitation and sliding dashpots.
Each jump splits additively, \([\![u]\!] = [\![u]\!]^e + [\![u]\!]^v\), and the spring acts on the elastic part only. Tension branch, \([\![u]\!]_n \ge 0\):
with \([\![u]\!]_n^v = NV - N_0V_0\) supplied by
CavityVolumeOpening. Compression,
\([\![u]\!]_n < 0\), switches to a contact penalty \(T_n = K_p [\![u]\!]_n\).
The springs must be in series. A parallel spring would carry load forever and the interface would never separate completely.
Once \(f \ge f_F\) the interface has separated and carries
so the compressive penalty survives separation while the tensile and shear load paths do not. Frictional sliding could replace \(T_t = 0\) if a model needed it.
Freezing the state after separation needs no extra machinery: every rate in this model is driven by \(T_n\) or \(T_t\), and on the separated branch the shear traction is zero while the normal traction is non-positive, so the sliding rate, the nucleation rate (through both of its factors) and the diffusive growth rate (through its Macaulay bracket) all vanish identically. \(f\), \(N\) and \([\![u]\!]_t^v\) therefore hold their values without being clamped.
… important::
cavity_fraction here is the separation indicator, and in an
implicit composition it must be wired to the old (converged) damage
state, not to the trial unknown::
[traction]
type = ShamNeedlemanTraction
cavity_fraction = 'cavity_fraction~1'
...
Reading the trial state instead puts a jump discontinuity in the backward-Euler residual exactly at \(f_F\). Below the threshold the residual is \(f - f_\text{old} - \Delta t \dot f\), which the accelerated softening drives sharply negative as \(f \to f_F^-\); at and above the threshold every rate is switched off and the residual is \(f - f_\text{old} > 0\). The residual therefore steps over zero without touching it and Newton has no root to find, so the first step that would separate the interface fails to converge rather than separating it.
Switching on the converged state removes the discontinuity: the whole
step is taken with intact rates, \(f\) is free to pass \(f_F\) (the
saturated \(f^*\) from
EffectiveCavityFraction keeps every
softening denominator bounded while it does), and the following step
sees \(f_\text{old} \ge f_F\) and freezes the state as described above.
The cost is that separation is resolved only to within one time step,
the usual first-order accuracy of an explicit switch; resolving the
event exactly would need sub-stepping in the time integrator, which is
not something a constitutive leaf can do.
Inputs#
normal_jump—input·Scalar· requiredSigned normal jump across the interface
tangential_jump—input·Scalar· requiredSigned tangential (sliding) jump
viscous_normal_opening—input·Scalar· requiredViscous part of the normal jump, i.e. the smeared cavity volume
viscous_sliding—input·Scalar· requiredViscous part of the sliding jump
cavity_fraction—input·Scalar· requiredSeparation indicator: the physical cavitated area fraction, tested against the failure fraction. Wire this to the old (converged) damage state in an implicit composition – see the class docstring
Outputs#
normal_traction—output·Scalar· requiredNormal traction
shear_traction—output·Scalar· requiredShear traction
Parameters#
normal_stiffness—parameter·Scalar· requiredNormal spring stiffness K_n
shear_stiffness—parameter·Scalar· requiredShear spring stiffness K_t
penalty_stiffness—parameter·Scalar· requiredCompressive contact penalty stiffness K_p
failure_fraction—parameter·Scalar· requiredPhysical area fraction at final separation