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