Skip to content

Commit 46f891f

Browse files
committed
Merge branch 'feature_tutorials_fea' of https://github.com/su2code/su2code.github.io into feature_tutorials_fea
2 parents 4150a03 + 80dccb1 commit 46f891f

File tree

1 file changed

+215
-0
lines changed

1 file changed

+215
-0
lines changed
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
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+
![ProblemSetup](../structural_mechanics/images/lin1.png)
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+
![Mesh](../structural_mechanics/images/lin2.png)
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+
![Nonlinear Results](../structural_mechanics/images/nlin1.png)
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+
![Nonlinear Incremental Results](../structural_mechanics/images/nlin2.png)

0 commit comments

Comments
 (0)