Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | Private Member Functions | Friends | List of all members
Nektar::PreconCfsBRJ Class Reference

#include <PreconCfsBRJ.h>

Inheritance diagram for Nektar::PreconCfsBRJ:
[legend]

Public Member Functions

 PreconCfsBRJ (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vComm)
 
 ~PreconCfsBRJ ()
 
virtual bool v_UpdatePreconMatCheck (const Array< OneD, const NekDouble > &res, const NekDouble dtLambda) override
 
- Public Member Functions inherited from Nektar::PreconCfsOp
 PreconCfsOp (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vComm)
 
virtual ~PreconCfsOp ()
 
void SetOperators (const NekPreconCfsOperators &in)
 
- Public Member Functions inherited from Nektar::PreconCfs
 PreconCfs (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vComm)
 
virtual ~PreconCfs ()
 
void DoPreconCfs (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const bool &flag)
 
void BuildPreconCfs (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, const Array< OneD, NekDouble >> &intmp, const NekDouble time, const NekDouble lambda)
 
void InitObject ()
 
bool UpdatePreconMatCheck (const Array< OneD, const NekDouble > &res, const NekDouble dtLambda)
 

Static Public Member Functions

static PreconCfsOpSharedPtr create (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vComm)
 Creates an instance of this class. More...
 

Static Public Attributes

static std::string className
 Name of the class. More...
 

Protected Member Functions

virtual void v_InitObject () override
 
- Protected Member Functions inherited from Nektar::PreconCfs
void DoNullPrecon (const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const bool &flag)
 

Protected Attributes

int m_PreconItsStep
 
int m_BRJRelaxParam
 
Array< OneD, Array< OneD, SNekBlkMatSharedPtr > > m_PreconMatVarsSingle
 
unsigned int m_max_nblocks
 
unsigned int m_max_nElmtDof
 
std::vector< simd< NekSingle >, tinysimd::allocator< simd< NekSingle > > > m_sBlkDiagMat
 
std::vector< int > m_inputIdx
 
Array< OneD, SNekBlkMatSharedPtrm_TraceJacSingle
 
TensorOfArray4D< NekSinglem_TraceJacArraySingle
 
Array< OneD, SNekBlkMatSharedPtrm_TraceJacDerivSingle
 
TensorOfArray4D< NekSinglem_TraceJacDerivArraySingle
 
Array< OneD, Array< OneD, NekSingle > > m_TraceJacDerivSignSingle
 
TensorOfArray5D< NekSinglem_TraceIPSymJacArraySingle
 
PrecType m_PreconMatStorage
 
- Protected Attributes inherited from Nektar::PreconCfsOp
NekPreconCfsOperators m_operator
 
- Protected Attributes inherited from Nektar::PreconCfs
LibUtilities::CommSharedPtr m_Comm
 
bool m_verbose
 
int m_spacedim
 
int m_PreconMatFreezNumb
 
int m_PreconTimesCounter
 
NekDouble m_DtLambdaPreconMat = -1.0
 
NekDouble m_BndEvaluateTime
 
bool m_CalcPreconMatFlag = false
 

Private Member Functions

virtual void v_DoPreconCfs (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const bool &flag) override
 
virtual void v_BuildPreconCfs (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, const Array< OneD, NekDouble >> &intmp, const NekDouble time, const NekDouble lambda) override
 
