Nektar++
NodalTriExp.h
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File NodalTriExp.h
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining a
14 // copy of this software and associated documentation files (the "Software"),
15 // to deal in the Software without restriction, including without limitation
16 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 // and/or sell copies of the Software, and to permit persons to whom the
18 // Software is furnished to do so, subject to the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be included
21 // in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 // DEALINGS IN THE SOFTWARE.
30 //
31 // Description: Header for NodalTriExp routines
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 #ifndef NODALTRIEXP_H
36 #define NODALTRIEXP_H
37 
38 #include <boost/core/ignore_unused.hpp>
39 
41 #include <SpatialDomains/TriGeom.h>
42 
43 #include <LocalRegions/MatrixKey.h>
46 
47 namespace Nektar
48 {
49  namespace LocalRegions
50  {
51 
52  class NodalTriExp: virtual public StdRegions::StdNodalTriExp, virtual public Expansion2D
53  {
54  public:
55  /** \brief Constructor using BasisKey class for quadrature
56  points and order definition */
58  const LibUtilities::BasisKey &Bb,
59  const LibUtilities::PointsType Ntype,
61 
62  /// Copy Constructor
63  LOCAL_REGIONS_EXPORT NodalTriExp(const NodalTriExp &T);
64 
65  /// Destructor
67 
68 
70  Array<OneD,NekDouble> &coords_2,
73  Array<OneD,NekDouble> &coords);
74 
75  //----------------------------
76  // Integration Methods
77  //----------------------------
78 
79  /// \brief Integrate the physical point list \a inarray over region
81 
82  /** \brief Inner product of \a inarray over region with respect to the
83  expansion basis (this)->_Base[0] and return in \a outarray */
85  Array<OneD, NekDouble> &outarray)
86  {
87  NodalTriExp::IProductWRTBase_SumFac(inarray,outarray);
88  }
89 
90  void IProductWRTDerivBase(const int dir,
91  const Array<OneD, const NekDouble>& inarray,
92  Array<OneD, NekDouble> & outarray)
93  {
94  NodalTriExp::IProductWRTDerivBase_SumFac(dir,inarray,outarray);
95  }
96 
97  //-----------------------------
98  // Differentiation Methods
99  //-----------------------------
100 
102  Array<OneD, NekDouble> &out_d0,
103  Array<OneD, NekDouble> &out_d1,
105 
106  //----------------------------
107  // Evaluations Methods
108  //---------------------------
109 
110  /** \brief Forward transform from physical quadrature space
111  stored in \a inarray and evaluate the expansion coefficients and
112  store in \a (this)->_coeffs */
114  Array<OneD, NekDouble> &outarray);
115 
117  const Array<OneD, const NekDouble> &coord,
118  const Array<OneD, const NekDouble> & physvals);
119 
121  Array<OneD,NekDouble> &outarray,
122  const StdRegions::StdMatrixKey &mkey)
123  {
124  StdExpansion::MassMatrixOp_MatFree(inarray,outarray,mkey);
125  }
126 
128  Array<OneD,NekDouble> &outarray,
129  const StdRegions::StdMatrixKey &mkey)
130  {
131  StdExpansion::LaplacianMatrixOp_MatFree_GenericImpl(inarray,outarray,mkey);
132  }
133 
134  void LaplacianMatrixOp(const int k1, const int k2,
135  const Array<OneD, const NekDouble> &inarray,
136  Array<OneD,NekDouble> &outarray,
137  const StdRegions::StdMatrixKey &mkey)
138  {
139  StdExpansion::LaplacianMatrixOp_MatFree(k1,k2,inarray,outarray,mkey);
140  }
141 
142  void WeakDerivMatrixOp(const int i,
143  const Array<OneD, const NekDouble> &inarray,
144  Array<OneD,NekDouble> &outarray,
145  const StdRegions::StdMatrixKey &mkey)
146  {
147  StdExpansion::WeakDerivMatrixOp_MatFree(i,inarray,outarray,mkey);
148  }
149 
151  Array<OneD,NekDouble> &outarray,
152  const StdRegions::StdMatrixKey &mkey)
153  {
154  StdExpansion::HelmholtzMatrixOp_MatFree_GenericImpl(inarray,outarray,mkey);
155  }
156 
157  protected:
158 
162 
164  Array<OneD, NekDouble> &outarray,
165  bool multiplybyweights = true);
167  Array<OneD, NekDouble> &outarray);
168 
169  void IProductWRTDerivBase_SumFac(const int dir,
170  const Array<OneD, const NekDouble>& inarray,
171  Array<OneD, NekDouble> & outarray);
172  void IProductWRTDerivBase_MatOp(const int dir,
173  const Array<OneD, const NekDouble>& inarray,
174  Array<OneD, NekDouble> & outarray);
175 
176 
178  Array<OneD,NekDouble> &outarray,
179  const StdRegions::StdMatrixKey &mkey);
180 
182 
184 
186 
187  private:
190 
191 
192  //virtual StdRegions::ExpansionType v_DetExpansionType() const
193  //{
194  // return DetExpansionType();
195  //}
196 
198  {
199  return StdNodalTriExp::GenNBasisTransMatrix();
200  }
201 
202  virtual void v_GetCoords(Array<OneD, NekDouble> &coords_0,
205  {
206  GetCoords(coords_0, coords_1, coords_2);
207  }
208 
209  virtual void v_GetCoord(const Array<OneD, const NekDouble> &lcoord,
210  Array<OneD, NekDouble> &coord)
211  {
212  GetCoord(lcoord, coord);
213  }
214 
217  {
218  return StdNodalTriExp::GetNodalPoints(x,y);
219  }
220 
221  /** \brief Virtual call to integrate the physical point list \a inarray
222  over region (see SegExp::Integral) */
224  {
225  return Integral(inarray);
226  }
227 
228  /** \brief Virtual call to TriExp::IProduct_WRT_B */
229  virtual void v_IProductWRTBase(const Array<OneD, const NekDouble> &inarray,
230  Array<OneD, NekDouble> &outarray)
231  {
232  IProductWRTBase(inarray,outarray);
233  }
234 
235  virtual void v_IProductWRTDerivBase (const int dir,
236  const Array<OneD, const NekDouble> &inarray,
237  Array<OneD, NekDouble> &outarray)
238  {
239  IProductWRTDerivBase(dir,inarray,outarray);
240  }
241 
242  virtual void v_StdPhysDeriv(
243  const Array<OneD, const NekDouble> &inarray,
244  Array<OneD, NekDouble> &out_d0,
245  Array<OneD, NekDouble> &out_d1,
247  {
248  StdTriExp::v_PhysDeriv(inarray, out_d0, out_d1, out_d2);
249  }
250 
251  virtual void v_PhysDeriv(const Array<OneD, const NekDouble> &inarray,
252  Array<OneD, NekDouble> &out_d0,
253  Array<OneD, NekDouble> &out_d1,
255  {
256  boost::ignore_unused(out_d2);
257  PhysDeriv(inarray, out_d0, out_d1);
258  }
259 
260  virtual void v_PhysDeriv(const int dir,
261  const Array<OneD, const NekDouble>& inarray,
262  Array<OneD, NekDouble> &outarray)
263  {
265  switch(dir)
266  {
267  case 0:
268  {
269  PhysDeriv(inarray, outarray, tmp);
270  }
271  break;
272  case 1:
273  {
274  PhysDeriv(inarray, tmp, outarray);
275  }
276  break;
277  default:
278  {
279  ASSERTL1(dir >= 0 &&dir < 2,"input dir is out of range");
280  }
281  break;
282  }
283  }
284 
285  /// Virtual call to SegExp::FwdTrans
286  virtual void v_FwdTrans(const Array<OneD, const NekDouble> &inarray,
287  Array<OneD, NekDouble> &outarray)
288  {
289  FwdTrans(inarray,outarray);
290  }
291 
292  /// Virtual call to TriExp::Evaluate
294  const Array<OneD, const NekDouble> &coord,
295  const Array<OneD, const NekDouble> &physvals)
296 
297  {
298  return PhysEvaluate(coord, physvals);
299  }
300 
302  {
303  return CreateStdMatrix(mkey);
304  }
305 
307  {
308  return m_matrixManager[mkey];
309  }
310 
311 // virtual DNekScalMatSharedPtr v_GetLocMatrix(const StdRegions::MatrixType mtype, NekDouble lambdaval, NekDouble tau)
312 // {
313 // MatrixKey mkey(mtype,DetExpansionType(),*this,lambdaval,tau);
314 // return m_matrixManager[mkey];
315 // }
316 
318  {
319  return m_staticCondMatrixManager[mkey];
320  }
321 
322  virtual void v_BwdTrans_SumFac(const Array<OneD, const NekDouble>& inarray,
323  Array<OneD, NekDouble> &outarray)
324  {
325  StdNodalTriExp::v_BwdTrans_SumFac(inarray,outarray);
326  }
327 
329  Array<OneD, NekDouble> &outarray,
330  bool multiplybyweights = true)
331  {
332  boost::ignore_unused(multiplybyweights);
333  IProductWRTBase_SumFac(inarray,outarray);
334  }
335 
336  virtual void v_IProductWRTDerivBase_SumFac(const int dir,
337  const Array<OneD, const NekDouble>& inarray,
338  Array<OneD, NekDouble> &outarray)
339  {
340  IProductWRTDerivBase_SumFac(dir,inarray,outarray);
341  }
342 
343  virtual void v_MassMatrixOp(const Array<OneD, const NekDouble> &inarray,
344  Array<OneD,NekDouble> &outarray,
345  const StdRegions::StdMatrixKey &mkey)
346  {
347  MassMatrixOp(inarray,outarray,mkey);
348  }
349 
351  Array<OneD,NekDouble> &outarray,
352  const StdRegions::StdMatrixKey &mkey)
353  {
354  LaplacianMatrixOp(inarray,outarray,mkey);
355  }
356 
357  virtual void v_LaplacianMatrixOp(const int k1, const int k2,
358  const Array<OneD, const NekDouble> &inarray,
359  Array<OneD,NekDouble> &outarray,
360  const StdRegions::StdMatrixKey &mkey)
361  {
362  LaplacianMatrixOp(k1,k2,inarray,outarray,mkey);
363  }
364 
365  virtual void v_WeakDerivMatrixOp(const int i,
366  const Array<OneD, const NekDouble> &inarray,
367  Array<OneD,NekDouble> &outarray,
368  const StdRegions::StdMatrixKey &mkey)
369  {
370  WeakDerivMatrixOp(i,inarray,outarray,mkey);
371  }
372 
374  Array<OneD,NekDouble> &outarray,
375  const StdRegions::StdMatrixKey &mkey)
376  {
377  HelmholtzMatrixOp(inarray,outarray,mkey);
378  }
379 
380  void v_ComputeEdgeNormal(const int edge);
381  };
382 
383  typedef std::shared_ptr<NodalTriExp> NodalTriExpSharedPtr;
384  typedef std::vector< NodalTriExpSharedPtr > NodalTriExpVector;
385 
386  } //end of namespace
387 } //end of namespace
388 
389 #endif // NODALTRIEXP_H
390 
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Virtual call to SegExp::FwdTrans.
Definition: NodalTriExp.h:286
NodalTriExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::PointsType Ntype, const SpatialDomains::TriGeomSharedPtr &geom)
Constructor using BasisKey class for quadrature points and order definition.
Definition: NodalTriExp.cpp:44
void v_ComputeEdgeNormal(const int edge)
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
void GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords)
void IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:73
void LaplacianMatrixOp(const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:134
void IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Differentiation Methods.
void IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:90
virtual void v_LaplacianMatrixOp(const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:357
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
void GeneralMatrixOp_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
NekDouble PhysEvaluate(const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals)
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:301
std::shared_ptr< NodalTriExp > NodalTriExpSharedPtr
Definition: NodalTriExp.h:383
virtual void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Calculate the derivative of the physical points.
Definition: NodalTriExp.h:251
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: NodalTriExp.h:188
std::vector< NodalTriExpSharedPtr > NodalTriExpVector
Definition: NodalTriExp.h:384
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:350
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:373
std::shared_ptr< TriGeom > TriGeomSharedPtr
Definition: TriGeom.h:58
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const
void WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:142
virtual void v_PhysDeriv(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Calculate the derivative of the physical points in a given direction.
Definition: NodalTriExp.h:260
void IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey)
Definition: NodalTriExp.h:306
virtual void v_GetNodalPoints(Array< OneD, const NekDouble > &x, Array< OneD, const NekDouble > &y)
Definition: NodalTriExp.h:215
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
double NekDouble
void HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:150
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey)
Definition: NodalTriExp.h:317
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:235
virtual void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Definition: NodalTriExp.h:242
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)
virtual void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:365
NekDouble Integral(const Array< OneD, const NekDouble > &inarray)
Integrate the physical point list inarray over region.
Definition: NodalTriExp.cpp:98
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: NodalTriExp.h:189
virtual NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals)
Virtual call to TriExp::Evaluate.
Definition: NodalTriExp.h:293
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:322
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
Definition: NodalTriExp.h:328
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Virtual call to TriExp::IProduct_WRT_B.
Definition: NodalTriExp.h:229
DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
virtual DNekMatSharedPtr v_GenNBasisTransMatrix()
Definition: NodalTriExp.h:197
virtual void v_GetCoord(const Array< OneD, const NekDouble > &lcoord, Array< OneD, NekDouble > &coord)
Definition: NodalTriExp.h:209
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray)
Virtual call to integrate the physical point list inarray over region (see SegExp::Integral) ...
Definition: NodalTriExp.h:223
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_0, Array< OneD, NekDouble > &coords_1=NullNekDouble1DArray, Array< OneD, NekDouble > &coords_2=NullNekDouble1DArray)
Definition: NodalTriExp.h:202
void GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3=NullNekDouble1DArray)
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:120
void LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:127
#define LOCAL_REGIONS_EXPORT
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:336
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Inner product of inarray over region with respect to the expansion basis (this)->_Base[0] and return ...
Definition: NodalTriExp.h:84
Describes the specification for a Basis.
Definition: Basis.h:49
DNekMatSharedPtr CreateStdMatrix(const StdRegions::StdMatrixKey &mkey)
virtual void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:343