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

#include <LinearisedAdvection.h>

Inheritance diagram for Nektar::LinearisedAdvection:
[legend]

Static Public Member Functions

static SolverUtils::AdvectionSharedPtr create (std::string)
 Creates an instance of this class. More...
 

Static Public Attributes

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

Protected Member Functions

DNekBlkMatSharedPtr GetFloquetBlockMatrix (FloquetMatType mattype, bool UseContCoeffs=false) const
 
DNekBlkMatSharedPtr GenFloquetBlockMatrix (FloquetMatType mattype, bool UseContCoeffs=false) const
 
 LinearisedAdvection ()
 
virtual ~LinearisedAdvection ()
 
virtual void v_InitObject (LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields) override
 Initialises the advection object. More...
 
virtual void v_Advect (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray) override
 Advects a vector field. More...
 
virtual void v_SetBaseFlow (const Array< OneD, Array< OneD, NekDouble >> &inarray, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields) override
 Overrides the base flow used during linearised advection. More...
 
void UpdateBase (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const NekDouble time)
 
void UpdateGradBase (const int var, const MultiRegions::ExpListSharedPtr &field)
 
void DFT (const std::string file, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
 
void ImportFldBase (std::string pInfile, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, int slice)
 Import Base flow. More...
 
- Protected Member Functions inherited from Nektar::SolverUtils::Advection
virtual SOLVER_UTILS_EXPORT void v_AdvectVolumeFlux (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &pVolumeFlux, const NekDouble &time)
 Advects Volume Flux. More...
 
virtual SOLVER_UTILS_EXPORT void v_AdvectTraceFlux (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &pTraceFlux, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
 Advects Trace Flux. More...
 
virtual SOLVER_UTILS_EXPORT void v_AdvectCoeffs (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
 
virtual SOLVER_UTILS_EXPORT void v_AddVolumJacToMat (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int &nConvectiveFields, const TensorOfArray5D< NekDouble > &ElmtJacArray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray)
 

Protected Attributes

LibUtilities::SessionReaderSharedPtr m_session
 
int m_spacedim
 
int m_expdim
 
Array< OneD, Array< OneD, NekDouble > > m_baseflow
 Storage for base flow. More...
 
Array< OneD, Array< OneD, NekDouble > > m_gradBase
 
int m_start
 number of slices More...
 
int m_skip
 
int m_slices
 
NekDouble m_period
 period length More...
 
int m_isperiodic
 
int m_interporder
 
Array< OneD, Array< OneD, NekDouble > > m_interp
 interpolation vector More...
 
LibUtilities::NektarFFTSharedPtr m_FFT
 auxiliary variables More...
 
Array< OneD, NekDoublem_tmpIN
 
Array< OneD, NekDoublem_tmpOUT
 
bool m_useFFTW
 
bool m_singleMode
 flag to determine if use single mode or not More...
 
bool m_halfMode
 flag to determine if use half mode or not More...
 
bool m_multipleModes
 flag to determine if use multiple mode or not More...
 
FloquetBlockMatrixMapShPtr m_FloquetBlockMat
 
- Protected Attributes inherited from Nektar::SolverUtils::Advection
AdvectionFluxVecCB m_fluxVector
 Callback function to the flux vector (set when advection is in conservative form). More...
 
RiemannSolverSharedPtr m_riemann
 Riemann solver for DG-type schemes. More...
 
int m_spaceDim
 Storage for space dimension. Used for homogeneous extension. More...
 

Private Types

enum  FloquetMatType { eForwardsCoeff , eForwardsPhys }
 
enum  HomogeneousType { eHomogeneous1D , eHomogeneous2D , eHomogeneous3D , eNotHomogeneous }
 Parameter for homogeneous expansions. More...
 
typedef std::map< FloquetMatType, DNekBlkMatSharedPtrFloquetBlockMatrixMap
 A map between matrix keys and their associated block matrices. More...
 
typedef std::shared_ptr< FloquetBlockMatrixMapFloquetBlockMatrixMapShPtr
 A shared pointer to a BlockMatrixMap. More...
 

Private Attributes

bool m_useFFT
 flag to determine if use or not the FFT for transformations More...
 
enum HomogeneousType m_HomogeneousType
 
NekDouble m_LhomX
 physical length in X direction (if homogeneous) More...
 
NekDouble m_LhomY
 physical length in Y direction (if homogeneous) More...
 
NekDouble m_LhomZ
 physical length in Z direction (if homogeneous) More...
 
int m_npointsX
 number of points in X direction (if homogeneous) More...
 
int m_npointsY
 number of points in Y direction (if homogeneous) More...
 
int m_npointsZ
 number of points in Z direction (if homogeneous) More...
 
int m_HomoDirec
 number of homogenous directions More...
 
int m_NumMode
 Mode to use in case of single mode analysis. More...
 
SpatialDomains::BoundaryConditionsSharedPtr m_boundaryConditions
 

Friends

class MemoryManager< LinearisedAdvection >
 

Additional Inherited Members

- Public Member Functions inherited from Nektar::SolverUtils::Advection
virtual SOLVER_UTILS_EXPORT ~Advection ()
 
SOLVER_UTILS_EXPORT void InitObject (LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
 Interface function to initialise the advection object. More...
 
SOLVER_UTILS_EXPORT void Advect (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
 Interface function to advect the vector field. More...
 
SOLVER_UTILS_EXPORT void AdvectVolumeFlux (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, Array< OneD, NekDouble >> &pAdvVel, const Array< OneD, Array< OneD, NekDouble >> &pInarray, TensorOfArray3D< NekDouble > &pVolumeFlux, const NekDouble &pTime)
 Interface function to advect the Volume field. More...
 
SOLVER_UTILS_EXPORT void AdvectTraceFlux (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, Array< OneD, NekDouble >> &pAdvVel, const Array< OneD, Array< OneD, NekDouble >> &pInarray, Array< OneD, Array< OneD, NekDouble >> &pTraceFlux, const NekDouble &pTime, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
 Interface function to advect the Trace field. More...
 
SOLVER_UTILS_EXPORT void AdvectCoeffs (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
 Similar with Advection::Advect(): calculate the advection flux The difference is in the outarray: it is the coefficients of basis for AdvectCoeffs() it is the physics on quadrature points for Advect() More...
 
template<typename FuncPointerT , typename ObjectPointerT >
void SetFluxVector (FuncPointerT func, ObjectPointerT obj)
 Set the flux vector callback function. More...
 
void SetRiemannSolver (RiemannSolverSharedPtr riemann)
 Set a Riemann solver object for this advection object. More...
 
void SetFluxVector (AdvectionFluxVecCB fluxVector)
 Set the flux vector callback function. More...
 
void SetBaseFlow (const Array< OneD, Array< OneD, NekDouble >> &inarray, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields)
 Set the base flow used for linearised advection objects. More...
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
SOLVER_UTILS_EXPORT void AddTraceJacToMat (const int nConvectiveFields, const int nSpaceDim, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, TypeNekBlkMatSharedPtr > &TracePntJacCons, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const Array< OneD, TypeNekBlkMatSharedPtr > &TracePntJacGrad, const Array< OneD, Array< OneD, DataType >> &TracePntJacGradSign)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void CalcJacobTraceInteg (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int m, const int n, const Array< OneD, const TypeNekBlkMatSharedPtr > &PntJac, const Array< OneD, const Array< OneD, DataType >> &PntJacSign, Array< OneD, DNekMatSharedPtr > &TraceJacFwd, Array< OneD, DNekMatSharedPtr > &TraceJacBwd)
 
SOLVER_UTILS_EXPORT void AddVolumJacToMat (const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int &nConvectiveFields, const TensorOfArray5D< NekDouble > &ElmtJacArray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void AddTraceJacToMat (const int nConvectiveFields, const int nSpaceDim, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, TypeNekBlkMatSharedPtr > &TracePntJacCons, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const Array< OneD, TypeNekBlkMatSharedPtr > &TracePntJacGrad, const Array< OneD, Array< OneD, DataType >> &TracePntJacGradSign)
 

Detailed Description

Definition at line 44 of file LinearisedAdvection.h.

Member Typedef Documentation

◆ FloquetBlockMatrixMap

A map between matrix keys and their associated block matrices.

Definition at line 54 of file LinearisedAdvection.h.

◆ FloquetBlockMatrixMapShPtr

A shared pointer to a BlockMatrixMap.

Definition at line 56 of file LinearisedAdvection.h.

Member Enumeration Documentation

◆ FloquetMatType

Enumerator
eForwardsCoeff 
eForwardsPhys 

Definition at line 46 of file LinearisedAdvection.h.

◆ HomogeneousType

Parameter for homogeneous expansions.

Enumerator
eHomogeneous1D 
eHomogeneous2D 
eHomogeneous3D 
eNotHomogeneous 

Definition at line 146 of file LinearisedAdvection.h.

Constructor & Destructor Documentation

◆ LinearisedAdvection()

Nektar::LinearisedAdvection::LinearisedAdvection ( )
protected

Constructor. Creates ...

Parameters

Definition at line 55 of file LinearisedAdvection.cpp.

55  : Advection()
56 {
57 }

◆ ~LinearisedAdvection()

Nektar::LinearisedAdvection::~LinearisedAdvection ( )
protectedvirtual

Definition at line 264 of file LinearisedAdvection.cpp.

265 {
266 }

Member Function Documentation

◆ create()

static SolverUtils::AdvectionSharedPtr Nektar::LinearisedAdvection::create ( std::string  )
inlinestatic

Creates an instance of this class.

Definition at line 62 of file LinearisedAdvection.h.

63  {
65  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ DFT()

void Nektar::LinearisedAdvection::DFT ( const std::string  file,
Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields 
)
protected

Definition at line 669 of file LinearisedAdvection.cpp.

671 {
672  size_t ConvectedFields = m_baseflow.size() - 1;
673  size_t npoints = m_baseflow[0].size();
674  m_interp = Array<OneD, Array<OneD, NekDouble>>(ConvectedFields);
675 
676  for (size_t i = 0; i < ConvectedFields; ++i)
677  {
678  m_interp[i] = Array<OneD, NekDouble>(npoints * m_slices, 0.0);
679  }
680 
681  // Import the slides into auxiliary vector
682  // The base flow should be stored in the form "filename_%d.ext"
683  // A subdirectory can also be included, such as "dir/filename_%d.ext"
684  size_t found = file.find("%d");
685  ASSERTL0(found != string::npos &&
686  file.find("%d", found + 1) == string::npos,
687  "Since N_slices is specified, the filename provided for function "
688  "'BaseFlow' must include exactly one instance of the format "
689  "specifier '%d', to index the time-slices.");
690  size_t nstart = m_start;
691  for (size_t i = nstart; i < nstart + m_slices * m_skip; i += m_skip)
692  {
693  boost::format filename(file);
694  filename % i;
695  ImportFldBase(filename.str(), pFields, (i - nstart) / m_skip);
696  if (m_session->GetComm()->GetRank() == 0)
697  {
698  cout << "read base flow file " << filename.str() << endl;
699  }
700  }
701  if (!m_isperiodic)
702  {
703  return;
704  }
705 
706  // Discrete Fourier Transform of the fields
707  for (size_t k = 0; k < ConvectedFields; ++k)
708  {
709 #ifdef NEKTAR_USING_FFTW
710 
711  // Discrete Fourier Transform using FFTW
712  Array<OneD, NekDouble> fft_in(npoints * m_slices);
713  Array<OneD, NekDouble> fft_out(npoints * m_slices);
714 
715  Array<OneD, NekDouble> m_tmpIN(m_slices);
716  Array<OneD, NekDouble> m_tmpOUT(m_slices);
717 
718  // Shuffle the data
719  for (int j = 0; j < m_slices; ++j)
720  {
721  Vmath::Vcopy(npoints, &m_interp[k][j * npoints], 1, &(fft_in[j]),
722  m_slices);
723  }
724 
726  m_slices);
727 
728  // FFT Transform
729  for (size_t i = 0; i < npoints; i++)
730  {
731  m_FFT->FFTFwdTrans(m_tmpIN = fft_in + i * m_slices,
732  m_tmpOUT = fft_out + i * m_slices);
733  }
734 
735  // Reshuffle data
736  for (int s = 0; s < m_slices; ++s)
737  {
738  Vmath::Vcopy(npoints, &fft_out[s], m_slices,
739  &m_interp[k][s * npoints], 1);
740  }
741 
742  Vmath::Zero(fft_in.size(), &fft_in[0], 1);
743  Vmath::Zero(fft_out.size(), &fft_out[0], 1);
744 #else
745  // Discrete Fourier Transform using MVM
746  DNekBlkMatSharedPtr blkmat;
748 
749  int nrows = blkmat->GetRows();
750  int ncols = blkmat->GetColumns();
751 
752  Array<OneD, NekDouble> sortedinarray(ncols);
753  Array<OneD, NekDouble> sortedoutarray(nrows);
754 
755  // Shuffle the data
756  for (int j = 0; j < m_slices; ++j)
757  {
758  Vmath::Vcopy(npoints, &m_interp[k][j * npoints], 1,
759  &(sortedinarray[j]), m_slices);
760  }
761 
762  // Create NekVectors from the given data arrays
763  NekVector<NekDouble> in(ncols, sortedinarray, eWrapper);
764  NekVector<NekDouble> out(nrows, sortedoutarray, eWrapper);
765 
766  // Perform matrix-vector multiply.
767  out = (*blkmat) * in;
768 
769  // Reshuffle data
770  for (int s = 0; s < m_slices; ++s)
771  {
772  Vmath::Vcopy(npoints, &sortedoutarray[s], m_slices,
773  &m_interp[k][s * npoints], 1);
774  }
775 
776  for (size_t r = 0; r < sortedinarray.size(); ++r)
777  {
778  sortedinarray[0] = 0;
779  sortedoutarray[0] = 0;
780  }
781 
782 #endif
783  }
784 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
LibUtilities::SessionReaderSharedPtr m_session
Array< OneD, NekDouble > m_tmpIN
DNekBlkMatSharedPtr GetFloquetBlockMatrix(FloquetMatType mattype, bool UseContCoeffs=false) const
Array< OneD, Array< OneD, NekDouble > > m_baseflow
Storage for base flow.
Array< OneD, NekDouble > m_tmpOUT
LibUtilities::NektarFFTSharedPtr m_FFT
auxiliary variables
void ImportFldBase(std::string pInfile, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, int slice)
Import Base flow.
Array< OneD, Array< OneD, NekDouble > > m_interp
interpolation vector
NektarFFTFactory & GetNektarFFTFactory()
Definition: NektarFFT.cpp:69
std::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
Definition: NekTypeDefs.hpp:77
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:492
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1255

References ASSERTL0, Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::CreateInstance(), eForwardsPhys, Nektar::eWrapper, CellMLToNektar.pycml::format, GetFloquetBlockMatrix(), Nektar::LibUtilities::GetNektarFFTFactory(), ImportFldBase(), m_baseflow, m_FFT, m_interp, m_isperiodic, m_session, m_skip, m_slices, m_start, m_tmpIN, m_tmpOUT, Vmath::Vcopy(), and Vmath::Zero().

Referenced by v_InitObject().

◆ GenFloquetBlockMatrix()

DNekBlkMatSharedPtr Nektar::LinearisedAdvection::GenFloquetBlockMatrix ( FloquetMatType  mattype,
bool  UseContCoeffs = false 
) const
protected

◆ GetFloquetBlockMatrix()

DNekBlkMatSharedPtr Nektar::LinearisedAdvection::GetFloquetBlockMatrix ( FloquetMatType  mattype,
bool  UseContCoeffs = false 
) const
protected

Definition at line 628 of file LinearisedAdvection.cpp.

630 {
631  boost::ignore_unused(mattype, UseContCoeffs);
632 
633  DNekMatSharedPtr loc_mat;
634  DNekBlkMatSharedPtr BlkMatrix;
635  size_t n_exp = 0;
636 
637  n_exp = m_baseflow[0].size(); // will operatore on m_phys
638 
639  Array<OneD, unsigned int> nrows(n_exp);
640  Array<OneD, unsigned int> ncols(n_exp);
641 
642  nrows = Array<OneD, unsigned int>(n_exp, m_slices);
643  ncols = Array<OneD, unsigned int>(n_exp, m_slices);
644 
645  MatrixStorage blkmatStorage = eDIAGONAL;
646  BlkMatrix = MemoryManager<DNekBlkMat>::AllocateSharedPtr(nrows, ncols,
647  blkmatStorage);
648 
649  const LibUtilities::PointsKey Pkey(m_slices,
651  const LibUtilities::BasisKey BK(LibUtilities::eFourier, m_slices, Pkey);
652  StdRegions::StdSegExp StdSeg(BK);
653 
654  StdRegions::StdMatrixKey matkey(StdRegions::eFwdTrans,
655  StdSeg.DetShapeType(), StdSeg);
656 
657  loc_mat = StdSeg.GetStdMatrix(matkey);
658 
659  // set up array of block matrices.
660  for (size_t i = 0; i < n_exp; ++i)
661  {
662  BlkMatrix->SetBlock(i, i, loc_mat);
663  }
664 
665  return BlkMatrix;
666 }
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
Definition: PointsType.h:76
@ eFourier
Fourier Expansion .
Definition: BasisType.h:57
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:75

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::eDIAGONAL, Nektar::LibUtilities::eFourier, Nektar::LibUtilities::eFourierEvenlySpaced, Nektar::StdRegions::eFwdTrans, Nektar::StdRegions::StdExpansion::GetStdMatrix(), m_baseflow, and m_slices.

Referenced by DFT().

◆ ImportFldBase()

void Nektar::LinearisedAdvection::ImportFldBase ( std::string  pInfile,
Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
int  pSlice 
)
protected

Import Base flow.

Import field from infile and load into m_fields. This routine will also perform a BwdTrans to ensure data is in both the physical and coefficient storage.

Parameters
pInFileFilename to read.
pFieldsArray of expansion lists

Definition at line 417 of file LinearisedAdvection.cpp.

420 {
421  std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef;
422  std::vector<std::vector<NekDouble>> FieldData;
423 
424  size_t nqtot = m_baseflow[0].size();
425  Array<OneD, NekDouble> tmp_coeff(pFields[0]->GetNcoeffs(), 0.0);
426 
427  size_t numexp = pFields[0]->GetExpSize();
428  Array<OneD, int> ElementGIDs(numexp);
429 
430  // Define list of global element ids
431  for (size_t i = 0; i < numexp; ++i)
432  {
433  ElementGIDs[i] = pFields[0]->GetExp(i)->GetGeom()->GetGlobalID();
434  }
435 
436  // Get Homogeneous
439  fld->Import(pInfile, FieldDef, FieldData,
441 
442  size_t nSessionVar = m_session->GetVariables().size();
443  size_t nSessionConvVar = nSessionVar - 1;
444  size_t nFileVar = FieldDef[0]->m_fields.size();
445 
446  std::unordered_map<int, int> zIdToPlane;
447  if (m_singleMode || m_halfMode)
448  {
449  zIdToPlane[0] = 0;
450  }
451 
452  for (size_t j = 0; j < nFileVar; ++j)
453  {
454  size_t k = 0;
455  for (; k < nSessionConvVar; ++k)
456  {
457  if (m_session->GetVariable(k) == FieldDef[0]->m_fields[j])
458  {
459  break;
460  }
461  }
462  if (k == nSessionConvVar)
463  {
464  continue;
465  }
466  for (size_t i = 0; i < FieldDef.size(); ++i)
467  {
468  pFields[j]->ExtractDataToCoeffs(FieldDef[i], FieldData[i],
469  FieldDef[i]->m_fields[j], tmp_coeff,
470  zIdToPlane);
471  }
472 
473  if (m_singleMode || m_halfMode)
474  {
475  pFields[j]->GetPlane(0)->BwdTrans(tmp_coeff, m_baseflow[k]);
476 
477  if (m_singleMode)
478  {
479  // copy the bwd trans into the second plane for single
480  // Mode Analysis
481  int ncplane = (pFields[0]->GetNpoints()) / m_npointsZ;
482  Vmath::Vcopy(ncplane, &m_baseflow[k][0], 1,
483  &m_baseflow[k][ncplane], 1);
484  }
485  }
486  else // fully 3D base flow - put in physical space.
487  {
488  bool oldwavespace = pFields[j]->GetWaveSpace();
489  pFields[j]->SetWaveSpace(false);
490  pFields[j]->BwdTrans(tmp_coeff, m_baseflow[k]);
491  pFields[j]->SetWaveSpace(oldwavespace);
492  }
493  }
494 
495  // If time-periodic, put loaded data into the slice storage.
496  if (m_slices > 1)
497  {
498  for (size_t i = 0; i < nSessionConvVar; ++i)
499  {
500  Vmath::Vcopy(nqtot, &m_baseflow[i][0], 1,
501  &m_interp[i][pSlice * nqtot], 1);
502  }
503  }
504 }
static std::shared_ptr< FieldIO > CreateForFile(const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
Construct a FieldIO object for a given input filename.
Definition: FieldIO.cpp:226
int m_npointsZ
number of points in Z direction (if homogeneous)
bool m_singleMode
flag to determine if use single mode or not
bool m_halfMode
flag to determine if use half mode or not
std::shared_ptr< FieldIO > FieldIOSharedPtr
Definition: FieldIO.h:327
static FieldMetaDataMap NullFieldMetaDataMap
Definition: FieldIO.h:53

References Nektar::LibUtilities::FieldIO::CreateForFile(), m_baseflow, m_halfMode, m_interp, m_npointsZ, m_session, m_singleMode, m_slices, Nektar::LibUtilities::NullFieldMetaDataMap, and Vmath::Vcopy().

Referenced by DFT(), and v_InitObject().

◆ UpdateBase()

void Nektar::LinearisedAdvection::UpdateBase ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const NekDouble  time 
)
protected

Definition at line 506 of file LinearisedAdvection.cpp.

509 {
510  int npoints = m_baseflow[0].size();
511  if (m_isperiodic)
512  {
513  NekDouble BetaT = 2 * M_PI * fmod(time, m_period) / m_period;
514  NekDouble phase;
515  Array<OneD, NekDouble> auxiliary(npoints);
516 
517  Vmath::Vcopy(npoints, &inarray[0], 1, &outarray[0], 1);
518  Vmath::Svtvp(npoints, cos(0.5 * m_slices * BetaT), &inarray[npoints], 1,
519  &outarray[0], 1, &outarray[0], 1);
520 
521  for (int i = 2; i < m_slices; i += 2)
522  {
523  phase = (i >> 1) * BetaT;
524 
525  Vmath::Svtvp(npoints, cos(phase), &inarray[i * npoints], 1,
526  &outarray[0], 1, &outarray[0], 1);
527  Vmath::Svtvp(npoints, -sin(phase), &inarray[(i + 1) * npoints], 1,
528  &outarray[0], 1, &outarray[0], 1);
529  }
530  }
531  else
532  {
533  NekDouble x = time;
534  x = x / m_period * (m_slices - 1);
535  int ix = x;
536  if (ix < 0)
537  {
538  ix = 0;
539  }
540  if (ix > m_slices - 2)
541  {
542  ix = m_slices - 2;
543  }
544  int padleft = m_interporder / 2 - 1;
545  if (padleft > ix)
546  {
547  padleft = ix;
548  }
549  int padright = m_interporder - 1 - padleft;
550  if (padright > m_slices - 1 - ix)
551  {
552  padright = m_slices - 1 - ix;
553  }
554  padleft = m_interporder - 1 - padright;
555  Array<OneD, NekDouble> coeff(m_interporder, 1.);
556  for (int i = 0; i < m_interporder; ++i)
557  {
558  for (int j = 0; j < m_interporder; ++j)
559  {
560  if (i != j)
561  {
562  coeff[i] *= (x - ix + padleft - (NekDouble)j) /
563  ((NekDouble)i - (NekDouble)j);
564  }
565  }
566  }
567  Vmath::Zero(npoints, &outarray[0], 1);
568  for (int i = ix - padleft; i < ix + padright + 1; ++i)
569  {
570  Vmath::Svtvp(npoints, coeff[i - ix + padleft],
571  &inarray[i * npoints], 1, &outarray[0], 1,
572  &outarray[0], 1);
573  }
574  }
575 }
NekDouble m_period
period length
double NekDouble
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

References m_baseflow, m_interporder, m_isperiodic, m_period, m_slices, Vmath::Svtvp(), Vmath::Vcopy(), and Vmath::Zero().

Referenced by Nektar::AdjointAdvection::v_Advect(), and v_Advect().

◆ UpdateGradBase()

void Nektar::LinearisedAdvection::UpdateGradBase ( const int  var,
const MultiRegions::ExpListSharedPtr field 
)
protected

Definition at line 577 of file LinearisedAdvection.cpp.

579 {
580  int nBaseDerivs = (m_halfMode || m_singleMode) ? 2 : m_spacedim;
581  switch (m_spacedim)
582  {
583  case 1: // 1D
584  {
585  field->PhysDeriv(m_baseflow[var],
586  m_gradBase[var * nBaseDerivs + 0]);
587  }
588  break;
589  case 2: // 2D
590  {
591  field->PhysDeriv(m_baseflow[var], m_gradBase[var * nBaseDerivs + 0],
592  m_gradBase[var * nBaseDerivs + 1]);
593  }
594  break;
595  case 3:
596  {
597  if (m_halfMode) // can assume W = 0 and d/dz == 0
598  {
599  if (var < 2)
600  {
601  field->PhysDeriv(m_baseflow[var],
602  m_gradBase[var * nBaseDerivs + 0],
603  m_gradBase[var * nBaseDerivs + 1]);
604  }
605  }
606  else if (m_singleMode) // single mode where d/dz = 0
607  {
608  field->PhysDeriv(m_baseflow[var],
609  m_gradBase[var * nBaseDerivs + 0],
610  m_gradBase[var * nBaseDerivs + 1]);
611  }
612  else
613  {
614  // Differentiate base flow in physical space
615  bool oldwavespace = field->GetWaveSpace();
616  field->SetWaveSpace(false);
617  field->PhysDeriv(m_baseflow[var],
618  m_gradBase[var * nBaseDerivs + 0],
619  m_gradBase[var * nBaseDerivs + 1],
620  m_gradBase[var * nBaseDerivs + 2]);
621  field->SetWaveSpace(oldwavespace);
622  }
623  }
624  break;
625  }
626 }
Array< OneD, Array< OneD, NekDouble > > m_gradBase

References m_baseflow, m_gradBase, m_halfMode, m_singleMode, and m_spacedim.

Referenced by Nektar::AdjointAdvection::v_Advect(), v_Advect(), v_InitObject(), and v_SetBaseFlow().

◆ v_Advect()

void Nektar::LinearisedAdvection::v_Advect ( const int  nConvectiveFields,
const Array< OneD, MultiRegions::ExpListSharedPtr > &  fields,
const Array< OneD, Array< OneD, NekDouble >> &  advVel,
const Array< OneD, Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const NekDouble time,
const Array< OneD, Array< OneD, NekDouble >> &  pFwd = NullNekDoubleArrayOfArray,
const Array< OneD, Array< OneD, NekDouble >> &  pBwd = NullNekDoubleArrayOfArray 
)
overrideprotectedvirtual

Advects a vector field.

Implements Nektar::SolverUtils::Advection.

Reimplemented in Nektar::AdjointAdvection.

Definition at line 270 of file LinearisedAdvection.cpp.

278 {
279  boost::ignore_unused(pFwd, pBwd);
280  ASSERTL1(nConvectiveFields == inarray.size(),
281  "Number of convective fields and Inarray are not compatible");
282 
283  size_t nPointsTot = fields[0]->GetNpoints();
284  size_t ndim = advVel.size();
285  size_t nBaseDerivs = (m_halfMode || m_singleMode) ? 2 : m_spacedim;
286  size_t nDerivs = (m_halfMode) ? 2 : m_spacedim;
287 
288  Array<OneD, Array<OneD, NekDouble>> velocity(ndim);
289  for (size_t i = 0; i < ndim; ++i)
290  {
291  if (fields[i]->GetWaveSpace() && !m_singleMode && !m_halfMode)
292  {
293  velocity[i] = Array<OneD, NekDouble>(nPointsTot, 0.0);
294  fields[i]->HomogeneousBwdTrans(nPointsTot, advVel[i], velocity[i]);
295  }
296  else
297  {
298  velocity[i] = advVel[i];
299  }
300  }
301 
302  Array<OneD, Array<OneD, NekDouble>> grad(nDerivs);
303  for (size_t i = 0; i < nDerivs; ++i)
304  {
305  grad[i] = Array<OneD, NekDouble>(nPointsTot);
306  }
307 
308  // Evaluation of the base flow for periodic cases
309  if (m_slices > 1)
310  {
311  for (size_t i = 0; i < ndim; ++i)
312  {
313  UpdateBase(m_interp[i], m_baseflow[i], time);
314  UpdateGradBase(i, fields[i]);
315  }
316  }
317 
318  // Evaluate the linearised advection term
319  for (size_t i = 0; i < (size_t)nConvectiveFields; ++i)
320  {
321  // Calculate gradient
322  switch (nDerivs)
323  {
324  case 1:
325  {
326  fields[i]->PhysDeriv(inarray[i], grad[0]);
327  }
328  break;
329  case 2:
330  {
331  fields[i]->PhysDeriv(inarray[i], grad[0], grad[1]);
332  }
333  break;
334  case 3:
335  {
336  fields[i]->PhysDeriv(inarray[i], grad[0], grad[1], grad[2]);
337  if (m_multipleModes)
338  {
339  // transform gradients into physical Fourier space
340  fields[i]->HomogeneousBwdTrans(nPointsTot, grad[0],
341  grad[0]);
342  fields[i]->HomogeneousBwdTrans(nPointsTot, grad[1],
343  grad[1]);
344  fields[i]->HomogeneousBwdTrans(nPointsTot, grad[2],
345  grad[2]);
346  }
347  }
348  break;
349  }
350 
351  // Calculate U_j du'_i/dx_j
352  Vmath::Vmul(nPointsTot, grad[0], 1, m_baseflow[0], 1, outarray[i], 1);
353  for (size_t j = 1; j < nDerivs; ++j)
354  {
355  Vmath::Vvtvp(nPointsTot, grad[j], 1, m_baseflow[j], 1, outarray[i],
356  1, outarray[i], 1);
357  }
358 
359  // Add u'_j dU_i/dx_j
360  size_t lim = (m_halfMode || m_singleMode) ? 2 : ndim;
361  if (m_halfMode && i == 2)
362  {
363  lim = 0;
364  }
365  for (size_t j = 0; j < lim; ++j)
366  {
367  Vmath::Vvtvp(nPointsTot, m_gradBase[i * nBaseDerivs + j], 1,
368  velocity[j], 1, outarray[i], 1, outarray[i], 1);
369  }
370 
371  if (m_multipleModes)
372  {
373  fields[i]->HomogeneousFwdTrans(nPointsTot, outarray[i],
374  outarray[i]);
375  }
376  Vmath::Neg(nPointsTot, outarray[i], 1);
377  }
378 }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:249
void UpdateBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const NekDouble time)
void UpdateGradBase(const int var, const MultiRegions::ExpListSharedPtr &field)
bool m_multipleModes
flag to determine if use multiple mode or not
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:209
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:518
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
Definition: Vmath.cpp:574

References ASSERTL1, m_baseflow, m_gradBase, m_halfMode, m_interp, m_multipleModes, m_singleMode, m_slices, m_spacedim, Vmath::Neg(), UpdateBase(), UpdateGradBase(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ v_InitObject()

void Nektar::LinearisedAdvection::v_InitObject ( LibUtilities::SessionReaderSharedPtr  pSession,
Array< OneD, MultiRegions::ExpListSharedPtr pFields 
)
overrideprotectedvirtual

Initialises the advection object.

This function should be overridden in derived classes to initialise the specific advection data members. However, this base class function should be called as the first statement of the overridden function to ensure the base class is correctly initialised in order.

Parameters
pSessionSession information.
pFieldsExpansion lists for scalar fields.

Reimplemented from Nektar::SolverUtils::Advection.

Definition at line 59 of file LinearisedAdvection.cpp.

62 {
63  Advection::v_InitObject(pSession, pFields);
64 
65  m_session = pSession;
68  m_session, pFields[0]->GetGraph());
69  m_spacedim = pFields[0]->GetGraph()->GetSpaceDimension();
70  m_expdim = pFields[0]->GetGraph()->GetMeshDimension();
71 
72  // Setting parameters for homogeneous problems
73  m_HomoDirec = 0;
74  m_useFFT = false;
76  m_singleMode = false;
77  m_halfMode = false;
78  m_multipleModes = false;
79 
80  if (m_session->DefinesSolverInfo("HOMOGENEOUS"))
81  {
82  std::string HomoStr = m_session->GetSolverInfo("HOMOGENEOUS");
83  m_spacedim = 3;
84 
85  if ((HomoStr == "HOMOGENEOUS1D") || (HomoStr == "Homogeneous1D") ||
86  (HomoStr == "1D") || (HomoStr == "Homo1D"))
87  {
89  m_LhomZ = m_session->GetParameter("LZ");
90  m_HomoDirec = 1;
91 
92  ASSERTL0(m_session->DefinesSolverInfo("ModeType"),
93  "Need to specify ModeType as HalfMode,SingleMode or "
94  "MultipleModes");
95 
96  m_session->MatchSolverInfo("ModeType", "SingleMode", m_singleMode,
97  false);
98  m_session->MatchSolverInfo("ModeType", "HalfMode", m_halfMode,
99  false);
100  m_session->MatchSolverInfo("ModeType", "MultipleModes",
101  m_multipleModes, false);
102 
103  if (m_singleMode)
104  {
105  m_npointsZ = 2;
106  }
107  else if (m_halfMode)
108  {
109  m_npointsZ = 1;
110  }
111  else if (m_multipleModes)
112  {
113  m_npointsZ = m_session->GetParameter("HomModesZ");
114  }
115  }
116 
117  if ((HomoStr == "HOMOGENEOUS2D") || (HomoStr == "Homogeneous2D") ||
118  (HomoStr == "2D") || (HomoStr == "Homo2D"))
119  {
121  m_session->LoadParameter("HomModesY", m_npointsY);
122  m_session->LoadParameter("LY", m_LhomY);
123  m_session->LoadParameter("HomModesZ", m_npointsZ);
124  m_session->LoadParameter("LZ", m_LhomZ);
125  m_HomoDirec = 2;
126  }
127 
128  if ((HomoStr == "HOMOGENEOUS3D") || (HomoStr == "Homogeneous3D") ||
129  (HomoStr == "3D") || (HomoStr == "Homo3D"))
130  {
132  m_session->LoadParameter("HomModesX", m_npointsX);
133  m_session->LoadParameter("LX", m_LhomX);
134  m_session->LoadParameter("HomModesY", m_npointsY);
135  m_session->LoadParameter("LY", m_LhomY);
136  m_session->LoadParameter("HomModesZ", m_npointsZ);
137  m_session->LoadParameter("LZ", m_LhomZ);
138  m_HomoDirec = 3;
139  }
140 
141  if (m_session->DefinesSolverInfo("USEFFT"))
142  {
143  m_useFFT = true;
144  }
145  }
146  else
147  {
148  m_npointsZ = 1; // set to default value so can use to identify 2d or 3D
149  // (homogeneous) expansions
150  }
151 
152  size_t nvar = m_session->GetVariables().size();
153  m_baseflow = Array<OneD, Array<OneD, NekDouble>>(nvar);
154  for (size_t i = 0; i < nvar; ++i)
155  {
156  m_baseflow[i] = Array<OneD, NekDouble>(pFields[i]->GetTotPoints(), 0.0);
157  }
158 
159  size_t nBaseDerivs = (m_halfMode || m_singleMode) ? 2 : m_spacedim;
160  m_gradBase = Array<OneD, Array<OneD, NekDouble>>(nvar * nBaseDerivs);
161  for (size_t i = 0; i < nvar; ++i)
162  {
163  for (size_t j = 0; j < nBaseDerivs; ++j)
164  {
165  m_gradBase[i * nBaseDerivs + j] =
166  Array<OneD, NekDouble>(pFields[i]->GetTotPoints(), 0.0);
167  }
168  }
169 
170  ASSERTL0(m_session->DefinesFunction("BaseFlow"),
171  "Base flow must be defined for linearised forms.");
172  string file = m_session->GetFunctionFilename("BaseFlow", 0);
173 
174  // Periodic base flows
175  if (m_session->DefinesParameter("N_slices"))
176  {
177  m_session->LoadParameter("N_slices", m_slices);
178  if (m_slices > 1)
179  {
180  ASSERTL0(m_session->GetFunctionType("BaseFlow", 0) ==
182  "Base flow should be a sequence of files.");
183  m_session->LoadParameter("BaseFlow_interporder", m_interporder, 0);
185  "BaseFlow_interporder should be smaller than or equal to "
186  "N_slices.");
188  m_session->LoadParameter("N_start", m_start, 0);
189  m_session->LoadParameter("N_skip", m_skip, 1);
190  DFT(file, pFields);
191  }
192  else
193  {
194  ASSERTL0(false, "Number of slices must be a positive number "
195  "greater than 1");
196  }
197  }
198  // Steady base-flow
199  else
200  {
201  m_slices = 1;
202 
203  // BaseFlow from file
204  if (m_session->GetFunctionType("BaseFlow", m_session->GetVariable(0)) ==
206  {
207  ImportFldBase(file, pFields, 1);
208  }
209  // analytic base flow
210  else
211  {
212  size_t nq = pFields[0]->GetNpoints();
213  Array<OneD, NekDouble> x0(nq);
214  Array<OneD, NekDouble> x1(nq);
215  Array<OneD, NekDouble> x2(nq);
216 
217  // get the coordinates (assuming all fields have the same
218  // discretisation)
219  pFields[0]->GetCoords(x0, x1, x2);
220 
221  for (size_t i = 0; i < pFields.size(); i++)
222  {
224  m_session->GetFunction("BaseFlow", i);
225 
226  ifunc->Evaluate(x0, x1, x2, m_baseflow[i]);
227  }
228  }
229  }
230 
231  for (size_t i = 0; i < nvar; ++i)
232  {
233  UpdateGradBase(i, pFields[i]);
234  }
235 
236  if (m_session->DefinesParameter("period"))
237  {
238  m_period = m_session->GetParameter("period");
239  }
240  else
241  {
242  m_period =
243  (m_session->GetParameter("TimeStep") * m_slices) / (m_slices - 1.);
244  }
245  if (m_session->GetComm()->GetRank() == 0)
246  {
247  cout << "baseflow info : interpolation order " << m_interporder
248  << ", period " << m_period << ", periodicity ";
249  if (m_isperiodic)
250  {
251  cout << "yes\n";
252  }
253  else
254  {
255  cout << "no\n";
256  }
257  cout << "baseflow info : files from " << m_start << " to "
258  << (m_start + (m_slices - 1) * m_skip) << " (skip " << m_skip
259  << ") with " << (m_slices - (m_interporder > 1))
260  << " time intervals" << endl;
261  }
262 }
SpatialDomains::BoundaryConditionsSharedPtr m_boundaryConditions
NekDouble m_LhomZ
physical length in Z direction (if homogeneous)
enum HomogeneousType m_HomogeneousType
int m_npointsX
number of points in X direction (if homogeneous)
int m_npointsY
number of points in Y direction (if homogeneous)
int m_HomoDirec
number of homogenous directions
bool m_useFFT
flag to determine if use or not the FFT for transformations
void DFT(const std::string file, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
NekDouble m_LhomY
physical length in Y direction (if homogeneous)
NekDouble m_LhomX
physical length in X direction (if homogeneous)
virtual SOLVER_UTILS_EXPORT void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object.
Definition: Advection.cpp:353
std::shared_ptr< Equation > EquationSharedPtr
Definition: Equation.h:129

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL0, DFT(), Nektar::LibUtilities::eFunctionTypeFile, eHomogeneous1D, eHomogeneous2D, eHomogeneous3D, eNotHomogeneous, ImportFldBase(), m_baseflow, m_boundaryConditions, m_expdim, m_gradBase, m_halfMode, m_HomoDirec, m_HomogeneousType, m_interporder, m_isperiodic, m_LhomX, m_LhomY, m_LhomZ, m_multipleModes, m_npointsX, m_npointsY, m_npointsZ, m_period, m_session, m_singleMode, m_skip, m_slices, m_spacedim, m_start, m_useFFT, UpdateGradBase(), and Nektar::SolverUtils::Advection::v_InitObject().

◆ v_SetBaseFlow()

void Nektar::LinearisedAdvection::v_SetBaseFlow ( const Array< OneD, Array< OneD, NekDouble >> &  inarray,
const Array< OneD, MultiRegions::ExpListSharedPtr > &  fields 
)
overrideprotectedvirtual

Overrides the base flow used during linearised advection.

Reimplemented from Nektar::SolverUtils::Advection.

Definition at line 380 of file LinearisedAdvection.cpp.

383 {
384  if (m_session->GetSolverInfo("EqType") == "UnsteadyNavierStokes")
385  {
386  // The SFD method is only applied to the velocity variables in
387  // incompressible
388  ASSERTL1(inarray.size() == (m_baseflow.size() - 1),
389  "Number of base flow variables does not match what is "
390  "expected.");
391  }
392  else
393  {
394  ASSERTL1(
395  inarray.size() == (m_baseflow.size()),
396  "Number of base flow variables does not match what is expected.");
397  }
398 
399  size_t npts = inarray[0].size();
400 
401  for (size_t i = 0; i < inarray.size(); ++i)
402  {
403  ASSERTL1(npts == m_baseflow[i].size(),
404  "Size of base flow array does not match expected.");
405  Vmath::Vcopy(npts, inarray[i], 1, m_baseflow[i], 1);
406  UpdateGradBase(i, fields[i]);
407  }
408 }

References ASSERTL1, m_baseflow, m_session, UpdateGradBase(), and Vmath::Vcopy().

Friends And Related Function Documentation

◆ MemoryManager< LinearisedAdvection >

friend class MemoryManager< LinearisedAdvection >
friend

Definition at line 56 of file LinearisedAdvection.h.

Member Data Documentation

◆ className

string Nektar::LinearisedAdvection::className
static
Initial value:
=
"Linearised Non-Conservative")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
static SolverUtils::AdvectionSharedPtr create(std::string)
Creates an instance of this class.
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects.
Definition: Advection.cpp:47

Name of class.

Definition at line 67 of file LinearisedAdvection.h.

◆ m_baseflow

Array<OneD, Array<OneD, NekDouble> > Nektar::LinearisedAdvection::m_baseflow
protected

◆ m_boundaryConditions

SpatialDomains::BoundaryConditionsSharedPtr Nektar::LinearisedAdvection::m_boundaryConditions
private

Definition at line 171 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_expdim

int Nektar::LinearisedAdvection::m_expdim
protected

Definition at line 73 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_FFT

LibUtilities::NektarFFTSharedPtr Nektar::LinearisedAdvection::m_FFT
protected

auxiliary variables

Definition at line 90 of file LinearisedAdvection.h.

Referenced by DFT().

◆ m_FloquetBlockMat

FloquetBlockMatrixMapShPtr Nektar::LinearisedAdvection::m_FloquetBlockMat
protected

Definition at line 105 of file LinearisedAdvection.h.

◆ m_gradBase

Array<OneD, Array<OneD, NekDouble> > Nektar::LinearisedAdvection::m_gradBase
protected

◆ m_halfMode

bool Nektar::LinearisedAdvection::m_halfMode
protected

flag to determine if use half mode or not

Definition at line 97 of file LinearisedAdvection.h.

Referenced by ImportFldBase(), UpdateGradBase(), Nektar::AdjointAdvection::v_Advect(), v_Advect(), and v_InitObject().

◆ m_HomoDirec

int Nektar::LinearisedAdvection::m_HomoDirec
private

number of homogenous directions

Definition at line 167 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_HomogeneousType

enum HomogeneousType Nektar::LinearisedAdvection::m_HomogeneousType
private

Definition at line 155 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_interp

Array<OneD, Array<OneD, NekDouble> > Nektar::LinearisedAdvection::m_interp
protected

interpolation vector

Definition at line 88 of file LinearisedAdvection.h.

Referenced by DFT(), ImportFldBase(), Nektar::AdjointAdvection::v_Advect(), and v_Advect().

◆ m_interporder

int Nektar::LinearisedAdvection::m_interporder
protected

Definition at line 86 of file LinearisedAdvection.h.

Referenced by UpdateBase(), and v_InitObject().

◆ m_isperiodic

int Nektar::LinearisedAdvection::m_isperiodic
protected

Definition at line 85 of file LinearisedAdvection.h.

Referenced by DFT(), UpdateBase(), and v_InitObject().

◆ m_LhomX

NekDouble Nektar::LinearisedAdvection::m_LhomX
private

physical length in X direction (if homogeneous)

Definition at line 159 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_LhomY

NekDouble Nektar::LinearisedAdvection::m_LhomY
private

physical length in Y direction (if homogeneous)

Definition at line 160 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_LhomZ

NekDouble Nektar::LinearisedAdvection::m_LhomZ
private

physical length in Z direction (if homogeneous)

Definition at line 161 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_multipleModes

bool Nektar::LinearisedAdvection::m_multipleModes
protected

flag to determine if use multiple mode or not

Definition at line 99 of file LinearisedAdvection.h.

Referenced by Nektar::AdjointAdvection::v_Advect(), v_Advect(), and v_InitObject().

◆ m_npointsX

int Nektar::LinearisedAdvection::m_npointsX
private

number of points in X direction (if homogeneous)

Definition at line 163 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_npointsY

int Nektar::LinearisedAdvection::m_npointsY
private

number of points in Y direction (if homogeneous)

Definition at line 164 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_npointsZ

int Nektar::LinearisedAdvection::m_npointsZ
private

number of points in Z direction (if homogeneous)

Definition at line 165 of file LinearisedAdvection.h.

Referenced by ImportFldBase(), and v_InitObject().

◆ m_NumMode

int Nektar::LinearisedAdvection::m_NumMode
private

Mode to use in case of single mode analysis.

Definition at line 169 of file LinearisedAdvection.h.

◆ m_period

NekDouble Nektar::LinearisedAdvection::m_period
protected

period length

Definition at line 84 of file LinearisedAdvection.h.

Referenced by UpdateBase(), Nektar::AdjointAdvection::v_Advect(), and v_InitObject().

◆ m_session

LibUtilities::SessionReaderSharedPtr Nektar::LinearisedAdvection::m_session
protected

Definition at line 70 of file LinearisedAdvection.h.

Referenced by DFT(), ImportFldBase(), v_InitObject(), and v_SetBaseFlow().

◆ m_singleMode

bool Nektar::LinearisedAdvection::m_singleMode
protected

flag to determine if use single mode or not

Definition at line 95 of file LinearisedAdvection.h.

Referenced by ImportFldBase(), UpdateGradBase(), Nektar::AdjointAdvection::v_Advect(), v_Advect(), and v_InitObject().

◆ m_skip

int Nektar::LinearisedAdvection::m_skip
protected

Definition at line 81 of file LinearisedAdvection.h.

Referenced by DFT(), and v_InitObject().

◆ m_slices

int Nektar::LinearisedAdvection::m_slices
protected

◆ m_spacedim

int Nektar::LinearisedAdvection::m_spacedim
protected

◆ m_start

int Nektar::LinearisedAdvection::m_start
protected

number of slices

Definition at line 80 of file LinearisedAdvection.h.

Referenced by DFT(), and v_InitObject().

◆ m_tmpIN

Array<OneD, NekDouble> Nektar::LinearisedAdvection::m_tmpIN
protected

Definition at line 91 of file LinearisedAdvection.h.

Referenced by DFT().

◆ m_tmpOUT

Array<OneD, NekDouble> Nektar::LinearisedAdvection::m_tmpOUT
protected

Definition at line 92 of file LinearisedAdvection.h.

Referenced by DFT().

◆ m_useFFT

bool Nektar::LinearisedAdvection::m_useFFT
private

flag to determine if use or not the FFT for transformations

Definition at line 155 of file LinearisedAdvection.h.

Referenced by v_InitObject().

◆ m_useFFTW

bool Nektar::LinearisedAdvection::m_useFFTW
protected

Definition at line 93 of file LinearisedAdvection.h.