44 namespace LocalRegions
55 boost::bind(&
TriExp::CreateMatrix, this, _1),
56 std::string(
"TriExpMatrix")),
57 m_staticCondMatrixManager(
58 boost::bind(&
TriExp::CreateStaticCondMatrix, this, _1),
59 std::string(
"TriExpStaticCondMatrix"))
70 m_matrixManager(T.m_matrixManager),
71 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
84 int nquad0 =
m_base[0]->GetNumPoints();
85 int nquad1 =
m_base[1]->GetNumPoints();
88 Array<OneD,NekDouble> tmp(nquad0*nquad1);
93 Vmath::Vmul(nquad0*nquad1, jac, 1, inarray, 1,tmp, 1);
97 Vmath::Smul(nquad0*nquad1, jac[0], inarray, 1, tmp, 1);
107 Array<OneD,NekDouble> &out_d0,
108 Array<OneD,NekDouble> &out_d1,
109 Array<OneD,NekDouble> &out_d2)
111 int nquad0 =
m_base[0]->GetNumPoints();
112 int nquad1 =
m_base[1]->GetNumPoints();
113 int nqtot = nquad0*nquad1;
114 const Array<TwoD, const NekDouble>& df
117 Array<OneD,NekDouble> diff0(2*nqtot);
118 Array<OneD,NekDouble> diff1(diff0+nqtot);
124 if(out_d0.num_elements())
127 Vmath::Vvtvp (nqtot,df[1],1,diff1,1, out_d0, 1, out_d0,1);
130 if(out_d1.num_elements())
133 Vmath::Vvtvp (nqtot,df[3],1,diff1,1, out_d1, 1, out_d1,1);
136 if(out_d2.num_elements())
139 Vmath::Vvtvp (nqtot,df[5],1,diff1,1, out_d2, 1, out_d2,1);
144 if(out_d0.num_elements())
146 Vmath::Smul (nqtot, df[0][0], diff0, 1, out_d0, 1);
147 Blas::Daxpy (nqtot, df[1][0], diff1, 1, out_d0, 1);
150 if(out_d1.num_elements())
152 Vmath::Smul (nqtot, df[2][0], diff0, 1, out_d1, 1);
153 Blas::Daxpy (nqtot, df[3][0], diff1, 1, out_d1, 1);
156 if(out_d2.num_elements())
158 Vmath::Smul (nqtot, df[4][0], diff0, 1, out_d2, 1);
159 Blas::Daxpy (nqtot, df[5][0], diff1, 1, out_d2, 1);
166 const Array<OneD, const NekDouble>& inarray,
167 Array<OneD, NekDouble> &outarray)
188 ASSERTL1(
false,
"input dir is out of range");
195 const Array<OneD, const NekDouble> &inarray,
196 const Array<OneD, const NekDouble> &direction,
197 Array<OneD, NekDouble> &out)
199 if(! out.num_elements())
204 int nquad0 =
m_base[0]->GetNumPoints();
205 int nquad1 =
m_base[1]->GetNumPoints();
206 int nqtot = nquad0*nquad1;
208 const Array<TwoD, const NekDouble>& df =
211 Array<OneD,NekDouble> diff0(2*nqtot);
212 Array<OneD,NekDouble> diff1(diff0+nqtot);
219 Array<OneD, Array<OneD, NekDouble> > tangmat(2);
224 for (
int i=0; i< 2; ++i)
226 tangmat[i] = Array<OneD, NekDouble>(nqtot,0.0);
227 for (
int k=0; k<(
m_geom->GetCoordim()); ++k)
229 Vmath::Vvtvp(nqtot,&df[2*k+i][0],1,&direction[k*nqtot],1,&tangmat[i][0],1,&tangmat[i][0],1);
234 Vmath::Vmul (nqtot,&tangmat[0][0],1,&diff0[0],1, &out[0], 1);
235 Vmath::Vvtvp (nqtot,&tangmat[1][0],1,&diff1[0],1, &out[0], 1, &out[0],1);
245 Array<OneD,NekDouble> &outarray)
263 Array<OneD, NekDouble> &outarray)
266 int npoints[2] = {
m_base[0]->GetNumPoints(),
267 m_base[1]->GetNumPoints()};
268 int nmodes[2] = {
m_base[0]->GetNumModes(),
269 m_base[1]->GetNumModes()};
271 fill(outarray.get(), outarray.get()+
m_ncoeffs, 0.0 );
273 Array<OneD, NekDouble> physEdge[3];
274 Array<OneD, NekDouble> coeffEdge[3];
276 for(i = 0; i < 3; i++)
278 physEdge[i] = Array<OneD, NekDouble>(npoints[i!=0]);
279 coeffEdge[i] = Array<OneD, NekDouble>(nmodes[i!=0]);
283 for(i = 0; i < npoints[0]; i++)
285 physEdge[0][i] = inarray[i];
288 for(i = 0; i < npoints[1]; i++)
290 physEdge[1][i] = inarray[npoints[0]-1+i*npoints[0]];
291 physEdge[2][i] = inarray[(npoints[1]-1)*npoints[0]-i*npoints[0]];
294 for(i = 0; i < 3; i++)
298 reverse( (physEdge[i]).
get() , (physEdge[i]).
get() + npoints[i!=0] );
303 for(i = 0; i < 3; i++)
308 Array<OneD, unsigned int> mapArray;
309 Array<OneD, int> signArray;
312 for(i = 0; i < 3; i++)
314 segexp[i!=0]->FwdTrans_BndConstrained(physEdge[i],coeffEdge[i]);
317 for(j=0; j < nmodes[i!=0]; j++)
320 outarray[ mapArray[j] ] = sign * coeffEdge[i][j];
325 int nInteriorDofs =
m_ncoeffs - nBoundaryDofs;
327 if (nInteriorDofs > 0) {
343 Array<OneD, NekDouble> rhs(nInteriorDofs);
344 Array<OneD, NekDouble> result(nInteriorDofs);
348 for(i = 0; i < nInteriorDofs; i++)
350 rhs[i] = tmp1[ mapArray[i] ];
353 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, matsys->Scale(), &((matsys->GetOwnedMatrix())->GetPtr())[0],
354 nInteriorDofs,rhs.get(),1,0.0,result.get(),1);
356 for(i = 0; i < nInteriorDofs; i++)
358 outarray[ mapArray[i] ] = result[i];
365 Array<OneD, NekDouble> &outarray)
372 const Array<OneD, const NekDouble>& inarray,
373 Array<OneD, NekDouble> & outarray)
380 Array<OneD, NekDouble> &outarray)
382 int nquad0 =
m_base[0]->GetNumPoints();
383 int nquad1 =
m_base[1]->GetNumPoints();
384 int order0 =
m_base[0]->GetNumModes();
386 Array<OneD,NekDouble> tmp(nquad0*nquad1+nquad1*order0);
387 Array<OneD,NekDouble> wsp(tmp+nquad0*nquad1);
395 Array<OneD, NekDouble> &outarray)
401 Blas::Dgemv(
'N',
m_ncoeffs,nq,iprodmat->Scale(),(iprodmat->GetOwnedMatrix())->GetPtr().get(),
402 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
408 const Array<OneD, const NekDouble>& inarray,
409 Array<OneD, NekDouble> & outarray)
411 ASSERTL1((dir==0)||(dir==1)||(dir==2),
"Invalid direction.");
412 ASSERTL1((dir==2)?(
m_geom->GetCoordim()==3):
true,
"Invalid direction.");
415 int nquad0 =
m_base[0]->GetNumPoints();
416 int nquad1 =
m_base[1]->GetNumPoints();
417 int nqtot = nquad0*nquad1;
418 int nmodes0 =
m_base[0]->GetNumModes();
419 int wspsize = max(max(nqtot,
m_ncoeffs),nquad1*nmodes0);
421 const Array<TwoD, const NekDouble>& df =
424 Array<OneD, NekDouble> tmp0 (6*wspsize);
425 Array<OneD, NekDouble> tmp1 (tmp0 + wspsize);
426 Array<OneD, NekDouble> tmp2 (tmp0 + 2*wspsize);
427 Array<OneD, NekDouble> tmp3 (tmp0 + 3*wspsize);
428 Array<OneD, NekDouble> gfac0(tmp0 + 4*wspsize);
429 Array<OneD, NekDouble> gfac1(tmp0 + 5*wspsize);
431 const Array<OneD, const NekDouble>& z0 =
m_base[0]->GetZ();
432 const Array<OneD, const NekDouble>& z1 =
m_base[1]->GetZ();
435 for(i = 0; i < nquad1; ++i)
437 gfac0[i] = 2.0/(1-z1[i]);
439 for(i = 0; i < nquad0; ++i)
441 gfac1[i] = 0.5*(1+z0[i]);
444 for(i = 0; i < nquad1; ++i)
446 Vmath::Smul(nquad0,gfac0[i],&inarray[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
449 for(i = 0; i < nquad1; ++i)
451 Vmath::Vmul(nquad0,&gfac1[0],1,&tmp0[0]+i*nquad0,1,&tmp1[0]+i*nquad0,1);
456 Vmath::Vmul(nqtot,&df[2*dir][0], 1,&tmp0[0], 1,&tmp0[0],1);
457 Vmath::Vmul(nqtot,&df[2*dir+1][0],1,&tmp1[0], 1,&tmp1[0],1);
458 Vmath::Vmul(nqtot,&df[2*dir+1][0],1,&inarray[0],1,&tmp2[0],1);
462 Vmath::Smul(nqtot, df[2*dir][0], tmp0, 1, tmp0, 1);
463 Vmath::Smul(nqtot, df[2*dir+1][0], tmp1, 1, tmp1, 1);
464 Vmath::Smul(nqtot, df[2*dir+1][0], inarray, 1, tmp2, 1);
478 const Array<OneD, const NekDouble>& inarray,
479 Array<OneD, NekDouble> &outarray)
503 ASSERTL1(
false,
"input dir is out of range");
511 Blas::Dgemv(
'N',
m_ncoeffs,nq,iprodmat->Scale(),(iprodmat->GetOwnedMatrix())->GetPtr().get(),
512 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
517 const Array<OneD, const NekDouble> &Fx,
518 const Array<OneD, const NekDouble> &Fy,
519 const Array<OneD, const NekDouble> &Fz,
520 Array<OneD, NekDouble> &outarray)
522 int nq =
m_base[0]->GetNumPoints()*
m_base[1]->GetNumPoints();
523 Array<OneD, NekDouble > Fn(nq);
525 const Array<OneD, const Array<OneD, NekDouble> > &normals =
532 &normals[1][0],1,&Fy[0],1,&Fn[0],1);
533 Vmath::Vvtvp (nq,&normals[2][0],1,&Fz[0],1,&Fn[0],1,&Fn[0],1);
538 normals[1][0],&Fy[0],1,&Fn[0],1);
539 Vmath::Svtvp (nq,normals[2][0],&Fz[0],1,&Fn[0],1,&Fn[0],1);
546 Array<OneD,NekDouble> &coords)
550 ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[1] <= 1.0 &&
551 Lcoords[1] >= -1.0 && Lcoords[1] <=1.0,
552 "Local coordinates are not in region [-1,1]");
556 for(i = 0; i <
m_geom->GetCoordim(); ++i)
558 coords[i] =
m_geom->GetCoord(i,Lcoords);
563 Array<OneD, NekDouble> &coords_0,
564 Array<OneD, NekDouble> &coords_1,
565 Array<OneD, NekDouble> &coords_2)
577 const Array<OneD, const NekDouble> &Lcoord,
578 const Array<OneD, const NekDouble> &physvals)
586 Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(2);
589 m_geom->GetLocCoords(coord,Lcoord);
598 const Array<OneD, const NekDouble> &inarray,
599 Array<OneD,NekDouble> &outarray,
606 const Array<OneD, const NekDouble> &inarray,
607 Array<OneD,NekDouble> &outarray)
609 int nquad0 =
m_base[0]->GetNumPoints();
610 int nquad1 =
m_base[1]->GetNumPoints();
619 Vmath::Vcopy(nquad1,&(inarray[0])+(nquad0-1),nquad0,&(outarray[0]),1);
622 Vmath::Vcopy(nquad1,&(inarray[0]),nquad0,&(outarray[0]),1);
625 ASSERTL0(
false,
"edge value (< 3) is out of range");
630 if(
m_base[edge?1:0]->GetPointsKey() != EdgeExp->GetBasis(0)->GetPointsKey())
632 Array<OneD,NekDouble> outtmp(max(nquad0,nquad1));
637 EdgeExp->GetBasis(0)->GetPointsKey(),outarray);
651 const int edge,
const Array<OneD, const NekDouble> &inarray,
652 Array<OneD, NekDouble> &outarray)
655 "Routine not implemented for triangular elements");
660 Array<OneD, NekDouble> &outarray)
663 "Routine not implemented for triangular elements");
673 const Array<TwoD, const NekDouble> & df = geomFactors->GetDerivFactors(ptsKeys);
674 const Array<OneD, const NekDouble> & jac = geomFactors->GetJac(ptsKeys);
675 int nqe =
m_base[0]->GetNumPoints();
678 m_edgeNormals[edge] = Array<OneD, Array<OneD, NekDouble> >(dim);
679 Array<OneD, Array<OneD, NekDouble> > &normal =
m_edgeNormals[edge];
680 for (i = 0; i < dim; ++i)
682 normal[i] = Array<OneD, NekDouble>(nqe);
701 Vmath::Fill(nqe,df[2*i+1][0] + df[2*i][0],normal[i],1);
711 ASSERTL0(
false,
"Edge is out of range (edge < 3)");
718 fac += normal[i][0]*normal[i][0];
730 int nquad0 = ptsKeys[0].GetNumPoints();
731 int nquad1 = ptsKeys[1].GetNumPoints();
735 Array<OneD,NekDouble> normals(
GetCoordim()*max(nquad0,nquad1),0.0);
736 Array<OneD,NekDouble> edgejac(
GetCoordim()*max(nquad0,nquad1),0.0);
744 for(j = 0; j < nquad0; ++j)
749 normals[i*nquad0+j] = -df[2*i+1][j]*edgejac[j];
752 from_key = ptsKeys[0];
755 for(j = 0; j < nquad1; ++j)
757 edgejac[j] = jac[nquad0*j+nquad0-1];
760 normals[i*nquad1+j] = (df[2*i][nquad0*j + nquad0-1] + df[2*i+1][nquad0*j + nquad0-1])*edgejac[j];
763 from_key = ptsKeys[1];
766 for(j = 0; j < nquad1; ++j)
768 edgejac[j] = jac[nquad0*j];
771 normals[i*nquad1+j] = -df[2*i][nquad0*j]*edgejac[j];
774 from_key = ptsKeys[1];
777 ASSERTL0(
false,
"edge is out of range (edge < 3)");
782 Array<OneD,NekDouble> work(nqe,0.0);
799 Vmath::Vvtvp(nqe,normal[i],1, normal[i],1,work,1,work,1);
834 return m_geom->GetCoordim();
839 const std::vector<unsigned int > &nummodes,
const int mode_offset,
NekDouble * coeffs)
841 int data_order0 = nummodes[mode_offset];
842 int fillorder0 = min(
m_base[0]->GetNumModes(),data_order0);
843 int data_order1 = nummodes[mode_offset+1];
844 int order1 =
m_base[1]->GetNumModes();
845 int fillorder1 = min(order1,data_order1);
856 "Extraction routine not set up for this basis");
859 for(i = 0; i < fillorder0; ++i)
861 Vmath::Vcopy(fillorder1-i,&data[cnt],1,&coeffs[cnt1],1);
862 cnt += data_order1-i;
868 ASSERTL0(
false,
"basis is either not set up or not hierarchicial");
881 return GetGeom2D()->GetCartesianEorient(edge);
887 ASSERTL1(dir >= 0 &&dir <= 1,
"input dir is out of range");
928 return tmp->GetStdMatrix(mkey);
993 Array<TwoD, const NekDouble> df =
m_metricinfo->GetDerivFactors(ptsKeys);
1018 int rows = deriv0.GetRows();
1019 int cols = deriv1.GetColumns();
1022 (*WeakDeriv) = df[2*dir][0]*deriv0 + df[2*dir+1][0]*deriv1;
1052 Array<TwoD, const NekDouble> gmat =
1055 int rows = lap00.GetRows();
1056 int cols = lap00.GetColumns();
1060 (*lap) = gmat[0][0] * lap00 +
1061 gmat[1][0] * (lap01 +
Transpose(lap01)) +
1084 int rows = LapMat.GetRows();
1085 int cols = LapMat.GetColumns();
1090 (*helm) = LapMat + factor*MassMat;
1125 const Array<TwoD, const NekDouble>& df =
m_metricinfo->GetDerivFactors(ptsKeys);
1151 int rows = stdiprod0.GetRows();
1152 int cols = stdiprod1.GetColumns();
1155 (*mat) = df[2*dir][0]*stdiprod0 + df[2*dir+1][0]*stdiprod1;
1208 unsigned int nint = (
unsigned int)(
m_ncoeffs - nbdry);
1209 unsigned int exp_size[] = {nbdry,nint};
1210 unsigned int nblks = 2;
1221 goto UseLocRegionsMatrix;
1226 goto UseStdRegionsMatrix;
1231 goto UseLocRegionsMatrix;
1233 UseStdRegionsMatrix:
1248 UseLocRegionsMatrix:
1261 Array<OneD,unsigned int> bmap(nbdry);
1262 Array<OneD,unsigned int> imap(nint);
1266 for(i = 0; i < nbdry; ++i)
1268 for(j = 0; j < nbdry; ++j)
1270 (*A)(i,j) = mat(bmap[i],bmap[j]);
1273 for(j = 0; j < nint; ++j)
1275 (*B)(i,j) = mat(bmap[i],imap[j]);
1279 for(i = 0; i < nint; ++i)
1281 for(j = 0; j < nbdry; ++j)
1283 (*C)(i,j) = mat(imap[i],bmap[j]);
1286 for(j = 0; j < nint; ++j)
1288 (*D)(i,j) = mat(imap[i],imap[j]);
1297 (*A) = (*A) - (*B)*(*C);
1333 Array<OneD,NekDouble> &outarray,
1341 Array<OneD,NekDouble> &outarray,
1349 const Array<OneD, const NekDouble> &inarray,
1350 Array<OneD,NekDouble> &outarray,
1358 const Array<OneD, const NekDouble> &inarray,
1359 Array<OneD,NekDouble> &outarray,
1367 Array<OneD,NekDouble> &outarray,
1375 Array<OneD,NekDouble> &outarray,
1383 Array<OneD,NekDouble> &outarray,
1391 Array<OneD,NekDouble> &outarray,
1396 if(inarray.get() == outarray.get())
1401 Blas::Dgemv(
'N',
m_ncoeffs,
m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1402 m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
1406 Blas::Dgemv(
'N',
m_ncoeffs,
m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1407 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
1413 const Array<OneD, const NekDouble> &inarray,
1414 Array<OneD, NekDouble> &outarray,
1415 Array<OneD, NekDouble> &wsp)
1422 int nquad0 =
m_base[0]->GetNumPoints();
1423 int nquad1 =
m_base[1]->GetNumPoints();
1424 int nqtot = nquad0*nquad1;
1425 int nmodes0 =
m_base[0]->GetNumModes();
1426 int nmodes1 =
m_base[1]->GetNumModes();
1427 int wspsize = max(max(max(nqtot,
m_ncoeffs),nquad1*nmodes0),nquad0*nmodes1);
1429 ASSERTL1(wsp.num_elements() >= 3*wspsize,
1430 "Workspace is of insufficient size.");
1432 const Array<OneD, const NekDouble>& base0 =
m_base[0]->GetBdata();
1433 const Array<OneD, const NekDouble>& base1 =
m_base[1]->GetBdata();
1434 const Array<OneD, const NekDouble>& dbase0 =
m_base[0]->GetDbdata();
1435 const Array<OneD, const NekDouble>& dbase1 =
m_base[1]->GetDbdata();
1441 Array<OneD,NekDouble> wsp0(wsp);
1442 Array<OneD,NekDouble> wsp1(wsp+wspsize);
1443 Array<OneD,NekDouble> wsp2(wsp+2*wspsize);
1451 Vmath::Vvtvvtp(nqtot,&metric00[0],1,&wsp1[0],1,&metric01[0],1,&wsp2[0],1,&wsp0[0],1);
1452 Vmath::Vvtvvtp(nqtot,&metric01[0],1,&wsp1[0],1,&metric11[0],1,&wsp2[0],1,&wsp2[0],1);
1475 const unsigned int dim = 2;
1481 Array<OneD, NekDouble> dEta_dXi[2] = {Array<OneD, NekDouble>(nqtot,1.0),
1482 Array<OneD, NekDouble>(nqtot,1.0)};
1484 for (i = 0; i < dim; ++i)
1486 for (j = i; j < dim; ++j)
1488 m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1492 const Array<OneD, const NekDouble>& z0 =
m_base[0]->GetZ();
1493 const Array<OneD, const NekDouble>& z1 =
m_base[1]->GetZ();
1494 const unsigned int nquad0 =
m_base[0]->GetNumPoints();
1495 const unsigned int nquad1 =
m_base[1]->GetNumPoints();
1496 const Array<TwoD, const NekDouble>& df =
1499 for(i = 0; i < nquad1; i++)
1501 Blas::Dscal(nquad0,2.0/(1-z1[i]),&dEta_dXi[0][0]+i*nquad0,1);
1502 Blas::Dscal(nquad0,2.0/(1-z1[i]),&dEta_dXi[1][0]+i*nquad0,1);
1504 for(i = 0; i < nquad0; i++)
1506 Blas::Dscal(nquad1,0.5*(1+z0[i]),&dEta_dXi[1][0]+i,nquad0);
1509 Array<OneD, NekDouble> tmp(nqtot);
1513 Vmath::Smul (nqtot,df[0][0],&dEta_dXi[0][0],1,&tmp[0],1);
1514 Vmath::Svtvp(nqtot,df[1][0],&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1520 Vmath::Smul (nqtot,df[2][0],&dEta_dXi[0][0],1,&tmp[0],1);
1521 Vmath::Svtvp(nqtot,df[3][0],&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1528 Vmath::Smul (nqtot,df[4][0],&dEta_dXi[0][0],1,&tmp[0],1);
1529 Vmath::Svtvp(nqtot,df[5][0],&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1535 NekDouble g2 = df[1][0]*df[1][0] + df[3][0]*df[3][0];
1538 g2 += df[5][0]*df[5][0];
1545 Vmath::Vmul (nqtot,&df[0][0],1,&dEta_dXi[0][0],1,&tmp[0],1);
1546 Vmath::Vvtvp(nqtot,&df[1][0],1,&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1553 Vmath::Vmul (nqtot,&df[2][0],1,&dEta_dXi[0][0],1,&tmp[0],1);
1554 Vmath::Vvtvp(nqtot,&df[3][0],1,&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1562 Vmath::Vmul (nqtot,&df[4][0],1,&dEta_dXi[0][0],1,&tmp[0],1);
1563 Vmath::Vvtvp(nqtot,&df[5][0],1,&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1571 for (
unsigned int i = 0; i < dim; ++i)
1573 for (
unsigned int j = i; j < dim; ++j)
1596 const Array<OneD, const NekDouble> &inarray,
1597 Array<OneD, NekDouble> &outarray)
1599 int n_coeffs = inarray.num_elements();
1600 int nquad0 =
m_base[0]->GetNumPoints();
1601 int nquad1 =
m_base[1]->GetNumPoints();
1602 int nqtot = nquad0*nquad1;
1603 int nmodes0 =
m_base[0]->GetNumModes();
1604 int nmodes1 =
m_base[1]->GetNumModes();
1605 int numMin2 = nmodes0, i;
1607 Array<OneD, NekDouble> coeff(n_coeffs,0.0);
1608 Array<OneD, NekDouble> phys_tmp(nqtot,0.0);
1609 Array<OneD, NekDouble> tmp, tmp2;
1639 m_TriExp ->BwdTrans(inarray,phys_tmp);
1640 m_OrthoTriExp->FwdTrans(phys_tmp, coeff);
1642 for (i = 0; i < n_coeffs; i++)
1647 numMin += numMin2 - 1;
1652 m_OrthoTriExp->BwdTrans(coeff,phys_tmp);
1653 m_TriExp ->FwdTrans(phys_tmp, outarray);