Nonlinear Solvers#
This chapter derives the mathematical foundations for nonlinear finite element analysis: Newton-Raphson iteration and arc-length methods. We then connect these to the femlabpy implementation.
1. The Nonlinear Problem#
1.1 Equilibrium equation#
For a structure under load, equilibrium requires:
where:
\(\mathbf{u}\) is the displacement vector
\(\mathbf{F}^{ext}\) is the external load vector
\(\mathbf{F}^{int}(\mathbf{u})\) is the internal force vector
\(\mathbf{R}\) is the residual (out-of-balance) force
Nonlinearity arises from:
Material nonlinearity: \(\boldsymbol{\sigma} = \boldsymbol{\sigma}(\boldsymbol{\varepsilon})\) is nonlinear (plasticity, hyperelasticity)
Geometric nonlinearity: strain-displacement relation is nonlinear (large deformations)
1.2 Linearization#
The residual at \(\mathbf{u} + \Delta\mathbf{u}\) is approximated by Taylor expansion:
The tangent stiffness matrix is:
For equilibrium at the new state:
2. Newton-Raphson Method#
2.1 Standard Newton-Raphson#
The Newton-Raphson algorithm iteratively solves the nonlinear system:
Initialize: \(\mathbf{u}^{(0)} = \mathbf{u}_n\) (previous converged state)
Iterate for \(k = 0, 1, 2, \ldots\):
Compute residual: $\(\mathbf{R}^{(k)} = \mathbf{F}^{ext} - \mathbf{F}^{int}(\mathbf{u}^{(k)})\)$
Check convergence: $\(\|\mathbf{R}^{(k)}\| < \text{tol} \implies \text{converged}\)$
Compute tangent stiffness: $\(\mathbf{K}_T^{(k)} = \frac{\partial \mathbf{F}^{int}}{\partial \mathbf{u}}\bigg|_{\mathbf{u}^{(k)}}\)$
Solve for correction: $\(\mathbf{K}_T^{(k)} \Delta\mathbf{u}^{(k)} = \mathbf{R}^{(k)}\)$
Update displacement: $\(\mathbf{u}^{(k+1)} = \mathbf{u}^{(k)} + \Delta\mathbf{u}^{(k)}\)$
2.2 Convergence properties#
Newton-Raphson has quadratic convergence near the solution:
This means the error squares each iteration, giving rapid convergence when close to the solution.
However, convergence requires:
A good initial guess
Non-singular tangent matrix
Residual in the basin of convergence
2.3 Modified Newton-Raphson#
To reduce computation, the tangent can be held constant:
This gives linear (slower) convergence but avoids reforming and refactorizing \(\mathbf{K}_T\) each iteration.
3. Load Control and Incremental Analysis#
3.1 Load incrementation#
For path-dependent problems (plasticity), the load is applied in increments:
where \(\lambda_n\) is the load factor and \(\hat{\mathbf{F}}\) is the reference load.
The solution proceeds through load steps \(n = 1, 2, \ldots\):
3.2 Predictor-corrector scheme#
Each load step uses:
Predictor: Apply load increment, compute initial displacement estimate
Corrector: Newton iterations to equilibrium
4. Arc-Length Methods#
4.1 Motivation#
Standard load control fails at limit points where \(\frac{d\lambda}{d\mathbf{u}} \to 0\). At such points, the load-displacement curve has a horizontal tangent and the structure exhibits snap-through or snap-back behavior.
Arc-length methods treat the load factor \(\lambda\) as an additional unknown, allowing the solver to trace the complete equilibrium path including post-buckling and softening regimes.
4.2 Augmented system#
The equilibrium equation becomes:
With \(n\) displacement DOFs and one unknown \(\lambda\), we have \(n\) equations and \(n+1\) unknowns. An additional constraint equation is needed:
4.3 Linearization#
Linearizing the equilibrium equation:
The displacement correction can be decomposed:
where:
\(\delta\mathbf{u}_R = \mathbf{K}_T^{-1} \mathbf{R}^{(k)}\) (residual contribution)
\(\delta\mathbf{u}_F = \mathbf{K}_T^{-1} \hat{\mathbf{F}}\) (load contribution)
4.4 Spherical arc-length (Riks method)#
The constraint is a hypersphere in load-displacement space:
Derivation of \(\delta\lambda\):
Substituting \(\delta\mathbf{u} = \delta\mathbf{u}_R + \delta\lambda \, \delta\mathbf{u}_F\) into the linearized constraint:
Keeping linear terms:
Solving for \(\delta\lambda\):
4.5 Cylindrical arc-length (Crisfield method)#
Uses displacement-only constraint:
This yields a quadratic equation in \(\delta\lambda\):
where:
\(a_1 = \delta\mathbf{u}_F^T \delta\mathbf{u}_F\)
\(a_2 = 2(\Delta\mathbf{u} + \delta\mathbf{u}_R)^T \delta\mathbf{u}_F\)
\(a_3 = (\Delta\mathbf{u} + \delta\mathbf{u}_R)^T (\Delta\mathbf{u} + \delta\mathbf{u}_R) - \Delta l^2\)
The root is chosen to maintain path direction (positive work criterion).
4.6 Orthogonal residual method (femlabpy)#
The femlabpy implementation uses orthogonality to the predictor:
Derivation:
Let \(\Delta\mathbf{u}^{(0)} = \mathbf{K}_T^{-1} \hat{\mathbf{F}}\) be the reference increment. The correction satisfies:
Solving:
This is computationally efficient and robust for most structural problems.
5. Tangent Stiffness Matrix#
5.1 Material tangent#
From the constitutive relation \(\boldsymbol{\sigma} = \boldsymbol{\sigma}(\boldsymbol{\varepsilon})\):
where \(\mathbf{D}_T = \frac{\partial \boldsymbol{\sigma}}{\partial \boldsymbol{\varepsilon}}\) is the tangent modulus.
For elasticity: \(\mathbf{D}_T = \mathbf{D}\) (constant)
For plasticity: \(\mathbf{D}_T = \mathbf{D}^{ep}\) (consistent elastoplastic tangent)
5.2 Geometric stiffness#
For large deformations with the Green-Lagrange strain:
The geometric stiffness arises from the variation of the strain-displacement matrix:
where \(\mathbf{G}\) contains shape function derivatives and \(\boldsymbol{\tau}\) is the stress matrix.
6. Convergence Criteria#
6.1 Residual norm#
Force equilibrium:
6.2 Displacement increment norm#
Solution stationarity:
6.3 Energy norm#
Combined criterion:
The femlabpy helper rnorm() evaluates the residual on constrained DOFs, matching legacy conventions.
7. Implementation in femlabpy#
7.1 Orthogonal residual solver#
solve_nlbar(X, T, G, C, P, ...) implements the nonlinear bar solver:
Step |
Action |
|---|---|
1 |
Initialize \(\mathbf{u} = \mathbf{0}\), \(\mathbf{f} = \mathbf{0}\) |
2 |
Build tangent with |
3 |
Apply BCs with |
4 |
Compute reference increment \(\Delta\mathbf{u}_0\) |
5 |
Orthogonal residual correction loop |
6 |
Commit converged state |
7 |
Recover reactions with |
Returns: u, q, S, E, R, f, U_path, F_path
7.2 Elastoplastic solver#
solve_plastic(X, T, G, C, P, ...) handles Q4 elastoplastic problems:
Geometry options:
Plane stress:
kq4eps,qq4epsPlane strain:
kq4epe,qq4epe
Material options:
material_type=1: von Misesmaterial_type=2: Drucker-Prager
State arrays:
u,du: displacement historyf,df: external force stateS,E: committed element stress/strain
7.3 Code reading order#
solve_nlbar()
└── kbar, qbar (element routines)
└── setbc, setload (constraints)
└── reaction (post-processing)
solve_plastic()
└── kq4eps/kq4epe, qq4eps/qq4epe
└── _solve_plastic_system()