Stress gradient calculation
This demo shows the stress gradient calculation module. A gradient is calculated by fitting a plane into a node and its neighbor nodes of an FEM mesh.
See documentation for details on the module.
[1]:
import numpy as np
import pandas as pd
import pylife.stress.equistress
import pylife.mesh.gradient
import pylife.vmap
import pyvista as pv
Read in demo data and add the stress tensor dimensions for the third dimension.
[2]:
vm_mesh = pylife.vmap.VMAPImport("plate_with_hole.vmap")
mesh = (vm_mesh.make_mesh('1', 'STATE-2')
.join_coordinates()
.join_variable('STRESS_CAUCHY')
.to_frame())
Calculate and add von Mises stress
[3]:
mesh['mises'] = mesh.equistress.mises()
Calculate stress gradient on von Mises stress
[4]:
grad = mesh.gradient.gradient_of('mises')
grad["abs_grad"] = np.linalg.norm(grad, axis = 1)
mesh = mesh.join(grad)
display(mesh)
x | y | z | S11 | S22 | S33 | S12 | S13 | S23 | mises | dmises_dx | dmises_dy | dmises_dz | abs_grad | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
element_id | node_id | ||||||||||||||
1 | 1734 | 14.897208 | 5.269875 | 0.0 | 27.080811 | 6.927080 | 0.0 | -13.687358 | 0.0 | 0.0 | 33.996987 | -1.893361 | 3.568289 | 0.0 | 4.039493 |
1582 | 14.555333 | 5.355806 | 0.0 | 28.319006 | 1.178649 | 0.0 | -10.732705 | 0.0 | 0.0 | 33.399850 | -1.508279 | 3.797076 | 0.0 | 4.085669 | |
1596 | 14.630658 | 4.908741 | 0.0 | 47.701195 | 5.512213 | 0.0 | -17.866833 | 0.0 | 0.0 | 54.777007 | -1.442228 | 5.469620 | 0.0 | 5.656568 | |
4923 | 14.726271 | 5.312840 | 0.0 | 27.699907 | 4.052865 | 0.0 | -12.210032 | 0.0 | 0.0 | 33.446991 | 1.381062 | 6.028931 | 0.0 | 6.185091 | |
4924 | 14.592996 | 5.132274 | 0.0 | 38.010101 | 3.345431 | 0.0 | -14.299768 | 0.0 | 0.0 | 44.070962 | -0.538004 | -5.162114 | 0.0 | 5.190074 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
4770 | 3812 | -13.189782 | -5.691876 | 0.0 | 36.527439 | 2.470588 | 0.0 | -14.706686 | 0.0 | 0.0 | 43.577209 | 0.489075 | -5.247270 | 0.0 | 5.270013 |
12418 | -13.560289 | -5.278386 | 0.0 | 32.868889 | 3.320898 | 0.0 | -14.260107 | 0.0 | 0.0 | 39.903508 | -0.352899 | -9.819771 | 0.0 | 9.826110 | |
14446 | -13.673285 | -5.569107 | 0.0 | 34.291058 | 3.642457 | 0.0 | -13.836027 | 0.0 | 0.0 | 40.478974 | 3.865992 | -7.135043 | 0.0 | 8.115093 | |
14614 | -13.389065 | -5.709927 | 0.0 | 36.063541 | 2.828889 | 0.0 | -13.774759 | 0.0 | 0.0 | 42.140169 | 0.252531 | -5.859227 | 0.0 | 5.864667 | |
14534 | -13.276068 | -5.419206 | 0.0 | 33.804211 | 2.829817 | 0.0 | -14.580153 | 0.0 | 0.0 | 41.143837 | -0.134343 | -10.059937 | 0.0 | 10.060834 |
37884 rows × 14 columns
[5]:
grid = pv.UnstructuredGrid(*mesh.mesh.vtk_data())
plotter = pv.Plotter()
plotter.add_mesh(grid, scalars=mesh.groupby('element_id')["abs_grad"].mean().to_numpy(), show_edges=True, cmap='jet')
plotter.add_scalar_bar()
plotter.show()
[6]:
"That's it"
[6]:
"That's it"