1 /*!
2  * \file   include/TFEL/Math/T2toST2/T2toST2T2toT2ProductExpr.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_T2TOST2T2TOT2PRODUCTEXPR_HXX
15 #define LIB_TFEL_MATH_T2TOST2T2TOT2PRODUCTEXPR_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/T2toT2/T2toT2Concept.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 T2toST2T2toT2ProductExpr
33     {}; // end of struct T2toST2T2toT2ProductExpr
34 
35     /*!
36      * Partial specialisation
37      */
38     template<typename T2toST2ResultType>
39     struct TFEL_VISIBILITY_LOCAL Expr<T2toST2ResultType,T2toST2T2toT2ProductExpr<1u> >
40       : public T2toST2Concept<Expr<T2toST2ResultType,T2toST2T2toT2ProductExpr<1u> > >,
41 	public fsarray<StensorDimeToSize<T2toST2Traits<T2toST2ResultType>::dime>::value*
42 		       TensorDimeToSize<T2toST2Traits<T2toST2ResultType>::dime>::value,
43 		       typename T2toST2Traits<T2toST2ResultType>::NumType>
44 {
45   //! a simple alias
46   typedef EmptyRunTimeProperties RunTimeProperties;
47   //! a simple alias
48   typedef typename T2toST2Traits<T2toST2ResultType>::NumType value_type;
49   //! a simple check
50   TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2ResultType>::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 T2toST2Type,
56 	   typename T2toT2Type2>
57     TFEL_MATH_INLINE
Exprtfel::math::Expr58     Expr(const T2toST2Type& a,
59 	 const T2toT2Type2& b)
60   {
61     //! a simple check
62     TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toST2Type,tfel::math::T2toST2Concept>::cond));
63     //! a simple check
64     TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toT2Type2,T2toT2Concept>::cond));
65     //! a simple check
66     TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2Type>::dime==1u));
67     //! a simple check
68     TFEL_STATIC_ASSERT((T2toT2Traits <T2toT2Type2>::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<T2toST2ResultType,T2toST2T2toT2ProductExpr>
99 
100   /*!
101    * Partial specialisation
102    */
103   template<typename T2toST2ResultType>
104   struct TFEL_VISIBILITY_LOCAL Expr<T2toST2ResultType,T2toST2T2toT2ProductExpr<2u> >
105     : public T2toST2Concept<Expr<T2toST2ResultType,T2toST2T2toT2ProductExpr<2u> > >,
106       public fsarray<StensorDimeToSize<T2toST2Traits<T2toST2ResultType>::dime>::value*
107 		     TensorDimeToSize<T2toST2Traits<T2toST2ResultType>::dime>::value,
108 		     typename T2toST2Traits<T2toST2ResultType>::NumType>
109 {
110   //! a simple alias
111   typedef EmptyRunTimeProperties RunTimeProperties;
112   //! a simple alias
113   typedef typename T2toST2Traits<T2toST2ResultType>::NumType value_type;
114   //! a simple check
115   TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2ResultType>::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 T2toST2Type,
121 	   typename T2toT2Type2>
122     TFEL_MATH_INLINE
Exprtfel::math::Expr123     Expr(const T2toST2Type& a,
124 	 const T2toT2Type2& b)
125   {
126     //! a simple check
127     TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toST2Type,tfel::math::T2toST2Concept>::cond));
128     //! a simple check
129     TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toT2Type2,T2toT2Concept>::cond));
130     //! a simple check
131     TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2Type>::dime==2u));
132     //! a simple check
133     TFEL_STATIC_ASSERT((T2toT2Traits <T2toT2Type2>::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(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);
139     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);
140     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);
141     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);
142     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);
143     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);
144     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);
145     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);
146     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);
147     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);
148     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);
149     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);
150     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);
151     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);
152     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);
153     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);
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*5+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<T2toST2ResultType,T2toST2T2toT2ProductExpr>
175 
176 /*!
177  * Partial specialisation
178  */
179 template<typename T2toST2ResultType>
180 struct TFEL_VISIBILITY_LOCAL Expr<T2toST2ResultType,T2toST2T2toT2ProductExpr<3u> >
181   : public T2toST2Concept<Expr<T2toST2ResultType,T2toST2T2toT2ProductExpr<3u> > >,
182     public fsarray<StensorDimeToSize<T2toST2Traits<T2toST2ResultType>::dime>::value*
183 		   TensorDimeToSize<T2toST2Traits<T2toST2ResultType>::dime>::value,
184 		   typename T2toST2Traits<T2toST2ResultType>::NumType>
185 {
186   //! a simple alias
187   typedef EmptyRunTimeProperties RunTimeProperties;
188   //! a simple alias
189   typedef typename T2toST2Traits<T2toST2ResultType>::NumType value_type;
190   //! a simple check
191   TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2ResultType>::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 T2toST2Type,
197     typename T2toT2Type2>
198     TFEL_MATH_INLINE
Exprtfel::math::Expr199     Expr(const T2toST2Type& a,
200 	 const T2toT2Type2& b)
201     {
202       //! a simple check
203       TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toST2Type,tfel::math::T2toST2Concept>::cond));
204       //! a simple check
205       TFEL_STATIC_ASSERT((tfel::meta::Implements<T2toT2Type2,T2toT2Concept>::cond));
206       //! a simple check
207       TFEL_STATIC_ASSERT((T2toST2Traits<T2toST2Type>::dime==3u));
208       //! a simple check
209       TFEL_STATIC_ASSERT((T2toT2Traits <T2toT2Type2>::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(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);
217       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);
218       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);
219       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);
220       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);
221       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);
222       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);
223       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);
224       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);
225       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);
226       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);
227       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);
228       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);
229       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);
230       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);
231       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);
232       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);
233       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);
234       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);
235       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);
236       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);
237       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);
238       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);
239       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);
240       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);
241       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);
242       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);
243       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);
244       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);
245       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);
246       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);
247       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);
248       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);
249       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);
250       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);
251       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);
252       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);
253       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);
254       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);
255       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);
256       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);
257       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);
258       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);
259       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);
260       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);
261       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);
262       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);
263       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);
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*9+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<T2toST2ResultType,T2toST2T2toT2ProductExpr>
285 
286 } // end of namespace math
287 
288 } // end of namespace tfel
289 
290 #endif /* LIB_TFEL_MATH_T2TOST2T2TOT2PRODUCTEXPR_HXX */
291