1 /*!
2  * \file   include/TFEL/Math/ST2toT2/T2toST2ST2toT2ProductExpr.hxx
3  * \brief
4  * \author Thomas Helfer
5  * \date   16 juin 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_MATH_T2TOST2ST2TOT2PRODUCTEXPR_HXX
15 #define LIB_TFEL_MATH_T2TOST2ST2TOT2PRODUCTEXPR_HXX
16 
17 #include"TFEL/Config/TFELConfig.hxx"
18 
19 #include"TFEL/Math/General/EmptyRunTimeProperties.hxx"
20 #include"TFEL/Math/T2toST2/T2toST2Concept.hxx"
21 #include"TFEL/Math/ST2toT2/ST2toT2Concept.hxx"
22 #include"TFEL/Math/ST2toST2/ST2toST2Concept.hxx"
23 
24 namespace tfel
25 {
26 
27   namespace math
28   {
29 
30     //! Empty structure used for partial specialisation of the
31     //! Expr class
32     template<unsigned short N>
33     struct TFEL_VISIBILITY_LOCAL T2toST2ST2toT2ProductExpr
34     {}; // end of struct T2toST2ST2toT2ProductExpr
35 
36 /*!
37  * Partial specialisation
38  */
39 template<typename ST2toST2ResultType>
40 struct TFEL_VISIBILITY_LOCAL Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr<1u> >
41   : public ST2toST2Concept<Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr<1u> > >,
42 	public fsarray<StensorDimeToSize<ST2toST2Traits<ST2toST2ResultType>::dime>::value*
43 		       StensorDimeToSize<ST2toST2Traits<ST2toST2ResultType>::dime>::value,
44 		       typename ST2toST2Traits<ST2toST2ResultType>::NumType>
45 {
46   //! a simple alias
47   typedef EmptyRunTimeProperties RunTimeProperties;
48   //! a simple alias
49   typedef typename ST2toST2Traits<ST2toST2ResultType>::NumType value_type;
50   //! a simple check
51   TFEL_STATIC_ASSERT((ST2toST2Traits<ST2toST2ResultType>::dime==1u));
52   /*!
53    * \param[in] a : first term of the product
54    * \param[in] b : second term of the product
55    */
56   template<typename T2toST2Type,
57 	       typename ST2toT2Type2>
58   TFEL_MATH_INLINE
Exprtfel::math::Expr59   Expr(const T2toST2Type& a,
60 		 const ST2toT2Type2& b)
61   {
62 	//! a simple check
63 	TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toST2Type,T2toST2Concept>::cond));
64 	//! a simple check
65 	TFEL_STATIC_ASSERT((tfel::meta::Implements<ST2toT2Type2,ST2toT2Concept>::cond));
66 	//! a simple check
67 	TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2Type>::dime==1u));
68 	//! a simple check
69 	TFEL_STATIC_ASSERT((ST2toT2Traits <ST2toT2Type2>::dime==1u));
70 this->v[0]=a(0,0)*b(0,0)+a(0,1)*b(1,0)+a(0,2)*b(2,0);
71 this->v[1]=a(0,0)*b(0,1)+a(0,1)*b(1,1)+a(0,2)*b(2,1);
72 this->v[2]=a(0,0)*b(0,2)+a(0,1)*b(1,2)+a(0,2)*b(2,2);
73 this->v[3]=a(1,0)*b(0,0)+a(1,1)*b(1,0)+a(1,2)*b(2,0);
74 this->v[4]=a(1,0)*b(0,1)+a(1,1)*b(1,1)+a(1,2)*b(2,1);
75 this->v[5]=a(1,0)*b(0,2)+a(1,1)*b(1,2)+a(1,2)*b(2,2);
76 this->v[6]=a(2,0)*b(0,0)+a(2,1)*b(1,0)+a(2,2)*b(2,0);
77 this->v[7]=a(2,0)*b(0,1)+a(2,1)*b(1,1)+a(2,2)*b(2,1);
78 this->v[8]=a(2,0)*b(0,2)+a(2,1)*b(1,2)+a(2,2)*b(2,2);
79   } // end of Expr
80   /*!
81    * \brief access operator
82    * \param[in] i : line index
83    * \param[in] j : column index
84    */
85   TFEL_MATH_INLINE const value_type&
operator ()tfel::math::Expr86   operator()(const unsigned short i,
87 		 const unsigned short j) const
88   {
89 	return this->v[i*3+j];
90   } // end of operator()
91   /*!
92    * \return the runtime properties
93    */
94   TFEL_MATH_INLINE RunTimeProperties
getRunTimePropertiestfel::math::Expr95   getRunTimeProperties() const
96   {
97 	return RunTimeProperties();
98   }
99 }; // end of struct Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr>
100 
101 /*!
102  * Partial specialisation
103  */
104 template<typename ST2toST2ResultType>
105 struct TFEL_VISIBILITY_LOCAL Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr<2u> >
106   : public ST2toST2Concept<Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr<2u> > >,
107 	public fsarray<StensorDimeToSize<ST2toST2Traits<ST2toST2ResultType>::dime>::value*
108 		       StensorDimeToSize<ST2toST2Traits<ST2toST2ResultType>::dime>::value,
109 		       typename ST2toST2Traits<ST2toST2ResultType>::NumType>
110 {
111   //! a simple alias
112   typedef EmptyRunTimeProperties RunTimeProperties;
113   //! a simple alias
114   typedef typename ST2toST2Traits<ST2toST2ResultType>::NumType value_type;
115   //! a simple check
116   TFEL_STATIC_ASSERT((ST2toST2Traits<ST2toST2ResultType>::dime==2u));
117   /*!
118    * \param[in] a : first term of the product
119    * \param[in] b : second term of the product
120    */
121   template<typename T2toST2Type,
122 	       typename ST2toT2Type2>
123   TFEL_MATH_INLINE
Exprtfel::math::Expr124   Expr(const T2toST2Type& a,
125 		 const ST2toT2Type2& b)
126   {
127 	//! a simple check
128 	TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toST2Type,T2toST2Concept>::cond));
129 	//! a simple check
130 	TFEL_STATIC_ASSERT((tfel::meta::Implements<ST2toT2Type2,ST2toT2Concept>::cond));
131 	//! a simple check
132 	TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2Type>::dime==2u));
133 	//! a simple check
134 	TFEL_STATIC_ASSERT((ST2toT2Traits <ST2toT2Type2>::dime==2u));
135 this->v[0]=a(0,0)*b(0,0)+a(0,1)*b(1,0)+a(0,2)*b(2,0)+a(0,3)*b(3,0)+a(0,4)*b(4,0);
136 this->v[1]=a(0,0)*b(0,1)+a(0,1)*b(1,1)+a(0,2)*b(2,1)+a(0,3)*b(3,1)+a(0,4)*b(4,1);
137 this->v[2]=a(0,0)*b(0,2)+a(0,1)*b(1,2)+a(0,2)*b(2,2)+a(0,3)*b(3,2)+a(0,4)*b(4,2);
138 this->v[3]=a(0,0)*b(0,3)+a(0,1)*b(1,3)+a(0,2)*b(2,3)+a(0,3)*b(3,3)+a(0,4)*b(4,3);
139 this->v[4]=a(1,0)*b(0,0)+a(1,1)*b(1,0)+a(1,2)*b(2,0)+a(1,3)*b(3,0)+a(1,4)*b(4,0);
140 this->v[5]=a(1,0)*b(0,1)+a(1,1)*b(1,1)+a(1,2)*b(2,1)+a(1,3)*b(3,1)+a(1,4)*b(4,1);
141 this->v[6]=a(1,0)*b(0,2)+a(1,1)*b(1,2)+a(1,2)*b(2,2)+a(1,3)*b(3,2)+a(1,4)*b(4,2);
142 this->v[7]=a(1,0)*b(0,3)+a(1,1)*b(1,3)+a(1,2)*b(2,3)+a(1,3)*b(3,3)+a(1,4)*b(4,3);
143 this->v[8]=a(2,0)*b(0,0)+a(2,1)*b(1,0)+a(2,2)*b(2,0)+a(2,3)*b(3,0)+a(2,4)*b(4,0);
144 this->v[9]=a(2,0)*b(0,1)+a(2,1)*b(1,1)+a(2,2)*b(2,1)+a(2,3)*b(3,1)+a(2,4)*b(4,1);
145 this->v[10]=a(2,0)*b(0,2)+a(2,1)*b(1,2)+a(2,2)*b(2,2)+a(2,3)*b(3,2)+a(2,4)*b(4,2);
146 this->v[11]=a(2,0)*b(0,3)+a(2,1)*b(1,3)+a(2,2)*b(2,3)+a(2,3)*b(3,3)+a(2,4)*b(4,3);
147 this->v[12]=a(3,0)*b(0,0)+a(3,1)*b(1,0)+a(3,2)*b(2,0)+a(3,3)*b(3,0)+a(3,4)*b(4,0);
148 this->v[13]=a(3,0)*b(0,1)+a(3,1)*b(1,1)+a(3,2)*b(2,1)+a(3,3)*b(3,1)+a(3,4)*b(4,1);
149 this->v[14]=a(3,0)*b(0,2)+a(3,1)*b(1,2)+a(3,2)*b(2,2)+a(3,3)*b(3,2)+a(3,4)*b(4,2);
150 this->v[15]=a(3,0)*b(0,3)+a(3,1)*b(1,3)+a(3,2)*b(2,3)+a(3,3)*b(3,3)+a(3,4)*b(4,3);
151   } // end of Expr
152   /*!
153    * \brief access operator
154    * \param[in] i : line index
155    * \param[in] j : column index
156    */
157   TFEL_MATH_INLINE const value_type&
operator ()tfel::math::Expr158   operator()(const unsigned short i,
159 		 const unsigned short j) const
160   {
161 	return this->v[i*4+j];
162   } // end of operator()
163   /*!
164    * \return the runtime properties
165    */
166   TFEL_MATH_INLINE RunTimeProperties
getRunTimePropertiestfel::math::Expr167   getRunTimeProperties() const
168   {
169 	return RunTimeProperties();
170   }
171 }; // end of struct Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr>
172 
173 /*!
174  * Partial specialisation
175  */
176 template<typename ST2toST2ResultType>
177 struct TFEL_VISIBILITY_LOCAL Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr<3u> >
178   : public ST2toST2Concept<Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr<3u> > >,
179 	public fsarray<StensorDimeToSize<ST2toST2Traits<ST2toST2ResultType>::dime>::value*
180 		       StensorDimeToSize<ST2toST2Traits<ST2toST2ResultType>::dime>::value,
181 		       typename ST2toST2Traits<ST2toST2ResultType>::NumType>
182 {
183   //! a simple alias
184   typedef EmptyRunTimeProperties RunTimeProperties;
185   //! a simple alias
186   typedef typename ST2toST2Traits<ST2toST2ResultType>::NumType value_type;
187   //! a simple check
188   TFEL_STATIC_ASSERT((ST2toST2Traits<ST2toST2ResultType>::dime==3u));
189   /*!
190    * \param[in] a : first term of the product
191    * \param[in] b : second term of the product
192    */
193   template<typename T2toST2Type,
194 	       typename ST2toT2Type2>
195   TFEL_MATH_INLINE
Exprtfel::math::Expr196   Expr(const T2toST2Type& a,
197 		 const ST2toT2Type2& b)
198   {
199 	//! a simple check
200 	TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toST2Type,T2toST2Concept>::cond));
201 	//! a simple check
202 	TFEL_STATIC_ASSERT((tfel::meta::Implements<ST2toT2Type2,ST2toT2Concept>::cond));
203 	//! a simple check
204 	TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2Type>::dime==3u));
205 	//! a simple check
206 	TFEL_STATIC_ASSERT((ST2toT2Traits <ST2toT2Type2>::dime==3u));
207 this->v[0]=a(0,0)*b(0,0)+a(0,1)*b(1,0)+a(0,2)*b(2,0)+a(0,3)*b(3,0)+a(0,4)*b(4,0)+a(0,5)*b(5,0)+a(0,6)*b(6,0)+a(0,7)*b(7,0)+a(0,8)*b(8,0);
208 this->v[1]=a(0,0)*b(0,1)+a(0,1)*b(1,1)+a(0,2)*b(2,1)+a(0,3)*b(3,1)+a(0,4)*b(4,1)+a(0,5)*b(5,1)+a(0,6)*b(6,1)+a(0,7)*b(7,1)+a(0,8)*b(8,1);
209 this->v[2]=a(0,0)*b(0,2)+a(0,1)*b(1,2)+a(0,2)*b(2,2)+a(0,3)*b(3,2)+a(0,4)*b(4,2)+a(0,5)*b(5,2)+a(0,6)*b(6,2)+a(0,7)*b(7,2)+a(0,8)*b(8,2);
210 this->v[3]=a(0,0)*b(0,3)+a(0,1)*b(1,3)+a(0,2)*b(2,3)+a(0,3)*b(3,3)+a(0,4)*b(4,3)+a(0,5)*b(5,3)+a(0,6)*b(6,3)+a(0,7)*b(7,3)+a(0,8)*b(8,3);
211 this->v[4]=a(0,0)*b(0,4)+a(0,1)*b(1,4)+a(0,2)*b(2,4)+a(0,3)*b(3,4)+a(0,4)*b(4,4)+a(0,5)*b(5,4)+a(0,6)*b(6,4)+a(0,7)*b(7,4)+a(0,8)*b(8,4);
212 this->v[5]=a(0,0)*b(0,5)+a(0,1)*b(1,5)+a(0,2)*b(2,5)+a(0,3)*b(3,5)+a(0,4)*b(4,5)+a(0,5)*b(5,5)+a(0,6)*b(6,5)+a(0,7)*b(7,5)+a(0,8)*b(8,5);
213 this->v[6]=a(1,0)*b(0,0)+a(1,1)*b(1,0)+a(1,2)*b(2,0)+a(1,3)*b(3,0)+a(1,4)*b(4,0)+a(1,5)*b(5,0)+a(1,6)*b(6,0)+a(1,7)*b(7,0)+a(1,8)*b(8,0);
214 this->v[7]=a(1,0)*b(0,1)+a(1,1)*b(1,1)+a(1,2)*b(2,1)+a(1,3)*b(3,1)+a(1,4)*b(4,1)+a(1,5)*b(5,1)+a(1,6)*b(6,1)+a(1,7)*b(7,1)+a(1,8)*b(8,1);
215 this->v[8]=a(1,0)*b(0,2)+a(1,1)*b(1,2)+a(1,2)*b(2,2)+a(1,3)*b(3,2)+a(1,4)*b(4,2)+a(1,5)*b(5,2)+a(1,6)*b(6,2)+a(1,7)*b(7,2)+a(1,8)*b(8,2);
216 this->v[9]=a(1,0)*b(0,3)+a(1,1)*b(1,3)+a(1,2)*b(2,3)+a(1,3)*b(3,3)+a(1,4)*b(4,3)+a(1,5)*b(5,3)+a(1,6)*b(6,3)+a(1,7)*b(7,3)+a(1,8)*b(8,3);
217 this->v[10]=a(1,0)*b(0,4)+a(1,1)*b(1,4)+a(1,2)*b(2,4)+a(1,3)*b(3,4)+a(1,4)*b(4,4)+a(1,5)*b(5,4)+a(1,6)*b(6,4)+a(1,7)*b(7,4)+a(1,8)*b(8,4);
218 this->v[11]=a(1,0)*b(0,5)+a(1,1)*b(1,5)+a(1,2)*b(2,5)+a(1,3)*b(3,5)+a(1,4)*b(4,5)+a(1,5)*b(5,5)+a(1,6)*b(6,5)+a(1,7)*b(7,5)+a(1,8)*b(8,5);
219 this->v[12]=a(2,0)*b(0,0)+a(2,1)*b(1,0)+a(2,2)*b(2,0)+a(2,3)*b(3,0)+a(2,4)*b(4,0)+a(2,5)*b(5,0)+a(2,6)*b(6,0)+a(2,7)*b(7,0)+a(2,8)*b(8,0);
220 this->v[13]=a(2,0)*b(0,1)+a(2,1)*b(1,1)+a(2,2)*b(2,1)+a(2,3)*b(3,1)+a(2,4)*b(4,1)+a(2,5)*b(5,1)+a(2,6)*b(6,1)+a(2,7)*b(7,1)+a(2,8)*b(8,1);
221 this->v[14]=a(2,0)*b(0,2)+a(2,1)*b(1,2)+a(2,2)*b(2,2)+a(2,3)*b(3,2)+a(2,4)*b(4,2)+a(2,5)*b(5,2)+a(2,6)*b(6,2)+a(2,7)*b(7,2)+a(2,8)*b(8,2);
222 this->v[15]=a(2,0)*b(0,3)+a(2,1)*b(1,3)+a(2,2)*b(2,3)+a(2,3)*b(3,3)+a(2,4)*b(4,3)+a(2,5)*b(5,3)+a(2,6)*b(6,3)+a(2,7)*b(7,3)+a(2,8)*b(8,3);
223 this->v[16]=a(2,0)*b(0,4)+a(2,1)*b(1,4)+a(2,2)*b(2,4)+a(2,3)*b(3,4)+a(2,4)*b(4,4)+a(2,5)*b(5,4)+a(2,6)*b(6,4)+a(2,7)*b(7,4)+a(2,8)*b(8,4);
224 this->v[17]=a(2,0)*b(0,5)+a(2,1)*b(1,5)+a(2,2)*b(2,5)+a(2,3)*b(3,5)+a(2,4)*b(4,5)+a(2,5)*b(5,5)+a(2,6)*b(6,5)+a(2,7)*b(7,5)+a(2,8)*b(8,5);
225 this->v[18]=a(3,0)*b(0,0)+a(3,1)*b(1,0)+a(3,2)*b(2,0)+a(3,3)*b(3,0)+a(3,4)*b(4,0)+a(3,5)*b(5,0)+a(3,6)*b(6,0)+a(3,7)*b(7,0)+a(3,8)*b(8,0);
226 this->v[19]=a(3,0)*b(0,1)+a(3,1)*b(1,1)+a(3,2)*b(2,1)+a(3,3)*b(3,1)+a(3,4)*b(4,1)+a(3,5)*b(5,1)+a(3,6)*b(6,1)+a(3,7)*b(7,1)+a(3,8)*b(8,1);
227 this->v[20]=a(3,0)*b(0,2)+a(3,1)*b(1,2)+a(3,2)*b(2,2)+a(3,3)*b(3,2)+a(3,4)*b(4,2)+a(3,5)*b(5,2)+a(3,6)*b(6,2)+a(3,7)*b(7,2)+a(3,8)*b(8,2);
228 this->v[21]=a(3,0)*b(0,3)+a(3,1)*b(1,3)+a(3,2)*b(2,3)+a(3,3)*b(3,3)+a(3,4)*b(4,3)+a(3,5)*b(5,3)+a(3,6)*b(6,3)+a(3,7)*b(7,3)+a(3,8)*b(8,3);
229 this->v[22]=a(3,0)*b(0,4)+a(3,1)*b(1,4)+a(3,2)*b(2,4)+a(3,3)*b(3,4)+a(3,4)*b(4,4)+a(3,5)*b(5,4)+a(3,6)*b(6,4)+a(3,7)*b(7,4)+a(3,8)*b(8,4);
230 this->v[23]=a(3,0)*b(0,5)+a(3,1)*b(1,5)+a(3,2)*b(2,5)+a(3,3)*b(3,5)+a(3,4)*b(4,5)+a(3,5)*b(5,5)+a(3,6)*b(6,5)+a(3,7)*b(7,5)+a(3,8)*b(8,5);
231 this->v[24]=a(4,0)*b(0,0)+a(4,1)*b(1,0)+a(4,2)*b(2,0)+a(4,3)*b(3,0)+a(4,4)*b(4,0)+a(4,5)*b(5,0)+a(4,6)*b(6,0)+a(4,7)*b(7,0)+a(4,8)*b(8,0);
232 this->v[25]=a(4,0)*b(0,1)+a(4,1)*b(1,1)+a(4,2)*b(2,1)+a(4,3)*b(3,1)+a(4,4)*b(4,1)+a(4,5)*b(5,1)+a(4,6)*b(6,1)+a(4,7)*b(7,1)+a(4,8)*b(8,1);
233 this->v[26]=a(4,0)*b(0,2)+a(4,1)*b(1,2)+a(4,2)*b(2,2)+a(4,3)*b(3,2)+a(4,4)*b(4,2)+a(4,5)*b(5,2)+a(4,6)*b(6,2)+a(4,7)*b(7,2)+a(4,8)*b(8,2);
234 this->v[27]=a(4,0)*b(0,3)+a(4,1)*b(1,3)+a(4,2)*b(2,3)+a(4,3)*b(3,3)+a(4,4)*b(4,3)+a(4,5)*b(5,3)+a(4,6)*b(6,3)+a(4,7)*b(7,3)+a(4,8)*b(8,3);
235 this->v[28]=a(4,0)*b(0,4)+a(4,1)*b(1,4)+a(4,2)*b(2,4)+a(4,3)*b(3,4)+a(4,4)*b(4,4)+a(4,5)*b(5,4)+a(4,6)*b(6,4)+a(4,7)*b(7,4)+a(4,8)*b(8,4);
236 this->v[29]=a(4,0)*b(0,5)+a(4,1)*b(1,5)+a(4,2)*b(2,5)+a(4,3)*b(3,5)+a(4,4)*b(4,5)+a(4,5)*b(5,5)+a(4,6)*b(6,5)+a(4,7)*b(7,5)+a(4,8)*b(8,5);
237 this->v[30]=a(5,0)*b(0,0)+a(5,1)*b(1,0)+a(5,2)*b(2,0)+a(5,3)*b(3,0)+a(5,4)*b(4,0)+a(5,5)*b(5,0)+a(5,6)*b(6,0)+a(5,7)*b(7,0)+a(5,8)*b(8,0);
238 this->v[31]=a(5,0)*b(0,1)+a(5,1)*b(1,1)+a(5,2)*b(2,1)+a(5,3)*b(3,1)+a(5,4)*b(4,1)+a(5,5)*b(5,1)+a(5,6)*b(6,1)+a(5,7)*b(7,1)+a(5,8)*b(8,1);
239 this->v[32]=a(5,0)*b(0,2)+a(5,1)*b(1,2)+a(5,2)*b(2,2)+a(5,3)*b(3,2)+a(5,4)*b(4,2)+a(5,5)*b(5,2)+a(5,6)*b(6,2)+a(5,7)*b(7,2)+a(5,8)*b(8,2);
240 this->v[33]=a(5,0)*b(0,3)+a(5,1)*b(1,3)+a(5,2)*b(2,3)+a(5,3)*b(3,3)+a(5,4)*b(4,3)+a(5,5)*b(5,3)+a(5,6)*b(6,3)+a(5,7)*b(7,3)+a(5,8)*b(8,3);
241 this->v[34]=a(5,0)*b(0,4)+a(5,1)*b(1,4)+a(5,2)*b(2,4)+a(5,3)*b(3,4)+a(5,4)*b(4,4)+a(5,5)*b(5,4)+a(5,6)*b(6,4)+a(5,7)*b(7,4)+a(5,8)*b(8,4);
242 this->v[35]=a(5,0)*b(0,5)+a(5,1)*b(1,5)+a(5,2)*b(2,5)+a(5,3)*b(3,5)+a(5,4)*b(4,5)+a(5,5)*b(5,5)+a(5,6)*b(6,5)+a(5,7)*b(7,5)+a(5,8)*b(8,5);
243   } // end of Expr
244   /*!
245    * \brief access operator
246    * \param[in] i : line index
247    * \param[in] j : column index
248    */
249   TFEL_MATH_INLINE const value_type&
operator ()tfel::math::Expr250   operator()(const unsigned short i,
251 		 const unsigned short j) const
252   {
253 	return this->v[i*6+j];
254   } // end of operator()
255   /*!
256    * \return the runtime properties
257    */
258   TFEL_MATH_INLINE RunTimeProperties
getRunTimePropertiestfel::math::Expr259   getRunTimeProperties() const
260   {
261 	return RunTimeProperties();
262   }
263 }; // end of struct Expr<ST2toST2ResultType,T2toST2ST2toT2ProductExpr>
264 
265 } // end of namespace math
266 
267 } // end of namespace tfel
268 
269 #endif /* LIB_TFEL_MATH_T2TOST2ST2TOT2PRODUCTEXPR_HXX */
270