LifeV
EvaluationEmult.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_EMULT_HPP
37 #define EVALUTATION_EMULT_HPP
38 
39 
40 #include <lifev/core/LifeV.hpp>
41 
42 #include <lifev/eta/array/OperationSmallEmult.hpp>
43 
44 #include <lifev/eta/expression/ExpressionEmult.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 EvaluationEmult
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 OperationSmallEmult< 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  EvaluationEmult (const EvaluationEmult& 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 EvaluationEmult (const ExpressionEmult<ExpressionL, ExpressionR>& expression)
111  : M_evaluationL (expression.left() ),
112  M_evaluationR (expression.right() )
113  {}
114 
115  //! Destructor
116  ~EvaluationEmult()
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 << " emult ";
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).emult (M_evaluationR.value_q (q) );
187  }
188 
189  //! Getter for the value for a vector
190  return_Type value_qi (const UInt& q, const UInt& i) const
191  {
192  return M_evaluationL.value_qi (q, i).emult (M_evaluationR.value_qi (q, i) );
193  }
194 
195  //! Getter for the value for a matrix
196  return_Type value_qij (const UInt& q, const UInt& i, const UInt& j) const
197  {
198  return M_evaluationL.value_qij (q, i, j).emult (M_evaluationR.value_qij (q, i, j) );
199  }
200 
201  //@}
202 
203 private:
204 
205  //! @name Private Methods
206  //@{
207 
208  //! No default
209  EvaluationEmult();
210 
211  //@}
212 
213  // Internal storage
214  EvaluationLType M_evaluationL;
215  EvaluationRType M_evaluationR;
216 };
217 
218 
219 template< typename EvaluationLType, typename EvaluationRType>
220 const flag_Type EvaluationEmult<EvaluationLType, EvaluationRType>::S_globalUpdateFlag
221  = EvaluationLType::S_globalUpdateFlag | EvaluationRType::S_globalUpdateFlag;
222 
223 template< typename EvaluationLType, typename EvaluationRType>
224 const flag_Type EvaluationEmult<EvaluationLType, EvaluationRType>::S_testUpdateFlag
225  = EvaluationLType::S_testUpdateFlag | EvaluationRType::S_testUpdateFlag;
226 
227 template< typename EvaluationLType, typename EvaluationRType>
228 const flag_Type EvaluationEmult<EvaluationLType, EvaluationRType>::S_solutionUpdateFlag
229  = EvaluationLType::S_solutionUpdateFlag | EvaluationRType::S_solutionUpdateFlag;
230 
231 } // Namespace ExpressionAssembly
232 
233 } // Namespace LifeV
234 #endif
uint32_type flag_Type
bit-flag with up to 32 different flags
Definition: LifeV.hpp:197
class OperationSmallEmult Class containing information about the element-wise multiplication product ...
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