Alexandre Daby-Seesaram
  • Home
  • Research
  • Talks
  • News
  • Resources
  • Teaching
  • Education
  • CV

Continuum mechanics

This static webpage shows the tangible meaning of kinematics quantities usually used in continuum mechanics.

Gradient of the transformation

Let \(\mathcal{F}\) be the transformation such that \(\forall \underline{X} \in \Omega_0\) we can define its counter part \(\underline{x} = \mathcal{F}\left\{\underline{X}\right\} \in \Omega_t\)

Most kinematic quantities that describe the transformation of an elementary volume in the bulk are defined based on \[\underline{\underline{F}} = \underline{\underline{\nabla}}\mathcal{F},\] the gradient of the transformation.

Let’s try to grasp the physical meaning of the component of \(\underline{\underline{F}}\) in a Cartesian framework.

import%20marimo%20as%20mo%0Afrom%20wigglystuff%20import%20Matrix%0Aimport%20numpy%20as%20np%0A%0AF%20%3D%20mo.ui.anywidget(Matrix(np.eye(3)%2C%20step%3D0.01))%0Amo.hstack(%5Bmo.md(r%22%24%5Cunderline%7B%5Cunderline%7BF%7D%7D%3D%24%22)%2C%20F%5D)%0A

You can play with its components (hover and then click + drag directly on the matrix’s components) and observe the impact it has on the deformation of a unit cube. In the following figure we can observe a unit cube initially undeformed (black) that gets deformed by the action of \(\underline{\underline{F}}\) (red).

import%20plotly.graph_objects%20as%20go%0A%0A%0A%0Anodes_0%20%3D%20np.array(%5B%0A%20%20%20%20%5B0%2C%201%2C%201%2C%200%2C%200%2C%201%2C%201%2C%200%5D%2C%20%20%23%20X%0A%20%20%20%20%5B0%2C%200%2C%201%2C%201%2C%200%2C%200%2C%201%2C%201%5D%2C%20%20%23%20Y%0A%20%20%20%20%5B0%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%5D%20%20%20%23%20Z%0A%5D)%0A%0Anodes_t%20%3D%20F.matrix%40nodes_0%0A%0Aedges%20%3D%20np.array(%5B%0A%20%20%20%20%5B0%2C%201%5D%2C%20%5B1%2C%202%5D%2C%20%5B2%2C%203%5D%2C%20%5B3%2C%200%5D%2C%20%20%23%20bottom%20face%0A%20%20%20%20%5B4%2C%205%5D%2C%20%5B5%2C%206%5D%2C%20%5B6%2C%207%5D%2C%20%5B7%2C%204%5D%2C%20%20%23%20top%20face%0A%20%20%20%20%5B0%2C%204%5D%2C%20%5B1%2C%205%5D%2C%20%5B2%2C%206%5D%2C%20%5B3%2C%207%5D%20%20%20%23%20vertical%20edges%0A%5D)%0A%0A
%23%20Create%20figure%0Afig%20%3D%20go.Figure()%0A%0A%23%20Add%20cube%20edges%0Afor%20edge%20in%20edges%3A%0A%20%20%20%20x%20%3D%20nodes_0%5B0%2C%20edge%5D%0A%20%20%20%20y%20%3D%20nodes_0%5B1%2C%20edge%5D%0A%20%20%20%20z%20%3D%20nodes_0%5B2%2C%20edge%5D%0A%20%20%20%20fig.add_trace(go.Scatter3d(%0A%20%20%20%20%20%20%20%20x%3Dx%2C%20y%3Dy%2C%20z%3Dz%2C%0A%20%20%20%20%20%20%20%20mode%3D'lines'%2C%0A%20%20%20%20%20%20%20%20line%3Ddict(color%3D'black'%2C%20width%3D3)%0A%20%20%20%20))%0Afor%20edge%20in%20edges%3A%0A%20%20%20%20x%20%3D%20nodes_t%5B0%2C%20edge%5D%0A%20%20%20%20y%20%3D%20nodes_t%5B1%2C%20edge%5D%0A%20%20%20%20z%20%3D%20nodes_t%5B2%2C%20edge%5D%0A%20%20%20%20fig.add_trace(go.Scatter3d(%0A%20%20%20%20%20%20%20%20x%3Dx%2C%20y%3Dy%2C%20z%3Dz%2C%0A%20%20%20%20%20%20%20%20mode%3D'lines'%2C%0A%20%20%20%20%20%20%20%20line%3Ddict(color%3D'red'%2C%20width%3D6)%0A%20%20%20%20))%0A%0A%23%20Configure%20layout%20with%20turntable%20mode%0Afig.update_layout(%0A%20%20%20%20scene%3Ddict(%0A%20%20%20%20%20%20%20%20aspectmode%3D'cube'%2C%0A%0A%20%20%20%20%20%20%20%20xaxis%3Ddict(range%3Dx_range.value)%2C%0A%20%20%20%20%20%20%20%20yaxis%3Ddict(range%3Dy_range.value)%2C%0A%20%20%20%20%20%20%20%20zaxis%3Ddict(range%3Dz_range.value)%2C%0A%20%20%20%20)%2C%0A%20%20%20%20%23%20scene_camera%3Ddict(%0A%20%20%20%20%23%20%20%20%20%20eye%3Ddict(x%3D1.5%2C%20y%3D1.5%2C%20z%3D1)%2C%0A%20%20%20%20%23%20%20%20%20%20projection%3Ddict(type%3D'perspective')%0A%20%20%20%20%23%20)%2C%0A%20%20%20%20dragmode%3D'turntable'%2C%20%20%0A%20%20%20%20title%3D%22Initial%20and%20deformed%20unit%20cubes%22%2C%20%0A%20%20%20%20showlegend%20%3D%20False%0A)%0A%0Amo.ui.plotly(fig)%0A

