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