|
| 1 | +--- |
| 2 | +title: Non-linear Elasticity |
| 3 | +permalink: /tutorials/Nonlinear_Elasticity/ |
| 4 | +--- |
| 5 | + |
| 6 | +| Written by | for Version | Revised by | Revision date | Revised version | |
| 7 | +| --- | --- | --- | --- | --- | |
| 8 | +| [@rsanfer](https://github.com/rsanfer) | 7.0.0 | [@rsanfer](https://github.com/rsanfer) | Jan 28, 2020 | 7.0.1 | |
| 9 | + |
| 10 | +###### **At one glance** |
| 11 | + |
| 12 | +###### Solver: ```ELASTICITY``` |
| 13 | +###### Uses: ```SU2_CFD``` |
| 14 | +###### Complexity: <span style="color: orange;">**Intermediate**</span> |
| 15 | +###### Prerequisites: [**Linear Elasticity**](../Linear_Elasticity/) |
| 16 | + |
| 17 | + |
| 18 | +### Goals |
| 19 | + |
| 20 | +Once completed the tutorial on [Linear Elasticity](../Linear_Elasticity/), we can move on to non-linear problems. This document will guide you throught the following capabilities of SU2: |
| 21 | +- Setting up a non-linear structural problem with large deformations |
| 22 | +- Non-linear (hyperelastic) material law |
| 23 | +- Follower boundary conditions |
| 24 | +- Incremental loads |
| 25 | + |
| 26 | +In this tutorial, we use the same problem definition as for the linear elastic case: a vertical, slender cantilever, clamped in its base, and subject to a horizontal, follower load $$P$$ on its left boundary. This is shown in Fig. 1. |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +### Resources |
| 31 | + |
| 32 | +You can find the resources for this tutorial in the same [structural_mechanics/cantilever](https://github.com/rsanfer/Tutorials/blob/master/structural_mechanics/cantilever) folder in the [Tutorials repository](https://github.com/rsanfer/Tutorials). You can reuse the mesh file [mesh_cantilever.su2](https://github.com/rsanfer/Tutorials/blob/master/structural_mechanics/cantilever/mesh_cantilever.su2) |
| 33 | +from the Linear Elasticity tutorial, but you will need a new config file, [config_nonlinear.cfg](https://github.com/rsanfer/Tutorials/blob/master/structural_mechanics/cantilever/config_nonlinear.cfg). |
| 34 | + |
| 35 | +### Background |
| 36 | + |
| 37 | +SU2 has been designed using a finite-deformation framework$$^1$$ to account for geometrical and material non-linearities. |
| 38 | + |
| 39 | +We can write the non-linear structural problem via the residual equation |
| 40 | + |
| 41 | +$$\mathscr{S}(\mathbf{u}) = \mathbf{T}(\mathbf{u}) - \mathbf{F}_b - \mathbf{F}_{\Gamma}(\mathbf{u})$$ |
| 42 | + |
| 43 | +which has been obtained from the weak formulation of the structural problem defined using the principle of virtual work and discretized using FEM. The state variable $$\mathbf{u}$$ corresponds to the displacements of the structure with respect to its reference configuration $$\mathbf{R}$$. $$\mathbf{T}(\mathbf{u})$$ are the internal equivalent forces, $$\mathbf{F}_b$$ are the body forces and $$\mathbf{F}_{\Gamma}(\mathbf{u})$$ are the surface forces applied over the external boundaries of the structure. |
| 44 | + |
| 45 | +We can linearize the structural equation as |
| 46 | + |
| 47 | +$$\mathscr{S}(\mathbf{u}) + \frac{\partial \mathscr{S}(\mathbf{u})}{\partial \mathbf{u}} \Delta \mathbf{u} = \mathbf{0}$$ |
| 48 | + |
| 49 | +where the tangent matrix is $$\mathbf{K} = \partial \mathscr{S}(\mathbf{u})/\partial \mathbf{u}$$. The linearized problem is solved using a Newton method until convergence. Further description of the approach adopted in SU2 can be found in a [paper](https://doi.org/10.1002/nme.5700) by Sanchez _et al_$$^2$$. |
| 50 | + |
| 51 | +#### Mesh Description |
| 52 | + |
| 53 | +The cantilever is discretized using 1000 4-node quad elements with linear interpolation. The boundaries are defined as follows: |
| 54 | + |
| 55 | + |
| 56 | + |
| 57 | +#### Configuration File Options |
| 58 | + |
| 59 | +We start the tutorial by definining the structural properties. In this case, we will solve a geometrically non-linear problem, with a Neo-Hookean material model. |
| 60 | + |
| 61 | +``` |
| 62 | +GEOMETRIC_CONDITIONS= LARGE_DEFORMATIONS |
| 63 | +MATERIAL_MODEL= NEO_HOOKEAN |
| 64 | +``` |
| 65 | + |
| 66 | +We adopt a **plane strain** formulation for the 2D problem, and reduce the stiffness of the cantilever by 2 orders of magnitude as compared to the [Linear Elasticity](../Linear_Elasticity/) tutorial, so that the beam undergoes large deformations: |
| 67 | + |
| 68 | +``` |
| 69 | +ELASTICITY_MODULUS=5E7 |
| 70 | +POISSON_RATIO=0.35 |
| 71 | +FORMULATION_ELASTICITY_2D = PLANE_STRAIN |
| 72 | +``` |
| 73 | + |
| 74 | +Now, we define the Newton-Raphson strategy to solve the non-linear problem. We set the solution method and maximum number of subiterations using |
| 75 | + |
| 76 | +``` |
| 77 | +NONLINEAR_FEM_SOLUTION_METHOD = NEWTON_RAPHSON |
| 78 | +INNER_ITER = 15 |
| 79 | +``` |
| 80 | + |
| 81 | +Then, the convergence criteria is set to evaluate the norm of the displacement vector (```RMS_UTOL```), the residual vector (```RMS_RTOL```) and the energy (```RMS_ETOL```). We set the convergence values to -8.0, which is the log<sub>10</sub> of the previously defined magnitudes. |
| 82 | + |
| 83 | +``` |
| 84 | +CONV_FIELD= RMS_UTOL, RMS_RTOL, RMS_ETOL |
| 85 | +CONV_RESIDUAL_MINVAL= -8, |
| 86 | +``` |
| 87 | + |
| 88 | +Finally, we define the boundary conditions. In this case, the load applied to the ```left``` boundary will be an uniform, _follower_ pressure, that is, its direction will change with the changes in the normals of the surface. This is done as |
| 89 | + |
| 90 | +``` |
| 91 | +MARKER_CLAMPED = ( clamped ) |
| 92 | +MARKER_PRESSURE = ( left, 1E3, upper, 0, right, 0) |
| 93 | +``` |
| 94 | + |
| 95 | +### Running SU2 |
| 96 | + |
| 97 | +Follow the links provided to download the [config](https://github.com/rsanfer/Tutorials/blob/master/structural_mechanics/cantilever/config_nonlinear.cfg) and [mesh](https://github.com/rsanfer/Tutorials/blob/master/structural_mechanics/cantilever/mesh_cantilever.su2) files. Execute the code with the standard command |
| 98 | + |
| 99 | +``` |
| 100 | +SU2_CFD config_nonlinear.cfg |
| 101 | +``` |
| 102 | + |
| 103 | +which will show the following convergence history: |
| 104 | + |
| 105 | +``` |
| 106 | ++----------------------------------------------------------------+ |
| 107 | +| Inner_Iter| rms[U]| rms[R]| rms[E]| VonMises| |
| 108 | ++----------------------------------------------------------------+ |
| 109 | +| 0| -1.454599| -0.001635| -2.082200| 1.1259e+06| |
| 110 | +| 1| -2.406133| 3.664361| -0.038068| 1.1224e+06| |
| 111 | +| 2| -3.623182| 2.288350| -2.827362| 1.1053e+06| |
| 112 | +| 3| -3.096627| -0.433125| -5.369087| 1.1229e+06| |
| 113 | +| 4| -4.547761| 0.493533| -6.401479| 1.1222e+06| |
| 114 | +| 5| -5.306858| -2.420278| -9.740703| 1.1221e+06| |
| 115 | +| 6| -6.878854| -3.854770| -12.877010| 1.1221e+06| |
| 116 | +| 7| -8.478641| -6.065417| -16.078409| 1.1221e+06| |
| 117 | +| 8| -10.081222| -7.667567| -19.283559| 1.1221e+06| |
| 118 | +| 9| -11.683669| -8.697378| -22.488189| 1.1221e+06| |
| 119 | +``` |
| 120 | + |
| 121 | +The code is stopped as soon as the values of ```rms[U]```, ```rms[R]``` and ```rms[E]``` are below the convergence criteria set in the config file. The displacement field obtained in _nonlinear.vtk_ is shown below: |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | +### Increasing the load |
| 126 | + |
| 127 | +The magnitude of the residual can limit the convergence of the solver, particularly for those cases in which the problem is very non-linear. Say, for example, that we multiply the load in the ```left``` boundary by 4, using |
| 128 | + |
| 129 | +``` |
| 130 | +MARKER_PRESSURE = ( left, 4E3, upper, 0, right, 0) |
| 131 | +``` |
| 132 | + |
| 133 | +Running SU2 now would result in the divergence of the solver, |
| 134 | + |
| 135 | +``` |
| 136 | ++----------------------------------------------------------------+ |
| 137 | +| Inner_Iter| rms[U]| rms[R]| rms[E]| VonMises| |
| 138 | ++----------------------------------------------------------------+ |
| 139 | +| 0| -0.852539| 0.600425| -0.878080| 4.5753e+06| |
| 140 | +| 1| -1.130461| 4.628370| 2.207826| 4.4618e+06| |
| 141 | +| 2| -2.198592| 4.658260| 1.539054| 2.8742e+08| |
| 142 | +| 3| -nan| -nan| -nan| 0.0000e+00| |
| 143 | +| 4| -nan| -nan| -nan| 0.0000e+00| |
| 144 | +
|
| 145 | +``` |
| 146 | + |
| 147 | +due to a large imbalance between the internal and external loads. It can be observed that the order of magnitude of the residual vector grows above 10<sup>4</sup>. To solve this problem, we have incorporated an incremental approach to SU2, that applies the load in linear steps, |
| 148 | + |
| 149 | +$$\mathbf{F}_i = \frac{i}{N}\mathbf{F}$$ |
| 150 | + |
| 151 | +where $$i$$ is the step and $$N$$ the maximum number of increments allowed. To apply the load in increments, we need to use the following commands |
| 152 | + |
| 153 | +``` |
| 154 | +INCREMENTAL_LOAD = YES |
| 155 | +NUMBER_INCREMENTS = 25 |
| 156 | +INCREMENTAL_CRITERIA = (2.0, 2.0, 2.0) |
| 157 | +``` |
| 158 | + |
| 159 | +where $$N$$ = 25, and the criteria to apply the increments is that either one of ```rms[U] > 2.0```, ```rms[R] > 2.0``` or ```rms[E] > 2.0``` is met. We add an option to print out the load increment to the screen output: |
| 160 | + |
| 161 | +``` |
| 162 | +SCREEN_OUTPUT = (INNER_ITER, LOAD_INCREMENT, RMS_UTOL, RMS_RTOL, RMS_ETOL, VMS) |
| 163 | +``` |
| 164 | + |
| 165 | +If we now run the code, |
| 166 | + |
| 167 | +``` |
| 168 | ++-----------------------------------------------------------------------------+ |
| 169 | +| Inner_Iter| Load[%]| rms[U]| rms[R]| rms[E]| VonMises| |
| 170 | ++-----------------------------------------------------------------------------+ |
| 171 | +| 0| 100.00%| -0.852539| 0.600425| -0.878080| 4.5753e+06| |
| 172 | +| 1| 100.00%| -1.130461| 4.628370| 2.207826| 4.4618e+06| |
| 173 | +
|
| 174 | +Incremental load: increment 1 |
| 175 | ++-----------------------------------------------------------------------------+ |
| 176 | +| Inner_Iter| Load[%]| rms[U]| rms[R]| rms[E]| VonMises| |
| 177 | ++-----------------------------------------------------------------------------+ |
| 178 | +| 0| 4.00%| -2.250479| -0.797515| -3.673960| 1.7944e+05| |
| 179 | +| 1| 4.00%| -4.005792| 2.096002| -3.207727| 1.7948e+05| |
| 180 | +| 2| 4.00%| -5.555428| -0.881184| -9.113457| 1.7949e+05| |
| 181 | +| 3| 4.00%| -7.611025| -4.228316| -14.254076| 1.7949e+05| |
| 182 | +| 4| 4.00%| -10.343696| -7.532184| -19.528442| 1.7949e+05| |
| 183 | +| 5| 4.00%| -13.138042| -8.791438| -24.949847| 1.7949e+05| |
| 184 | +
|
| 185 | +``` |
| 186 | + |
| 187 | +given that ```4.628370 > 2.0``` and ```2.207826 > 2.0```, the load is applied in $$\Delta \mathbf{F} = 1/25 \mathbf{F}$$, completing the simulation in the 25th step, |
| 188 | + |
| 189 | +``` |
| 190 | +Incremental load: increment 25 |
| 191 | ++-----------------------------------------------------------------------------+ |
| 192 | +| Inner_Iter| Load[%]| rms[U]| rms[R]| rms[E]| VonMises| |
| 193 | ++-----------------------------------------------------------------------------+ |
| 194 | +| 0| 100.00%| -2.188244| -0.786306| -3.616397| 4.2701e+06| |
| 195 | +| 1| 100.00%| -3.417010| 2.241142| -2.911125| 4.2325e+06| |
| 196 | +| 2| 100.00%| -2.802795| -0.383540| -4.853108| 4.1931e+06| |
| 197 | +| 3| 100.00%| -3.461966| 1.059169| -5.203155| 4.2102e+06| |
| 198 | +| 4| 100.00%| -4.053497| -0.412173| -7.024221| 4.2103e+06| |
| 199 | +| 5| 100.00%| -4.505028| -1.211625| -8.188042| 4.2090e+06| |
| 200 | +| 6| 100.00%| -5.044900| -2.434771| -9.288963| 4.2093e+06| |
| 201 | +| 7| 100.00%| -5.572267| -3.418852| -10.345812| 4.2092e+06| |
| 202 | +| 8| 100.00%| -6.099258| -4.140827| -11.400141| 4.2093e+06| |
| 203 | +| 9| 100.00%| -6.625915| -4.693663| -12.453409| 4.2093e+06| |
| 204 | +| 10| 100.00%| -7.152645| -5.224056| -13.506885| 4.2093e+06| |
| 205 | +| 11| 100.00%| -7.679350| -5.750731| -14.560291| 4.2093e+06| |
| 206 | +| 12| 100.00%| -8.206063| -6.277523| -15.613718| 4.2093e+06| |
| 207 | +| 13| 100.00%| -8.732773| -6.804154| -16.667138| 4.2093e+06| |
| 208 | +| 14| 100.00%| -9.259484| -7.329682| -17.720560| 4.2093e+06| |
| 209 | +| 15| 100.00%| -9.786195| -7.846390| -18.773983| 4.2093e+06| |
| 210 | +| 16| 100.00%| -10.312907| -8.293905| -19.827405| 4.2093e+06| |
| 211 | +``` |
| 212 | + |
| 213 | +The displacement field is now |
| 214 | + |
| 215 | + |
0 commit comments