41 string SkewSymmetricAdvection::className
    44             SkewSymmetricAdvection::create);
    49 SkewSymmetricAdvection::SkewSymmetricAdvection():
    75     pSession->MatchSolverInfo(
"ModeType",
"SingleMode",
m_SingleMode,
false);
    76     pSession->MatchSolverInfo(
"ModeType",
"HalfMode",
m_HalfMode,
false);
    84     const int                                          nConvectiveFields,
    94     int ndim             = advVel.num_elements();
    95     int nqtot            = fields[0]->GetTotPoints();
    96     ASSERTL1(nConvectiveFields == inarray.num_elements(),
"Number of convective fields and Inarray are not compatible");
    99     for(
int i = 0; i < ndim; ++i)
   104             fields[i]->HomogeneousBwdTrans(advVel[i],velocity[i]);
   108             velocity[i] = advVel[i];
   112     for(
int n = 0; n < nConvectiveFields; ++n)
   116         int nPointsTot = fields[0]->GetNpoints();
   126             fields[0]->PhysDeriv(inarray[n],gradV0);
   127             Vmath::Vmul(nPointsTot,gradV0,1,velocity[0],1,outarray[n],1);
   128             Vmath::Vmul(nPointsTot,inarray[n],1,velocity[0],1,gradV0,1);
   129             fields[0]->PhysDeriv(gradV0,tmp);
   130             Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   131             Vmath::Smul(nPointsTot,0.5,outarray[n],1,outarray[n],1);
   135             fields[0]->PhysDeriv(inarray[n],gradV0,gradV1);
   136             Vmath::Vmul (nPointsTot,gradV0,1,velocity[0],1,outarray[n],1);
   137             Vmath::Vvtvp(nPointsTot,gradV1,1,velocity[1],1,outarray[n],1,outarray[n],1);
   138             Vmath::Vmul(nPointsTot,inarray[n],1,velocity[0],1,gradV0,1);
   139             Vmath::Vmul(nPointsTot,inarray[n],1,velocity[1],1,gradV1,1);
   141             Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   143             Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   144             Vmath::Smul(nPointsTot,0.5,outarray[n],1,outarray[n],1);
   150             fields[0]->PhysDeriv(inarray[n],gradV0,gradV1,gradV2);
   156                 fields[0]->DealiasedProd(velocity[0],gradV0,gradV0,
m_CoeffState);
   157                 fields[0]->DealiasedProd(velocity[1],gradV1,gradV1,
m_CoeffState);
   158                 fields[0]->DealiasedProd(velocity[2],gradV2,gradV2,
m_CoeffState);
   159                 Vmath::Vadd(nPointsTot,gradV0,1,gradV1,1,outarray[n],1);
   160                 Vmath::Vadd(nPointsTot,gradV2,1,outarray[n],1,outarray[n],1);
   161                 fields[0]->DealiasedProd(inarray[n],velocity[0],gradV0,
m_CoeffState);
   162                 fields[0]->DealiasedProd(inarray[n],velocity[1],gradV1,
m_CoeffState);
   163                 fields[0]->DealiasedProd(inarray[n],velocity[2],gradV2,
m_CoeffState);
   165                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   167                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   169                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   170                 Vmath::Smul(nPointsTot,0.5,outarray[n],1,outarray[n],1);
   177                 fields[0]->HomogeneousBwdTrans(gradV0,tmp);
   178                 Vmath::Vmul(nPointsTot,tmp,1,velocity[0],1,outarray[n],1); 
   179                 fields[0]->HomogeneousBwdTrans(gradV1,tmp);
   180                 Vmath::Vvtvp(nPointsTot,tmp,1,velocity[1],1,outarray[n],1,outarray[n],1);
   181                 fields[0]->HomogeneousBwdTrans(gradV2,tmp);
   182                 Vmath::Vvtvp(nPointsTot,tmp,1,velocity[2],1,outarray[n],1,outarray[n],1);
   184                 fields[0]->HomogeneousBwdTrans(inarray[n],Up);
   185                 Vmath::Vmul(nPointsTot,Up,1,velocity[0],1,gradV0,1);
   186                 Vmath::Vmul(nPointsTot,Up,1,velocity[1],1,gradV1,1);
   187                 Vmath::Vmul(nPointsTot,Up,1,velocity[2],1,gradV2,1);
   189                 fields[0]->SetWaveSpace(
false);
   191                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   193                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   195                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   196                 fields[0]->SetWaveSpace(
true);
   199                 fields[0]->HomogeneousFwdTrans(tmp,outarray[n]);
   203                 Vmath::Vmul(nPointsTot,gradV0,1,velocity[0],1,outarray[n],1);
   204                 Vmath::Vvtvp(nPointsTot,gradV1,1,velocity[1],1,outarray[n],1,outarray[n],1);
   205                 Vmath::Vvtvp(nPointsTot,gradV2,1,velocity[2],1,outarray[n],1,outarray[n],1);
   206                 Vmath::Vmul(nPointsTot,inarray[n],1,velocity[0],1,gradV0,1);
   207                 Vmath::Vmul(nPointsTot,inarray[n],1,velocity[1],1,gradV1,1);
   208                 Vmath::Vmul(nPointsTot,inarray[n],1,velocity[2],1,gradV2,1);
   210                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   212                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   214                 Vmath::Vadd(nPointsTot,tmp,1,outarray[n],1,outarray[n],1);
   215                 Vmath::Smul(nPointsTot,0.5,outarray[n],1,outarray[n],1);
   219                 ASSERTL0(
false, 
"Dealiasing is not allowed in combination "   220                                 "with the Skew-Symmetric advection form for "   221                                 "efficiency reasons.");
   225             ASSERTL0(
false,
"dimension unknown");
 
#define ASSERTL0(condition, msg)
 
MultiRegions::CoeffState m_CoeffState
 
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 
 
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)
Advects a vector field. 
 
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y. 
 
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects. 
 
void Neg(int n, T *x, const int incx)
Negate x = -x. 
 
MultiRegions::Direction const DirCartesianMap[]
 
virtual ~SkewSymmetricAdvection()
 
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory. 
 
bool m_homogen_dealiasing
 
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
 
std::shared_ptr< SessionReader > SessionReaderSharedPtr
 
virtual SOLVER_UTILS_EXPORT void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object. 
 
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y. 
 
void 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. 
 
An abstract base class encapsulating the concept of advection of a vector field. 
 
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object.