1/*!
2 * \file   StiffnessTensor.ixx
3 * \brief
4 * \author Thomas Helfer
5 * \date   23 oct. 2014
6 * \copyright Copyright (C) 2006-2018 CEA/DEN, EDF R&D. All rights
7 * reserved.
8 * This project is publicly released under either the GNU GPL Licence
9 * or the CECILL-A licence. A copy of thoses licences are delivered
10 * with the sources of TFEL. CEA or EDF may also distribute this
11 * project under specific licensing conditions.
12 */
13
14#ifndef LIB_TFEL_MATERIAL_STIFFNESSTENSORIXX
15#define LIB_TFEL_MATERIAL_STIFFNESSTENSORIXX
16
17#include<algorithm>
18
19namespace tfel{
20
21  namespace material{
22
23    namespace internals{
24
25      template<unsigned short N,StiffnessTensorAlterationCharacteristic smt>
26      struct ComputeIsotropicStiffnessTensorI;
27
28      template<unsigned short N,StiffnessTensorAlterationCharacteristic smt>
29      struct ComputeOrthotropicStiffnessTensorI;
30
31      template<>
32      struct ComputeIsotropicStiffnessTensorI<1u,StiffnessTensorAlterationCharacteristic::UNALTERED>
33      {
34	template<typename StressType,typename RealType>
35	static TFEL_MATERIAL_INLINE void
36	exe(tfel::math::st2tost2<1u,StressType>& C,
37	    const StressType E,const RealType n){
38	  const StressType l   = E*n/((1.-2*n)*(1+n));
39	  const StressType G   = E/(1+n);
40	  const StressType C11 = l+G;
41	  C(0,0)=C11;
42	  C(0,1)=C(0,2)=l;
43	  C(1,1)=C11;
44	  C(1,0)=C(1,2)=l;
45	  C(2,0)=C(2,1)=l;
46	  C(2,2)=C11;
47	}
48      };
49
50      template<>
51      struct ComputeIsotropicStiffnessTensorI<1u,StiffnessTensorAlterationCharacteristic::ALTERED>
52      {
53	template<typename StressType,typename RealType>
54	static TFEL_MATERIAL_INLINE void
55	exe(tfel::math::st2tost2<1u,StressType>& C,
56	    const StressType E,const RealType n)
57
58	{
59	  constexpr const StressType zero = StressType(0);
60	  const StressType C1  = E/(1-n*n);
61	  const StressType C2  = n*C1;
62	  C(0,0)=C1;
63	  C(0,1)=C2;
64	  C(0,2)=C(0,3)=zero;
65	  C(1,0)=C2;
66	  C(1,1)=C1;
67	  C(1,2)=C(1,3)=zero;
68	  C(2,0)=C(2,1)=zero;
69	} // end of struct computeIsotropicPlaneStressAlteredStiffnessTensor
70      };
71
72      template<>
73      struct ComputeIsotropicStiffnessTensorI<2u,StiffnessTensorAlterationCharacteristic::UNALTERED>
74      {
75	template<typename StressType,typename RealType>
76	static TFEL_MATERIAL_INLINE void
77	exe(tfel::math::st2tost2<2u,StressType>& C,
78	    const StressType E,const RealType n)
79	{
80	  constexpr const StressType zero = StressType(0);
81	  const StressType l   = E*n/((1-2*n)*(1+n));
82	  const StressType G   = E/(1+n);
83	  const StressType C11 = l+G;
84	  C(0,0)=C11;
85	  C(0,1)=l;
86	  C(0,2)=l;
87	  C(0,3)=zero;
88	  C(1,0)=l;
89	  C(1,1)=C11;
90	  C(1,2)=l;
91	  C(1,3)=zero;
92	  C(2,0)=l;
93	  C(2,1)=l;
94	  C(2,2)=C11;
95	  C(2,3)=C(3,0)=zero;
96	  C(3,1)=C(3,2)=zero;
97	  C(3,3)=G;
98	}
99      }; // end of struct ComputeIsotropicStiffnessTensorI
100
101
102      template<>
103      struct ComputeIsotropicStiffnessTensorI<2u,StiffnessTensorAlterationCharacteristic::ALTERED>
104      {
105	template<typename StressType,typename RealType>
106	static TFEL_MATERIAL_INLINE void
107	exe(tfel::math::st2tost2<2u,StressType>& C,
108	    const StressType E,const RealType n)
109
110	{
111	  constexpr const StressType zero = StressType(0);
112	  const StressType C1  = E/(1-n*n);
113	  const StressType C2  = n*C1;
114	  const StressType C3  = (1-n)*C1;
115	  C(0,0)=C1;
116	  C(0,1)=C2;
117	  C(0,2)=C(0,3)=zero;
118	  C(1,0)=C2;
119	  C(1,1)=C1;
120	  C(1,2)=C(1,3)=zero;
121	  C(2,0)=C(2,1)=zero;
122	  C(2,2)=C(2,3)=zero;
123	  C(3,0)=C(3,1)=zero;
124	  C(3,2)=zero;
125	  C(3,3)=C3;
126	} // end of struct computeIsotropicPlaneStressAlteredStiffnessTensor
127      };
128
129      template<StiffnessTensorAlterationCharacteristic smt>
130      struct ComputeIsotropicStiffnessTensorI<3u,smt>
131      {
132	template<typename StressType,typename RealType>
133	static TFEL_MATERIAL_INLINE void
134	exe(tfel::math::st2tost2<3u,StressType>& C,
135	    const StressType E,const RealType n)
136	{
137	  constexpr const StressType zero = StressType(0);
138	  const StressType l = E*n/((1-2*n)*(1+n));
139	  const StressType G = E/(1+n);
140	  const StressType C11 = l+G;
141	  C(0,0)=C11;
142	  C(0,1)=C(0,2)=l;
143	  C(0,3)=C(0,4)=C(0,5)=zero;
144	  C(1,0)=C(1,2)=l;
145	  C(1,1)=C11;
146	  C(1,3)=C(1,4)=C(1,5)=zero;
147	  C(2,0)=C(2,1)=l;
148	  C(2,2)=C11;
149	  C(2,3)=C(2,4)=C(2,5)=zero;
150	  C(3,0)=C(3,1)=C(3,2)=zero;
151	  C(3,3)=G;
152	  C(3,4)=C(3,5)=C(4,0)=zero;
153	  C(4,1)=C(4,2)=C(4,3)=zero;
154	  C(4,4)=G;
155	  C(4,5)=C(5,0)=C(5,1)=zero;
156	  C(5,2)=C(5,3)=C(5,4)=zero;
157	  C(5,5)=G;
158	} // end of struct computeStiffnessTensor
159      };
160
161      template<>
162      struct ComputeOrthotropicStiffnessTensorI<1u,StiffnessTensorAlterationCharacteristic::UNALTERED>
163      {
164	template<typename StressType,typename RealType>
165	static TFEL_MATERIAL_INLINE void
166	exe(tfel::math::st2tost2<1u,StressType>& C,
167	    const StressType E1,const StressType E2,const StressType E3,
168	    const RealType n12,const RealType n23,const RealType n13,
169	    const StressType,const StressType,const StressType){
170	  const auto S11=1/E1;
171	  const auto S22=1/E2;
172	  const auto S33=1/E3;
173	  const auto S12=-n12/E1;
174	  const auto S13=-n13/E1;
175	  const auto S23=-n23/E2;
176	  const auto inv_detS=1/(S11*S22*S33+2*S23*S13*S12-S11*S23*S23-S22*S13*S13-S33*S12*S12);
177	  C(0,0)=(S22*S33-S23*S23)*inv_detS;
178	  C(0,1)=(S13*S23-S12*S33)*inv_detS;
179	  C(0,2)=(S12*S23-S13*S22)*inv_detS;
180	  C(1,0)=(S13*S23-S12*S33)*inv_detS;
181	  C(1,1)=(S11*S33-S13*S13)*inv_detS;
182	  C(1,2)=(S12*S13-S11*S23)*inv_detS;
183	  C(2,0)=(S12*S23-S13*S22)*inv_detS;
184	  C(2,1)=(S12*S13-S11*S23)*inv_detS;
185	  C(2,2)=(S11*S22-S12*S12)*inv_detS;
186	}
187      };
188
189      template<>
190      struct ComputeOrthotropicStiffnessTensorI<1u,StiffnessTensorAlterationCharacteristic::ALTERED>
191      {
192	template<typename StressType,typename RealType>
193	static TFEL_MATERIAL_INLINE void
194	exe(tfel::math::st2tost2<1u,StressType>& C,
195	    const StressType E1,const StressType E2,const StressType E3,
196	    const RealType n12,const RealType n23,const RealType n13,
197	    const StressType,const StressType,const StressType)
198	{
199	  const auto S11=1/E1;
200	  const auto S22=1/E2;
201	  const auto S33=1/E3;
202	  const auto S12=-n12/E1;
203	  const auto S13=-n13/E1;
204	  const auto S23=-n23/E2;
205	  const auto inv_detS=1/(S11*S22*S33+2*S23*S13*S12-S11*S23*S23-S22*S13*S13-S33*S12*S12);
206	  const auto C00=(S22*S33-S23*S23)*inv_detS;
207	  const auto C01=(S13*S23-S12*S33)*inv_detS;
208	  const auto C02=(S12*S23-S13*S22)*inv_detS;
209	  const auto C10=(S13*S23-S12*S33)*inv_detS;
210	  const auto C11=(S11*S33-S13*S13)*inv_detS;
211	  const auto C12=(S12*S13-S11*S23)*inv_detS;
212	  const auto C20=(S12*S23-S13*S22)*inv_detS;
213	  const auto C21=(S12*S13-S11*S23)*inv_detS;
214	  const auto C22=(S11*S22-S12*S12)*inv_detS;
215	  const auto tmp20 = C20/C22;
216	  const auto tmp21 = C21/C22;
217	  std::fill(C.begin(),C.end(),StressType(0.));
218	  C(0,0)=C00-C02*tmp20;
219	  C(0,1)=C01-C02*tmp21;
220	  C(1,0)=C10-C12*tmp20;
221	  C(1,1)=C11-C12*tmp21;
222	} // end of exe
223      };
224
225      template<>
226      struct ComputeOrthotropicStiffnessTensorI<2u,StiffnessTensorAlterationCharacteristic::UNALTERED>
227      {
228	template<typename StressType,typename RealType>
229	static TFEL_MATERIAL_INLINE void
230	exe(tfel::math::st2tost2<2u,StressType>& C,
231	    const StressType E1,const StressType E2,const StressType E3,
232	    const RealType n12,const RealType n23,const RealType n13,
233	    const StressType G12,const StressType,const StressType)
234	{
235	  const auto S11=1/E1;
236	  const auto S22=1/E2;
237	  const auto S33=1/E3;
238	  const auto S12=-n12/E1;
239	  const auto S13=-n13/E1;
240	  const auto S23=-n23/E2;
241	  const auto inv_detS=1/(S11*S22*S33+2*S23*S13*S12-S11*S23*S23-S22*S13*S13-S33*S12*S12);
242	  std::fill(C.begin(),C.end(),StressType(0.));
243	  C(0,0)=(S22*S33-S23*S23)*inv_detS;
244	  C(0,1)=(S13*S23-S12*S33)*inv_detS;
245	  C(0,2)=(S12*S23-S13*S22)*inv_detS;
246	  C(1,0)=(S13*S23-S12*S33)*inv_detS;
247	  C(1,1)=(S11*S33-S13*S13)*inv_detS;
248	  C(1,2)=(S12*S13-S11*S23)*inv_detS;
249	  C(2,0)=(S12*S23-S13*S22)*inv_detS;
250	  C(2,1)=(S12*S13-S11*S23)*inv_detS;
251	  C(2,2)=(S11*S22-S12*S12)*inv_detS;
252	  C(3,3)=2*G12;
253	} // end of exe
254      };
255
256      template<>
257      struct ComputeOrthotropicStiffnessTensorI<2u,StiffnessTensorAlterationCharacteristic::ALTERED>
258      {
259	template<typename StressType,typename RealType>
260	static TFEL_MATERIAL_INLINE void
261	exe(tfel::math::st2tost2<2u,StressType>& C,
262	    const StressType E1,const StressType E2,const StressType E3,
263	    const RealType n12,const RealType n23,const RealType n13,
264	    const StressType G12,const StressType,const StressType)
265	{
266	  const auto S11=1/E1;
267	  const auto S22=1/E2;
268	  const auto S33=1/E3;
269	  const auto S12=-n12/E1;
270	  const auto S13=-n13/E1;
271	  const auto S23=-n23/E2;
272	  const auto inv_detS=1/(S11*S22*S33+2*S23*S13*S12-S11*S23*S23-S22*S13*S13-S33*S12*S12);
273	  const auto C00=(S22*S33-S23*S23)*inv_detS;
274	  const auto C01=(S13*S23-S12*S33)*inv_detS;
275	  const auto C02=(S12*S23-S13*S22)*inv_detS;
276	  const auto C10=(S13*S23-S12*S33)*inv_detS;
277	  const auto C11=(S11*S33-S13*S13)*inv_detS;
278	  const auto C12=(S12*S13-S11*S23)*inv_detS;
279	  const auto C20=(S12*S23-S13*S22)*inv_detS;
280	  const auto C21=(S12*S13-S11*S23)*inv_detS;
281	  const auto C22=(S11*S22-S12*S12)*inv_detS;
282	  const auto tmp20 = C20/C22;
283	  const auto tmp21 = C21/C22;
284	  std::fill(C.begin(),C.end(),StressType(0.));
285	  C(0,0)=C00-C02*tmp20;
286	  C(0,1)=C01-C02*tmp21;
287	  C(1,0)=C10-C12*tmp20;
288	  C(1,1)=C11-C12*tmp21;
289	  C(3,3)=2*G12;
290	} // end of exe
291      };
292
293      template<StiffnessTensorAlterationCharacteristic smt>
294      struct ComputeOrthotropicStiffnessTensorI<3u,smt>
295      {
296	template<typename StressType,typename RealType>
297	static TFEL_MATERIAL_INLINE void
298	exe(tfel::math::st2tost2<3u,StressType>& C,
299	    const StressType E1,const StressType E2,const StressType E3,
300	    const RealType n12,const RealType n23,const RealType n13,
301	    const StressType G12,const StressType G23,const StressType G13)
302	{
303	  const auto S11=1/E1;
304	  const auto S22=1/E2;
305	  const auto S33=1/E3;
306	  const auto S12=-n12/E1;
307	  const auto S13=-n13/E1;
308	  const auto S23=-n23/E2;
309	  const auto inv_detS=1/(S11*S22*S33+2*S23*S13*S12-S11*S23*S23-S22*S13*S13-S33*S12*S12);
310	  std::fill(C.begin(),C.end(),StressType(0.));
311	  C(0,0)=(S22*S33-S23*S23)*inv_detS;
312	  C(1,1)=(S11*S33-S13*S13)*inv_detS;
313	  C(2,2)=(S11*S22-S12*S12)*inv_detS;
314	  C(0,1)=C(1,0)=(S13*S23-S12*S33)*inv_detS;
315	  C(0,2)=C(2,0)=(S12*S23-S13*S22)*inv_detS;
316	  C(1,2)=C(2,1)=(S12*S13-S11*S23)*inv_detS;
317	  C(3,3)=2*G12;
318	  C(4,4)=2*G13;
319	  C(5,5)=2*G23;
320	} // end of struct exe
321      };
322
323      template<ModellingHypothesis::Hypothesis H,
324	       StiffnessTensorAlterationCharacteristic>
325      struct ComputeIsotropicStiffnessTensorII
326	: public ComputeIsotropicStiffnessTensorI<ModellingHypothesisToSpaceDimension<H>::value,
327						  StiffnessTensorAlterationCharacteristic::UNALTERED>
328      {};
329
330      template<>
331      struct ComputeIsotropicStiffnessTensorII<ModellingHypothesis::PLANESTRESS,
332					       StiffnessTensorAlterationCharacteristic::ALTERED>
333	: public ComputeIsotropicStiffnessTensorI<2u,StiffnessTensorAlterationCharacteristic::ALTERED>
334      {};
335
336      template<>
337      struct ComputeIsotropicStiffnessTensorII<ModellingHypothesis::AXISYMMETRICALGENERALISEDPLANESTRESS,
338					       StiffnessTensorAlterationCharacteristic::ALTERED>
339	: public ComputeIsotropicStiffnessTensorI<1u,StiffnessTensorAlterationCharacteristic::ALTERED>
340      {};
341
342      template<ModellingHypothesis::Hypothesis H,
343	       StiffnessTensorAlterationCharacteristic smt>
344      struct ComputeOrthotropicStiffnessTensorII
345	: public ComputeOrthotropicStiffnessTensorI<ModellingHypothesisToSpaceDimension<H>::value,
346						    StiffnessTensorAlterationCharacteristic::UNALTERED>
347      {};
348
349      template<>
350      struct ComputeOrthotropicStiffnessTensorII<ModellingHypothesis::PLANESTRESS,
351						 StiffnessTensorAlterationCharacteristic::ALTERED>
352	: public ComputeOrthotropicStiffnessTensorI<2u,StiffnessTensorAlterationCharacteristic::ALTERED>
353      {};
354
355      template<>
356      struct ComputeOrthotropicStiffnessTensorII<ModellingHypothesis::AXISYMMETRICALGENERALISEDPLANESTRESS,
357						 StiffnessTensorAlterationCharacteristic::ALTERED>
358	: public ComputeOrthotropicStiffnessTensorI<1u,StiffnessTensorAlterationCharacteristic::ALTERED>
359      {};
360
361      /*!
362       * \brief class in charge of computing an orthotropic stiffness
363       * tensor according to:
364       * - The modelling hypothesis.
365       * - The choice of computing an altered or unaltered stiffness
366       *   tensor. This parameter is only useful in plane stress
367       *   modelling hypotheses.
368       * - The orthotropic axes convention.
369       * \tparam H: modelling hypothesis
370       * \tparam smt: stiffness matrix alteration choice
371       * \tparam c: orthotropic axis convention
372       */
373      template<ModellingHypothesis::Hypothesis,
374	       StiffnessTensorAlterationCharacteristic,
375	       OrthotropicAxesConvention>
376      struct ComputeOrthotropicStiffnessTensor;
377      /*!
378       * \brief partial specialisation for the
379       * `OrthotropicAxesConvention::DEFAULT` orthotropic axes
380       * convention.
381       * \tparam H: modelling hypothesis
382       * \tparam smt: stiffness matrix alteration choice
383       */
384      template<ModellingHypothesis::Hypothesis H,
385	       StiffnessTensorAlterationCharacteristic smt>
386      struct ComputeOrthotropicStiffnessTensor<H,smt,OrthotropicAxesConvention::DEFAULT>
387	: public ComputeOrthotropicStiffnessTensorII<H,smt>
388      {};
389      /*!
390       * \brief partial specialisation for the
391       * `OrthotropicAxesConvention::PIPE` orthotropic axes
392       * convention.
393       * \tparam H: modelling hypothesis
394       * \tparam smt: stiffness matrix alteration choice
395       */
396      template<ModellingHypothesis::Hypothesis H,
397	       StiffnessTensorAlterationCharacteristic smt>
398      struct ComputeOrthotropicStiffnessTensor<H,smt,OrthotropicAxesConvention::PIPE>
399	: public ComputeOrthotropicStiffnessTensorII<H,smt>
400      {};
401      /*!
402       * \brief partial specialisation for the:
403       * - `ModellingHypothesis::PLANESTRESS` modelling hypothesis.
404       * - `OrthotropicAxesConvention::PIPE` orthotropic axes
405       * convention.
406       * \tparam smt: stiffness matrix alteration choice
407       */
408      template<StiffnessTensorAlterationCharacteristic smt>
409      struct ComputeOrthotropicStiffnessTensor<ModellingHypothesis::PLANESTRESS,
410					       smt,OrthotropicAxesConvention::PIPE>
411      {
412	template<typename StressType,typename RealType>
413	static TFEL_MATERIAL_INLINE void
414	exe(tfel::math::st2tost2<2u,StressType>& C,
415	    const StressType E1, const StressType E2, const StressType E3,
416	    const RealType   n12,const RealType   n23,const RealType   n13,
417	    const StressType G12,const StressType G23,const StressType G13)
418	{
419	  using COST = ComputeOrthotropicStiffnessTensorII<ModellingHypothesis::PLANESTRESS,smt>;
420	  COST::exe(C,E1,E3,E2,
421		    n13,n23*E3/E2,n12,
422		    G13,G23,G12);
423
424	}
425      };
426      /*!
427       * \brief partial specialisation for the:
428       * - `ModellingHypothesis::PLANESTRAIN` modelling hypothesis.
429       * - `OrthotropicAxesConvention::PIPE` orthotropic axes
430       * convention.
431       * \tparam smt: stiffness matrix alteration choice
432       */
433      template<StiffnessTensorAlterationCharacteristic smt>
434      struct ComputeOrthotropicStiffnessTensor<ModellingHypothesis::PLANESTRAIN,
435					       smt,OrthotropicAxesConvention::PIPE>
436      {
437	template<typename StressType,typename RealType>
438	static TFEL_MATERIAL_INLINE void
439	exe(tfel::math::st2tost2<2u,StressType>& C,
440	    const StressType E1, const StressType E2, const StressType E3,
441	    const RealType   n12,const RealType   n23,const RealType   n13,
442	    const StressType G12,const StressType G23,const StressType G13)
443	{
444	  using COST = ComputeOrthotropicStiffnessTensorII<ModellingHypothesis::PLANESTRAIN,smt>;
445	  COST::exe(C,E1,E3,E2,
446		    n13,n23*E3/E2,n12,
447		    G13,G23,G12);
448	}
449      };
450      /*!
451       * \brief partial specialisation for the:
452       * - `ModellingHypothesis::GENERALISEDPLANESTRAIN` modelling
453       *   hypothesis.
454       * - `OrthotropicAxesConvention::PIPE` orthotropic axes
455       * convention.
456       * \tparam smt: stiffness matrix alteration choice
457       */
458      template<StiffnessTensorAlterationCharacteristic smt>
459      struct ComputeOrthotropicStiffnessTensor<ModellingHypothesis::GENERALISEDPLANESTRAIN,
460					       smt,OrthotropicAxesConvention::PIPE>
461      {
462	template<typename StressType,typename RealType>
463	static TFEL_MATERIAL_INLINE void
464	exe(tfel::math::st2tost2<2u,StressType>& C,
465	    const StressType E1, const StressType E2, const StressType E3,
466	    const RealType   n12,const RealType   n23,const RealType   n13,
467	    const StressType G12,const StressType G23,const StressType G13)
468	{
469	  using COST =
470	    ComputeOrthotropicStiffnessTensorII<ModellingHypothesis::GENERALISEDPLANESTRAIN,smt>;
471	  COST::exe(C,E1,E3,E2,
472		    n13,n23*E3/E2,n12,
473		    G13,G23,G12);
474	}
475      };
476
477    } // end of namespace internals
478
479    template<ModellingHypothesis::Hypothesis H>
480    template<typename StressType>
481    void
482    ComputeAlteredStiffnessTensor<H>::exe(tfel::math::st2tost2<ModellingHypothesisToSpaceDimension<H>::value,StressType>& Da,
483					  const tfel::math::st2tost2<ModellingHypothesisToSpaceDimension<H>::value,StressType>& D)
484    {
485      Da = D;
486    }
487
488    template<typename StressType>
489    void
490    ComputeAlteredStiffnessTensor<ModellingHypothesis::PLANESTRESS>::exe(tfel::math::st2tost2<2u,StressType>& Da,
491									 const tfel::math::st2tost2<2u,StressType>& D)
492    {
493      Da(0,0)=D(0,0)-D(2,0)/D(2,2)*D(0,2);
494      Da(0,1)=D(0,1)-D(2,1)/D(2,2)*D(0,2);
495      Da(1,0)=D(1,0)-D(2,0)/D(2,2)*D(1,2);
496      Da(1,1)=D(1,1)-D(2,1)/D(2,2)*D(1,2);
497      Da(0,2)=StressType(0);
498      Da(1,2)=StressType(0);
499      Da(2,0)=StressType(0);
500      Da(2,1)=StressType(0);
501      Da(2,2)=StressType(0);
502      Da(0,3)=StressType(0);
503      Da(1,3)=StressType(0);
504      Da(2,3)=StressType(0);
505      Da(3,0)=StressType(0);
506      Da(3,1)=StressType(0);
507      Da(3,2)=StressType(0);
508      Da(3,3)=D(3,3);
509    } // end of computeAlteredStiffnessTensor
510
511    template<unsigned short N,StiffnessTensorAlterationCharacteristic smt,
512	     typename StressType,typename RealType>
513    void computeIsotropicStiffnessTensorII(tfel::math::st2tost2<N,StressType>& C,
514					   const StressType E,
515					   const RealType n)
516    {
517      tfel::material::internals::ComputeIsotropicStiffnessTensorI<N,smt>::exe(C,E,n);
518    }
519
520    template<unsigned short N,StiffnessTensorAlterationCharacteristic smt,
521	     typename StressType,typename RealType>
522    void computeOrthotropicStiffnessTensorII(tfel::math::st2tost2<N,StressType>& C,
523					     const StressType E1,const StressType E2,const StressType E3,
524					     const RealType n12,const RealType n23,const RealType n13,
525					     const StressType G12,const StressType G23,const StressType G13)
526    {
527      tfel::material::internals::ComputeOrthotropicStiffnessTensorI<N,smt>::exe(C,E1,E2,E3,
528										n12,n23,n13,
529										G12,G23,G13);
530    }
531
532    template<ModellingHypothesis::Hypothesis H,StiffnessTensorAlterationCharacteristic smt,
533	     typename StressType,typename RealType>
534    void computeIsotropicStiffnessTensor(tfel::math::st2tost2<ModellingHypothesisToSpaceDimension<H>::value,StressType>& C,
535					 const StressType E,
536					 const RealType n)
537    {
538      tfel::material::internals::ComputeIsotropicStiffnessTensorII<H,smt>::exe(C,E,n);
539    }
540
541    template<ModellingHypothesis::Hypothesis H,StiffnessTensorAlterationCharacteristic smt,
542	     typename StressType,typename RealType>
543    void computeOrthotropicStiffnessTensor(tfel::math::st2tost2<ModellingHypothesisToSpaceDimension<H>::value,StressType>& C,
544					   const StressType E1,const StressType E2,const StressType E3,
545					   const RealType n12,const RealType n23,const RealType n13,
546					   const StressType G12,const StressType G23,const StressType G13)
547    {
548      tfel::material::internals::ComputeOrthotropicStiffnessTensorII<H,smt>::exe(C,E1,E2,E3,
549										 n12,n23,n13,
550										 G12,G23,G13);
551    }
552
553    template<ModellingHypothesis::Hypothesis H,
554	     StiffnessTensorAlterationCharacteristic smt,
555	     OrthotropicAxesConvention c,
556	     typename StressType,typename RealType>
557    void computeOrthotropicStiffnessTensor(tfel::math::st2tost2<ModellingHypothesisToSpaceDimension<H>::value,StressType>& C,
558					   const StressType E1, const StressType E2, const StressType E3,
559					   const RealType   n12,const RealType   n23,const RealType n13,
560					   const StressType G12,const StressType G23,const StressType G13)
561    {
562      internals::ComputeOrthotropicStiffnessTensor<H,smt,c>::exe(C,E1,E2,E3,
563								 n12,n23,n13,
564								 G12,G23,G13);
565    }
566
567  } // end of namespace material
568
569} // end of namespace tfel
570
571#endif /* LIB_TFEL_MATERIAL_STIFFNESSTENSORIXX */
572