Arc-length solvers (structsolve.arc_length)#

Arc-length solvers for non-linear static analyses

The Riks and Crisfield methods share the implementation of _solver_arc_length(), and are selected with Analysis.NL_method = 'arc_length_riks' or Analysis.NL_method = 'arc_length_crisfield'. The module-level constants control the arc-length scaling and adaptation.

structsolve.arc_length._solver_arc_length(an, method, silent=False)#

Arc-length solver

The equilibrium path \(\{F_{int}(c)\} = \lambda \{F_{ext}\}\) is traced with the arc-length constraint

\[\frac{\{\Delta c\}^T\{\Delta c\}}{\{u_{ref}\}^T\{u_{ref}\}} + \psi^2 \Delta\lambda^2 = \Delta s^2\]

where \(\{\Delta c\}\) and \(\Delta\lambda\) are the increments of the current step and \(\{u_{ref}\}\) is the linear solution for \(\lambda=1\), which makes the arc length \(\Delta s\) independent of the units of the model. In the linear regime \(\Delta s \approx \sqrt{1 + \psi^2} \Delta\lambda\).

Each step starts from a tangent predictor, whose direction follows the previous increment, allowing limit points to be passed. At each iteration, the bordered system is solved with two solutions of the tangent stiffness matrix, \(\{\delta c_R\} = [K_T]^{-1}\{R\}\) and \(\{\delta c_q\} = [K_T]^{-1}\{F_{ext}\}\), and the correction of the load factor \(\delta\lambda\) comes from the constraint:

  • method='riks': the constraint is linearized at the current increment (updated normal plane), which is Newton-Raphson applied to the augmented system and gives quadratic convergence.

  • method='crisfield': the quadratic (spherical) constraint is solved exactly, choosing the root with the smallest angle to the current increment. When the roots are complex, the linearized constraint is used.

After each converged step, the arc length is multiplied by sqrt(DESIRED_NUM_ITER/num_iter), bounded by MIN_GROWTH_FACTOR and MAX_GROWTH_FACTOR and limited by an.maxInc, where num_iter is the number of corrections of the step. When a step fails, the arc length is multiplied by INC_CUT_FACTOR. The analysis stops when:

  • the load factor reaches 1.0, the step where it is exceeded is replaced by Newton-Raphson iterations at exactly \(\lambda = 1\)

  • the cumulative arc length reaches an.maxArcLength

  • the arc length becomes smaller than an.minInc

  • MAX_NUM_STEPS steps converged

When the load depends on the configuration, i.e. calc_fext accepts the keyword argument c, \(\{F_{ext}\}\) in \(\{\delta c_q\}\) and in the tangent predictor is the load vector of the current configuration calc_fext(inc=1., c=c), the derivative \(\partial R/\partial \lambda\) of the residual, whereas \(\{u_{ref}\}\) remains the linear solution of the reference vector. The callables that accept inc receive the current load factor, see callbacks.

When calc_fext also accepts the keyword argument lbd, e.g. for prescribed displacements imposed exactly, it receives the load factor together with the configuration, \(\{F_{ext}\}\) above being then \(\partial R/\partial \lambda\) at the current \(c\) and \(\lambda\); \(\{u_{ref}\}\) is the linear solution of \(\partial R/\partial \lambda\) at \(c = 0\), \(\lambda = 0\), since the reference vector may be null, e.g. under a prescribed displacement alone; and \(\lambda \, \partial R/\partial \lambda\) is an additional reference of the relative convergence criterion. \(\partial R/\partial \lambda\) is evaluated together with the tangent stiffness matrix, at the same iterate, i.e. once per update of the tangent stiffness matrix, and used in the bordered solution; the last one evaluated is the reference of the next convergence checks. At the converged state it is kept with the tangent stiffness matrix when the step is repeated with a shorter arc length.

The initial arc length corresponds to a load factor increment of an.initialInc along the initial tangent. The convergence and divergence checks are the same as in the Newton-Raphson solver, see newton_raphson._check_convergence() and newton_raphson._check_divergence(), where the relative criterion also considers the external force vector of the current increment, and an.modified_NR and an.compute_every_n control how often the tangent stiffness matrix is updated.

Parameters:
anAnalysis

Analysis object, the converged load factors and solutions are appended to an.increments and an.cs.

methodstr

'riks' or 'crisfield'.

silentbool, optional

A boolean to tell whether the log messages should be printed.

Riks and Crisfield methods#

structsolve.arc_length_riks._solver_arc_length_riks(an, silent=False)#

Arc-Length solver using the Riks method

The arc-length constraint is linearized at every iteration (updated normal plane), see arc_length._solver_arc_length().

structsolve.arc_length_crisfield._solver_arc_length_crisfield(an, silent=False)#

Arc-Length solver using Crisfield`s method

The quadratic (spherical) arc-length constraint is solved exactly at every iteration, see arc_length._solver_arc_length().

Constants#

structsolve.arc_length.PSI = 1.0#

Scaling factor of the load-factor term in the arc-length constraint

structsolve.arc_length.DESIRED_NUM_ITER = 4#

Desired number of corrections per step, used to adapt the arc length

structsolve.arc_length.MAX_GROWTH_FACTOR = 1.5#

Maximum factor to increase the arc length after a converged step

structsolve.arc_length.MIN_GROWTH_FACTOR = 0.5#

Minimum factor to reduce the arc length after a converged step

structsolve.arc_length.MAX_NUM_STEPS = 1000#

Maximum number of converged steps of an arc-length analysis