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
39
40using namespace std;
41
42namespace Nektar
43{
44namespace StdRegions
45{
46/** \brief defult constructor */
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 */
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);
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
144{
145 boost::ignore_unused(out_d1, out_d2);
146 PhysTensorDeriv(inarray, out_d0);
147}
148
149void 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
163{
164 boost::ignore_unused(out_d1, out_d2);
165 PhysTensorDeriv(inarray, out_d0);
166 // PhysDeriv(inarray, out_d0);
167}
168
169void 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);
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);
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);
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
495void 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);
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
666int StdSegExp::v_GetTraceNcoeffs(const int i) const
667{
668 boost::ignore_unused(i);
669 return 1;
670}
671
673{
674 boost::ignore_unused(i);
675 return 0;
676}
677
678int 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{
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
841int 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
877void StdSegExp::v_GetTraceCoeffMap(const unsigned int traceid,
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
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
925void StdSegExp::v_GetElmtTraceToTraceMap(const unsigned int eid,
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:47
Defines a specification for a set of points.
Definition: Points.h:55
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:87
NekDouble GetConstFactor(const ConstFactorType &factor) const
Definition: StdMatrixKey.h:128
bool ConstFactorExists(const ConstFactorType &factor) const
Definition: StdMatrixKey.h:137
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 = alpha A x plus beta y where A[m x n].
Definition: Blas.hpp:213
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:130
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:137
void InterpCoeff1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
Definition: InterpCoeff.cpp:44
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:53
@ eModified_B
Principle Modified Functions .
Definition: BasisType.h:51
@ P
Monomial polynomials .
Definition: BasisType.h:64
@ 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
std::vector< double > w(NPUPPER)
std::vector< double > z(NPUPPER)
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:207
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
Definition: Vmath.cpp:890
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:487
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1191
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:414