35 #include <boost/core/ignore_unused.hpp>
45 CFSImplicit::CFSImplicit(
66 m_session->LoadParameter(
"AdvectionJacFlag", ntmp, 1);
69 m_session->LoadParameter(
"ViscousJacFlag", ntmp, 1);
82 std::string SolverType =
"Newton";
83 if (
m_session->DefinesSolverInfo(
"NonlinSysIterSolver"))
85 SolverType =
m_session->GetSolverInfo(
"NonlinSysIterSolver");
88 ModuleExists(SolverType),
"NekNonlinSys '" + SolverType +
89 "' is not defined.\n");
113 m_fields[0]->GetLocTraceToTraceMap();
115 locTraceToTraceMap->CalcLocTracePhysToTraceIDMap(
117 for (
int i = 1; i < nvariables; i++)
119 m_fields[i]->GetLocTraceToTraceMap()
120 ->SetLocTracePhysToTraceIDMap(
121 locTraceToTraceMap->GetLocTracephysToTraceIDMap());
131 m_session->LoadParameter(
"NewtonAbsoluteIteTol",
162 boost::ignore_unused(flag);
163 unsigned int nvariables =
m_fields.size();
164 unsigned int npoints =
m_fields[0]->GetNcoeffs();
168 for (
int i = 0; i < nvariables; ++i)
170 int offset = i * npoints;
171 in2D[i] = inarray + offset;
172 out2D[i] = out + offset;
173 source2D[i] = source + offset;
183 unsigned int nvariable = inarray.size();
184 unsigned int ncoeffs = inarray[nvariable - 1].size();
185 unsigned int npoints =
m_fields[0]->GetNpoints();
189 for (
int i = 0; i < nvariable; ++i)
192 m_fields[i]->BwdTrans(inarray[i], inpnts[i]);
198 for (
int i = 0; i < nvariable; ++i)
201 inarray[i], 1, out[i], 1);
206 for (
int i = 0; i < nvariable; ++i)
209 source[i], 1, out[i], 1);
223 int nvariables = inarray.size();
237 for (
int i = 0; i < nvariables; ++i)
241 m_fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
249 for (
int i = 0; i < nvariables; ++i)
259 x->ApplyCoeff(
m_fields, inarray, outarray, time);
264 int nElements =
m_fields[0]->GetExpSize();
273 for (
int n = 0; n < nElements; ++n)
275 nq =
m_fields[0]->GetExp(n)->GetNcoeffs();
276 offset =
m_fields[0]->GetCoeff_Offset(n);
278 for (
int i = 0; i < nvariables; ++i)
281 tmp = outarray[i] + offset, 1);
297 int nvariables = inarray.size();
301 outarray, time, pFwd, pBwd);
310 unsigned int nvariables = inpnts.size();
311 unsigned int ncoeffs =
m_fields[0]->GetNcoeffs();
312 unsigned int ntotal = nvariables * ncoeffs;
318 for (
int i = 0; i < nvariables; ++i)
320 int noffset = i * ncoeffs;
321 tmpArray = inarray + noffset;
322 m_fields[i]->FwdTrans(inpnts[i], tmpArray);
327 for (
int i = 0; i < nvariables; ++i)
329 int noffset = i * ncoeffs;
330 tmpArray = out + noffset;
331 m_fields[i]->BwdTrans(tmpArray, outpnt[i]);
342 boost::ignore_unused(inpnts);
347 unsigned int ntotal = inarray.size();
357 m_nonlinsol->v_SetupNekNonlinSystem(ntotal, inarray, inarray, 0);
371 unsigned int nvariables =
m_fields.size();
372 unsigned int ntotal = inarray.size();
373 unsigned int npoints = ntotal/nvariables;
375 unsigned int nTotalGlobal = ntotal;
377 unsigned int nTotalDOF = nTotalGlobal / nvariables;
383 for (
int i = 0; i < nvariables; ++i)
385 int offset = i * npoints;
391 for (
int i = 0; i < nvariables; ++i)
396 for (
int i = 2; i < nvariables - 1; ++i)
400 for (
int i = 2; i < nvariables - 1; ++i)
405 for (
int i = 0; i < nvariables; ++i)
411 for (
int i = 0; i < nvariables; ++i)
413 cout <<
"m_magnitdEstimat[" << i <<
"] = "
432 for(
int i = 0; i < nvariables; i++)
448 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
456 if (StdMatDataDBB.size() == 0)
461 int nSpaceDim =
m_graph->GetSpaceDimension();
462 int nvariable = inarray.size();
463 int npoints =
m_fields[0]->GetTotPoints();
464 int nVar2 = nvariable*nvariable;
465 std::shared_ptr<LocalRegions::ExpansionVector> expvect =
467 int nTotElmt = (*expvect).size();
478 for(
int i = 0; i < 3; i++)
482 normal3D[0][0] = 1.0;
483 normal3D[1][1] = 1.0;
484 normal3D[2][2] = 1.0;
521 int nElmtCoefOld = -1;
522 for(
int ne=0; ne<nTotElmt;ne++)
524 int nElmtCoef = (*expvect)[ne]->GetNcoeffs();
525 int nElmtCoef2 = nElmtCoef*nElmtCoef;
526 int nElmtPnt = (*expvect)[ne]->GetTotPoints();
537 if(nElmtPnt>PntJacCons[0].size()||nElmtCoef>nElmtCoefOld)
539 nElmtCoefOld = nElmtCoef;
540 for(
int ndir=0; ndir<3;ndir++)
552 for(
int i=0; i<nElmtPnt;i++)
564 for(
int i=0; i<nElmtPnt;i++)
566 PntJacDerv[ndir][ndir1][i] =
568 PntJacDervStd[ndir][ndir1][i] =
576 for(
int j = 0; j < nvariable; j++)
578 locVars[j] = inarray[j]+noffset;
583 for(
int nFluxDir = 0; nFluxDir < nSpaceDim; nFluxDir++)
585 normals = normal3D[nFluxDir];
587 normals,wspMat,PntJacCons[nFluxDir]);
593 for(
int j = 0; j < nSpaceDim; j++)
595 for(
int k = 0; k < nvariable; k++)
597 locDerv[j][k] = qfield[j][k]+noffset;
600 locmu = mu + noffset;
601 locDmuDT = DmuDT + noffset;
602 for(
int nFluxDir = 0; nFluxDir < nSpaceDim; nFluxDir++)
604 normals = normal3D[nFluxDir];
606 locVars,locDerv,locmu,locDmuDT,normals,wspMatDrv,
607 PntJacCons[nFluxDir]);
613 locmu = mu + noffset;
614 for(
int nFluxDir = 0; nFluxDir < nSpaceDim; nFluxDir++)
617 for(
int nDervDir = 0; nDervDir < nSpaceDim; nDervDir++)
620 locVars,locmu,normalPnt,wspMatDrv,
621 PntJacDerv[nFluxDir][nDervDir]);
627 for(
int n=0; n<nvariable;n++)
629 for(
int m=0; m<nvariable;m++)
631 int nVarOffset = m+n*nvariable;
632 GmatxData = gmtxarray[m][n]->GetBlock(ne,ne)->GetPtr();
640 for(
int i=0; i<nElmtPnt;i++)
642 tmppnts[i] = PntJacCons[ndir][i][nVarOffset];
644 (*expvect)[ne]->AlignVectorToCollapsedDir(ndir,
648 Vmath::Vadd(nElmtPnt,ConsCurv[nd],1,ConsStdd[nd],1,
655 (*expvect)[ne]->MultiplyByQuadratureMetric(
656 ConsStdd[ndir],ConsStdd[ndir]);
657 for(
int i=0; i<nElmtPnt;i++)
659 PntJacConsStd[ndir][i][nVarOffset] =
660 DataType(ConsStdd[ndir][i]);
668 for(
int m=0; m<nvariable;m++)
670 for(
int n=0; n<nvariable;n++)
672 int nVarOffset = m+n*nvariable;
678 DervStdd[ndStd0][ndStd1],1);
685 for(
int i=0; i<nElmtPnt;i++)
688 PntJacDerv[nd0][nd1][i][nVarOffset];
691 (*expvect)[ne]->AlignVectorToCollapsedDir(
692 nd0,tmppnts,ConsCurv);
696 AlignVectorToCollapsedDir(nd1,
697 ConsCurv[nd],DervCurv[nd]);
705 DervCurv[ndStd0][ndStd1],1,
706 DervStdd[ndStd0][ndStd1],1,
707 DervStdd[ndStd0][ndStd1],1);
717 MultiplyByQuadratureMetric(
720 for(
int i=0; i<nElmtPnt;i++)
722 PntJacDervStd[nd0][nd1][i][nVarOffset] =
723 -DataType(DervStdd[nd0][nd1][i]);
735 for(
int i=0;i<nElmtPnt;i++)
738 &StdMatDataDBB[ne][ndir][i][0],1,
739 &PntJacConsStd[ndir][i][0],1,
740 &MatData[0],nElmtCoef2Paded);
750 for(
int i=0;i<nElmtPnt;i++)
753 &StdMatDataDBDB[ne][nd0][nd1][i][0],1,
754 &PntJacDervStd[nd0][nd1][i][0],1,
755 &MatData[0],nElmtCoef2Paded);
764 for(
int n=0; n<nvariable;n++)
766 for(
int m=0; m<nvariable;m++)
768 int nVarOffset = m+n*nvariable;
769 GmatxData = gmtxarray[m][n]->GetBlock(ne,ne)->GetPtr();
771 tmpA = MatData + nVarOffset*nElmtCoef2Paded,1,
778 template<
typename DataType>
783 std::shared_ptr<LocalRegions::ExpansionVector> expvect =
785 int nTotElmt = (*expvect).size();
790 vector<DNekMatSharedPtr> VectStdDerivBase0;
791 vector< TensorOfArray3D<DataType> > VectStdDerivBase_Base;
792 vector< TensorOfArray4D<DataType> > VectStdDervBase_DervBase;
796 for (
int ne = 0; ne < nTotElmt; ne++)
799 stdExp = (*expvect)[ne]->GetStdExp();
801 stdExp->DetShapeType(), *stdExp);
802 MatStdDerivBase0 = stdExp->GetStdMatrix(matkey);
804 int nTotStdExp = VectStdDerivBase0.size();
805 int nFoundStdExp = -1;
806 for (
int i = 0; i < nTotStdExp; i++)
808 if ((*VectStdDerivBase0[i])==(*MatStdDerivBase0))
813 if (nFoundStdExp >= 0)
815 StdMatDataDBB[ne] = VectStdDerivBase_Base[nFoundStdExp];
816 StdMatDataDBDB[ne] = VectStdDervBase_DervBase[nFoundStdExp];
820 int nElmtCoef = (*expvect)[ne]->GetNcoeffs();
821 int nElmtCoef2 = nElmtCoef*nElmtCoef;
822 int nElmtPnt = (*expvect)[ne]->GetTotPoints();
833 ArrayStdMat[0] = MatStdDerivBase0;
837 stdExp->DetShapeType(), *stdExp);
838 ArrayStdMat[1] = stdExp->GetStdMatrix(matkey);
844 stdExp->DetShapeType(), *stdExp);
845 ArrayStdMat[2] = stdExp->GetStdMatrix(matkey);
850 ArrayStdMatData[nd0] = ArrayStdMat[nd0]->GetPtr();
854 stdExp->DetShapeType(), *stdExp);
864 for(
int i=0;i<nElmtPnt;i++)
867 for(
int nc1=0;nc1<nElmtCoef;nc1++)
869 int noffset = nc1*nElmtCoef;
870 for(
int nc0=0;nc0<nElmtCoef;nc0++)
872 tmpStdDBB[nd0][i][nc0+noffset] =
873 DataType (ArrayStdMatData[nd0]
875 BwdMatData[i*nElmtCoef+nc1]);
883 tmpStdDBDB[nd0][nd1] =
885 for(
int i=0;i<nElmtPnt;i++)
887 tmpStdDBDB[nd0][nd1][i] =
889 for(
int nc1=0;nc1<nElmtCoef;nc1++)
891 int noffset = nc1*nElmtCoef;
892 for(
int nc0=0;nc0<nElmtCoef;nc0++)
894 tmpStdDBDB[nd0][nd1][i][nc0+noffset] =
895 DataType(ArrayStdMatData[nd0]
904 VectStdDerivBase0.push_back(MatStdDerivBase0);
905 VectStdDerivBase_Base.push_back(tmpStdDBB);
906 VectStdDervBase_DervBase.push_back(tmpStdDBDB);
908 StdMatDataDBB[ne] = tmpStdDBB;
909 StdMatDataDBDB[ne] = tmpStdDBDB;
915 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
925 int nvariables = inarray.size();
926 GetTraceJac(inarray,qfield,TraceJac,TraceJacDeriv,TraceJacDerivSign,
933 TraceJac,gmtxarray,tmpJac,tmpSign);
937 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
940 TypeNekBlkMatSharedPtr &gmtVar,
941 const DataType &tmpDataType)
943 boost::ignore_unused(tmpDataType);
945 int n1d = gmtxarray.size();
946 int n2d = gmtxarray[0].size();
947 int nConvectiveFields = n1d;
949 ASSERTL0(n1d==n2d,
"ElmtVarInvMtrx requires n1d==n2d");
954 gmtxarray[0][0]->GetBlockSizes(rowSizes,colSizes);
955 int nTotElmt = rowSizes.size();
956 int nElmtCoef = rowSizes[0]-1;
961 TypeNekBlkMatSharedPtr tmpGmtx;
966 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
968 int nrows = gmtxarray[0][0]->GetBlock(nelmt,nelmt)->GetRows();
969 int ncols = gmtxarray[0][0]->GetBlock(nelmt,nelmt)->GetColumns();
970 ASSERTL0(nrows==ncols,
"ElmtVarInvMtrx requires nrows==ncols");
974 if (nElmtCoef0!=nElmtCoef)
976 nElmtCoef0 = nElmtCoef;
977 int nElmtCoefVar = nElmtCoef0*nConvectiveFields;
978 blocksize = nElmtCoefVar*nElmtCoefVar;
979 tmprow[0] = nElmtCoefVar;
981 GMatData = tmpGmtx->GetBlock(0,0)->GetPtr();
984 for(
int n = 0; n < nConvectiveFields; n++)
986 for(
int m = 0; m < nConvectiveFields; m++)
988 ElmtMatData = gmtxarray[m][n]->
989 GetBlock(nelmt,nelmt)->GetPtr();
991 for(
int ncl = 0; ncl < nElmtCoef; ncl++)
993 int Goffset = (n*nElmtCoef+ncl)*nConvectiveFields*
994 nElmtCoef+m*nElmtCoef;
995 int Eoffset = ncl*nElmtCoef;
998 tmpArray1 = ElmtMatData+Eoffset,1,
999 tmpArray2 = GMatData+Goffset,1);
1004 tmpGmtx->GetBlock(0,0)->Invert();
1006 for(
int m = 0; m < nConvectiveFields; m++)
1008 for(
int n = 0; n < nConvectiveFields; n++)
1011 gmtxarray[m][n]->GetBlock(nelmt,nelmt)->GetPtr();
1013 for(
int ncl = 0; ncl < nElmtCoef; ncl++)
1015 int Goffset = (n*nElmtCoef+ncl)*nConvectiveFields*
1016 nElmtCoef+m*nElmtCoef;
1017 int Eoffset = ncl*nElmtCoef;
1020 tmpArray1 = GMatData+Goffset,1,
1021 tmpArray2 = ElmtMatData+Eoffset,1);
1025 ElmtMatData = gmtVar->GetBlock(nelmt,nelmt)->GetPtr();
1033 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1042 boost::ignore_unused(TraceJacDeriv, TraceJacDerivSign);
1044 int nvariables = inarray.size();
1051 TypeNekBlkMatSharedPtr FJac,BJac;
1054 if(TraceJac.size()>0)
1074 for(
int i = 0; i < nvariables; ++i)
1078 m_fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
1091 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1093 const int nConvectiveFields,
1101 TypeNekBlkMatSharedPtr &FJac,
1102 TypeNekBlkMatSharedPtr &BJac,
1105 boost::ignore_unused(TraceIPSymJacArray);
1108 int nvariables = nConvectiveFields;
1117 for(
int i = 0; i < nvariables; i++)
1131 m_diffusion->GetAVmu(fields,inarray,muvar,MuVarTrace);
1136 for(
int i = 0; i < nvariables; ++i)
1142 fields[0]->GetTraceMap();
1147 for (
int nd = 0; nd < nDim; ++nd)
1151 for (
int i = 0; i < nConvectiveFields; ++i)
1156 fields[i]->GetFwdBwdTracePhys(qfield[nd][i], qFwd[nd][i],
1157 qBwd[nd][i],
true,
true,
false);
1158 TraceMap->GetAssemblyCommDG()->PerformExchange(qFwd[nd][i],
1165 PenaltyFactor2, fields,AdvVel,inarray,time,qfield,Fwd,Bwd,
1166 qFwd,qBwd,MuVarTrace,nonZeroIndex,numflux);
1168 int nFields = nvariables;
1173 for(
int i = 0; i < nFields; i++)
1183 for(
int i = 0; i < nFields; i++)
1193 for(
int i = 0; i < nFields; i++)
1197 Vmath::Sadd(nTracePts,epsvar,Fwd[i],1,plusFwd[i],1);
1201 for(
int i = 0; i < nFields; i++)
1208 x->Apply(FwdBnd, tmpinarry, time);
1212 for(
int j = 0; j < nFields; j++)
1214 m_fields[j]->FillBwdWithBoundCond(plusFwd[j], plusBwd[j]);
1218 PenaltyFactor2,fields,AdvVel,inarray,time,qfield,
1219 plusFwd,plusBwd,qFwd,qBwd,MuVarTrace,nonZeroIndex,plusflux);
1221 for (
int n = 0; n < nFields; n++)
1223 Vmath::Vsub(nTracePts,plusflux[n],1,numflux[n],1,Jacvect[n],1);
1224 Vmath::Smul(nTracePts, oepsvar ,Jacvect[n],1,Jacvect[n],1);
1226 for(
int j = 0; j < nTracePts; j++)
1228 tmpMatData = FJac->GetBlock(j,j)->GetPtr();
1229 for (
int n = 0; n < nFields; n++)
1231 tmpMatData[n+i*nFields] = DataType(Jacvect[n][j]);
1241 for(
int i = 0; i < nFields; i++)
1248 x->Apply(FwdBnd, tmpinarry, time);
1252 for(
int i = 0; i < nFields; i++)
1257 for(
int i = 0; i < nFields; i++)
1262 Vmath::Sadd(nTracePts,epsvar,Bwd[i],1,plusBwd[i],1);
1264 for(
int j = 0; j < nFields; j++)
1266 m_fields[j]->FillBwdWithBoundCond(Fwd[j], plusBwd[j]);
1270 PenaltyFactor2,fields,AdvVel,inarray,time,qfield,Fwd,
1271 plusBwd,qFwd,qBwd,MuVarTrace,nonZeroIndex,plusflux);
1273 for (
int n = 0; n < nFields; n++)
1275 Vmath::Vsub(nTracePts,plusflux[n],1,numflux[n],1,Jacvect[n],1);
1276 Vmath::Smul(nTracePts, oepsvar,Jacvect[n],1,Jacvect[n],1);
1278 for(
int j = 0; j < nTracePts; j++)
1280 tmpMatData = BJac->GetBlock(j,j)->GetPtr();
1281 for (
int n = 0; n < nFields; n++)
1283 tmpMatData[n+i*nFields] = DataType(Jacvect[n][j]);
1292 const int nConvectiveFields,
1295 const int nTracePts,
1310 boost::ignore_unused(nDim, nPts, PenaltyFactor2, time, qFwd, qBwd,
1320 for (
int i = 0; i < nConvectiveFields; i++)
1329 for(
int i = 0; i < nConvectiveFields; i++)
1334 m_diffusion->DiffuseTraceFlux(fields, inarray, qfield,
1336 for(
int i = 0; i < nConvectiveFields; i++)
1338 Vmath::Vsub(nTracePts,traceflux[i],1,visflux[i],1,
1369 TraceJacDeriv,TraceJacDerivSign,TraceIPSymJacArray);
1376 TraceJacDerivArray);
1380 const int nConvectiveFields,
1390 boost::ignore_unused(nConvectiveFields, nElmtPnt, locVars, locDerv,
1391 locmu, locDmuDT, normals, wspMat, PntJacArray);
1395 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1399 const DataType tmpDataType)
1401 boost::ignore_unused(tmpDataType);
1404 std::shared_ptr<LocalRegions::ExpansionVector> pexp = explist->GetExp();
1405 int nTotElmt = (*pexp).size();
1406 int nConvectiveFields =
m_fields.size();
1411 Vmath::Fill(nTotElmt,Negdtlamda,pseudotimefactor,1);
1414 for(
int m = 0; m < nConvectiveFields; m++)
1416 for(
int n = 0; n < nConvectiveFields; n++)
1418 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1420 GMatData = gmtxarray[m][n]->GetBlock(nelmt,nelmt)->GetPtr();
1421 DataType factor = DataType(pseudotimefactor[nelmt]);
1434 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1439 explist->GetExp(nelmt)->DetShapeType();
1441 if (tmp.size()!=nelmtcoef||(ElmtTypeNow!=ElmtTypePrevious))
1444 stdExp = explist->GetExp(nelmt)->GetStdExp();
1446 stdExp->DetShapeType(), *stdExp);
1449 BwdMatData = BwdMat->GetPtr();
1451 if(nelmtcoef!=tmp.size())
1456 MassMatData = MassMat->GetPtr();
1457 MassMatDataDataType =
1461 ElmtTypePrevious = ElmtTypeNow;
1464 for(
int np=0; np<nelmtcoef;np++)
1466 explist->GetExp(nelmt)->IProductWRTBase(
1467 BwdMatData+np*nelmtpnts,tmp);
1468 Vmath::Vcopy(nelmtcoef,tmp,1,tmp2 = MassMatData+np*nelmtcoef,1);
1470 for(
int i=0;i<MassMatData.size();i++)
1472 MassMatDataDataType[i] = DataType(MassMatData[i]);
1475 for(
int m = 0; m < nConvectiveFields; m++)
1477 GMatData = gmtxarray[m][m]->GetBlock(nelmt,nelmt)->GetPtr();
1478 Vmath::Vadd(MassMatData.size(),MassMatDataDataType,1,
1479 GMatData,1,GMatData,1);
1485 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1492 boost::ignore_unused(TraceJacArray, TraceJacDeriv, TraceJacDerivArray);
1494 int nFwdBwd,nDiagBlks,nvar0Jac,nvar1Jac;
1498 nFwdBwd = TraceJac.size();
1499 TraceJac[0]->GetBlockSizes(rowSizes,colSizes);
1500 nDiagBlks = rowSizes.size();
1501 nvar0Jac = rowSizes[1] - rowSizes[0];
1502 nvar1Jac = colSizes[1] - colSizes[0];
1504 if(0==TraceJacArray.size())
1507 for(
int nlr=0;nlr<nFwdBwd;nlr++)
1510 for(
int m=0;m<nvar0Jac;m++)
1513 for(
int n=0;n<nvar1Jac;n++)
1515 TraceJacArray[nlr][m][n] =
1522 for(
int nlr=0;nlr<nFwdBwd;nlr++)
1524 const TypeNekBlkMatSharedPtr tmpMat = TraceJac[nlr];
1540 boost::ignore_unused(explist, normals, nDervDir, inarray, ElmtJacArray,
1546 const int nConvectiveFields,
1555 boost::ignore_unused(nConvectiveFields, nElmtPnt, nDervDir, locVars,
1556 locmu, locnormal, wspMat, PntJacArray);
1567 boost::ignore_unused(explist, normals, nDervDir, inarray, ElmtJac);
1571 const int nConvectiveFields,
1580 int matsize = nConvectiveFields*nConvectiveFields;
1584 for(
int npnt = 0; npnt < nElmtPnt; npnt++)
1586 for(
int j = 0; j < nConvectiveFields; j++)
1588 pointVar[j] = locVars[j][npnt];
1593 Vmath::Vcopy(matsize, wspMatData,1,PntJacArray[npnt],1);
1599 const int nConvectiveFields,
1604 int nvariables = conservVar.size();
1605 const int nvariables3D = 5;
1609 efix_StegerWarming = 0.0;
1611 if (nvariables > expDim+2)
1618 fluxJacData = fluxJac->GetPtr();
1620 if(nConvectiveFields==nvariables3D)
1623 efix_StegerWarming,fsw);
1631 PointFJac3DData = PointFJac3D->GetPtr();
1637 index[nvariables-1] = 4;
1638 for(
int i=0;i<nvariables-1;i++)
1645 for(
int j=0; j< nvariables; j++)
1648 PointFwd[nj] = conservVar[j];
1652 efix_StegerWarming,fsw);
1654 for(
int j=0; j< nvariables; j++)
1657 for(
int k=0; k< nvariables; k++)
1660 fluxJacData[j+k*nConvectiveFields] =
1661 PointFJac3DData[nj+nk*nvariables3D];
1689 boost::ignore_unused(flag);
1698 unsigned int nTotalGlobal = inarray.size();
1704 unsigned int ntotal = inarray.size();
1708 Vmath::Svtvp(ntotal, eps, inarray, 1, refsol, 1, solplus, 1);
1712 Vmath::Vsub(ntotal, resplus, 1, refres, 1, out,1);
1718 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1720 const TypeNekBlkMatSharedPtr &BlkMat,
1725 BlkMat->GetBlockSizes(rowSizes,colSizes);
1726 int nDiagBlks = rowSizes.size();
1727 int nvar0 = rowSizes[1] - rowSizes[0];
1728 int nvar1 = colSizes[1] - colSizes[0];
1732 for(
int i=0;i<nDiagBlks;i++)
1734 ElmtMatData = BlkMat->GetBlock(i,i)->GetPtr();
1735 for(
int n=0;n<nvar1;n++)
1737 int noffset = n*nvar0;
1738 for(
int m=0;m<nvar0;m++)
1740 MatArray[m][n][i] = ElmtMatData[m+noffset];
1746 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1749 const DataType valu)
1752 int n1d = gmtxarray.size();
1754 for(
int n1 = 0; n1 < n1d; ++n1)
1761 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
1764 const DataType valu)
1766 int n1d = gmtxarray.size();
1774 for(
int n1 = 0; n1 < n1d; ++n1)
1776 gmtxarray[n1]->GetBlockSizes(rowSizes,colSizes);
1777 int nelmts = rowSizes.size();
1779 for(
int i = 0; i < nelmts; ++i)
1781 loc_mat_arr = gmtxarray[n1]->GetBlock(i,i)->GetPtr();
1783 int nrows = gmtxarray[n1]->GetBlock(i,i)->GetRows();
1784 int ncols = gmtxarray[n1]->GetBlock(i,i)->GetColumns();
1804 const int nvariables3D = 5;
1810 NekDouble l1,l4,l5,al1,al4,al5,x1,x2,x3,y1;
1811 NekDouble c1,d1,c2,d2,c3,d3,c4,d4,c5,d5;
1829 (EL - 0.5 * (rhouL * vx + rhovL * vy + rhowL * vz)) / rhoL;
1831 ps =
m_varConv->Geteos()->GetPressure(rhoL, eL);
1835 v2 = vx*vx + vy*vy + vz*vz;
1845 vn = nx*vx + ny*vy + nz*vz;
1846 sn = std::max(
sqrt(nx*nx + ny*ny + nz*nz),sml_ssf);
1860 al1 =
sqrt(l1*l1 + eps2);
1861 al4 =
sqrt(l4*l4 + eps2);
1862 al5 =
sqrt(l5*l5 + eps2);
1864 l1 = 0.5*(fExactorSplt*l1 + fsw*al1);
1865 l4 = 0.5*(fExactorSplt*l4 + fsw*al4);
1866 l5 = 0.5*(fExactorSplt*l5 + fsw*al5);
1876 int nVar1 = nvariables3D;
1877 int nVar2 = 2*nvariables3D;
1878 int nVar3 = 3*nvariables3D;
1879 int nVar4 = 4*nvariables3D;
1880 FJacData[ nVar0] = c1*y1 - d1*vna + l1;
1881 FJacData[ nVar1] = -c1*vx + d1*nxa;
1882 FJacData[ nVar2] = -c1*vy + d1*nya;
1883 FJacData[ nVar3] = -c1*vz + d1*nza;
1884 FJacData[ nVar4] = c1;
1885 c2 = c1*vx + d1*nxa*ae;
1886 d2 = x3*nxa + d1*vx;
1887 FJacData[ 1 + nVar0] = c2*y1 - d2*vna;
1888 FJacData[ 1 + nVar1] = -c2*vx + d2*nxa + l1;
1889 FJacData[ 1 + nVar2] = -c2*vy + d2*nya;
1890 FJacData[ 1 + nVar3] = -c2*vz + d2*nza;
1891 FJacData[ 1 + nVar4] = c2;
1892 c3 = c1*vy + d1*nya*ae;
1893 d3 = x3*nya + d1*vy;
1894 FJacData[ 2 + nVar0] = c3*y1 - d3*vna;
1895 FJacData[ 2 + nVar1] = -c3*vx + d3*nxa;
1896 FJacData[ 2 + nVar2] = -c3*vy + d3*nya + l1;
1897 FJacData[ 2 + nVar3] = -c3*vz + d3*nza;
1898 FJacData[ 2 + nVar4] = c3;
1899 c4 = c1*vz + d1*nza*ae;
1900 d4 = x3*nza + d1*vz;
1901 FJacData[ 3 + nVar0] = c4*y1 - d4*vna;
1902 FJacData[ 3 + nVar1] = -c4*vx + d4*nxa;
1903 FJacData[ 3 + nVar2] = -c4*vy + d4*nya;
1904 FJacData[ 3 + nVar3] = -c4*vz + d4*nza + l1;
1905 FJacData[ 3 + nVar4] = c4;
1906 c5 = c1*h0 + d1*vna*ae;
1907 d5 = x3*vna + d1*h0;
1908 FJacData[ 4 + nVar0] = c5*y1 - d5*vna;
1909 FJacData[ 4 + nVar1] = -c5*vx + d5*nxa;
1910 FJacData[ 4 + nVar2] = -c5*vy + d5*nya;
1911 FJacData[ 4 + nVar3] = -c5*vz + d5*nza;
1912 FJacData[ 4 + nVar4] = c5 + l1;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
size_type size() const
Returns the array's size.
void DoDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
Add the diffusions terms to the right-hand side Similar to DoDiffusion() but with outarray in coeffic...
void CalcVolJacStdMat(TensorOfArray4D< DataType > &StdMatDataDBB, TensorOfArray5D< DataType > &StdMatDataDBDB)
void ElmtVarInvMtrx(Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, TypeNekBlkMatSharedPtr &gmtVar, const DataType &tmpDatatype)
void DoAdvectionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
Compute the advection terms for the right-hand side.
virtual void v_DoDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
LibUtilities::NekNonlinSysSharedPtr m_nonlinsol
void AddMatNSBlkDiagVol(const Array< OneD, const Array< OneD, NekDouble >> &inarray, const Array< OneD, const TensorOfArray2D< NekDouble >> &qfield, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, TensorOfArray4D< DataType > &StdMatDataDBB, TensorOfArray5D< DataType > &StdMatDataDBDB)
void PointFluxJacobianPoint(const Array< OneD, NekDouble > &Fwd, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &FJac, const NekDouble efix, const NekDouble fsw)
NekDouble m_jacobiFreeEps
void PreconCoeff(const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const bool &flag)
void MultiplyElmtInvMassPlusSource(Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const NekDouble dtlamda, const DataType tmpDataType)
void NonlinSysEvaluatorCoeff1D(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag)
void CalcRefValues(const Array< OneD, const NekDouble > &inarray)
virtual bool UpdateTimeStepCheck()
virtual void v_GetFluxDerivJacDirctn(const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray5D< NekDouble > &ElmtJacArray, const int nFluxDir)
void GetFluxVectorJacDirElmt(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void Fill2DArrayOfBlkDiagonalMat(Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const DataType valu)
void DoImplicitSolveCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inpnts, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const NekDouble time, const NekDouble lambda)
void CalcTraceNumericalFlux(const int nConvectiveFields, const int nDim, const int nPts, const int nTracePts, const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const Array< OneD, NekDouble >> &AdvVel, const Array< OneD, const Array< OneD, NekDouble >> &inarray, const NekDouble time, TensorOfArray3D< NekDouble > &qfield, const Array< OneD, const Array< OneD, NekDouble >> &vFwd, const Array< OneD, const Array< OneD, NekDouble >> &vBwd, const Array< OneD, const TensorOfArray2D< NekDouble >> &qFwd, const Array< OneD, const TensorOfArray2D< NekDouble >> &qBwd, const Array< OneD, NekDouble > &MuVarTrace, Array< OneD, int > &nonZeroIndex, Array< OneD, Array< OneD, NekDouble >> &traceflux)
Array< OneD, Array< OneD, NekDouble > > m_solutionPhys
void AllocateNekBlkMatDig(SNekBlkMatSharedPtr &mat, const Array< OneD, unsigned int > nrow, const Array< OneD, unsigned int > ncol)
TensorOfArray4D< NekSingle > m_stdSMatDataDBB
void NonlinSysEvaluatorCoeff(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag=true, const Array< OneD, const NekDouble > &source=NullNekDouble1DArray)
void TranSamesizeBlkDiagMatIntoArray(const TypeNekBlkMatSharedPtr &BlkMat, TensorOfArray3D< DataType > &MatArray)
void NumCalcRiemFluxJac(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const Array< OneD, NekDouble >> &AdvVel, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, const NekDouble &time, const Array< OneD, const Array< OneD, NekDouble >> &Fwd, const Array< OneD, const Array< OneD, NekDouble >> &Bwd, TypeNekBlkMatSharedPtr &FJac, TypeNekBlkMatSharedPtr &BJac, TensorOfArray5D< DataType > &TraceIPSymJacArray)
PreconCfsOpSharedPtr m_preconCfs
NekDouble m_newtonAbsoluteIteTol
virtual ~CFSImplicit()
Destructor for CFSImplicit class.
void DoOdeRhsCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
Compute the right-hand side.
virtual void v_InitObject()
Initialization object for CFSImplicit class.
void GetTraceJac(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, DataType >> &TraceJacDerivSign, TensorOfArray5D< DataType > &TraceIPSymJacArray)
void GetFluxVectorJacPoint(const int nConvectiveFields, const Array< OneD, NekDouble > &conservVar, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &fluxJac)
TensorOfArray5D< NekSingle > m_stdSMatDataDBDB
void GetFluxDerivJacDirctnElmt(const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void MatrixMultiplyMatrixFreeCoeff(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag=false)
virtual void v_MinusDiffusionFluxJacPoint(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void CalcPreconMatBRJCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray, SNekBlkMatSharedPtr &gmtVar, Array< OneD, SNekBlkMatSharedPtr > &TraceJac, Array< OneD, SNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, NekSingle >> &TraceJacDerivSign, TensorOfArray4D< NekSingle > &TraceJacArray, TensorOfArray4D< NekSingle > &TraceJacDerivArray, TensorOfArray5D< NekSingle > &TraceIPSymJacArray)
void TransTraceJacMatToArray(const Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, const Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, TensorOfArray4D< DataType > &TraceJacArray, TensorOfArray4D< DataType > &TraceJacDerivArray)
void AddMatNSBlkDiagBnd(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray2D< TypeNekBlkMatSharedPtr > &gmtxarray, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, DataType >> &TraceJacDerivSign, TensorOfArray5D< DataType > &TraceIPSymJacArray)
void CalcPhysDeriv(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield)
void MinusDiffusionFluxJacPoint(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble >> &inpnts, Array< OneD, Array< OneD, NekDouble >> &outpnt, const NekDouble time, const NekDouble lambda)
void Fill1DArrayOfBlkDiagonalMat(Array< OneD, TypeNekBlkMatSharedPtr > &gmtxarray, const DataType valu)
void InitialiseNonlinSysSolver()
void CalcMuDmuDT(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT)
virtual void v_GetFluxDerivJacDirctnElmt(const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
NekDouble m_bndEvaluateTime
std::string m_shockCaptureType
SolverUtils::DiffusionSharedPtr m_diffusion
std::vector< CFSBndCondSharedPtr > m_bndConds
void GetElmtTimeStep(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &tstep)
Calculate the maximum timestep on each element subject to CFL restrictions.
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
Compute the projection and call the method for imposing the boundary conditions in case of discontinu...
VariableConverterSharedPtr m_varConv
virtual void v_InitObject()
Initialization object for CompressibleFlowSystem class.
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
NekDouble m_NonlinIterTolRelativeL2
int m_NekNonlinSysMaxIterations
NekDouble m_LinSysRelativeTolInNonlin
int m_NekLinSysMaxIterations
void DefineNekSysResEval(FuncPointerT func, ObjectPointerT obj)
void DefineNekSysLhsEval(FuncPointerT func, ObjectPointerT obj)
void DefineNekSysPrecon(FuncPointerT func, ObjectPointerT obj)
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void DefineCalcPreconMatBRJCoeff(FuncPointerT func, ObjectPointerT obj)
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
int m_spacedim
Spatial dimension (>= expansion dim).
SpatialDomains::MeshGraphSharedPtr m_graph
Pointer to graph defining mesh.
LibUtilities::CommSharedPtr m_comm
Communicator.
NekDouble m_timestep
Time step size.
NekDouble m_time
Current time of simulation.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
NekDouble m_fintime
Finish time of the simulation.
NekDouble m_lastCheckTime
NekDouble m_checktime
Time between checkpoints.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
enum HomogeneousType m_HomogeneousType
SOLVER_UTILS_EXPORT int GetNpoints()
SOLVER_UTILS_EXPORT int GetNcoeffs()
SOLVER_UTILS_EXPORT int GetPhys_Offset(int n)
SOLVER_UTILS_EXPORT int GetTotPoints()
Base class for unsteady solvers.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
NekDouble m_TimeIntegLambda
coefff of spacial derivatives(rhs or m_F in GLM) in calculating the residual of the whole equation(us...
bool m_explicitAdvection
Indicates if explicit or implicit treatment of advection is used.
bool m_explicitDiffusion
Indicates if explicit or implicit treatment of diffusion is used.
bool m_flagImplicitSolver
Array< OneD, NekDouble > m_magnitdEstimat
estimate the magnitude of each conserved varibles
bool m_flagUpdatePreconMat
static void Ger(const int &m, const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy, double *a, const int &lda)
BLAS level 2: Matrix vector multiply A = alpha*x*y**T + A where A[m x n].
NekNonlinSysFactory & GetNekNonlinSysFactory()
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< AssemblyMapDG > AssemblyMapDGSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< LocTraceToTraceMap > LocTraceToTraceMapSharedPtr
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
The above copyright notice and this permission notice shall be included.
std::shared_ptr< SNekBlkMat > SNekBlkMatSharedPtr
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
static Array< OneD, Array< OneD, Array< OneD, NekDouble > > > NullNekDoubleTensorOfArray3D
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
PreconCfsOpFactory & GetPreconCfsOpFactory()
Declaration of the boundary condition factory singleton.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
void Neg(int n, T *x, const int incx)
Negate x = -x.
T Dot(int n, const T *w, const T *x)
vvtvp (vector times vector times vector): z = w*x*y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha - x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
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.
scalarT< T > abs(scalarT< T > in)
scalarT< T > sqrt(scalarT< T > in)