1@DSL DefaultFiniteStrainDSL;
2@Behaviour SaintVenantKirchhoffElasticity;
3@Author T. Helfer;
4@Date 19/10/2013;
5@Description{
6  "La loi de SaintVenantKirchhoffElasticity est une extension "
7  "de la loi de Hooke au cas des grandes rotations. "
8  "Elle ne peut être utilisée que pour des petites déformations."
9}
10
11@MaterialProperty stress young;
12young.setGlossaryName("YoungModulus");
13@MaterialProperty real nu;
14nu.setGlossaryName("PoissonRatio");
15
16@LocalVariable stress lambda;   //<! Premier coefficient de Lamé
17@LocalVariable stress mu;       //<! Second  coefficient de Lamé
18@LocalVariable StrainStensor e; //<! Déformation de Green-Lagrange
19
20// Nous déclarons le second tenseur de Piola-Kirchhoff en tant que
21// variable locale pour le réutiliser dans le calcul de l'opérateur
22// tangent
23@LocalVariable StressStensor s; //<! Second tenseur des contraintes de Piola-Kirchhoff
24
25@InitLocalVariables{
26  /*!
27   * Nous commençons par calculer les coefficients de Lame \(\lambda\)
28   * et \(\mu\)~:
29   * \begin{aligned}
30   *   \lambda  &= \\
31   *   \mu      &= \\
32   * \end{aligned}
33   */
34  lambda = computeLambda(young,nu);
35  mu     = computeMu(young,nu);
36}
37
38@PredictionOperator<DS_DEGL>{
39  static_cast<void>(smt); // suppression d'un warning : la matrice de
40			  // prédiction est toujours l'élastique
41  Dt = lambda*Stensor4::IxI()+2*mu*Stensor4::Id();
42}
43
44/*!
45 * Nous décrivons ici l'intégration de la loi.
46 */
47@Integrator{
48  /*!
49   * Nous calculons ensuite le tenseur de Green-Lagrange
50   */
51  e = computeGreenLagrangeTensor(F1);
52  // second Piola–Kirchhoff stress
53  s = lambda*trace(e)*StrainStensor::Id()+2*mu*e;
54  // conversion to Cauchy stress tensor
55  sig = convertSecondPiolaKirchhoffStressToCauchyStress(s,F1);
56}
57
58/*!
59 * Nous fournissons l'opérateur tangent le plus naturel pour cette
60 * loi.
61 */
62@TangentOperator<DS_DEGL>{
63  static_cast<void>(smt); // suppression d'un warning : la matrice
64			  // tangente est toujours l'élastique
65  Dt = lambda*Stensor4::IxI()+2*mu*Stensor4::Id();
66}
67
68/*!
69 * Nous fournissons un autre l'opérateur tangent, proche de celui
70 * utilisé par le Code-Aster. Cet opérateur aurait pu être calculé
71 * automatiquement par MFront, mais cela impliquait de recalculer le
72 * second tenseur des contraintes de Piola-Kirchhoff à partir des
73 * contraintes de Cauchy. Nous utilisons ici le fait que le second
74 * tenseur de Piola-Kirchhoff est connu à la fin de l'intégration.
75 */
76@TangentOperator<DTAU_DF>{
77  static_cast<void>(smt); // suppression d'un warning : la matrice
78			  // tangente est toujours l'élastique
79  StiffnessTensor De = lambda*Stensor4::IxI()+2*mu*Stensor4::Id();
80  t2tost2<N,stress> dS = 0.5*De*t2tost2<N,strain>::dCdF(F1);
81  t2tost2<N,stress> dtau;
82  computePushForwardDerivative(dtau,dS,s,F1);
83  Dt = dtau;
84}
85
86@InternalEnergy{
87  const auto tr = trace(e);
88  Psi_s = lambda*tr*tr/2+mu*(e|e);
89}
90