From this second order tensor, we can also compute the associated right Cauchy–Green deformation tensor

F_mat%20%3D%20np.array(F.matrix)%0A%0AC%20%3D%20mo.ui.anywidget(Matrix(F_mat.T%40F_mat%2C%20step%3D0.0))%0Amo.hstack(%5Bmo.md(r%22%24%5Cunderline%7B%5Cunderline%7BC%7D%7D%3D%24%22)%2C%20C%5D)%0A

that is not impacted by rigid body motions (translations or rotations).

You can change the limits of the boundary box to zoom in and out on the cubes with the following sliders.

x_range%20%3D%20mo.ui.range_slider(%0A%20%20%20%20start%3D-5%2C%20stop%3D5%2C%20value%3D%5B-1%2C2%5D%2C%0A%20%20%20%20label%3D%22X%20range%22%2C%20step%3D0.1%2Cfull_width%3DTrue%0A)%0Ay_range%20%3D%20mo.ui.range_slider(%0A%20%20%20%20start%3D-5%2C%20stop%3D5%2C%20value%3D%5B-1%2C2%5D%2C%0A%20%20%20%20label%3D%22Y%20range%22%2C%20step%3D0.1%2Cfull_width%3DTrue%0A)%0Az_range%20%3D%20mo.ui.range_slider(%0A%20%20%20%20start%3D-5%2C%20stop%3D5%2C%20value%3D%5B-1%2C2%5D%2C%0A%20%20%20%20label%3D%22Z%20range%22%2C%20step%3D0.1%2Cfull_width%3DTrue%0A)%0A%0Amo.vstack(%5Bx_range%2C%20y_range%2C%20z_range%5D)%0A

The variation of the volume is given by the jacobian \[J=\text{det}\left(\underline{\underline{F}}\right).\] The current volume \(V_t\) is computed as \[V_t = J~V_0\] with \(V_0\) being the volume of the initial cube.

jacobian%20%3D%20np.linalg.det(F.matrix) mo.md(rf%22See%20the%20new%20volume%20%24V_t%24%20%3D%7Bjacobian%3A.1f%7D%24%5Ctimes%20V_0%24%22)%0A

Stress tensor

The Cauchy stress tensor \(\underline{\underline{\sigma}}\) describes internal traction forces. To get an idea of the physical interpretation of each of its component let’s manipulate this tensor and look at the impact it has on the corresponding traction forces on an elementary volume element.

normal_axis_dropdown%20%3D%20mo.ui.dropdown(options%3D%5B%22e_1%22%2C%20%22e_2%22%2C%20%22e_3%22%2C%22-e_1%22%2C%20%22-e_2%22%2C%20%22-e_3%22%5D%2C%20label%3D%22Select%20the%20normal%20vector%20you%20want%20here%3A%20%22%2C%20value%20%3D%20%22e_1%22)%0A%0Anormal_axis_dropdown%0A

And see how the components of

sigma%20%3D%20mo.ui.anywidget(Matrix(np.eye(3)%2C%20step%3D0.01%2Cmirror%3DTrue))%0A%0Amo.hstack(%5Bmo.md(r%22%24%5Cunderline%7B%5Cunderline%7B%5Csigma%7D%7D%3D%24%22)%2C%20sigma%5D)%0A

affect the traction vector \(\underline{T} = \underline{\underline{\sigma}} \underline{n}\)

