CoordinateDescentPredictor#

Source: models/common/CoordinateDescentPredictor.py

Coordinate descent on \(\varphi(\dot{\gamma}) + A\dot{\gamma} = b\) as a warm start.

Gauss-Seidel over the components, each coordinate solved by bisection in the driving-force variable. See the module docstring for the structure and why coordinate descent suits it.

Both \(A\) and \(b\) are plain Scalar\ s carried on sub-batch axes – \(b\) over (m,) and \(A\) over (m, m). A matrix of scalars is exactly what the sub-batch machinery already represents, so this needs no dynamic-base tensor at the model boundary.

A system with a single coordinate is written without the sub-batch axes, as plain scalars. Viscoplasticity is that case: the update condenses onto one flow rate, so \(m = 1\) and the sweep is a single exact scalar solve. The two layouts are told apart by sub-batch rank and a mismatched pair is rejected.

Inputs#

couplinginput · Scalar · required

The coupling matrix \(A\), sub-batched over (m, m), symmetric positive semi-definite – or a plain scalar for a one-coordinate system. Its diagonal must be non-negative – that is what brackets each coordinate solve.

trial_driving_forceinput · Scalar · required

The right-hand side \(b\), sub-batched over (m,) – or a plain scalar for a one-coordinate system: the driving force that would act with every rate at zero (for crystal plasticity, the trial resolved shear; for viscoplasticity, the trial yield function).

Outputs#

rateoutput · Scalar · required

The predicted rate, laid out like trial_driving_force

Other options#

rate_lawstr · required

Explicit rate law, driving force in and rate out – the inverse of the separable nonlinearity. Its driving-force input is named by driving_force_input; every other input is forwarded unchanged.

driving_force_inputstr · required

Which of rate_law’s inputs is the driving force.

sweepsint · default 16

Gauss-Seidel sweeps. Measured: 16 suffices; more does not help once the coupling linearization dominates the error.

bisectionsint · default 16

Bisections of the bracket in each coordinate solve, before the Newton polish. What matters is the width of the bracket \([0, b]\) relative to the root, which is physics-dependent: for crystal plasticity the answer is unchanged from 6 upward and broken at 4, but viscoplasticity at a large time step brackets a root near \(0.09\) inside \([0, 90]\), and 8 halvings leave the iterate several times the root – more than the Newton polish recovers. Measured there, 8 takes the first step from 0 Newton iterations to 3 while 16 holds it at 0, so the default stays at 16. Each bisection costs one evaluation of the rate law, which is scalar arithmetic.

polishint · default 3

Newton steps after bisection, using the rate law’s own tangent. Three recovers full relative accuracy from a coarse bracket.