Fault healing when the slip rate goes to zero with slip weakening friction?

Dear Pylith developers,

I’m modeling dynamic rupture propagation in a 2D elastic block along a planar 1D fault. I overstress the block and observe the rupture propagating from the middle weaker section of the fault along the two stronger side section.
I’m using slip-weakening, rate and state and some custom friction models with spatially varying parameters: e.g. with slip weakening both fric coefficients = 0.6 for the middle section and mu_s = 0.65, mu_d = 0.6 for the side sections.

I think I’m facing an issue with the built in slip weakening model. It looks like the fault heals back to its original strength once my slip rate drops to zero. I have friction.force_healing = False
I originally thought it’s a mesh resolution issue, but the effect gets even worse with refining the mesh.
Please attached see the plot of shear stress, slip rate and slip along the fault.


Both simulations are the same, right side - twice finer mesh. Both are the same time in the simulation. It’s the first time step where the coarser fault seemed to heal, while the finer fault has been healing for multiple time steps by now (asymmetrical, non-elliptical slip, larger shear stress in places, where it should be weak).

Please let me know what you think.
Thanks!

I think this bit of the SlipWeakening.cc subroutine answers my question…

const PylithScalar tolerance = 1.0e-12;
if (slipRate > tolerance && !_forceHealing) {
const PylithScalar slipPrev = stateVars[s_slipPrev];

stateVars[s_slipPrev] = slip;
stateVars[s_slipCum] += fabs(slip - slipPrev);

} else {
// Sliding has stopped, so reset state variables.
stateVars[s_slipPrev] = slip;
stateVars[s_slipCum] = 0.0;

Do I understand it correctly that once the slip rate is below 1e-12 we’ll heal regardless of the value of _forceHealing flag?

Thanks!

The code at SlipWeakening.cc Line 360:

  const PylithScalar tolerance = 1.0e-12;
  if (slipRate > tolerance && !_forceHealing) {
    const PylithScalar slipPrev = stateVars[s_slipPrev];

    stateVars[s_slipPrev] = slip;
    stateVars[s_slipCum] += fabs(slip - slipPrev);
  } else {
    // Sliding has stopped, so reset state variables.
    stateVars[s_slipPrev] = slip;
    stateVars[s_slipCum] = 0.0;
  } // else

says that if the slip rate is above the threshold and not force healing, then keep accumulating slip in the slip distance state variable. For healing to take place (reset the cumulative slip to zero), the slip rate must be less than the tolerance or force healing is true. So, yes when the slip rate falls below the tolerance shown, healing takes place. The force healing flag is intended for use in quasi-static models when the time steps are large and an earthquake (slip) occurs in a single time step.

If you do not want healing to take place when the slip rate drops below the tolerance (fault stays in the ‘weak’ state forever), then you can implement your own version of the model and adjust the logic. See the templates directory for an example of how to extend PyLith by adding your own friction model.