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