void PreconBlkDiag (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
template<typename DataType >
void MinusOffDiag2Rhs (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const size_t nvariables, const size_t 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)
 
template<typename TypeNekBlkMatSharedPtr >
void AllocatePreconBlkDiagCoeff (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const int &nscale=1)
 
void AllocateSIMDPreconBlkMatDiag (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
 This function creates the matrix structure for the block diagonal operator. It organizes the way that the matrix. More...
 
void AllocateNekBlkMatDig (SNekBlkMatSharedPtr &mat, const Array< OneD, unsigned int > nrow, const Array< OneD, unsigned int > ncol)
 

Friends

class MemoryManager< PreconCfsBRJ >
 

Detailed Description

Block Relaxed(weighted) Jacobi iterative (BRJ) Preconditioner for CFS

Solves a linear system using iterative methods.

Definition at line 49 of file PreconCfsBRJ.h.

Constructor & Destructor Documentation

◆ PreconCfsBRJ()

Nektar::PreconCfsBRJ::PreconCfsBRJ ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const LibUtilities::SessionReaderSharedPtr pSession,
const LibUtilities::CommSharedPtr vComm 
)

Definition at line 53 of file PreconCfsBRJ.cpp.

57  : PreconCfsOp(pFields, pSession, vComm)
58 {
59  pSession->LoadParameter("PreconItsStep", m_PreconItsStep, 7);
60  pSession->LoadParameter("BRJRelaxParam", m_BRJRelaxParam, 1.0);
61 
62  size_t nvariables = pFields.size();
64 
66  Array<OneD, Array<OneD, SNekBlkMatSharedPtr>>(nvariables);
67  for (size_t i = 0; i < nvariables; i++)
68  {
69  m_PreconMatVarsSingle[i] = Array<OneD, SNekBlkMatSharedPtr>(nvariables);
70  }
72 
74 }
Array< OneD, Array< OneD, SNekBlkMatSharedPtr > > m_PreconMatVarsSingle
Definition: PreconCfsBRJ.h:80
PrecType m_PreconMatStorage
Definition: PreconCfsBRJ.h:95
void AllocatePreconBlkDiagCoeff(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const int &nscale=1)
void AllocateSIMDPreconBlkMatDiag(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
This function creates the matrix structure for the block diagonal operator. It organizes the way that...
Definition: PreconCfsBRJ.h:143
PreconCfsOp(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vComm)
Definition: PreconCfsOp.cpp:48
@ eDiagonal
Definition: PreconCfs.h:48

References AllocatePreconBlkDiagCoeff(), AllocateSIMDPreconBlkMatDiag(), Nektar::eDiagonal, m_BRJRelaxParam, m_PreconItsStep, m_PreconMatStorage, and m_PreconMatVarsSingle.

◆ ~PreconCfsBRJ()

Nektar::PreconCfsBRJ::~PreconCfsBRJ ( )
inline

Definition at line 71 of file PreconCfsBRJ.h.

71 {};

Member Function Documentation

◆ AllocateNekBlkMatDig()

void Nektar::PreconCfsBRJ::AllocateNekBlkMatDig ( SNekBlkMatSharedPtr mat,
const Array< OneD, unsigned int >  nrow,
const Array< OneD, unsigned int >  ncol 
)
inlineprivate

Definition at line 241 of file PreconCfsBRJ.h.

244  {
245  mat =
247  SNekMatSharedPtr loc_matNvar;
248  for (size_t nelm = 0; nelm < nrow.size(); ++nelm)
249  {
250  int nrowsVars = nrow[nelm];
251  int ncolsVars = ncol[nelm];
252 
254  nrowsVars, ncolsVars, 0.0);
255  mat->SetBlock(nelm, nelm, loc_matNvar);
256  }
257  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< SNekMat > SNekMatSharedPtr

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and Nektar::eDIAGONAL.

Referenced by AllocatePreconBlkDiagCoeff(), and v_BuildPreconCfs().

◆ AllocatePreconBlkDiagCoeff()

template<typename TypeNekBlkMatSharedPtr >
void Nektar::PreconCfsBRJ::AllocatePreconBlkDiagCoeff ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &  gmtxarray,
const int &  nscale = 1 
)
private

Definition at line 502 of file PreconCfsBRJ.cpp.

506 {
507 
508  size_t nvars = pFields.size();
509  size_t nelmts = pFields[0]->GetNumElmts();
510  size_t nelmtcoef;
511  Array<OneD, unsigned int> nelmtmatdim(nelmts);
512  for (size_t i = 0; i < nelmts; i++)
513  {
514  nelmtcoef = pFields[0]->GetExp(i)->GetNcoeffs();
515  nelmtmatdim[i] = nelmtcoef * nscale;
516  }
517 
518  for (size_t i = 0; i < nvars; i++)
519  {
520  for (size_t j = 0; j < nvars; j++)
521  {
522  AllocateNekBlkMatDig(gmtxarray[i][j], nelmtmatdim, nelmtmatdim);
523  }
524  }
525 }
void AllocateNekBlkMatDig(SNekBlkMatSharedPtr &mat, const Array< OneD, unsigned int > nrow, const Array< OneD, unsigned int > ncol)
Definition: PreconCfsBRJ.h:241

References AllocateNekBlkMatDig().

Referenced by PreconCfsBRJ().

◆ AllocateSIMDPreconBlkMatDiag()

void Nektar::PreconCfsBRJ::AllocateSIMDPreconBlkMatDiag ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields)
inlineprivate

This function creates the matrix structure for the block diagonal operator. It organizes the way that the matrix.

by SIMD instructions. The degrees of freedom of each element are reorganized, so they are placed in the correct location to perfom SIMD instructions.

Definition at line 143 of file PreconCfsBRJ.h.

