1 /*!
2  * \file   include/TFEL/Material/Lame.hxx
3  * \brief  This file defines various functions dealing with Lame's coefficients.
4  * Using Lame's coefficients, linear elastic behaviour may be written~:
5  * \f[ \underline{\sigma} =
6  * \lambda*\mathrm{tr}\left(\underline{\epsilon}\right)\underline{I}+2\mu\underline{\epsilon}
7  * \f]
8  * \author Thomas Helfer
9  * \date   31 Jul 2006
10  * \copyright Copyright (C) 2006-2018 CEA/DEN, EDF R&D. All rights
11  * reserved.
12  * This project is publicly released under either the GNU GPL Licence
13  * or the CECILL-A licence. A copy of thoses licences are delivered
14  * with the sources of TFEL. CEA or EDF may also distribute this
15  * project under specific licensing conditions.
16  */
17 
18 #ifndef LIB_TFEL_LAME_HXX
19 #define LIB_TFEL_LAME_HXX
20 
21 #include "TFEL/Config/TFELConfig.hxx"
22 #include "TFEL/Config/TFELTypes.hxx"
23 #include "TFEL/Material/ModellingHypothesis.hxx"
24 
25 namespace tfel {
26 
27   namespace material {
28 
29     namespace lame {}
30 
31     /*
32      * \brief compute the first Lame's coefficient
33      */
34     template <typename T>
computeLambda(const T young,const T nu)35     constexpr T computeLambda(const T young, const T nu) {
36       return nu * young / ((1 + nu) * (1 - 2 * nu));
37     }
38 
39     /*
40      * \brief compute the first Lame's coefficient
41      */
42     template <typename T>
computeLambda(const tfel::math::qt<tfel::math::Stress,T> young,const tfel::math::qt<tfel::math::NoUnit,T> nu)43     constexpr tfel::math::qt<tfel::math::Stress, T> computeLambda(
44         const tfel::math::qt<tfel::math::Stress, T> young,
45         const tfel::math::qt<tfel::math::NoUnit, T> nu) {
46       return nu * young / ((1 + nu) * (1 - 2 * nu));
47     }
48 
49     /*
50      * \brief compute the second Lame's coefficient
51      */
52     template <typename T>
computeMu(const T young,const T nu)53     constexpr T computeMu(const T young, const T nu) {
54       return young / (2 * (1 + nu));
55     }
56 
57     /*
58      * \brief compute the second Lame's coefficient
59      */
60     template <typename T>
computeMu(const tfel::math::qt<tfel::math::Stress,T> young,const tfel::math::qt<tfel::math::NoUnit,T> nu)61     constexpr tfel::math::qt<tfel::math::Stress, T> computeMu(
62         const tfel::math::qt<tfel::math::Stress, T> young,
63         const tfel::math::qt<tfel::math::NoUnit, T> nu) {
64       return young / (2 * (1 + nu));
65     }
66 
67     /*!
68      * \class computeElasticStiffness
69      * \brief compute the elastic stiffness given Lame's coefficients
70      * \param N : space dimension
71      * \param T : numerical type
72      * \author Thomas Helfer
73      * \date   12 Sep 2006
74      */
75     template <unsigned short, typename>
76     struct computeElasticStiffness;
77 
78     /*
79      * Partial specialisation in 1D
80      */
81     template <typename T>
82     struct computeElasticStiffness<1u, T> {
exetfel::material::computeElasticStiffness83       static void exe(
84           typename tfel::config::Types<1u, T, true>::StiffnessTensor& D,
85           const typename tfel::config::Types<1u, T, true>::stress lambda,
86           const typename tfel::config::Types<1u, T, true>::stress mu) {
87         typedef typename tfel::config::Types<1u, T, true>::stress stress;
88         stress G = 2 * mu;
89         stress tmp = lambda + G;
90         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
91         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
92         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
93       }
exetfel::material::computeElasticStiffness94       static void exe(
95           typename tfel::config::Types<1u, T, false>::StiffnessTensor& D,
96           const typename tfel::config::Types<1u, T, false>::stress lambda,
97           const typename tfel::config::Types<1u, T, false>::stress mu) {
98         typedef typename tfel::config::Types<1u, T, false>::stress stress;
99         stress G = 2 * mu;
100         stress tmp = lambda + G;
101         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
102         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
103         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
104       }
105     };
106 
107     /*
108      * Partial specialisation in 2D
109      */
110     template <typename T>
111     struct computeElasticStiffness<2u, T> {
exetfel::material::computeElasticStiffness112       static void exe(
113           typename tfel::config::Types<2u, T, true>::StiffnessTensor& D,
114           const typename tfel::config::Types<2u, T, true>::stress lambda,
115           const typename tfel::config::Types<2u, T, true>::stress mu) {
116         typedef typename tfel::config::Types<2u, T, true>::stress stress;
117         const stress G = 2 * mu;
118         const stress tmp = lambda + G;
119         const stress zero(T(0));
120         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
121         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
122         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
123         D(0, 3) = D(3, 0) = zero;
124         D(1, 3) = D(3, 1) = zero;
125         D(2, 3) = D(3, 2) = zero;
126         D(3, 3) = G;
127       }
128 
exetfel::material::computeElasticStiffness129       static void exe(
130           typename tfel::config::Types<2u, T, false>::StiffnessTensor& D,
131           const typename tfel::config::Types<2u, T, false>::stress lambda,
132           const typename tfel::config::Types<2u, T, false>::stress mu) {
133         typedef typename tfel::config::Types<2u, T, false>::stress stress;
134         const stress G = 2 * mu;
135         const stress tmp = lambda + G;
136         const stress zero(T(0));
137         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
138         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
139         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
140         D(0, 3) = D(3, 0) = zero;
141         D(1, 3) = D(3, 1) = zero;
142         D(2, 3) = D(3, 2) = zero;
143         D(3, 3) = G;
144       }
145     };
146 
147     /*
148      * Partial specialisation in 3D
149      */
150     template <typename T>
151     struct computeElasticStiffness<3u, T> {
exetfel::material::computeElasticStiffness152       static void exe(
153           typename tfel::config::Types<3u, T, true>::StiffnessTensor& D,
154           const typename tfel::config::Types<3u, T, true>::stress lambda,
155           const typename tfel::config::Types<3u, T, true>::stress mu) {
156         typedef typename tfel::config::Types<3u, T, true>::stress stress;
157         const stress G = 2 * mu;
158         const stress tmp = lambda + G;
159         const stress zero(T(0));
160         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
161         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
162         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
163         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
164         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
165         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
166         D(0, 3) = D(3, 0) = D(0, 4) = D(4, 0) = D(0, 5) = D(5, 0) = zero;
167         D(1, 3) = D(3, 1) = D(1, 4) = D(4, 1) = D(1, 5) = D(5, 1) = zero;
168         D(2, 3) = D(3, 2) = D(2, 4) = D(4, 2) = D(2, 5) = D(5, 2) = zero;
169         D(3, 4) = D(4, 3) = D(3, 5) = D(5, 3) = zero;
170         D(4, 5) = D(5, 4) = zero;
171         D(3, 3) = G;
172         D(4, 4) = G;
173         D(5, 5) = G;
174       }
175 
exetfel::material::computeElasticStiffness176       static void exe(
177           typename tfel::config::Types<3u, T, false>::StiffnessTensor& D,
178           const typename tfel::config::Types<3u, T, false>::stress lambda,
179           const typename tfel::config::Types<3u, T, false>::stress mu) {
180         typedef typename tfel::config::Types<3u, T, false>::stress stress;
181         const stress G = 2 * mu;
182         const stress tmp = lambda + G;
183         constexpr const auto zero = stress(0);
184         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
185         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
186         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
187         D(0, 0) = D(1, 1) = D(2, 2) = tmp;
188         D(0, 1) = D(0, 2) = D(1, 2) = lambda;
189         D(1, 0) = D(2, 0) = D(2, 1) = lambda;
190         D(0, 3) = D(3, 0) = D(0, 4) = D(4, 0) = D(0, 5) = D(5, 0) = zero;
191         D(1, 3) = D(3, 1) = D(1, 4) = D(4, 1) = D(1, 5) = D(5, 1) = zero;
192         D(2, 3) = D(3, 2) = D(2, 4) = D(4, 2) = D(2, 5) = D(5, 2) = zero;
193         D(3, 4) = D(4, 3) = D(3, 5) = D(5, 3) = zero;
194         D(4, 5) = D(5, 4) = zero;
195         D(3, 3) = G;
196         D(4, 4) = G;
197         D(5, 5) = G;
198       }
199     };
200 
201     /*!
202      * \class computeUnalteredElasticStiffness
203      * \brief compute the elastic stiffness given Lame's coefficients
204      * \param N : space dimension
205      * \param T : numerical type
206      * \author Thomas Helfer
207      * \date   12 Sep 2006
208      */
209     template <unsigned short N, typename T>
210     struct computeUnalteredElasticStiffness {
exetfel::material::computeUnalteredElasticStiffness211       static void exe(
212           typename tfel::config::Types<N, T, true>::StiffnessTensor& D,
213           const typename tfel::config::Types<N, T, true>::stress lambda,
214           const typename tfel::config::Types<N, T, true>::stress mu) {
215         computeElasticStiffness<N, T>::exe(D, lambda, mu);
216       }
exetfel::material::computeUnalteredElasticStiffness217       static void exe(
218           typename tfel::config::Types<N, T, false>::StiffnessTensor& D,
219           const typename tfel::config::Types<N, T, false>::stress lambda,
220           const typename tfel::config::Types<N, T, false>::stress mu) {
221         computeElasticStiffness<N, T>::exe(D, lambda, mu);
222       }
223     };
224 
225     /*!
226      * \class computeUnalteredElasticStiffness
227      * \brief compute the elastic stiffness given Lame's coefficients
228      * \param H : modelling hypothesis
229      * \param T : numerical type
230      * \author Thomas Helfer
231      * \date   12 Sep 2006
232      */
233     template <ModellingHypothesis::Hypothesis H, typename T>
234     struct computeAlteredElasticStiffness {
235       static constexpr unsigned short N =
236           ModellingHypothesisToSpaceDimension<H>::value;
exetfel::material::computeAlteredElasticStiffness237       static void exe(
238           typename tfel::config::Types<N, T, true>::StiffnessTensor& D,
239           const typename tfel::config::Types<N, T, true>::stress lambda,
240           const typename tfel::config::Types<N, T, true>::stress mu) {
241         computeElasticStiffness<N, T>::exe(D, lambda, mu);
242       }
exetfel::material::computeAlteredElasticStiffness243       static void exe(
244           typename tfel::config::Types<N, T, false>::StiffnessTensor& D,
245           const typename tfel::config::Types<N, T, false>::stress lambda,
246           const typename tfel::config::Types<N, T, false>::stress mu) {
247         computeElasticStiffness<N, T>::exe(D, lambda, mu);
248       }
249     };  // end of struct computeAlteredElasticStiffness
250 
251     template <typename T>
252     struct computeAlteredElasticStiffness<
253         ModellingHypothesis::AXISYMMETRICALGENERALISEDPLANESTRESS,
254         T> {
exetfel::material::computeAlteredElasticStiffness255       static void exe(
256           typename tfel::config::Types<1u, T, true>::StiffnessTensor& D,
257           const typename tfel::config::Types<1u, T, true>::stress lambda,
258           const typename tfel::config::Types<1u, T, true>::stress mu) {
259         typedef typename tfel::config::Types<1u, T, true>::stress stress;
260         const stress D1 = 4 * mu * (lambda + mu) / (lambda + 2 * mu);
261         const stress D2 = 2 * mu * lambda / (lambda + 2 * mu);
262         D(0, 0) = D1;
263         D(0, 1) = D2;
264         D(1, 0) = D2;
265         D(1, 1) = D1;
266         D(2, 2) = D(0, 2) = D(1, 2) = D(2, 0) = D(2, 1) = stress(T(0));
267       }
exetfel::material::computeAlteredElasticStiffness268       static void exe(
269           typename tfel::config::Types<1u, T, false>::StiffnessTensor& D,
270           const typename tfel::config::Types<1u, T, false>::stress lambda,
271           const typename tfel::config::Types<1u, T, false>::stress mu) {
272         typedef typename tfel::config::Types<1u, T, false>::stress stress;
273         const stress D1 = 4 * mu * (lambda + mu) / (lambda + 2 * mu);
274         const stress D2 = 2 * mu * lambda / (lambda + 2 * mu);
275         D(0, 0) = D1;
276         D(0, 1) = D2;
277         D(1, 0) = D2;
278         D(1, 1) = D1;
279         D(2, 2) = D(0, 2) = D(1, 2) = D(2, 0) = D(2, 1) = stress(T(0));
280       }
281     };  // end of struct computeAlteredElasticStiffness
282 
283     template <typename T>
284     struct computeAlteredElasticStiffness<ModellingHypothesis::PLANESTRESS, T> {
exetfel::material::computeAlteredElasticStiffness285       static void exe(
286           typename tfel::config::Types<2u, T, true>::StiffnessTensor& D,
287           const typename tfel::config::Types<2u, T, true>::stress lambda,
288           const typename tfel::config::Types<2u, T, true>::stress mu) {
289         typedef typename tfel::config::Types<2u, T, true>::stress stress;
290         const stress D1 = 4 * mu * (lambda + mu) / (lambda + 2 * mu);
291         const stress D2 = 2 * mu * lambda / (lambda + 2 * mu);
292         D(0, 0) = D1;
293         D(0, 1) = D2;
294         D(1, 0) = D2;
295         D(1, 1) = D1;
296         D(3, 3) = 2 * mu;
297         D(0, 2) = D(0, 3) = D(1, 2) = D(1, 3) = D(2, 0) = D(2, 1) =
298             stress(T(0));
299         D(2, 2) = D(2, 3) = D(3, 0) = D(3, 1) = D(3, 2) = stress(T(0));
300       }
exetfel::material::computeAlteredElasticStiffness301       static void exe(
302           typename tfel::config::Types<2u, T, false>::StiffnessTensor& D,
303           const typename tfel::config::Types<2u, T, false>::stress lambda,
304           const typename tfel::config::Types<2u, T, false>::stress mu) {
305         typedef typename tfel::config::Types<2u, T, false>::stress stress;
306         const stress D1 = 4 * mu * (lambda + mu) / (lambda + 2 * mu);
307         const stress D2 = 2 * mu * lambda / (lambda + 2 * mu);
308         D(0, 0) = D1;
309         D(0, 1) = D2;
310         D(1, 0) = D2;
311         D(1, 1) = D1;
312         D(3, 3) = 2 * mu;
313         D(0, 2) = D(0, 3) = D(1, 2) = D(1, 3) = D(2, 0) = D(2, 1) =
314             stress(T(0));
315         D(2, 2) = D(2, 3) = D(3, 0) = D(3, 1) = D(3, 2) = stress(T(0));
316       }
317     };  // end of struct computeAlteredElasticStiffness
318 
319   }  // end of namespace material
320 
321 }  // end of namespace tfel
322 
323 #endif /* LIB_TFEL_LAME_HXX */
324