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\):

\[ T_n = K_n \left( [\![u]\!]_n - [\![u]\!]_n^v \right), \qquad T_t = K_t \left( [\![u]\!]_t - [\![u]\!]_t^v \right), \]

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

\[ T_n = K_p \min\left([\![u]\!]_n, 0\right), \qquad T_t = 0, \]

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 · required

Signed normal jump across the interface

tangential_jump — input · Scalar · required

Signed tangential (sliding) jump

viscous_normal_opening — input · Scalar · required

Viscous part of the normal jump, i.e. the smeared cavity volume

viscous_sliding — input · Scalar · required

Viscous part of the sliding jump

cavity_fraction — input · Scalar · required

Separation 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 · required

Normal traction

shear_traction — output · Scalar · required

Shear traction

Parameters#

normal_stiffness — parameter · Scalar · required

Normal spring stiffness K_n

shear_stiffness — parameter · Scalar · required

Shear spring stiffness K_t

penalty_stiffness — parameter · Scalar · required

Compressive contact penalty stiffness K_p

failure_fraction — parameter · Scalar · required

Physical area fraction at final separation