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#
coupling—input·Scalar· requiredThe 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_force—input·Scalar· requiredThe 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#
rate—output·Scalar· requiredThe predicted rate, laid out like
trial_driving_force
Other options#
rate_law—str· requiredExplicit 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_input—str· requiredWhich of
rate_law’s inputs is the driving force.sweeps—int· default16Gauss-Seidel sweeps. Measured: 16 suffices; more does not help once the coupling linearization dominates the error.
bisections—int· default16Bisections 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.
polish—int· default3Newton steps after bisection, using the rate law’s own tangent. Three recovers full relative accuracy from a coarse bracket.