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 byMIN_GROWTH_FACTORandMAX_GROWTH_FACTORand limited byan.maxInc, wherenum_iteris the number of corrections of the step. When a step fails, the arc length is multiplied byINC_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.maxArcLengththe arc length becomes smaller than
an.minIncMAX_NUM_STEPSsteps converged
When the load depends on the configuration, i.e.
calc_fextaccepts the keyword argumentc, \(\{F_{ext}\}\) in \(\{\delta c_q\}\) and in the tangent predictor is the load vector of the current configurationcalc_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 acceptincreceive the current load factor, seecallbacks.When
calc_fextalso accepts the keyword argumentlbd, 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.initialIncalong the initial tangent. The convergence and divergence checks are the same as in the Newton-Raphson solver, seenewton_raphson._check_convergence()andnewton_raphson._check_divergence(), where the relative criterion also considers the external force vector of the current increment, andan.modified_NRandan.compute_every_ncontrol how often the tangent stiffness matrix is updated.- Parameters:
- an
Analysis Analysis object, the converged load factors and solutions are appended to
an.incrementsandan.cs.- methodstr
'riks'or'crisfield'.- silentbool, optional
A boolean to tell whether the log messages should be printed.
- an
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