145  {
146  using vec_t = simd<NekSingle>;
147 
148  int TotMatLen = 0;
149  int TotLen = 0;
150  const auto nTotElmt = pFields[0]->GetNumElmts();
151  const auto nvariables = pFields.size();
152  const auto vecwidth = vec_t::width;
153 
154  m_max_nblocks = 0;
155  m_max_nElmtDof = 0;
156 
157  for (int ne = 0; ne < nTotElmt; ne++)
158  {
159  const auto nElmtDof = pFields[0]->GetNcoeffs(ne) * nvariables;
160  const auto nblocks = nElmtDof / vecwidth;
161  unsigned int totblocks =
162  (nElmtDof % vecwidth) ? nblocks + 1 : nblocks;
163 
164  m_max_nblocks =
165  (m_max_nblocks > totblocks) ? m_max_nblocks : totblocks;
167  (m_max_nElmtDof > nElmtDof) ? m_max_nElmtDof : nElmtDof;
168 
169  TotLen += totblocks * vecwidth;
170  TotMatLen += nElmtDof * totblocks;
171  }
172 
173  m_sBlkDiagMat.resize(TotMatLen);
174  m_inputIdx.resize(TotLen);
175 
176  // generate a index list of vector width aware mapping from
177  // local coeff storage over all variables to elemental storage
178  // over variables
179  unsigned int ncoeffs = pFields[0]->GetNcoeffs();
180  for (int ne = 0, cnt1 = 0; ne < nTotElmt; ne++)
181  {
182  const auto nElmtCoeff = pFields[0]->GetNcoeffs(ne);
183  const auto nElmtDof = nElmtCoeff * nvariables;
184  const auto nblocks = nElmtDof / vecwidth;
185  const auto nCoefOffset = pFields[0]->GetCoeff_Offset(ne);
186  int i = 0;
187  int i0 = 0;
188  int inOffset, j;
189 
190  for (int m = 0; m < nvariables; m++)
191  {
192  inOffset = m * ncoeffs + nCoefOffset;
193 
194  if (m && (vecwidth - i0 < nElmtCoeff))
195  {
196  // May need to add entries from later variables to
197  // remainder of last variable if the vector width
198  // was not exact multiple of number of elemental
199  // coeffs
200  for (i = 0; i0 < vecwidth; ++i, ++i0)
201  {
202  m_inputIdx[cnt1++] = inOffset + i;
203  }
204  }
205  else
206  {
207  i = 0;
208  }
209 
210  // load up other vectors in variable that fit into vector
211  // width
212  for (j = 0; (j + 1) * vecwidth < nElmtCoeff - i; ++j)
213  {
214  for (i0 = 0; i0 < vecwidth; ++i0)
215  {
216  m_inputIdx[cnt1++] = inOffset + i + j * vecwidth + i0;
217  }
218  }
219 
220  // load up any residual data for this variable
221  for (i0 = 0, j = j * vecwidth; j < nElmtCoeff - i; ++j, ++i0)
222  {
223  m_inputIdx[cnt1++] = inOffset + i + j;
224  }
225  }
226 
227  const auto endwidth = nElmtDof - nblocks * vecwidth;
228 
229  // fill out rest of index to match vector width with last entry
230  if (endwidth)
231  {
232  for (i0 = endwidth; i0 < vecwidth; ++i0)
233  {
234  m_inputIdx[cnt1++] = inOffset + i + j - 1;
235  }
236  }
237  ASSERTL1(cnt1 <= TotLen, "m_inputIdx over extended");
238  }
239  }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:249
unsigned int m_max_nblocks
Definition: PreconCfsBRJ.h:82
unsigned int m_max_nElmtDof
Definition: PreconCfsBRJ.h:83
std::vector< int > m_inputIdx
Definition: PreconCfsBRJ.h:86
std::vector< simd< NekSingle >, tinysimd::allocator< simd< NekSingle > > > m_sBlkDiagMat
Definition: PreconCfsBRJ.h:85
tinysimd::simd< NekDouble > vec_t
typename abi< ScalarType, width >::type simd
Definition: tinysimd.hpp:80

References ASSERTL1.

Referenced by PreconCfsBRJ().

◆ create()

static PreconCfsOpSharedPtr Nektar::PreconCfsBRJ::create ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const LibUtilities::SessionReaderSharedPtr pSession,
const LibUtilities::CommSharedPtr vComm 
)
inlinestatic

Creates an instance of this class.

Definition at line 55 of file PreconCfsBRJ.h.

59  {
61  pFields, pSession, vComm);
62  return p;
63  }
std::shared_ptr< PreconCfsOp > PreconCfsOpSharedPtr
Definition: PreconCfsOp.h:152

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and CellMLToNektar.cellml_metadata::p.

◆ MinusOffDiag2Rhs()

template<typename DataType >
void Nektar::PreconCfsBRJ::MinusOffDiag2Rhs ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const size_t  nvariables,
const size_t  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 
)
private

Definition at line 374 of file PreconCfsBRJ.cpp.

