LifeV
EvaluationOuterProduct.hpp
Go to the documentation of this file.
1 //@HEADER
2 /*
3 *******************************************************************************
4 
5  Copyright (C) 2004, 2005, 2007 EPFL, Politecnico di Milano, INRIA
6  Copyright (C) 2010 EPFL, Politecnico di Milano, Emory UNiversity
7 
8  This file is part of the LifeV library
9 
10  LifeV is free software; you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation; either version 3 of the License, or
13  (at your option) any later version.
14 
15  LifeV is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public
21  License along with this library; if not, see <http://www.gnu.org/licenses/>
22 
23 
24 *******************************************************************************
25 */
26 //@HEADER
27 
28 /*!
29  * @file
30  @brief This file contains the definition of the EvaluationEmult class.
31 
32  @date 08/2012
33  @author Samuel Quinodoz <samuel.quinodoz@epfl.ch>
34  */
35 
36 #ifndef EVALUTATION_OUTERPRODUCT_HPP
37 #define EVALUTATION_OUTERPRODUCT_HPP
38 
39 
40 #include <lifev/core/LifeV.hpp>
41 
42 #include <lifev/eta/array/OperationSmallOuterProduct.hpp>
43 
44 #include <lifev/eta/expression/ExpressionOuterProduct.hpp>
45 
46 #include <lifev/core/fem/QuadratureRule.hpp>
47 
48 namespace LifeV
49 {
50 
51 namespace ExpressionAssembly
52 {
53 
54 //! Evaluation for the element-wise multiplication between two other Evaluations
55 /*!
56  @author Samuel Quinodoz <samuel.quinodoz@epfl.ch>
57 
58  This class aims at representing an element-wise multiplication during the assembly
59 
60  This class is an Evaluation class, and therefore, has all the methods
61  required to work within the Evaluation trees.
62  */
63 template <typename EvaluationLType, typename EvaluationRType>
64 class EvaluationOuterProduct
65 {
66 public:
67 
68 
69  //! @name Public Types
70  //@{
71 
72  //! Type of the value returned by the left operand
73  typedef typename EvaluationLType::return_Type Lreturn_Type;
74 
75  //! Type of the value returned by the right operand
76  typedef typename EvaluationRType::return_Type Rreturn_Type;
77 
78  //! Type of the value returned by this class
79  typedef typename OperationSmallOuterProduct< Lreturn_Type, Rreturn_Type >::result_Type return_Type;
80 
81  //@}
82 
83 
84  //! @name Static constants
85  //@{
86 
87  //! Flag for the global current FE
88  const static flag_Type S_globalUpdateFlag;
89 
90  //! Flag for the test current FE
91  const static flag_Type S_testUpdateFlag;
92 
93  //! Flag for the solution current FE
94  const static flag_Type S_solutionUpdateFlag;
95 
96  //@}
97 
98 
99  //! @name Constructors, destructor
100  //@{
101 
102  //! Copy constructor
103  EvaluationOuterProduct (const EvaluationOuterProduct& eval)
104  : M_evaluationL (eval.M_evaluationL),
105  M_evaluationR (eval.M_evaluationR)
106  {}
107 
108  //! Constructor from the corresponding expression
109  template< typename ExpressionL, typename ExpressionR>
110  explicit EvaluationOuterProduct (const ExpressionOuterProduct<ExpressionL, ExpressionR>& expression)
111  : M_evaluationL (expression.left() ),
112  M_evaluationR (expression.right() )
113  {}
114 
115  //! Destructor
116  ~EvaluationOuterProduct()
117  {}
118 
119  //@}
120 
121 
122  //! @name Methods
123  //@{
124 
125  //! Internal update method
126  void update (const UInt& iElement)
127  {
128  M_evaluationL.update (iElement);
129  M_evaluationR.update (iElement);
130  }
131 
132  //! Display method
133  static void display (std::ostream& out = std::cout)
134  {
135  EvaluationLType::display (out);
136  out << " outerProduct ";
137  EvaluationRType::display (out);
138  }
139 
140  //@}
141 
142 
143  //! @name Set Methods
144  //@{
145 
146  //! Setter for the global current FE
147  template< typename CFEType >
148  void setGlobalCFE (const CFEType* globalCFE)
149  {
150  M_evaluationL.setGlobalCFE (globalCFE);
151  M_evaluationR.setGlobalCFE (globalCFE);
152  }
153 
154  //! Setter for the test current FE
155  template< typename CFEType >
156  void setTestCFE (const CFEType* testCFE)
157  {
158  M_evaluationL.setTestCFE (testCFE);
159  M_evaluationR.setTestCFE (testCFE);
160  }
161 
162  //! Setter for the solution FE
163  template< typename CFEType >
164  void setSolutionCFE (const CFEType* solutionCFE)
165  {
166  M_evaluationL.setSolutionCFE (solutionCFE);
167  M_evaluationR.setSolutionCFE (solutionCFE);
168  }
169 
170  //! Setter for the quadrature rule
171  void setQuadrature (const QuadratureRule& qr)
172  {
173  M_evaluationL.setQuadrature (qr);
174  M_evaluationR.setQuadrature (qr);
175  }
176 
177  //@}
178 
179 
180  //! @name Get Methods
181  //@{
182 
183  //! Getter for a value
184  return_Type value_q (const UInt& q) const
185  {
186  return M_evaluationL.value_q (q).outerProduct ( M_evaluationR.value_q (q) );
187  //ASSERT ( false , "This method returns only matrices");
188  }
189 
190  //! Getter for the value for a vector
191  return_Type value_qi (const UInt& q, const UInt& i) const
192  {
193  return M_evaluationL.value_qi (q, i).outerProduct ( M_evaluationR.value_qi (q, i) );
194  //ASSERT ( false , "This method returns only matrices");
195 
196  }
197 
198  //! Getter for the value for a matrix
199  return_Type value_qij (const UInt& q, const UInt& i, const UInt& j) const
200  {
201  //ASSERT ( false , "This method is NOT implemented for matrices");
202  return M_evaluationL.value_qij (q, i, j).outerProduct ( M_evaluationR.value_qij (q, i, j) );
203  }
204 
205  //@}
206 
207 private:
208 
209  //! @name Private Methods
210  //@{
211 
212  //! No default
213  EvaluationOuterProduct();
214 
215  //@}
216 
217  // Internal storage
218  EvaluationLType M_evaluationL;
219  EvaluationRType M_evaluationR;
220 };
221 
222 
223 template< typename EvaluationLType, typename EvaluationRType>
224 const flag_Type EvaluationOuterProduct<EvaluationLType, EvaluationRType>::S_globalUpdateFlag
225  = EvaluationLType::S_globalUpdateFlag | EvaluationRType::S_globalUpdateFlag;
226 
227 template< typename EvaluationLType, typename EvaluationRType>
228 const flag_Type EvaluationOuterProduct<EvaluationLType, EvaluationRType>::S_testUpdateFlag
229  = EvaluationLType::S_testUpdateFlag | EvaluationRType::S_testUpdateFlag;
230 
231 template< typename EvaluationLType, typename EvaluationRType>
232 const flag_Type EvaluationOuterProduct<EvaluationLType, EvaluationRType>::S_solutionUpdateFlag
233  = EvaluationLType::S_solutionUpdateFlag | EvaluationRType::S_solutionUpdateFlag;
234 
235 } // Namespace ExpressionAssembly
236 
237 } // Namespace LifeV
238 #endif
uint32_type flag_Type
bit-flag with up to 32 different flags
Definition: LifeV.hpp:197
class OperationSmallOuterProduct Class containing information about the element-wise multiplication p...
void updateInverseJacobian(const UInt &iQuadPt)
QuadratureRule - The basis class for storing and accessing quadrature rules.
uint32_type UInt
generic unsigned integer (used mainly for addressing)
Definition: LifeV.hpp:191