Nektar++
StdSegExp.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: StdSegExp.cpp
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: Routines within Standard Segment Expansions
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 #include <boost/core/ignore_unused.hpp>
36 
38 #include <StdRegions/StdSegExp.h>
39 
40 using namespace std;
41 
42 namespace Nektar
43 {
44 namespace StdRegions
45 {
46 /** \brief defult constructor */
47 StdSegExp::StdSegExp()
48 {
49 }
50 
51 /** \brief Constructor using BasisKey class for quadrature points and
52  * order definition
53  *
54  * \param Ba BasisKey class definition containing order and quadrature
55  * points.
56  */
57 StdSegExp::StdSegExp(const LibUtilities::BasisKey &Ba)
58  : StdExpansion(Ba.GetNumModes(), 1, Ba),
59  StdExpansion1D(Ba.GetNumModes(), Ba)
60 {
61 }
62 
63 /** \brief Copy Constructor */
65 {
66 }
67 
68 /** \brief Destructor */
70 {
71 }
72 
73 /** \brief Return Shape of region, using ShapeType enum list.
74  * i.e. Segment
75  */
77 {
79 }
80 
82 {
83 
84  bool returnval = false;
85 
87  {
88  returnval = true;
89  }
90 
92  {
93  returnval = true;
94  }
95 
96  return returnval;
97 }
98 
99 //---------------------------------------------------------------------
100 // Integration Methods
101 //---------------------------------------------------------------------
102 
103 /** \brief Integrate the physical point list \a inarray over region
104  * and return the value
105  *
106  * \param inarray definition of function to be integrated evauluated at
107  * quadrature point of expansion.
108  * \return returns \f$\int^1_{-1} u(\xi_1)d \xi_1 \f$ where \f$inarray[i]
109  * = u(\xi_{1i}) \f$
110  */
112 {
113  NekDouble Int = 0.0;
114  int nquad0 = m_base[0]->GetNumPoints();
115  Array<OneD, NekDouble> tmp(nquad0);
116  Array<OneD, const NekDouble> z = m_base[0]->GetZ();
117  Array<OneD, const NekDouble> w0 = m_base[0]->GetW();
118 
119  // multiply by integration constants
120  Vmath::Vmul(nquad0, inarray, 1, w0, 1, tmp, 1);
121 
122  Int = Vmath::Vsum(nquad0, tmp, 1);
123 
124  return Int;
125 }
126 
127 //---------------------------------------------------------------------
128 // Differentiation Methods
129 //---------------------------------------------------------------------
130 
131 /** \brief Evaluate the derivative \f$ d/d{\xi_1} \f$ at the physical
132  * quadrature points given by \a inarray and return in \a outarray.
133  *
134  * This is a wrapper around StdExpansion1D::Tensor_Deriv
135  * \param inarray array of a function evaluated at the quadrature points
136  * \param outarray the resulting array of the derivative \f$
137  * du/d_{\xi_1}|_{\xi_{1i}} \f$ will be stored in the array \a outarra
138  */
139 
141  Array<OneD, NekDouble> &out_d0,
142  Array<OneD, NekDouble> &out_d1,
143  Array<OneD, NekDouble> &out_d2)
144 {
145  boost::ignore_unused(out_d1, out_d2);
146  PhysTensorDeriv(inarray, out_d0);
147 }
148 
149 void StdSegExp::v_PhysDeriv(const int dir,
150  const Array<OneD, const NekDouble> &inarray,
151  Array<OneD, NekDouble> &outarray)
152 {
153  boost::ignore_unused(dir);
154  ASSERTL1(dir == 0, "input dir is out of range");
155  PhysTensorDeriv(inarray, outarray);
156  // PhysDeriv(inarray, outarray);
157 }
158 
160  Array<OneD, NekDouble> &out_d0,
161  Array<OneD, NekDouble> &out_d1,
162  Array<OneD, NekDouble> &out_d2)
163 {
164  boost::ignore_unused(out_d1, out_d2);
165  PhysTensorDeriv(inarray, out_d0);
166  // PhysDeriv(inarray, out_d0);
167 }
168 
169 void StdSegExp::v_StdPhysDeriv(const int dir,
170  const Array<OneD, const NekDouble> &inarray,
171  Array<OneD, NekDouble> &outarray)
172 {
173  boost::ignore_unused(dir);
174  ASSERTL1(dir == 0, "input dir is out of range");
175  PhysTensorDeriv(inarray, outarray);
176  // PhysDeriv(inarray, outarray);
177 }
178 
179 //---------------------------------------------------------------------
180 // Transforms
181 //---------------------------------------------------------------------
182 
183 /** \brief Backward transform from coefficient space given
184  * in \a inarray and evaluate at the physical quadrature
185  * points \a outarray
186  *
187  * Operation can be evaluated as \f$ u(\xi_{1i}) =
188  * \sum_{p=0}^{order-1} \hat{u}_p \phi_p(\xi_{1i}) \f$ or equivalently
189  * \f$ {\bf u} = {\bf B}^T {\bf \hat{u}} \f$ where
190  * \f${\bf B}[i][j] = \phi_i(\xi_{1j}), \mbox{\_coeffs}[p] = {\bf
191  * \hat{u}}[p] \f$
192  *
193  * The function takes the coefficient array \a inarray as
194  * input for the transformation
195  *
196  * \param inarray: the coeffficients of the expansion
197  *
198  * \param outarray: the resulting array of the values of the function at
199  * the physical quadrature points will be stored in the array \a outarray
200  */
201 
203  Array<OneD, NekDouble> &outarray)
204 {
205  int nquad = m_base[0]->GetNumPoints();
206 
207  if (m_base[0]->Collocation())
208  {
209  Vmath::Vcopy(nquad, inarray, 1, outarray, 1);
210  }
211  else
212  {
213 
214  Blas::Dgemv('N', nquad, m_base[0]->GetNumModes(), 1.0,
215  (m_base[0]->GetBdata()).get(), nquad, &inarray[0], 1, 0.0,
216  &outarray[0], 1);
217  }
218 }
219 
221  const Array<OneD, const NekDouble> &inarray,
222  Array<OneD, NekDouble> &outarray)
223 {
224  int n_coeffs = inarray.size();
225 
226  Array<OneD, NekDouble> coeff(n_coeffs);
227  Array<OneD, NekDouble> coeff_tmp(n_coeffs, 0.0);
230 
231  int nmodes0 = m_base[0]->GetNumModes();
232 
233  Vmath::Vcopy(n_coeffs, inarray, 1, coeff_tmp, 1);
234 
235  const LibUtilities::PointsKey Pkey0(nmodes0,
237 
238  LibUtilities::BasisKey b0(m_base[0]->GetBasisType(), nmodes0, Pkey0);
239 
240  LibUtilities::BasisKey bortho0(LibUtilities::eOrtho_A, nmodes0, Pkey0);
241 
242  LibUtilities::InterpCoeff1D(b0, coeff_tmp, bortho0, coeff);
243 
244  Vmath::Zero(n_coeffs, coeff_tmp, 1);
245 
246  Vmath::Vcopy(numMin, tmp = coeff, 1, tmp2 = coeff_tmp, 1);
247 
248  LibUtilities::InterpCoeff1D(bortho0, coeff_tmp, b0, outarray);
249 }
250 
251 /**
252  * \brief Forward transform from physical quadrature space stored in \a
253  * inarray and evaluate the expansion coefficients and store in \a
254  * outarray
255  *
256  * Perform a forward transform using a Galerkin projection by taking the
257  * inner product of the physical points and multiplying by the inverse
258  * of the mass matrix using the Solve method of the standard matrix
259  * container holding the local mass matrix, i.e. \f$ {\bf \hat{u}} =
260  * {\bf M}^{-1} {\bf I} \f$ where \f$ {\bf I}[p] = \int^1_{-1}
261  * \phi_p(\xi_1) u(\xi_1) d\xi_1 \f$
262  *
263  * This function stores the expansion coefficients calculated by the
264  * transformation in the coefficient space array \a outarray
265  *
266  * \param inarray: array of physical quadrature points to be transformed
267  * \param outarray: the coeffficients of the expansion
268  */
270  Array<OneD, NekDouble> &outarray)
271 {
272  if (m_base[0]->Collocation())
273  {
274  Vmath::Vcopy(m_ncoeffs, inarray, 1, outarray, 1);
275  }
276  else
277  {
278  v_IProductWRTBase(inarray, outarray);
279 
280  // get Mass matrix inverse
281  StdMatrixKey masskey(eInvMass, v_DetShapeType(), *this);
282  DNekMatSharedPtr matsys = GetStdMatrix(masskey);
283 
284  NekVector<NekDouble> in(m_ncoeffs, outarray, eCopy);
285  NekVector<NekDouble> out(m_ncoeffs, outarray, eWrapper);
286 
287  out = (*matsys) * in;
288  }
289 }
290 
292  const Array<OneD, const NekDouble> &inarray,
293  Array<OneD, NekDouble> &outarray)
294 {
295  if (m_base[0]->Collocation())
296  {
297  Vmath::Vcopy(m_ncoeffs, inarray, 1, outarray, 1);
298  }
299  else
300  {
301  int nInteriorDofs = m_ncoeffs - 2;
302  int offset = 0;
303 
304  switch (m_base[0]->GetBasisType())
305  {
307  {
308  offset = 1;
309  }
310  break;
312  {
313  nInteriorDofs = m_ncoeffs;
314  offset = 0;
315  }
316  break;
319  {
320  offset = 2;
321  }
322  break;
323  default:
324  ASSERTL0(false, "This type of FwdTrans is not defined for this "
325  "expansion type");
326  }
327 
328  fill(outarray.get(), outarray.get() + m_ncoeffs, 0.0);
329 
331  {
332  outarray[GetVertexMap(0)] = inarray[0];
333  outarray[GetVertexMap(1)] = inarray[m_base[0]->GetNumPoints() - 1];
334 
335  if (m_ncoeffs > 2)
336  {
337  // ideally, we would like to have tmp0 to be replaced by
338  // outarray (currently MassMatrixOp does not allow aliasing)
341 
342  StdMatrixKey masskey(eMass, v_DetShapeType(), *this);
343  MassMatrixOp(outarray, tmp0, masskey);
344  v_IProductWRTBase(inarray, tmp1);
345 
346  Vmath::Vsub(m_ncoeffs, tmp1, 1, tmp0, 1, tmp1, 1);
347 
348  // get Mass matrix inverse (only of interior DOF)
349  DNekMatSharedPtr matsys =
350  (m_stdStaticCondMatrixManager[masskey])->GetBlock(1, 1);
351 
352  Blas::Dgemv('N', nInteriorDofs, nInteriorDofs, 1.0,
353  &(matsys->GetPtr())[0], nInteriorDofs,
354  tmp1.get() + offset, 1, 0.0,
355  outarray.get() + offset, 1);
356  }
357  }
358  else
359  {
360  StdSegExp::v_FwdTrans(inarray, outarray);
361  }
362  }
363 }
364 
366  Array<OneD, NekDouble> &outarray)
367 {
368  v_BwdTrans(inarray, outarray);
369 }
370 
371 //---------------------------------------------------------------------
372 // Inner product functions
373 //---------------------------------------------------------------------
374 
375 /** \brief Inner product of \a inarray over region with respect to
376  * expansion basis \a base and return in \a outarray
377  *
378  * Calculate \f$ I[p] = \int^{1}_{-1} \phi_p(\xi_1) u(\xi_1) d\xi_1
379  * = \sum_{i=0}^{nq-1} \phi_p(\xi_{1i}) u(\xi_{1i}) w_i \f$ where
380  * \f$ outarray[p] = I[p], inarray[i] = u(\xi_{1i}), base[p*nq+i] =
381  * \phi_p(\xi_{1i}) \f$.
382  *
383  * \param base an array defining the local basis for the inner product
384  * usually passed from Basis->GetBdata() or Basis->GetDbdata()
385  * \param inarray: physical point array of function to be integrated
386  * \f$ u(\xi_1) \f$
387  * \param coll_check flag to identify when a Basis->Collocation() call
388  * should be performed to see if this is a GLL_Lagrange basis with a
389  * collocation property. (should be set to 0 if taking the inner
390  * product with respect to the derivative of basis)
391  * \param outarray the values of the inner product with respect to
392  * each basis over region will be stored in the array \a outarray as
393  * output of the function
394  */
395 
397  const Array<OneD, const NekDouble> &inarray,
398  Array<OneD, NekDouble> &outarray,
399  int coll_check)
400 {
401  boost::ignore_unused(coll_check);
402 
403  int nquad = m_base[0]->GetNumPoints();
404  Array<OneD, NekDouble> tmp(nquad);
405  Array<OneD, const NekDouble> w = m_base[0]->GetW();
406 
407  Vmath::Vmul(nquad, inarray, 1, w, 1, tmp, 1);
408 
409  /* Comment below was a bug for collocated basis
410  if(coll_check&&m_base[0]->Collocation())
411  {
412  Vmath::Vcopy(nquad, tmp, 1, outarray, 1);
413  }
414  else
415  {
416  Blas::Dgemv('T',nquad,m_ncoeffs,1.0,base.get(),nquad,
417  &tmp[0],1,0.0,outarray.get(),1);
418  }*/
419 
420  // Correct implementation
421  Blas::Dgemv('T', nquad, m_ncoeffs, 1.0, base.get(), nquad, &tmp[0], 1, 0.0,
422  outarray.get(), 1);
423 }
424 
425 /** \brief Inner product of \a inarray over region with respect to the
426  * expansion basis (this)->m_base[0] and return in \a outarray
427  *
428  * Wrapper call to StdSegExp::IProductWRTBase
429  * \param inarray array of function values evaluated at the physical
430  * collocation points
431  * \param outarray the values of the inner product with respect to
432  * each basis over region will be stored in the array \a outarray as
433  * output of the function
434  */
436  Array<OneD, NekDouble> &outarray)
437 {
438  v_IProductWRTBase(m_base[0]->GetBdata(), inarray, outarray, 1);
439 }
440 
442  const int dir, const Array<OneD, const NekDouble> &inarray,
443  Array<OneD, NekDouble> &outarray)
444 {
445  StdSegExp::IProductWRTDerivBase_SumFac(dir, inarray, outarray);
446 }
447 
449  const int dir, const Array<OneD, const NekDouble> &inarray,
450  Array<OneD, NekDouble> &outarray)
451 {
452  boost::ignore_unused(dir);
453  ASSERTL1(dir == 0, "input dir is out of range");
454  StdSegExp::v_IProductWRTBase(m_base[0]->GetDbdata(), inarray, outarray, 1);
455 }
456 
458  const Array<OneD, const NekDouble> &inarray,
459  Array<OneD, NekDouble> &outarray, bool multiplybyweights)
460 {
461  int nquad = m_base[0]->GetNumPoints();
462  Array<OneD, NekDouble> tmp(nquad);
463  Array<OneD, const NekDouble> w = m_base[0]->GetW();
464  Array<OneD, const NekDouble> base = m_base[0]->GetBdata();
465 
466  if (multiplybyweights)
467  {
468  Vmath::Vmul(nquad, inarray, 1, w, 1, tmp, 1);
469 
470  Blas::Dgemv('T', nquad, m_ncoeffs, 1.0, base.get(), nquad, &tmp[0], 1,
471  0.0, outarray.get(), 1);
472  }
473  else
474  {
475  Blas::Dgemv('T', nquad, m_ncoeffs, 1.0, base.get(), nquad, &inarray[0],
476  1, 0.0, outarray.get(), 1);
477  }
478 }
479 
480 //----------------------------
481 // Evaluation
482 //----------------------------
485 {
486  eta[0] = xi[0];
487 }
488 
491 {
492  xi[0] = eta[0];
493 }
494 
495 void StdSegExp::v_FillMode(const int mode, Array<OneD, NekDouble> &outarray)
496 {
497  int nquad = m_base[0]->GetNumPoints();
498  const NekDouble *base = m_base[0]->GetBdata().get();
499 
500  ASSERTL2(mode <= m_ncoeffs,
501  "calling argument mode is larger than total expansion order");
502 
503  Vmath::Vcopy(nquad, (NekDouble *)base + mode * nquad, 1, &outarray[0], 1);
504 }
505 
507  const Array<OneD, const NekDouble> &coords, int mode)
508 {
509  return StdExpansion::BaryEvaluateBasis<0>(coords[0], mode);
510 }
511 
513  Array<OneD, NekDouble> &outarray,
514  const StdMatrixKey &mkey)
515 {
516  boost::ignore_unused(mkey);
517 
518  int nquad = m_base[0]->GetNumPoints();
519 
520  Array<OneD, NekDouble> physValues(nquad);
521  Array<OneD, NekDouble> dPhysValuesdx(nquad);
522 
523  v_BwdTrans(inarray, physValues);
524 
525  // Laplacian matrix operation
526  v_PhysDeriv(physValues, dPhysValuesdx);
527  v_IProductWRTBase(m_base[0]->GetDbdata(), dPhysValuesdx, outarray, 1);
528 }
529 
531  Array<OneD, NekDouble> &outarray,
532  const StdMatrixKey &mkey)
533 {
534  int nquad = m_base[0]->GetNumPoints();
535 
536  Array<OneD, NekDouble> physValues(nquad);
537  Array<OneD, NekDouble> dPhysValuesdx(nquad);
539 
540  v_BwdTrans(inarray, physValues);
541 
542  // mass matrix operation
543  v_IProductWRTBase((m_base[0]->GetBdata()), physValues, wsp, 1);
544 
545  // Laplacian matrix operation
546  v_PhysDeriv(physValues, dPhysValuesdx);
547  v_IProductWRTBase(m_base[0]->GetDbdata(), dPhysValuesdx, outarray, 1);
548  Blas::Daxpy(m_ncoeffs, mkey.GetConstFactor(eFactorLambda), wsp.get(), 1,
549  outarray.get(), 1);
550 }
551 
553  const StdMatrixKey &mkey)
554 {
555  // Generate an orthogonal expansion
556  int nq = m_base[0]->GetNumPoints();
557  int nmodes = m_base[0]->GetNumModes();
558  // Declare orthogonal basis.
560 
562  StdSegExp OrthoExp(B);
563 
564  // SVV parameters loaded from the .xml case file
565  NekDouble SvvDiffCoeff = mkey.GetConstFactor(eFactorSVVDiffCoeff);
566  int cutoff = (int)(mkey.GetConstFactor(eFactorSVVCutoffRatio)) * nmodes;
567 
568  Array<OneD, NekDouble> orthocoeffs(OrthoExp.GetNcoeffs());
569 
570  // project onto modal space.
571  OrthoExp.FwdTrans(array, orthocoeffs);
572 
573  //
574  for (int j = 0; j < nmodes; ++j)
575  {
576  if (j >= cutoff) // to filter out only the "high-modes"
577  {
578  orthocoeffs[j] *=
579  (SvvDiffCoeff *
580  exp(-(j - nmodes) * (j - nmodes) /
581  ((NekDouble)((j - cutoff + 1) * (j - cutoff + 1)))));
582  }
583  else
584  {
585  orthocoeffs[j] *= 0.0;
586  }
587  }
588 
589  // backward transform to physical space
590  OrthoExp.BwdTrans(orthocoeffs, array);
591 }
592 
594  const NekDouble alpha,
595  const NekDouble exponent,
596  const NekDouble cutoff)
597 {
598  // Generate an orthogonal expansion
599  int nq = m_base[0]->GetNumPoints();
600  int nmodes = m_base[0]->GetNumModes();
601  int P = nmodes - 1;
602  // Declare orthogonal basis.
604 
606  StdSegExp OrthoExp(B);
607 
608  // Cutoff
609  int Pcut = cutoff * P;
610 
611  // Project onto orthogonal space.
612  Array<OneD, NekDouble> orthocoeffs(OrthoExp.GetNcoeffs());
613  OrthoExp.FwdTrans(array, orthocoeffs);
614 
615  //
616  NekDouble fac;
617  for (int j = 0; j < nmodes; ++j)
618  {
619  // to filter out only the "high-modes"
620  if (j > Pcut)
621  {
622  fac = (NekDouble)(j - Pcut) / ((NekDouble)(P - Pcut));
623  fac = pow(fac, exponent);
624  orthocoeffs[j] *= exp(-alpha * fac);
625  }
626  }
627 
628  // backward transform to physical space
629  OrthoExp.BwdTrans(orthocoeffs, array);
630 }
631 
632 // up to here
634  const Array<OneD, const NekDouble> &inarray,
635  Array<OneD, NekDouble> &outarray)
636 {
637  int nquad0 = m_base[0]->GetNumPoints();
638 
639  const Array<OneD, const NekDouble> &w0 = m_base[0]->GetW();
640 
641  Vmath::Vmul(nquad0, inarray.get(), 1, w0.get(), 1, outarray.get(), 1);
642 }
643 
645  Array<OneD, NekDouble> &coords_1,
646  Array<OneD, NekDouble> &coords_2)
647 {
648  boost::ignore_unused(coords_1, coords_2);
649  Blas::Dcopy(GetNumPoints(0), (m_base[0]->GetZ()).get(), 1, &coords_0[0], 1);
650 }
651 
652 //---------------------------------------------------------------------
653 // Helper functions
654 //---------------------------------------------------------------------
655 
657 {
658  return 2;
659 }
660 
662 {
663  return 2;
664 }
665 
666 int StdSegExp::v_GetTraceNcoeffs(const int i) const
667 {
668  boost::ignore_unused(i);
669  return 1;
670 }
671 
672 int StdSegExp::v_GetTraceIntNcoeffs(const int i) const
673 {
674  boost::ignore_unused(i);
675  return 0;
676 }
677 
678 int StdSegExp::v_GetTraceNumPoints(const int i) const
679 {
680  boost::ignore_unused(i);
681  return 1;
682 }
683 
685 {
686  return 2;
687 }
688 
690 {
691  return 2;
692 }
693 
695  const std::vector<unsigned int> &nummodes, int &modes_offset)
696 {
697  int nmodes = nummodes[modes_offset];
698  modes_offset += 1;
699 
700  return nmodes;
701 }
702 
703 //---------------------------------------------------------------------
704 // Wrapper functions
705 //---------------------------------------------------------------------
706 
708 {
709  DNekMatSharedPtr Mat;
710  MatrixType mattype;
711 
712  switch (mattype = mkey.GetMatrixType())
713  {
715  {
716  int nq = m_base[0]->GetNumPoints();
717 
718  // take definition from key
720  {
721  nq = (int)mkey.GetConstFactor(eFactorConst);
722  }
723 
725  Array<OneD, NekDouble> coords(1);
728 
729  for (int i = 0; i < neq; ++i)
730  {
731  coords[0] = -1.0 + 2 * i / (NekDouble)(neq - 1);
732  I = m_base[0]->GetI(coords);
733  Vmath::Vcopy(nq, I->GetRawPtr(), 1, Mat->GetRawPtr() + i, neq);
734  }
735  }
736  break;
737  case eFwdTrans:
738  {
739  Mat =
741  StdMatrixKey iprodkey(eIProductWRTBase, v_DetShapeType(), *this);
742  DNekMat &Iprod = *GetStdMatrix(iprodkey);
743  StdMatrixKey imasskey(eInvMass, v_DetShapeType(), *this);
744  DNekMat &Imass = *GetStdMatrix(imasskey);
745 
746  (*Mat) = Imass * Iprod;
747  }
748  break;
749  default:
750  {
752 
753  if (mattype == eMass)
754  {
755  // For Fourier basis set the imaginary component
756  // of mean mode to have a unit diagonal component
757  // in mass matrix
759  {
760  (*Mat)(1, 1) = 1.0;
761  }
762  }
763  }
764  break;
765  }
766 
767  return Mat;
768 }
769 
771 {
772  return v_GenMatrix(mkey);
773 }
774 
775 //---------------------------------------------------------------------
776 // Mappings
777 //---------------------------------------------------------------------
778 
780 {
781  if (outarray.size() != NumBndryCoeffs())
782  {
784  }
785  const LibUtilities::BasisType Btype = GetBasisType(0);
786  int nummodes = m_base[0]->GetNumModes();
787 
788  outarray[0] = 0;
789 
790  switch (Btype)
791  {
796  outarray[1] = nummodes - 1;
797  break;
800  outarray[1] = 1;
801  break;
802  default:
803  ASSERTL0(0, "Mapping array is not defined for this expansion");
804  break;
805  }
806 }
807 
809 {
810  int i;
811  if (outarray.size() != GetNcoeffs() - NumBndryCoeffs())
812  {
814  }
815  const LibUtilities::BasisType Btype = GetBasisType(0);
816 
817  switch (Btype)
818  {
823  for (i = 0; i < GetNcoeffs() - 2; i++)
824  {
825  outarray[i] = i + 1;
826  }
827  break;
830  for (i = 0; i < GetNcoeffs() - 2; i++)
831  {
832  outarray[i] = i + 2;
833  }
834  break;
835  default:
836  ASSERTL0(0, "Mapping array is not defined for this expansion");
837  break;
838  }
839 }
840 
841 int StdSegExp::v_GetVertexMap(int localVertexId, bool useCoeffPacking)
842 {
843  boost::ignore_unused(useCoeffPacking);
844  ASSERTL0((localVertexId == 0) || (localVertexId == 1),
845  "local vertex id"
846  "must be between 0 or 1");
847 
848  int localDOF = localVertexId;
849 
851  (localVertexId == 1))
852  {
853  localDOF = m_base[0]->GetNumModes() - 1;
854  }
855  return localDOF;
856 }
857 
859  bool standard)
860 {
861  boost::ignore_unused(standard);
862  int np = m_base[0]->GetNumPoints();
863 
864  conn = Array<OneD, int>(2 * (np - 1));
865  int cnt = 0;
866  for (int i = 0; i < np - 1; ++i)
867  {
868  conn[cnt++] = i;
869  conn[cnt++] = i + 1;
870  }
871 }
872 
873 /** \brief Get the map of the coefficient location to teh
874  * local trace coefficients
875  */
876 
877 void StdSegExp::v_GetTraceCoeffMap(const unsigned int traceid,
878  Array<OneD, unsigned int> &maparray)
879 {
880  int order0 = m_base[0]->GetNumModes();
881 
882  ASSERTL0(traceid < 2, "eid must be between 0 and 1");
883 
884  if (maparray.size() != 1)
885  {
886  maparray = Array<OneD, unsigned int>(1);
887  }
888 
889  const LibUtilities::BasisType bType = GetBasisType(0);
890 
891  if (bType == LibUtilities::eModified_A)
892  {
893  maparray[0] = (traceid == 0) ? 0 : 1;
894  }
895  else if (bType == LibUtilities::eGLL_Lagrange ||
897  {
898  maparray[0] = (traceid == 0) ? 0 : order0 - 1;
899  }
900  else
901  {
902  ASSERTL0(false, "Unknown Basis");
903  }
904 }
905 
907  Array<OneD, unsigned int> &maparray,
908  Array<OneD, int> &signarray,
909  Orientation orient, int P, int Q)
910 {
911  boost::ignore_unused(orient, P, Q);
912 
913  v_GetTraceCoeffMap(tid, maparray);
914 
915  if (signarray.size() != 1)
916  {
917  signarray = Array<OneD, int>(1, 1);
918  }
919  else
920  {
921  signarray[0] = 1;
922  }
923 }
924 
925 void StdSegExp::v_GetElmtTraceToTraceMap(const unsigned int eid,
926  Array<OneD, unsigned int> &maparray,
927  Array<OneD, int> &signarray,
928  Orientation orient, int P, int Q)
929 {
930  // parameters for higher dimnesion traces
931  boost::ignore_unused(eid, orient, P, Q);
932  if (maparray.size() != 1)
933  {
934  maparray = Array<OneD, unsigned int>(1);
935  }
936 
937  maparray[0] = 0;
938 
939  if (signarray.size() != 1)
940  {
941  signarray = Array<OneD, int>(1, 1);
942  }
943  else
944  {
945  signarray[0] = 1;
946  }
947 }
948 
949 } // namespace StdRegions
950 } // namespace Nektar
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:249
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Definition: ErrorUtil.hpp:272
Describes the specification for a Basis.
Definition: Basis.h:50
Defines a specification for a set of points.
Definition: Points.h:59
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray.
The base class for all shapes.
Definition: StdExpansion.h:71
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
Definition: StdExpansion.h:130
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:162
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:609
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Definition: StdExpansion.h:758
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int GetVertexMap(const int localVertexId, bool useCoeffPacking=false)
Definition: StdExpansion.h:685
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
Definition: StdExpansion.h:430
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:211
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space.
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLess > m_stdStaticCondMatrixManager
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:224
Array< OneD, LibUtilities::BasisSharedPtr > m_base
MatrixType GetMatrixType() const
Definition: StdMatrixKey.h:85
NekDouble GetConstFactor(const ConstFactorType &factor) const
Definition: StdMatrixKey.h:126
bool ConstFactorExists(const ConstFactorType &factor) const
Definition: StdMatrixKey.h:135
Class representing a segment element in reference space All interface of this class sits in StdExpans...
Definition: StdSegExp.h:48
virtual int v_GetTraceIntNcoeffs(const int i) const final override
Definition: StdSegExp.cpp:672
void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Inner product of inarray over region with respect to the expansion basis (this)->m_base[0] and return...
Definition: StdSegExp.cpp:435
virtual int v_NumDGBndryCoeffs() const override
Definition: StdSegExp.cpp:689
virtual int v_GetTraceNumPoints(const int i) const final override
Definition: StdSegExp.cpp:678
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final override
Definition: StdSegExp.cpp:506
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
Definition: StdSegExp.cpp:512
void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:220
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
Definition: StdSegExp.cpp:552
void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
Definition: StdSegExp.cpp:457
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
Definition: StdSegExp.cpp:808
virtual LibUtilities::ShapeType v_DetShapeType() const override
Return Shape of region, using ShapeType enum list. i.e. Segment.
Definition: StdSegExp.cpp:76
virtual int v_GetNverts() const final override
Definition: StdSegExp.cpp:656
virtual int v_NumBndryCoeffs() const override
Definition: StdSegExp.cpp:684
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
Definition: StdSegExp.cpp:530
void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:365
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:441
virtual void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
Definition: StdSegExp.cpp:489
virtual void v_GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
Get the map of the coefficient location to teh local trace coefficients.
Definition: StdSegExp.cpp:877
void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
Definition: StdSegExp.cpp:269
StdSegExp()
defult constructor
Definition: StdSegExp.cpp:47
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:495
void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray.
Definition: StdSegExp.cpp:140
virtual void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true) override
Definition: StdSegExp.cpp:858
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_0, Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2) override
Definition: StdSegExp.cpp:644
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrate the physical point list inarray over region and return the value.
Definition: StdSegExp.cpp:111
virtual int v_GetTraceNcoeffs(const int i) const final override
Definition: StdSegExp.cpp:666
virtual ~StdSegExp() override
Destructor.
Definition: StdSegExp.cpp:69
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false) override
Definition: StdSegExp.cpp:841
virtual void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff) override
Definition: StdSegExp.cpp:593
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) override
Definition: StdSegExp.cpp:770
void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:448
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:633
void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Backward transform from coefficient space given in inarray and evaluate at the physical quadrature po...
Definition: StdSegExp.cpp:202
virtual int v_GetNtraces() const final override
Definition: StdSegExp.cpp:661
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray) override
Definition: StdSegExp.cpp:779
void v_GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation edgeOrient, int P, int Q) override
Definition: StdSegExp.cpp:906
void v_GetElmtTraceToTraceMap(const unsigned int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation edgeOrient, int P, int Q) override
Definition: StdSegExp.cpp:925
void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
Definition: StdSegExp.cpp:159
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
Definition: StdSegExp.cpp:483
virtual bool v_IsBoundaryInteriorExpansion() const override
Definition: StdSegExp.cpp:81
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset) override
Definition: StdSegExp.cpp:694
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) override
Definition: StdSegExp.cpp:707
void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Definition: StdSegExp.cpp:291
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
Definition: Blas.hpp:246
static void Dcopy(const int &n, const double *x, const int &incx, double *y, const int &incy)
BLAS level 1: Copy x to y.
Definition: Blas.hpp:147
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
Definition: Blas.hpp:154
void InterpCoeff1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
Definition: InterpCoeff.cpp:46
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:53
@ eModified_B
Principle Modified Functions .
Definition: BasisType.h:51
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
Definition: BasisType.h:59
@ eOrtho_A
Principle Orthogonal Functions .
Definition: BasisType.h:44
@ eGLL_Lagrange
Lagrange for SEM basis .
Definition: BasisType.h:58
@ eChebyshev
Chebyshev Polynomials.
Definition: BasisType.h:63
@ eModified_A
Principle Modified Functions .
Definition: BasisType.h:50
@ eFourier
Fourier Expansion .
Definition: BasisType.h:57
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:75
double NekDouble
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:209
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
Definition: Vmath.cpp:895
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:492
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1255
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.cpp:419