387 {
388  boost::ignore_unused(flagUpdateDervFlux, qfield, TraceJacDerivArray,
389  TraceJacDerivSign, FwdFluxDeriv, BwdFluxDeriv,
390  TraceIPSymJacArray);
391 
392  size_t nTracePts = pFields[0]->GetTrace()->GetNpoints();
393  size_t npoints = pFields[0]->GetNpoints();
394  size_t nDim = m_spacedim;
395 
396  Array<OneD, Array<OneD, NekDouble>> outpnts(nvariables);
397  for (size_t i = 0; i < nvariables; i++)
398  {
399  outpnts[i] = Array<OneD, NekDouble>(npoints, 0.0);
400  pFields[i]->BwdTrans(outarray[i], outpnts[i]);
401  }
402 
403  // Store forwards/backwards space along trace space
404  Array<OneD, Array<OneD, NekDouble>> Fwd;
405  Array<OneD, Array<OneD, NekDouble>> Bwd;
406  Array<OneD, Array<OneD, NekDouble>> FwdFlux;
407  Array<OneD, Array<OneD, NekDouble>> BwdFlux;
408  TensorOfArray3D<NekDouble> numDerivBwd(nDim);
409  TensorOfArray3D<NekDouble> numDerivFwd(nDim);
410  size_t indexwspTrace = 0;
411  Fwd = wspTrace[indexwspTrace], indexwspTrace++;
412  Bwd = wspTrace[indexwspTrace], indexwspTrace++;
413  FwdFlux = wspTrace[indexwspTrace], indexwspTrace++;
414  BwdFlux = wspTrace[indexwspTrace], indexwspTrace++;
415 
416  LibUtilities::Timer timer;
417  for (size_t i = 0; i < nvariables; ++i)
418  {
419  timer.Start();
420  pFields[i]->GetFwdBwdTracePhys(outpnts[i], Fwd[i], Bwd[i]);
421  timer.Stop();
422  timer.AccumulateRegion("ExpList::GetFwdBwdTracePhys", 10);
423  }
424 
425  size_t indexwspTraceDataType = 0;
426  Array<OneD, Array<OneD, DataType>> Fwdarray(nvariables);
427  for (size_t m = 0; m < nvariables; ++m)
428  {
429  Fwdarray[m] = wspTraceDataType[indexwspTraceDataType],
430  indexwspTraceDataType++;
431  }
432  Array<OneD, DataType> Fwdreslt;
433  Fwdreslt = wspTraceDataType[indexwspTraceDataType], indexwspTraceDataType++;
434 
435  for (size_t m = 0; m < nvariables; ++m)
436  {
437  for (size_t i = 0; i < nTracePts; ++i)
438  {
439  Fwdarray[m][i] = DataType(Fwd[m][i]);
440  }
441  }
442  for (size_t m = 0; m < nvariables; ++m)
443  {
444  Vmath::Zero(nTracePts, Fwdreslt, 1);
445  for (size_t n = 0; n < nvariables; ++n)
446  {
447  for (size_t p = 0; p < nTracePts; ++p)
448  {
449  Fwdreslt[p] += TraceJacArray[0][m][n][p] * Fwdarray[n][p];
450  }
451  }
452  for (size_t i = 0; i < nTracePts; ++i)
453  {
454  FwdFlux[m][i] = NekDouble(Fwdreslt[i]);
455  }
456  }
457 
458  for (size_t m = 0; m < nvariables; ++m)
459  {
460  for (size_t i = 0; i < nTracePts; ++i)
461  {
462  Fwdarray[m][i] = DataType(Bwd[m][i]);
463  }
464  }
465  for (size_t m = 0; m < nvariables; ++m)
466  {
467  Vmath::Zero(nTracePts, Fwdreslt, 1);
468  for (size_t n = 0; n < nvariables; ++n)
469  {
470  for (size_t p = 0; p < nTracePts; ++p)
471  {
472  Fwdreslt[p] += TraceJacArray[1][m][n][p] * Fwdarray[n][p];
473  }
474  }
475  for (size_t i = 0; i < nTracePts; ++i)
476  {
477  BwdFlux[m][i] = NekDouble(Fwdreslt[i]);
478  }
479  }
480 
481  for (size_t i = 0; i < nvariables; ++i)
482  {
483  Vmath::Fill(nCoeffs, 0.0, outarray[i], 1);
484  timer.Start();
485  pFields[i]->AddTraceIntegralToOffDiag(FwdFlux[i], BwdFlux[i],
486  outarray[i]);
487  timer.Stop();
488  timer.AccumulateRegion("ExpList::AddTraceIntegralToOffDiag", 10);
489  }
490 
491  for (size_t i = 0; i < nvariables; ++i)
492  {
493  for (size_t p = 0; p < nCoeffs; ++p)
494  {
495  outarray[i][p] =
496  -m_DtLambdaPreconMat * outarray[i][p] + inarray[i][p];
497  }
498  }
499 }
NekDouble m_DtLambdaPreconMat
Definition: PreconCfs.h:89
double NekDouble
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:492
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45

References Nektar::LibUtilities::Timer::AccumulateRegion(), Vmath::Fill(), Nektar::PreconCfs::m_DtLambdaPreconMat, Nektar::PreconCfs::m_spacedim, CellMLToNektar.cellml_metadata::p, Nektar::LibUtilities::Timer::Start(), Nektar::LibUtilities::Timer::Stop(), and Vmath::Zero().

Referenced by v_DoPreconCfs().

◆ PreconBlkDiag()

void Nektar::PreconCfsBRJ::PreconBlkDiag ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const Array< OneD, NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
private

Definition at line 297 of file PreconCfsBRJ.cpp.