normal_axis%20%3D%20normal_axis_dropdown.value%0A%0A%0Amatch%20normal_axis%3A%0A%20%20%20%20case%20%22e_1%22%3A%0A%20%20%20%20%20%20%20%20n_axis%20%3D%20np.array(%5B%5B1%2C0%2C0%5D%5D).T%0A%20%20%20%20%20%20%20%20T_0%20%3D%20np.array(%5B%5B1%2C0.5%2C0.5%5D%5D).T%0A%20%20%20%20case%20%22-e_1%22%3A%0A%20%20%20%20%20%20%20%20n_axis%20%3D%20np.array(%5B%5B-1%2C0%2C0%5D%5D).T%0A%20%20%20%20%20%20%20%20T_0%20%3D%20np.array(%5B%5B0%2C0.5%2C0.5%5D%5D).T%0A%20%20%20%20case%20%22e_2%22%3A%0A%20%20%20%20%20%20%20%20n_axis%20%3D%20np.array(%5B%5B0%2C1%2C0%5D%5D).T%0A%20%20%20%20%20%20%20%20T_0%20%3D%20np.array(%5B%5B0.5%2C1%2C0.5%5D%5D).T%0A%20%20%20%20case%20%22-e_2%22%3A%0A%20%20%20%20%20%20%20%20n_axis%20%3D%20np.array(%5B%5B0%2C-1%2C0%5D%5D).T%0A%20%20%20%20%20%20%20%20T_0%20%3D%20np.array(%5B%5B0.5%2C0%2C0.5%5D%5D).T%0A%20%20%20%20case%20%22e_3%22%3A%0A%20%20%20%20%20%20%20%20n_axis%20%3D%20np.array(%5B%5B0%2C0%2C1%5D%5D).T%0A%20%20%20%20%20%20%20%20T_0%20%3D%20np.array(%5B%5B0.5%2C0.5%2C1%5D%5D).T%0A%20%20%20%20case%20%22-e_3%22%3A%0A%20%20%20%20%20%20%20%20n_axis%20%3D%20np.array(%5B%5B0%2C0%2C-1%5D%5D).T%0A%20%20%20%20%20%20%20%20T_0%20%3D%20np.array(%5B%5B0.5%2C0.5%2C0%5D%5D).T%0A%0AT_sigma%20%3D%20sigma.matrix%40n_axis%2F2%0A%0Ax_T_sigma%20%3D%20np.hstack(%5BT_0%2CT_0%2BT_sigma%5D)%0A fig_sigma%20%3D%20go.Figure()%0A%0A%0Amatch%20normal_axis%3A%0A%20%20%20%20case%20%22-e_3%22%3A%0A%20%20%20%20%20%20%20%20fig_sigma.add_trace(go.Surface(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20y%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20z%3Dz_n%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B%5B0%2C1%5D%2C%5B0%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B%5B0%2C0%5D%2C%5B1%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20z%3D%5B%5B0%2C0%5D%2C%5B0%2C0%5D%5D%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20showscale%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20colorscale%3D%5B%5B0%2C%20'blue'%5D%2C%20%5B1%2C%20'blue'%5D%5D%0A%20%20%20%20%20%20%20%20))%0A%20%20%20%20case%20%22e_3%22%3A%0A%20%20%20%20%20%20%20%20fig_sigma.add_trace(go.Surface(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20y%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20z%3Dz_n%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B%5B0%2C1%5D%2C%5B0%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B%5B0%2C0%5D%2C%5B1%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20z%3D%5B%5B1%2C1%5D%2C%5B1%2C1%5D%5D%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20showscale%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20colorscale%3D%5B%5B0%2C%20'blue'%5D%2C%20%5B1%2C%20'blue'%5D%5D%0A%20%20%20%20%20%20%20%20))%0A%20%20%20%20case%20%22e_1%22%3A%0A%20%20%20%20%20%20%20%20fig_sigma.add_trace(go.Surface(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20y%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20z%3Dz_n%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B%5B1%2C1%5D%2C%5B1%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B%5B0%2C1%5D%2C%5B0%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20z%3D%5B%5B0%2C0%5D%2C%5B1%2C1%5D%5D%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20showscale%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20colorscale%3D%5B%5B0%2C%20'blue'%5D%2C%20%5B1%2C%20'blue'%5D%5D%0A%20%20%20%20%20%20%20%20))%0A%20%20%20%20case%20%22-e_1%22%3A%0A%20%20%20%20%20%20%20%20fig_sigma.add_trace(go.Surface(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20y%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20z%3Dz_n%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B%5B0%2C0%5D%2C%5B0%2C0%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B%5B0%2C1%5D%2C%5B0%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20z%3D%5B%5B0%2C0%5D%2C%5B1%2C1%5D%5D%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20showscale%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20colorscale%3D%5B%5B0%2C%20'blue'%5D%2C%20%5B1%2C%20'blue'%5D%5D%0A%20%20%20%20%20%20%20%20))%0A%20%20%20%20case%20%22-e_2%22%3A%0A%20%20%20%20%20%20%20%20fig_sigma.add_trace(go.Surface(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20y%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20z%3Dz_n%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B%5B0%2C0%5D%2C%5B1%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B%5B0%2C0%5D%2C%5B0%2C0%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20z%3D%5B%5B0%2C1%5D%2C%5B0%2C1%5D%5D%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20showscale%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20colorscale%3D%5B%5B0%2C%20'blue'%5D%2C%20%5B1%2C%20'blue'%5D%5D%0A%20%20%20%20%20%20%20%20))%0A%20%20%20%20case%20%22e_2%22%3A%0A%20%20%20%20%20%20%20%20fig_sigma.add_trace(go.Surface(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20y%3Dx_n%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20z%3Dz_n%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B%5B0%2C0%5D%2C%5B1%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B%5B1%2C1%5D%2C%5B1%2C1%5D%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20z%3D%5B%5B0%2C1%5D%2C%5B0%2C1%5D%5D%2C%20%20%23%20z%20%3D%200%20plane%0A%20%20%20%20%20%20%20%20%20%20%20%20showscale%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20colorscale%3D%5B%5B0%2C%20'blue'%5D%2C%20%5B1%2C%20'blue'%5D%5D%0A%20%20%20%20%20%20%20%20))%0A%0Afig_sigma.add_trace(go.Scatter3d(%0A%20%20%20%20x%3Dx_T_sigma%5B0%2C%3A%5D%2C%20y%3Dx_T_sigma%5B1%2C%3A%5D%2C%20z%3Dx_T_sigma%5B2%2C%3A%5D%2C%0A%20%20%20%20mode%3D'lines'%2C%0A%20%20%20%20name%3D'Traction%20vector'%2C%0A%20%20%20%20line%3Ddict(color%3D'red'%2C%20width%3D5)%0A))%0A%0Afor%20edge_sigma%20in%20edges%3A%0A%20%20%20%20x_sigma%20%3D%20nodes_0%5B0%2C%20edge_sigma%5D%0A%20%20%20%20y_sigma%20%3D%20nodes_0%5B1%2C%20edge_sigma%5D%0A%20%20%20%20z_sigma%20%3D%20nodes_0%5B2%2C%20edge_sigma%5D%0A%20%20%20%20fig_sigma.add_trace(go.Scatter3d(%0A%20%20%20%20%20%20%20%20x%3Dx_sigma%2C%20y%3Dy_sigma%2C%20z%3Dz_sigma%2C%0A%20%20%20%20%20%20%20%20mode%3D'lines'%2C%0A%20%20%20%20%20%20%20%20showlegend%3DFalse%2C%0A%20%20%20%20%20%20%20%20line%3Ddict(color%3D'black'%2C%20width%3D3)%0A%20%20%20%20))%0A%0Afig_sigma.update_layout(%0A%20%20%20%20scene%3Ddict(%0A%20%20%20%20%20%20%20%20aspectmode%3D'cube'%2C%0A%0A%0A%20%20%20%20%20%20%20%20%23%20xaxis%3Ddict(range%3D%5B-1%2C%202%5D)%2C%20%20%0A%20%20%20%20%20%20%20%20%23%20yaxis%3Ddict(range%3D%5B-1%2C%202%5D)%2C%20%20%0A%20%20%20%20%20%20%20%20%23%20zaxis%3Ddict(range%3D%5B-1%2C%202%5D)%2C%20%20%0A%20%20%20%20)%2C%0A%20%20%20%20%23%20scene_camera%3Ddict(%0A%20%20%20%20%23%20%20%20%20%20eye%3Ddict(x%3D1.5%2C%20y%3D1.5%2C%20z%3D1)%2C%0A%20%20%20%20%23%20%20%20%20%20projection%3Ddict(type%3D'perspective')%0A%20%20%20%20%23%20)%2C%0A%20%20%20%20dragmode%3D'turntable'%2C%20%20%0A%20%20%20%20title%3D%22Infinitesimal%20volume%20and%20traction%20vector%22%2C%20%0A%20%20%20%20showlegend%20%3D%20True%0A)%0A%0Amo.ui.plotly(fig_sigma)%0A
Back to top