48 std::string PreconCfsBRJ::className =
50 "PreconCfsBRJ", PreconCfsBRJ::create,
51 "Block Relaxed Jacobi Preconditioner for CFS.");
53 PreconCfsBRJ::PreconCfsBRJ(
62 int nvariables = pFields.size();
66 for (
int i = 0; i < nvariables; i++)
72 int nelmts = pFields[0]->GetNumElmts();
75 for (
int i = 0; i < nelmts; i++)
77 nelmtcoef = pFields[0]->GetExp(i)->GetNcoeffs();
78 nelmtmatdim[i] = nelmtcoef * nvariables;
93 boost::ignore_unused(flag);
103 const NekDouble OmBRJParam = 1.0 - BRJParam;
105 unsigned int nvariables = pFields.size();
106 unsigned int npoints = pFields[0]->GetNcoeffs();
107 unsigned int ntotpnt = inarray.size();
109 ASSERTL0(nvariables * npoints == ntotpnt,
110 "nvariables*npoints!=ntotpnt in PreconCoeff");
119 for (
int m = 0; m < nvariables; m++)
121 int moffset = m * npoints;
122 rhs2d[m] = rhs + moffset;
123 out_2d[m] = outarray + moffset;
124 outTmp_2d[m] = outTmp + moffset;
125 pFields[m]->MultiplyByMassMatrix(inarray + moffset, rhs2d[m]);
128 int nphysic = pFields[0]->GetNpoints();
129 int nTracePts = pFields[0]->GetTrace()->GetNpoints();
134 for (
int j = 0; j < nvariables; j++)
141 for (
int i = 0; i < ntmpTrace; i++)
144 for (
int j = 0; j < nvariables; j++)
151 for (
int j = 0; j < nvariables; j++)
157 bool flagUpdateDervFlux =
false;
159 const int nwspTraceDataType = nvariables + 1;
162 for (
int m = 0; m < nwspTraceDataType; m++)
173 for (
int nrelax = 0; nrelax < nBRJIterTot - 1; nrelax++)
175 Vmath::Smul(ntotpnt, OmBRJParam, outarray, 1, outN, 1);
179 pFields, nvariables, npoints, rhs2d, out_2d, flagUpdateDervFlux,
180 FwdFluxDeriv, BwdFluxDeriv, qfield, tmpTrace, wspTraceDataType,
192 Vmath::Svtvp(ntotpnt, BRJParam, outTmp, 1, outN, 1, outarray, 1);
212 cout <<
" ## CalcuPreconMat " << endl;
226 boost::ignore_unused(res);
244 template <
typename DataType,
typename TypeNekBlkMatSharedPtr>
248 const TypeNekBlkMatSharedPtr &PreconMatVars,
const DataType &tmpDataType)
250 boost::ignore_unused(tmpDataType);
252 unsigned int nvariables = pFields.size();
253 unsigned int npoints = pFields[0]->GetNcoeffs();
254 unsigned int npointsVar = nvariables * npoints;
260 std::shared_ptr<LocalRegions::ExpansionVector> expvect =
261 pFields[0]->GetExp();
262 int nTotElmt = (*expvect).size();
264 for (
int m = 0; m < nvariables; m++)
266 int nVarOffset = m * npoints;
267 for (
int ne = 0; ne < nTotElmt; ne++)
269 int nCoefOffset = pFields[0]->GetCoeff_Offset(ne);
270 int nElmtCoef = pFields[0]->GetNcoeffs(ne);
271 int inOffset = nVarOffset + nCoefOffset;
272 int outOffset = nCoefOffset * nvariables + m * nElmtCoef;
273 for (
int i = 0; i < nElmtCoef; i++)
275 Sinarray[outOffset + i] = DataType(inarray[inOffset + i]);
280 outVect = (*PreconMatVars) * tmpVect;
282 for (
int m = 0; m < nvariables; m++)
284 int nVarOffset = m * npoints;
285 for (
int ne = 0; ne < nTotElmt; ne++)
287 int nCoefOffset = pFields[0]->GetCoeff_Offset(ne);
288 int nElmtCoef = pFields[0]->GetNcoeffs(ne);
289 int inOffset = nVarOffset + nCoefOffset;
290 int outOffset = nCoefOffset * nvariables + m * nElmtCoef;
291 for (
int i = 0; i < nElmtCoef; i++)
293 outarray[inOffset + i] =
NekDouble(Soutarray[outOffset + i]);
299 template <
typename DataType>
302 const int nvariables,
const int nCoeffs,
314 boost::ignore_unused(flagUpdateDervFlux, qfield, TraceJacDerivArray,
315 TraceJacDerivSign, FwdFluxDeriv, BwdFluxDeriv,
318 int nTracePts = pFields[0]->GetTrace()->GetNpoints();
319 int npoints = pFields[0]->GetNpoints();
323 for (
int i = 0; i < nvariables; i++)
326 pFields[i]->BwdTrans(outarray[i], outpnts[i]);
336 int indexwspTrace = 0;
337 Fwd = wspTrace[indexwspTrace], indexwspTrace++;
338 Bwd = wspTrace[indexwspTrace], indexwspTrace++;
339 FwdFlux = wspTrace[indexwspTrace], indexwspTrace++;
340 BwdFlux = wspTrace[indexwspTrace], indexwspTrace++;
343 for (
int i = 0; i < nvariables; ++i)
346 pFields[i]->GetFwdBwdTracePhys(outpnts[i], Fwd[i], Bwd[i]);
351 int indexwspTraceDataType = 0;
353 for (
int m = 0; m < nvariables; ++m)
355 Fwdarray[m] = wspTraceDataType[indexwspTraceDataType],
356 indexwspTraceDataType++;
359 Fwdreslt = wspTraceDataType[indexwspTraceDataType], indexwspTraceDataType++;
361 for (
int m = 0; m < nvariables; ++m)
363 for (
int i = 0; i < nTracePts; ++i)
365 Fwdarray[m][i] = DataType(Fwd[m][i]);
368 for (
int m = 0; m < nvariables; ++m)
371 for (
int n = 0; n < nvariables; ++n)
373 Vmath::Vvtvp(nTracePts, TraceJacArray[0][m][n], 1, Fwdarray[n], 1,
374 Fwdreslt, 1, Fwdreslt, 1);
377 for (
int i = 0; i < nTracePts; ++i)
383 for (
int m = 0; m < nvariables; ++m)
385 for (
int i = 0; i < nTracePts; ++i)
387 Fwdarray[m][i] = DataType(Bwd[m][i]);
390 for (
int m = 0; m < nvariables; ++m)
393 for (
int n = 0; n < nvariables; ++n)
395 Vmath::Vvtvp(nTracePts, TraceJacArray[1][m][n], 1, Fwdarray[n], 1,
396 Fwdreslt, 1, Fwdreslt, 1);
398 for (
int i = 0; i < nTracePts; ++i)
404 for (
int i = 0; i < nvariables; ++i)
408 pFields[i]->AddTraceIntegralToOffDiag(FwdFlux[i], BwdFlux[i],
414 for (
int i = 0; i < nvariables; ++i)
421 template <
typename TypeNekBlkMatSharedPtr>
428 int nvars = pFields.size();
429 int nelmts = pFields[0]->GetNumElmts();
432 for (
int i = 0; i < nelmts; i++)
434 nelmtcoef = pFields[0]->GetExp(i)->GetNcoeffs();
435 nelmtmatdim[i] = nelmtcoef * nscale;
438 for (
int i = 0; i < nvars; i++)
440 for (
int j = 0; j < nvars; j++)
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
void DoCalcPreconMatBRJCoeff(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)
virtual void v_InitObject()
virtual void v_DoPreconCfs(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const bool &flag)
Array< OneD, SNekBlkMatSharedPtr > m_TraceJacSingle
TensorOfArray4D< NekSingle > m_TraceJacArraySingle
Array< OneD, Array< OneD, SNekBlkMatSharedPtr > > m_PreconMatVarsSingle
Array< OneD, SNekBlkMatSharedPtr > m_TraceJacDerivSingle
Array< OneD, Array< OneD, NekSingle > > m_TraceJacDerivSignSingle
void MinusOffDiag2Rhs(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int nvariables, const int nCoeffs, const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, bool flagUpdateDervFlux, Array< OneD, Array< OneD, NekDouble >> &FwdFluxDeriv, Array< OneD, Array< OneD, NekDouble >> &BwdFluxDeriv, TensorOfArray3D< NekDouble > &qfield, TensorOfArray3D< NekDouble > &wspTrace, Array< OneD, Array< OneD, DataType >> &wspTraceDataType, const TensorOfArray4D< DataType > &TraceJacArray, const TensorOfArray4D< DataType > &TraceJacDerivArray, const Array< OneD, const Array< OneD, DataType >> &TraceJacDerivSign, const TensorOfArray5D< DataType > &TraceIPSymJacArray)
PrecType m_PreconMatStorage
TensorOfArray4D< NekSingle > m_TraceJacDerivArraySingle
void AllocatePreconBlkDiagCoeff(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const int &nscale=1)
virtual void v_BuildPreconCfs(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, const Array< OneD, NekDouble >> &intmp, const NekDouble time, const NekDouble lambda)
TensorOfArray5D< NekSingle > m_TraceIPSymJacArraySingle
void AllocateNekBlkMatDig(SNekBlkMatSharedPtr &mat, const Array< OneD, unsigned int > nrow, const Array< OneD, unsigned int > ncol)
virtual bool UpdatePreconMatCheck(const Array< OneD, const NekDouble > &res, const NekDouble dtLambda)
void PreconBlkDiag(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const TypeNekBlkMatSharedPtr &PreconMatVars, const DataType &tmpDataType)
SNekBlkMatSharedPtr m_PreconMatSingle
void DoNullPrecon(const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const bool &flag)
NekDouble m_DtLambdaPreconMat
NekDouble m_BndEvaluateTime
virtual void v_InitObject()
NekPreconCfsOperators m_operator
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
The above copyright notice and this permission notice shall be included.
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 Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*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.