42 std::string NavierStokesAdvection::navierStokesAdvectionTypeLookupIds[2] = {
43 LibUtilities::SessionReader::RegisterEnumValue(
"SPECTRALHPDEALIASING",
45 LibUtilities::SessionReader::RegisterEnumValue(
"SPECTRALHPDEALIASING",
58 NavierStokesAdvection::NavierStokesAdvection():
78 pSession->MatchSolverInfo(
"ModeType",
"SingleMode",
m_SingleMode,
false);
79 pSession->MatchSolverInfo(
"ModeType",
"HalfMode",
m_HalfMode,
false);
86 const int nConvectiveFields,
95 int nqtot = fields[0]->GetTotPoints();
96 ASSERTL1(nConvectiveFields == inarray.num_elements(),
"Number of convective fields and Inarray are not compatible");
99 int ndim = advVel.num_elements();
103 for(
int i = 0; i < ndim; ++i)
109 fields[i]->HomogeneousBwdTrans(advVel[i],velocity[i]);
113 velocity[i] = advVel[i];
117 int nPointsTot = fields[0]->GetNpoints();
125 nPointsTot = fields[0]->Get1DScaledTotPoints(OneDptscale);
131 for(
int i = 0; i < ndim; ++i)
135 fields[0]->PhysInterp1DScaled(OneDptscale,velocity[i],AdvVel[i]);
140 for(
int i = 0; i < ndim; ++i)
142 AdvVel[i] = velocity[i];
153 for(
int n = 0; n < nConvectiveFields; ++n)
155 fields[0]->PhysDeriv(inarray[n],grad0);
159 fields[0]->PhysInterp1DScaled(OneDptscale,grad0,wkSp);
160 Vmath::Vmul (nPointsTot,wkSp,1,AdvVel[0],1,Outarray,1);
162 fields[0]->PhysGalerkinProjection1DScaled(OneDptscale,Outarray,outarray[n]);
166 Vmath::Vmul(nPointsTot,grad0,1,AdvVel[0],1,outarray[n],1);
173 for(
int n = 0; n < nConvectiveFields; ++n)
175 fields[0]->PhysDeriv(inarray[n],grad0,grad1);
180 fields[0]->PhysInterp1DScaled(OneDptscale,grad0,wkSp);
181 Vmath::Vmul (nPointsTot,wkSp,1,AdvVel[0],1,Outarray,1);
182 fields[0]->PhysInterp1DScaled(OneDptscale,grad1,wkSp);
183 Vmath::Vvtvp(nPointsTot,wkSp,1,AdvVel[1],1,Outarray,1,Outarray,1);
185 fields[0]->PhysGalerkinProjection1DScaled(OneDptscale,Outarray,outarray[n]);
189 Vmath::Vmul (nPointsTot,grad0,1,AdvVel[0],1,outarray[n],1);
190 Vmath::Vvtvp(nPointsTot,grad1,1,AdvVel[1],1,outarray[n],1,outarray[n],1);
200 for (
int i = 0; i < ndim; i++)
204 for (
int i = 0; i < ndim*nConvectiveFields; i++)
208 for (
int i = 0; i < nConvectiveFields; i++)
213 for (
int n = 0; n < nConvectiveFields; n++)
215 fields[0]->PhysDeriv(inarray[n],grad[0],grad[1],grad[2]);
216 for (
int i = 0; i < ndim; i++)
218 fields[0]->PhysInterp1DScaled(OneDptscale,grad[i],
219 gradScaled[n*ndim+i]);
223 fields[0]->DealiasedDotProd(AdvVel,gradScaled,Outarray,
m_CoeffState);
225 for (
int n = 0; n < nConvectiveFields; n++)
227 fields[0]->PhysGalerkinProjection1DScaled(OneDptscale,
228 Outarray[n],outarray[n]);
235 for (
int i = 0; i < ndim*nConvectiveFields; i++)
239 for (
int i = 0; i < nConvectiveFields; i++)
244 for (
int n = 0; n < nConvectiveFields; n++)
246 fields[0]->PhysDeriv(inarray[n],grad[n*ndim+0],
251 fields[0]->DealiasedDotProd(AdvVel,grad,outarray,
m_CoeffState);
258 for(
int n = 0; n < nConvectiveFields; ++n)
260 if (fields[0]->GetWaveSpace() ==
true &&
266 fields[0]->PhysDeriv(velocity[n],grad0,grad1);
270 fields[0]->HomogeneousBwdTrans(inarray[n],wkSp);
271 fields[0]->PhysDeriv(wkSp,grad0,grad1);
277 fields[0]->HomogeneousBwdTrans(outarray[n],grad2);
279 else if (fields[0]->GetWaveSpace() ==
true &&
285 fields[0]->PhysDeriv(velocity[n],grad0);
289 fields[0]->HomogeneousBwdTrans(inarray[n],wkSp);
290 fields[0]->PhysDeriv(wkSp,grad0);
295 fields[0]->HomogeneousBwdTrans(outarray[n],grad1);
299 fields[0]->HomogeneousBwdTrans(outarray[n],grad2);
303 fields[0]->PhysDeriv(inarray[n],grad0,grad1,grad2);
308 fields[0]->PhysInterp1DScaled(OneDptscale,grad0,wkSp);
309 Vmath::Vmul(nPointsTot,wkSp,1,AdvVel[0],1,Outarray,1);
311 fields[0]->PhysInterp1DScaled(OneDptscale,grad1,wkSp);
315 fields[0]->PhysInterp1DScaled(OneDptscale,grad2,wkSp);
318 fields[0]->PhysGalerkinProjection1DScaled(OneDptscale,
319 Outarray,outarray[n]);
323 Vmath::Vmul(nPointsTot,grad0,1,AdvVel[0],1,outarray[n],1);
324 Vmath::Vvtvp(nPointsTot,grad1,1,AdvVel[1],1,outarray[n],1,
326 Vmath::Vvtvp(nPointsTot,grad2,1,AdvVel[2],1,outarray[n],1,
330 if(fields[0]->GetWaveSpace() ==
true)
332 fields[0]->HomogeneousFwdTrans(outarray[n],outarray[n]);
338 ASSERTL0(
false,
"dimension unknown");
341 for(
int n = 0; n < nConvectiveFields; ++n)
bool m_homogen_dealiasing
#define ASSERTL0(condition, msg)
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 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
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects.
void Neg(int n, T *x, const int incx)
Negate x = -x.
MultiRegions::CoeffState m_CoeffState
virtual ~NavierStokesAdvection()
MultiRegions::Direction const DirCartesianMap[]
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
#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 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.