300 {
301  unsigned int nvariables = pFields.size();
302 
303  int nTotElmt = pFields[0]->GetNumElmts();
304 
305  using vec_t = simd<NekSingle>;
306  const auto vecwidth = vec_t::width;
307 
308  // vectorized matrix multiply
309  std::vector<vec_t, tinysimd::allocator<vec_t>> Sinarray(m_max_nblocks);
310  std::vector<vec_t, tinysimd::allocator<vec_t>> Soutarray(m_max_nElmtDof);
311  // std::vector<vec_t, tinysimd::allocator<vec_t>> tmp;
312 
313  alignas(vec_t::alignment) std::array<NekSingle, vec_t::width> tmp;
314 
315  for (int ne = 0, cnt = 0, icnt = 0, icnt1 = 0; ne < nTotElmt; ne++)
316  {
317  const auto nElmtCoef = pFields[0]->GetNcoeffs(ne);
318  const auto nElmtDof = nElmtCoef * nvariables;
319  const auto nblocks = (nElmtDof % vecwidth) ? nElmtDof / vecwidth + 1
320  : nElmtDof / vecwidth;
321 
322  // gather data into blocks - could probably be done with a
323  // gather call? can be replaced with a gather op when working
324  for (int j = 0; j < nblocks; ++j, icnt += vecwidth)
325  {
326  for (int i = 0; i < vecwidth; ++i)
327  {
328  tmp[i] = inarray[m_inputIdx[icnt + i]];
329  }
330 
331  Sinarray[j].load(tmp.data());
332  }
333 
334  // Do matrix multiply
335  // first block just needs multiplying
336  vec_t in = Sinarray[0];
337  for (int i = 0; i < nElmtDof; ++i)
338  {
339  Soutarray[i] = m_sBlkDiagMat[cnt++] * in;
340  }
341 
342  // rest of blocks are multiply add operations;
343  for (int n = 1; n < nblocks; ++n)
344  {
345  in = Sinarray[n];
346  for (int i = 0; i < nElmtDof; ++i)
347  {
348  Soutarray[i].fma(m_sBlkDiagMat[cnt++], in);
349  }
350  }
351 
352  // get block aligned index for this expansion
353  NekSingle val;
354  for (int i = 0; i < nElmtDof; ++i)
355  {
356  // Get hold of data
357  Soutarray[i].store(tmp.data());
358 
359  // Sum vector width
360  val = tmp[0];
361  for (int j = 1; j < vecwidth; ++j)
362  {
363  val += tmp[j];
364  }
365  // put data into outarray
366  outarray[m_inputIdx[icnt1 + i]] = NekDouble(val);
367  }
368 
369  icnt1 += nblocks * vecwidth;
370  }
371 }

References m_inputIdx, m_max_nblocks, m_max_nElmtDof, and m_sBlkDiagMat.

Referenced by v_DoPreconCfs().

◆ v_BuildPreconCfs()

void Nektar::PreconCfsBRJ::v_BuildPreconCfs ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const Array< OneD, const Array< OneD, NekDouble >> &  intmp,
const NekDouble  time,
const NekDouble  lambda 
)
overrideprivatevirtual

Copy array into column major blocks of vector width

Reimplemented from Nektar::PreconCfsOp.

Definition at line 188 of file PreconCfsBRJ.cpp.

192 {
193  boost::ignore_unused(pFields);
194 
195  if (0 < m_PreconItsStep)
196  {
197  SNekBlkMatSharedPtr PreconMatSingle;
198  using vec_t = simd<NekSingle>;
199  int nvariables = pFields.size();
200  int nelmts = pFields[0]->GetNumElmts();
201  Array<OneD, unsigned int> matdim(nelmts);
202  for (int i = 0; i < nelmts; i++)
203  {
204  matdim[i] = pFields[0]->GetExp(i)->GetNcoeffs() * nvariables;
205  }
206  AllocateNekBlkMatDig(PreconMatSingle, matdim, matdim);
207 
209  intmp, m_PreconMatVarsSingle, PreconMatSingle, m_TraceJacSingle,
213 
214  if (m_verbose && m_Comm->GetRank() == 0)
215  {
216  cout << " ## CalcuPreconMat " << endl;
217  }
218 
219  // copy matrix to simd layout
220  // load matrix
221  int cnt = 0;
222  const auto vecwidth = vec_t::width;
223 
224  alignas(vec_t::alignment) std::array<NekSingle, vec_t::width> tmp;
225 
226  for (int ne = 0; ne < nelmts; ne++)
227  {
228  const auto nElmtDof = matdim[ne];
229  const auto nblocks = nElmtDof / vecwidth;
230 
231  const NekSingle *mmat =
232  PreconMatSingle->GetBlockPtr(ne, ne)->GetRawPtr();
233  /// Copy array into column major blocks of vector width
234  for (int i1 = 0; i1 < nblocks; ++i1)
235  {
236  for (int j = 0; j < nElmtDof; ++j)
237  {
238  for (int i = 0; i < vecwidth; ++i)
239  {
240  tmp[i] = mmat[j + (i1 * vecwidth + i) * nElmtDof];
241  }
242  // store contiguous vec_t array.
243  m_sBlkDiagMat[cnt++].load(tmp.data());
244  }
245  }
246 
247  const auto endwidth = nElmtDof - nblocks * vecwidth;
248 
249  // end rows that do not fit into vector widths
250  if (endwidth)
251  {
252  for (int j = 0; j < nElmtDof; ++j)
253  {
254  for (int i = 0; i < endwidth; ++i)
255  {
256  tmp[i] = mmat[j + (nblocks * vecwidth + i) * nElmtDof];
257  }
258 
259  for (int i = endwidth; i < vecwidth; ++i)
260  {
261  tmp[i] = 0.0;
262  }
263  m_sBlkDiagMat[cnt++].load(tmp.data());
264  }
265  }
266  }
267  }
268 
269  m_BndEvaluateTime = time;
270  m_DtLambdaPreconMat = lambda;
271 
272  m_CalcPreconMatFlag = false;
274 }
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)
Definition: PreconCfsOp.h:111
Array< OneD, SNekBlkMatSharedPtr > m_TraceJacSingle
Definition: PreconCfsBRJ.h:88
TensorOfArray4D< NekSingle > m_TraceJacArraySingle
Definition: PreconCfsBRJ.h:89
Array< OneD, SNekBlkMatSharedPtr > m_TraceJacDerivSingle
Definition: PreconCfsBRJ.h:90
Array< OneD, Array< OneD, NekSingle > > m_TraceJacDerivSignSingle
Definition: PreconCfsBRJ.h:92
TensorOfArray4D< NekSingle > m_TraceJacDerivArraySingle
Definition: PreconCfsBRJ.h:91
TensorOfArray5D< NekSingle > m_TraceIPSymJacArraySingle
Definition: PreconCfsBRJ.h:93
int m_PreconTimesCounter
Definition: PreconCfs.h:87
bool m_CalcPreconMatFlag
Definition: PreconCfs.h:92
NekDouble m_BndEvaluateTime
Definition: PreconCfs.h:90
LibUtilities::CommSharedPtr m_Comm
Definition: PreconCfs.h:82
NekPreconCfsOperators m_operator
Definition: PreconCfsOp.h:196
std::shared_ptr< SNekBlkMat > SNekBlkMatSharedPtr

