Ce notebook reproduit une partie du polycopié de travaux numériques de mécanique.
On va chercher une solution analytique approchée au problème du barrage à l'aide d'un calcul symbolique.
import sympy
sympy.init_printing()
D'abord, définissons quelques symboles.
x, y, U, V, l, h = sympy.symbols('x, y, U, V, l, h')
Ceci nous permet de définir le champ de déplacement $\xi$ :
xi = sympy.Matrix((U * y/h, V * y / h))
xi
On peut calculer l'énergie potentielle associée à ce champ de déplacement, constituée de deux termes. Le premier est l'énergie des forces extérieures.
gamma_e, gamma = sympy.symbols('gamma_e, gamma')
La première composante vient des forces de gravité :
phi1 = sympy.integrate(-gamma * xi[1], (y, 0, h - x/l*h), (x, 0, l))
phi1
La deuxième vient des forces hydrostatiques de l'eau :
m = sympy.symbols('m')
phi2 = sympy.integrate(gamma_e * (m * h - y) * xi[0], (y, 0, m*h))
phi2
Il faut maintenant calcul le travail élastique. Construisons le tenseur epsilon :
grad_xi = sympy.Matrix([[sympy.diff(xi[0], x), sympy.diff(xi[0], y)],
[sympy.diff(xi[1], x), sympy.diff(xi[1], y)]])
grad_xi
epsilon = 1 / sympy.S(2) * (grad_xi + grad_xi.transpose())
epsilon
lambda_, mu = sympy.symbols('lambda, mu')
W = sympy.integrate(lambda_ / sympy.S(2) * epsilon.trace()**2 + mu * (epsilon * epsilon).trace(), (y, 0, h-x/l*h), (x, 0, l))
W
sympy.factor(W)
On peut maintenant minimiser en U et V la fonctionnelle suivante :
func = W - phi1 - phi2
func
On écrit qu'au point minimum, la dérivée s'annule, ce qui donne un système de deux équations à deux inconnues :
sympy.diff(func, U)
sympy.diff(func, V)
Que l'on peut résoudre :
sols = sympy.solve([sympy.diff(func, U),
sympy.diff(func, V)], (U, V))
sols
On peut maintenant dessiner dans un cas simple la déformée :
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
xi[1].subs(sols)
def plot_dam_solution():
"""Plots the dam problem solution."""
l_, h_ = 0.5, 0.3
gamma_e_ = 0.5
gamma_ = 0.1
mu_ = 0.2
m_ = 1.
lambda__ = 0.1
A = (0, 0)
B = (l_, 0)
C = (0, h_)
points = np.c_[A, B, C, A].T
plt.plot(points[:, 0], points[:, 1], '-o', label='dam (original)')
Cd = np.array(C)
Cd[0] += xi[0].subs(sols).subs({gamma_e:gamma_e_, h:h_, l:l_, mu:mu_, m: m_, y:h_})
Cd[1] += xi[1].subs(sols).subs({gamma_e:gamma_e_, h:h_, l:l_, mu:mu_, m: m_, y:h_, gamma: gamma_, lambda_: lambda__})
points2 = np.c_[A, B, Cd, A].T
plt.plot(points2[:, 0], points2[:, 1], '-o', label='dam (displaced)')
plt.legend()
plot_dam_solution()
On peut également manipuler la solution de manière interactive :
from ipywidgets import interact
@interact
def plot_dam_solution(l_=0.5,
h_=0.3,
gamma_e_ = 0.5,
gamma_ = 0.1,
mu_ = 0.2,
m_ = 1.,
lambda__ = 0.1):
"""Plots the dam problem solution."""
A = (0, 0)
B = (l_, 0)
C = (0, h_)
points = np.c_[A, B, C, A].T
plt.plot(points[:, 0], points[:, 1], '-o', label='dam (original)')
Cd = np.array(C)
Cd[0] += xi[0].subs(sols).subs({gamma_e:gamma_e_, h:h_, l:l_, mu:mu_, m: m_, y:h_})
Cd[1] += xi[1].subs(sols).subs({gamma_e:gamma_e_, h:h_, l:l_, mu:mu_, m: m_, y:h_, gamma: gamma_, lambda_: lambda__})
points2 = np.c_[A, B, Cd, A].T
plt.plot(points2[:, 0], points2[:, 1], '-o', label='dam (displaced)')
plt.legend()
Failed to display Jupyter Widget of type interactive
.
If you're reading this message in Jupyter Notebook or JupyterLab, it may mean that the widgets JavaScript is still loading. If this message persists, it likely means that the widgets JavaScript library is either not installed or not enabled. See the Jupyter Widgets Documentation for setup instructions.
If you're reading this message in another notebook frontend (for example, a static rendering on GitHub or NBViewer), it may mean that your frontend doesn't currently support widgets.
Comme noté dans le guide, on peut remarquer que la solution trouvée n'est pas compatible avec les conditions cinématiques et statiques...
Todo : continuer la description pour l'élément de type 1 du maillage, puis l'élément 2 dans lequel on traite : l'énergie élastique, les efforts imposés et enfin le lagrangien pour imposer des déplacements dans la résolution du système.