Note
Go to the end to download the full example code.
LinearElasticity2#
A cantilever beam undergoing bending deformation in dynamic.
Note that this simulation is also performed in examples/Dynamic/Dynamic1.py.


0.000 s
0.010 s
0.020 s
0.030 s
0.040 s
0.050 s
0.060 s
0.070 s
0.080 s
0.090 s
0.100 s
0.110 s
0.120 s
0.130 s
0.140 s
0.150 s
0.160 s
0.170 s
0.180 s
0.190 s
0.200 s
0.210 s
0.220 s
0.230 s
0.240 s
0.250 s
0.260 s
0.270 s
0.280 s
0.290 s
0.300 s
0.310 s
0.320 s
0.330 s
0.340 s
0.350 s
0.360 s
0.370 s
0.380 s
0.390 s
0.400 s
0.410 s
0.420 s
0.430 s
0.440 s
0.450 s
0.460 s
0.470 s
0.480 s
0.490 s
0.500 s
Generate movie 01/52 (1.92 %) 6.96 s
Generate movie 02/52 (3.85 %) 5.72 s
Generate movie 03/52 (5.77 %) 5.57 s
Generate movie 04/52 (7.69 %) 5.52 s
Generate movie 05/52 (9.62 %) 5.33 s
Generate movie 06/52 (11.54 %) 5.23 s
Generate movie 07/52 (13.46 %) 5.17 s
Generate movie 08/52 (15.38 %) 5.04 s
Generate movie 09/52 (17.31 %) 4.96 s
Generate movie 10/52 (19.23 %) 4.77 s
Generate movie 11/52 (21.15 %) 4.67 s
Generate movie 12/52 (23.08 %) 4.55 s
Generate movie 13/52 (25.00 %) 4.49 s
Generate movie 14/52 (26.92 %) 4.33 s
Generate movie 15/52 (28.85 %) 4.21 s
Generate movie 16/52 (30.77 %) 4.08 s
Generate movie 17/52 (32.69 %) 3.97 s
Generate movie 18/52 (34.62 %) 3.85 s
Generate movie 19/52 (36.54 %) 3.74 s
Generate movie 20/52 (38.46 %) 3.63 s
Generate movie 21/52 (40.38 %) 3.58 s
Generate movie 22/52 (42.31 %) 3.42 s
Generate movie 23/52 (44.23 %) 3.29 s
Generate movie 24/52 (46.15 %) 3.20 s
Generate movie 25/52 (48.08 %) 3.15 s
Generate movie 26/52 (50.00 %) 3.03 s
Generate movie 27/52 (51.92 %) 2.89 s
Generate movie 28/52 (53.85 %) 3.03 s
Generate movie 29/52 (55.77 %) 2.62 s
Generate movie 30/52 (57.69 %) 2.52 s
Generate movie 31/52 (59.62 %) 2.42 s
Generate movie 32/52 (61.54 %) 2.31 s
Generate movie 33/52 (63.46 %) 2.19 s
Generate movie 34/52 (65.38 %) 2.07 s
Generate movie 35/52 (67.31 %) 1.96 s
Generate movie 36/52 (69.23 %) 1.86 s
Generate movie 37/52 (71.15 %) 1.82 s
Generate movie 38/52 (73.08 %) 1.63 s
Generate movie 39/52 (75.00 %) 1.50 s
Generate movie 40/52 (76.92 %) 1.38 s
Generate movie 41/52 (78.85 %) 1.27 s
Generate movie 42/52 (80.77 %) 1.16 s
Generate movie 43/52 (82.69 %) 1.04 s
Generate movie 44/52 (84.62 %) 925.00 ms
Generate movie 45/52 (86.54 %) 806.01 ms
Generate movie 46/52 (88.46 %) 689.87 ms
Generate movie 47/52 (90.38 %) 577.88 ms
Generate movie 48/52 (92.31 %) 460.79 ms
Generate movie 49/52 (94.23 %) 346.98 ms
Generate movie 50/52 (96.15 %) 231.45 ms
Generate movie 51/52 (98.08 %) 116.91 ms
Generate movie 52/52 (100.00 %) 0.00 µs
15 import matplotlib.pyplot as plt
16 import numpy as np
17
18 from EasyFEA import Folder, Display, ElemType, Models, Simulations, PyVista
19 from EasyFEA.FEM import Field, BiLinearForm, FeArray, Sym_Grad, Trace
20 from EasyFEA.Geoms import Domain
21
22 if __name__ == "__main__":
23 Display.Clear()
24
25 # ----------------------------------------------
26 # Configuration
27 # ----------------------------------------------
28
29 dim = 3
30
31 # outputs
32 makeMovie = True
33 folder = Folder.Results_Dir()
34
35 # geom
36 L = 120 # mm
37 h = 13
38
39 # model
40 elastic = Models.Elastic.Isotropic(dim, 210000, 0.3, planeStress=True, thickness=h)
41 lmbda = elastic.get_lambda()
42 mu = elastic.get_mu()
43 rho = 8100 * 1e-9
44
45 # load
46 Tmax = 0.5
47 N = 50
48 dt = Tmax / N
49 time = -dt
50
51 # ----------------------------------------------
52 # Mesh
53 # ----------------------------------------------
54
55 contour = Domain((0, 0), (L, h), h / 3)
56
57 if dim == 2:
58 mesh = contour.Mesh_2D([], ElemType.QUAD4, isOrganised=True)
59 else:
60 mesh = contour.Mesh_Extrude(
61 [], [0, 0, h], [3], ElemType.HEXA8, isOrganised=True
62 )
63
64 nodesX0 = mesh.Nodes_Conditions(lambda x, y, z: x == 0)
65 nodesXL = mesh.Nodes_Conditions(lambda x, y, z: x == L)
66
67 # ----------------------------------------------
68 # Formulations
69 # ----------------------------------------------
70
71 field = Field(mesh.groupElem, dim)
72
73 def S(u: Field) -> FeArray:
74 Eps = Sym_Grad(u)
75 return 2 * mu * Eps + lmbda * Trace(Eps) * np.eye(dim)
76
77 @BiLinearForm
78 def computeK(u: Field, v: Field):
79 Sig = S(u)
80 Eps = Sym_Grad(v)
81 return Sig.ddot(Eps)
82
83 @BiLinearForm
84 def computeM(u: Field, v: Field):
85 return rho * u.dot(v)
86
87 @BiLinearForm
88 def computeC(u: Field, v: Field):
89 K = computeK(u, v)
90 M = computeM(u, v)
91 C = K * 1e-3 + M * 1e-3
92 return C
93
94 weakForms = Models.WeakForms(field, computeK, computeC, computeM)
95
96 # ----------------------------------------------
97 # Simulations
98 # ----------------------------------------------
99
100 simu = Simulations.WeakForms(mesh, weakForms)
101
102 # static simulation
103 simu.add_dirichlet(nodesX0, [0] * dim, simu.Get_unknowns())
104 simu.add_dirichlet(nodesXL, [-10], ["y"])
105
106 simu.Solve()
107
108 # dynamic simulation
109 simu.Solver_Set_Hyperbolic_Algorithm(dt)
110 simu.Save_Iter()
111
112 simu.Bc_Init()
113 simu.add_dirichlet(nodesX0, [0] * dim, simu.Get_unknowns())
114
115 while time <= Tmax:
116
117 time += dt
118
119 simu.Solve()
120 simu.Save_Iter()
121
122 print(f"{time:.3f} s", end="\r")
123
124 # ----------------------------------------------
125 # Results
126 # ----------------------------------------------
127
128 if makeMovie:
129 PyVista.Movie_simu(
130 simu,
131 "uy",
132 folder,
133 "uy.gif",
134 deformFactor=1,
135 plotMesh=True,
136 N=400,
137 nodeValues=True,
138 )
139
140 simu.Set_Iter(0)
141 PyVista.Plot(simu, "uy", 1, plotMesh=True).show()
142
143 plt.show()
Total running time of the script: (0 minutes 11.321 seconds)