References AllocateNekBlkMatDig(), Nektar::NekPreconCfsOperators::DoCalcPreconMatBRJCoeff(), Nektar::PreconCfs::m_BndEvaluateTime, Nektar::PreconCfs::m_CalcPreconMatFlag, Nektar::PreconCfs::m_Comm, Nektar::PreconCfs::m_DtLambdaPreconMat, Nektar::PreconCfsOp::m_operator, m_PreconItsStep, m_PreconMatVarsSingle, Nektar::PreconCfs::m_PreconTimesCounter, m_sBlkDiagMat, m_TraceIPSymJacArraySingle, m_TraceJacArraySingle, m_TraceJacDerivArraySingle, m_TraceJacDerivSignSingle, m_TraceJacDerivSingle, m_TraceJacSingle, and Nektar::PreconCfs::m_verbose.

◆ v_DoPreconCfs()

void Nektar::PreconCfsBRJ::v_DoPreconCfs ( const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const Array< OneD, NekDouble > &  pInput,
Array< OneD, NekDouble > &  pOutput,
const bool &  flag 
)
overrideprivatevirtual

Reimplemented from Nektar::PreconCfsOp.

Definition at line 81 of file PreconCfsBRJ.cpp.

85 {
86  boost::ignore_unused(flag);
87 
88  size_t nBRJIterTot = m_PreconItsStep;
89  if (0 == nBRJIterTot)
90  {
91  DoNullPrecon(inarray, outarray, flag);
92  }
93  else
94  {
95  const NekDouble BRJParam = m_BRJRelaxParam;
96  const NekDouble OmBRJParam = 1.0 - BRJParam;
97 
98  size_t nvariables = pFields.size();
99  size_t npoints = pFields[0]->GetNcoeffs();
100  size_t ntotpnt = inarray.size();
101 
102  ASSERTL0(nvariables * npoints == ntotpnt,
103  "nvariables*npoints!=ntotpnt in PreconCoeff");
104 
105  Array<OneD, NekDouble> rhs(ntotpnt);
106 
107  Array<OneD, NekDouble> outN(ntotpnt);
108  Array<OneD, NekDouble> outTmp(ntotpnt);
109  Array<OneD, Array<OneD, NekDouble>> rhs2d(nvariables);
110  Array<OneD, Array<OneD, NekDouble>> out_2d(nvariables);
111  Array<OneD, Array<OneD, NekDouble>> outTmp_2d(nvariables);
112  for (size_t m = 0; m < nvariables; m++)
113  {
114  size_t moffset = m * npoints;
115  rhs2d[m] = rhs + moffset;
116  out_2d[m] = outarray + moffset;
117  outTmp_2d[m] = outTmp + moffset;
118  pFields[m]->MultiplyByMassMatrix(inarray + moffset, rhs2d[m]);
119  }
120 
121  size_t nphysic = pFields[0]->GetNpoints();
122  size_t nTracePts = pFields[0]->GetTrace()->GetNpoints();
123  TensorOfArray3D<NekDouble> qfield(m_spacedim);
124  for (int i = 0; i < m_spacedim; i++)
125  {
126  qfield[i] = Array<OneD, Array<OneD, NekDouble>>(nvariables);
127  for (size_t j = 0; j < nvariables; j++)
128  {
129  qfield[i][j] = Array<OneD, NekDouble>(nphysic);
130  }
131  }
132  size_t ntmpTrace = 4 + 2 * m_spacedim;
133  TensorOfArray3D<NekDouble> tmpTrace(ntmpTrace);
134  for (size_t i = 0; i < ntmpTrace; i++)
135  {
136  tmpTrace[i] = Array<OneD, Array<OneD, NekDouble>>(nvariables);
137  for (size_t j = 0; j < nvariables; j++)
138  {
139  tmpTrace[i][j] = Array<OneD, NekDouble>(nTracePts);
140  }
141  }
142  Array<OneD, Array<OneD, NekDouble>> FwdFluxDeriv(nvariables);
143  Array<OneD, Array<OneD, NekDouble>> BwdFluxDeriv(nvariables);
144  for (size_t j = 0; j < nvariables; j++)
145  {
146  FwdFluxDeriv[j] = Array<OneD, NekDouble>(nTracePts);
147  BwdFluxDeriv[j] = Array<OneD, NekDouble>(nTracePts);
148  }
149 
150  bool flagUpdateDervFlux = false;
151 
152  const size_t nwspTraceDataType = nvariables + 1;
153  Array<OneD, Array<OneD, NekSingle>> wspTraceDataType(nwspTraceDataType);
154  for (size_t m = 0; m < nwspTraceDataType; m++)
155  {
156  wspTraceDataType[m] = Array<OneD, NekSingle>(nTracePts);
157  }
158 
159  LibUtilities::Timer timer;
160  timer.Start();
161  PreconBlkDiag(pFields, rhs, outarray);
162  timer.Stop();
163  timer.AccumulateRegion("PreconCfsBRJ::PreconBlkDiag", 2);
164 
165  for (size_t nrelax = 0; nrelax < nBRJIterTot - 1; nrelax++)
166  {
167  Vmath::Smul(ntotpnt, OmBRJParam, outarray, 1, outN, 1);
168 
169  timer.Start();
171  pFields, nvariables, npoints, rhs2d, out_2d, flagUpdateDervFlux,
172  FwdFluxDeriv, BwdFluxDeriv, qfield, tmpTrace, wspTraceDataType,
175  timer.Stop();
176  timer.AccumulateRegion("PreconCfsBRJ::MinusOffDiag2Rhs", 2);
177 
178  timer.Start();
179  PreconBlkDiag(pFields, outarray, outTmp);
180  timer.Stop();
181  timer.AccumulateRegion("PreconCfsBRJ::PreconBlkDiag", 2);
182 
183  Vmath::Svtvp(ntotpnt, BRJParam, outTmp, 1, outN, 1, outarray, 1);
184  }
185  }
186 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
void MinusOffDiag2Rhs(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const size_t nvariables, const size_t 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)
void PreconBlkDiag(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void DoNullPrecon(const Array< OneD, NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const bool &flag)
Definition: PreconCfs.cpp:55
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
Definition: Vmath.cpp:622
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.cpp:248

References Nektar::LibUtilities::Timer::AccumulateRegion(), ASSERTL0, Nektar::PreconCfs::DoNullPrecon(), m_BRJRelaxParam, m_PreconItsStep, Nektar::PreconCfs::m_spacedim, m_TraceIPSymJacArraySingle, m_TraceJacArraySingle, m_TraceJacDerivArraySingle, m_TraceJacDerivSignSingle, MinusOffDiag2Rhs(), PreconBlkDiag(), Vmath::Smul(), Nektar::LibUtilities::Timer::Start(), Nektar::LibUtilities::Timer::Stop(), and Vmath::Svtvp().

◆ v_InitObject()

void Nektar::PreconCfsBRJ::v_InitObject ( )
overrideprotectedvirtual

Reimplemented from Nektar::PreconCfsOp.

Definition at line 76 of file PreconCfsBRJ.cpp.

77 {
79 }
virtual void v_InitObject() override
Definition: PreconCfsOp.cpp:56

References Nektar::PreconCfsOp::v_InitObject().

◆ v_UpdatePreconMatCheck()

bool Nektar::PreconCfsBRJ::v_UpdatePreconMatCheck ( const Array< OneD, const NekDouble > &  res,
const NekDouble  dtLambda 
)
overridevirtual

Reimplemented from Nektar::PreconCfs.

Definition at line 276 of file PreconCfsBRJ.cpp.

278 {
279  boost::ignore_unused(res);
280 
281  bool flag = false;
282 
283  if (m_CalcPreconMatFlag || (m_DtLambdaPreconMat != dtLambda))
284  {
285  flag = true;
286  }
287 
289  {
290  flag = true;
291  }
292 
293  m_CalcPreconMatFlag = flag;
294  return flag;
295 }
int m_PreconMatFreezNumb
Definition: PreconCfs.h:86

References Nektar::PreconCfs::m_CalcPreconMatFlag, Nektar::PreconCfs::m_DtLambdaPreconMat, Nektar::PreconCfs::m_PreconMatFreezNumb, and Nektar::PreconCfs::m_PreconTimesCounter.

Friends And Related Function Documentation

◆ MemoryManager< PreconCfsBRJ >

friend class MemoryManager< PreconCfsBRJ >
friend

Definition at line 1 of file PreconCfsBRJ.h.

Member Data Documentation

◆ className

std::string Nektar::PreconCfsBRJ::className
static
Initial value:
=
"PreconCfsBRJ", PreconCfsBRJ::create,
"Block Relaxed Jacobi Preconditioner for CFS.")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
static PreconCfsOpSharedPtr create(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &vComm)
Creates an instance of this class.
Definition: PreconCfsBRJ.h:55
PreconCfsOpFactory & GetPreconCfsOpFactory()
Declaration of the boundary condition factory singleton.
Definition: PreconCfsOp.cpp:42

Name of the class.

Definition at line 66 of file PreconCfsBRJ.h.

◆ m_BRJRelaxParam

int Nektar::PreconCfsBRJ::m_BRJRelaxParam
protected

Definition at line 78 of file PreconCfsBRJ.h.

Referenced by PreconCfsBRJ(), and v_DoPreconCfs().

◆ m_inputIdx

std::vector<int> Nektar::PreconCfsBRJ::m_inputIdx
protected

Definition at line 86 of file PreconCfsBRJ.h.

Referenced by PreconBlkDiag().

◆ m_max_nblocks

unsigned int Nektar::PreconCfsBRJ::m_max_nblocks
protected

Definition at line 82 of file PreconCfsBRJ.h.

Referenced by PreconBlkDiag().

◆ m_max_nElmtDof

unsigned int Nektar::PreconCfsBRJ::m_max_nElmtDof
protected

Definition at line 83 of file PreconCfsBRJ.h.

Referenced by PreconBlkDiag().

◆ m_PreconItsStep

int Nektar::PreconCfsBRJ::m_PreconItsStep
protected

Definition at line 77 of file PreconCfsBRJ.h.

Referenced by PreconCfsBRJ(), v_BuildPreconCfs(), and v_DoPreconCfs().

◆ m_PreconMatStorage

PrecType Nektar::PreconCfsBRJ::m_PreconMatStorage
protected

Definition at line 95 of file PreconCfsBRJ.h.

Referenced by PreconCfsBRJ().

◆ m_PreconMatVarsSingle

Array<OneD, Array<OneD, SNekBlkMatSharedPtr> > Nektar::PreconCfsBRJ::m_PreconMatVarsSingle
protected

Definition at line 80 of file PreconCfsBRJ.h.

Referenced by PreconCfsBRJ(), and v_BuildPreconCfs().

◆ m_sBlkDiagMat

std::vector<simd<NekSingle>, tinysimd::allocator<simd<NekSingle> > > Nektar::PreconCfsBRJ::m_sBlkDiagMat
protected

Definition at line 85 of file PreconCfsBRJ.h.

Referenced by PreconBlkDiag(), and v_BuildPreconCfs().

◆ m_TraceIPSymJacArraySingle

TensorOfArray5D<NekSingle> Nektar::PreconCfsBRJ::m_TraceIPSymJacArraySingle
protected

Definition at line 93 of file PreconCfsBRJ.h.

Referenced by v_BuildPreconCfs(), and v_DoPreconCfs().

◆ m_TraceJacArraySingle

TensorOfArray4D<NekSingle> Nektar::PreconCfsBRJ::m_TraceJacArraySingle
protected

Definition at line 89 of file PreconCfsBRJ.h.

Referenced by v_BuildPreconCfs(), and v_DoPreconCfs().

◆ m_TraceJacDerivArraySingle

TensorOfArray4D<NekSingle> Nektar::PreconCfsBRJ::m_TraceJacDerivArraySingle
protected

Definition at line 91 of file PreconCfsBRJ.h.

Referenced by v_BuildPreconCfs(), and v_DoPreconCfs().

◆ m_TraceJacDerivSignSingle

Array<OneD, Array<OneD, NekSingle> > Nektar::PreconCfsBRJ::m_TraceJacDerivSignSingle
protected

Definition at line 92 of file PreconCfsBRJ.h.

Referenced by v_BuildPreconCfs(), and v_DoPreconCfs().

◆ m_TraceJacDerivSingle

Array<OneD, SNekBlkMatSharedPtr> Nektar::PreconCfsBRJ::m_TraceJacDerivSingle
protected

Definition at line 90 of file PreconCfsBRJ.h.

Referenced by v_BuildPreconCfs().

◆ m_TraceJacSingle

Array<OneD, SNekBlkMatSharedPtr> Nektar::PreconCfsBRJ::m_TraceJacSingle
protected

Definition at line 88 of file PreconCfsBRJ.h.

Referenced by v_BuildPreconCfs().