geodynamics / pylith

PyLith is a finite element code for the solution of dynamic and quasi-static tectonic deformation problems.
Other
154 stars 98 forks source link

Reimplement fault constitutive models using new formulation #578

Open baagaard-usgs opened 1 year ago

baagaard-usgs commented 1 year ago

FaultCohesiveDyn

Friction ISA FaultRheology

Friction Models

TractionPerturbation [DONE]

Implements T_initial with same T(x,t) as boundary conditions

Issues

baagaard-usgs commented 1 year ago

plith::faults

FaultCohesiveDyn

setKernelsResidual()

FrictionStatic

pylith::fekernels

FaultFriction

Context

FrictionStatic

baagaard-usgs commented 1 year ago

We probably want to consider a zero tolerance (with a potentially separate tolerance for the fault normal direction) to detect "zero" slip and slip rate.

As in v2.x, these would be set in faults::FaultCohesiveDyn at the Python level and passed down to C++ with reasonable default values. These would be passed to the kernels in constants and set via _updateKernelConstants().

baagaard-usgs commented 1 year ago

@knepley The residual kernels for the contributions to the displacement field for the fault faces (which is the Lagrange multiplier) only get the solution for one side of the fault. For example, pylith::fekernels::FaultCohesiveKin::f0u_pos() gets passed in sOff with sOff[0] == 2. sOff is being set by PetscDSGetComponentOffsetsCohesive() which takes the side of the fault as an argument.

For fault friction we want to compute slip and slip rate, which are parameters to the friction model, to compute the traction term which gets combined with the Lagrange multiplier. I think we want to pass in the solution for both sides of the fault for all kernels involving the cohesive cell, even though the kernel "output" is only for one side in the case of the functions for the fault faces.

knepley commented 1 year ago

@baagaard-usgs Oh, that is right. We wanted to mimic a regular kernel. If we now want it to take all values, we can just pass 0 instead of s to the OffsetCohesive(), or even have a switch to indicate what kind of kernel input you want.

baagaard-usgs commented 1 year ago

We decided to change the PETSc code so that we always get all solution fields for both sides of the fault when integrating the fault faces or cohesive cells.

Matt has created a PETSc branch knepley/fix-cohesive-offsets that updates the solution field offsets so that we will get solution fields for both sides of the fault in the kernels involving cohesive cells (fault faces and cohesive cell). I am working on a PyLith branch update-fault-kernels-solution-offsets in my fork that updates the fault kernels accordingly. We hope to get these branches integrated into PETSc knepley/pylith and PyLIth main by the end of this week (Aug 4).