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
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_AlignVectorToCollapsedDir(
344  const int dir,
345  const Array<OneD, const NekDouble> &inarray,
346  Array<OneD, Array<OneD, NekDouble> > &outarray);
347 
348  virtual void v_MassMatrixOp(const Array<OneD, const NekDouble> &inarray,
349  Array<OneD,NekDouble> &outarray,
350  const StdRegions::StdMatrixKey &mkey)
351  {
352  MassMatrixOp(inarray,outarray,mkey);
353  }
354 
356  Array<OneD,NekDouble> &outarray,
357  const StdRegions::StdMatrixKey &mkey)
358  {
359  LaplacianMatrixOp(inarray,outarray,mkey);
360  }
361 
362  virtual void v_LaplacianMatrixOp(const int k1, const int k2,
363  const Array<OneD, const NekDouble> &inarray,
364  Array<OneD,NekDouble> &outarray,
365  const StdRegions::StdMatrixKey &mkey)
366  {
367  LaplacianMatrixOp(k1,k2,inarray,outarray,mkey);
368  }
369 
370  virtual void v_WeakDerivMatrixOp(const int i,
371  const Array<OneD, const NekDouble> &inarray,
372  Array<OneD,NekDouble> &outarray,
373  const StdRegions::StdMatrixKey &mkey)
374  {
375  WeakDerivMatrixOp(i,inarray,outarray,mkey);
376  }
377 
379  Array<OneD,NekDouble> &outarray,
380  const StdRegions::StdMatrixKey &mkey)
381  {
382  HelmholtzMatrixOp(inarray,outarray,mkey);
383  }
384 
385  void v_ComputeTraceNormal(const int edge);
386  };
387 
388  typedef std::shared_ptr<NodalTriExp> NodalTriExpSharedPtr;
389  typedef std::vector< NodalTriExpSharedPtr > NodalTriExpVector;
390 
391  } //end of namespace
392 } //end of namespace
393 
394 #endif // NODALTRIEXP_H
395 
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:250
#define LOCAL_REGIONS_EXPORT
Describes the specification for a Basis.
Definition: Basis.h:50
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: NodalTriExp.h:188
virtual void v_GetCoord(const Array< OneD, const NekDouble > &lcoord, Array< OneD, NekDouble > &coord)
Definition: NodalTriExp.h:209
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:322
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
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Virtual call to SegExp::FwdTrans.
Definition: NodalTriExp.h:286
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:378
void GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords)
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:355
virtual DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey)
Definition: NodalTriExp.h:306
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.
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
DNekMatSharedPtr CreateStdMatrix(const StdRegions::StdMatrixKey &mkey)
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_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:336
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 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 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
void GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3=NullNekDouble1DArray)
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:235
void GeneralMatrixOp_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
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
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
void IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: NodalTriExp.h:189
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...
virtual DNekMatSharedPtr v_GenNBasisTransMatrix()
Definition: NodalTriExp.h:197
void LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:127
DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
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
void IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: NodalTriExp.h:90
NekDouble PhysEvaluate(const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals)
virtual void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:348
NekDouble Integral(const Array< OneD, const NekDouble > &inarray)
Integrate the physical point list inarray over region.
Definition: NodalTriExp.cpp:98
void IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:120
virtual void v_GetNodalPoints(Array< OneD, const NekDouble > &x, Array< OneD, const NekDouble > &y)
Definition: NodalTriExp.h:215
virtual void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:301
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey)
Definition: NodalTriExp.h:317
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
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:362
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
void v_ComputeTraceNormal(const int edge)
void IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)
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 HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:150
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const
virtual void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
Definition: NodalTriExp.h:370
std::shared_ptr< NodalTriExp > NodalTriExpSharedPtr
Definition: NodalTriExp.h:388
std::vector< NodalTriExpSharedPtr > NodalTriExpVector
Definition: NodalTriExp.h:389
std::shared_ptr< TriGeom > TriGeomSharedPtr
Definition: TriGeom.h:58
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:73
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
double NekDouble