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