Nektar++
Public Member Functions | Protected Attributes | Private Member Functions | List of all members
Nektar::Collections::PhysDeriv_SumFac_Hex Class Referencefinal

Phys deriv operator using sum-factorisation (Hex) More...

Inheritance diagram for Nektar::Collections::PhysDeriv_SumFac_Hex:
[legend]

Public Member Functions

 ~PhysDeriv_SumFac_Hex () final=default
 
void operator() (const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
 Perform operation. More...
 
void operator() (int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
 
void CheckFactors (StdRegions::FactorMap factors, int coll_phys_offset) override
 Check the validity of the supplied factor map. More...
 
- Public Member Functions inherited from Nektar::Collections::Operator
 Operator (std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData, StdRegions::FactorMap factors)
 Constructor. More...
 
virtual ~Operator ()=default
 
virtual COLLECTIONS_EXPORT void operator() (const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp=NullNekDouble1DArray)=0
 Perform operation. More...
 
virtual COLLECTIONS_EXPORT void operator() (int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp=NullNekDouble1DArray)=0
 
virtual COLLECTIONS_EXPORT void CheckFactors (StdRegions::FactorMap factors, int coll_phys_offset)=0
 Check the validity of the supplied factor map. More...
 
unsigned int GetWspSize ()
 Get the size of the required workspace. More...
 
unsigned int GetNumElmt ()
 Get number of elements. More...
 
StdRegions::StdExpansionSharedPtr GetExpSharedPtr ()
 Get expansion pointer. More...
 
unsigned int GetInputSize ()
 
unsigned int GetOutputSize ()
 

Protected Attributes

Array< TwoD, const NekDoublem_derivFac
 
int m_coordim
 
const int m_nquad0
 
const int m_nquad1
 
const int m_nquad2
 
NekDoublem_Deriv0
 
NekDoublem_Deriv1
 
NekDoublem_Deriv2
 
- Protected Attributes inherited from Nektar::Collections::Operator
bool m_isDeformed
 
StdRegions::StdExpansionSharedPtr m_stdExp
 
unsigned int m_numElmt
 number of elements that the operator is applied on More...
 
unsigned int m_nqe
 
unsigned int m_wspSize
 
unsigned int m_inputSize
 number of modes or quadrature points that are passed as input to an operator More...
 
unsigned int m_outputSize
 number of modes or quadrature points that are taken as output from an operator More...
 

Private Member Functions

 PhysDeriv_SumFac_Hex (vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
 

Additional Inherited Members

- Protected Member Functions inherited from Nektar::Collections::Operator
virtual int v_GetInputSize ()
 This purely virtual function needs to be set-up for every operator inside Collections. It is responsible for returning the size of input collection, that the operator is applied on either in physical or coefficient space. More...
 
virtual int v_GetOutputSize ()
 This purely virtual function needs to be set-up for every operator inside Collections. It is responsible for returning the output size either in physical or coefficient space of an operator inside Collections. More...
 
- Protected Member Functions inherited from Nektar::Collections::PhysDeriv_Helper
 PhysDeriv_Helper ()
 

Detailed Description

Phys deriv operator using sum-factorisation (Hex)

Definition at line 1254 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Hex()

Nektar::Collections::PhysDeriv_SumFac_Hex::~PhysDeriv_SumFac_Hex ( )
finaldefault

◆ PhysDeriv_SumFac_Hex()

Nektar::Collections::PhysDeriv_SumFac_Hex::PhysDeriv_SumFac_Hex ( vector< StdRegions::StdExpansionSharedPtr pCollExp,
CoalescedGeomDataSharedPtr  pGeomData,
StdRegions::FactorMap  factors 
)
inlineprivate

Definition at line 1419 of file PhysDeriv.cpp.

1422 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
1423 m_nquad0(m_stdExp->GetNumPoints(0)),
1424 m_nquad1(m_stdExp->GetNumPoints(1)),
1425 m_nquad2(m_stdExp->GetNumPoints(2))
1426 {
1427 m_coordim = pCollExp[0]->GetCoordim();
1428
1429 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1430
1431 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1432 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1433 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1434
1436 }
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:188
unsigned int m_numElmt
number of elements that the operator is applied on
Definition: Operator.h:190
Operator(std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData, StdRegions::FactorMap factors)
Constructor.
Definition: Operator.cpp:66
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1409
StdRegions::ConstFactorMap factors

References m_coordim, m_Deriv0, m_Deriv1, m_Deriv2, m_derivFac, m_nquad0, m_nquad1, m_nquad2, Nektar::Collections::Operator::m_numElmt, Nektar::Collections::Operator::m_stdExp, and Nektar::Collections::Operator::m_wspSize.

Member Function Documentation

◆ CheckFactors()

void Nektar::Collections::PhysDeriv_SumFac_Hex::CheckFactors ( StdRegions::FactorMap  factors,
int  coll_phys_offset 
)
inlineoverridevirtual

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 1402 of file PhysDeriv.cpp.

1404 {
1405 ASSERTL0(false, "Not valid for this operator.");
1406 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208

References ASSERTL0.

◆ operator()() [1/2]

void Nektar::Collections::PhysDeriv_SumFac_Hex::operator() ( const Array< OneD, const NekDouble > &  input,
Array< OneD, NekDouble > &  output0,
Array< OneD, NekDouble > &  output1,
Array< OneD, NekDouble > &  output2,
Array< OneD, NekDouble > &  wsp 
)
inlinefinalvirtual

Perform operation.

Implements Nektar::Collections::Operator.

Definition at line 1262 of file PhysDeriv.cpp.

1267 {
1268 int nPhys = m_stdExp->GetTotPoints();
1269 int ntot = m_numElmt * nPhys;
1270 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1271 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1272 Array<OneD, Array<OneD, NekDouble>> out(3);
1273 out[0] = output0;
1274 out[1] = output1;
1275 out[2] = output2;
1276
1277 for (int i = 0; i < 3; ++i)
1278 {
1279 Diff[i] = wsp + i * ntot;
1280 }
1281
1283 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
1284 &Diff[0][0], m_nquad0);
1285
1286 for (int i = 0; i < m_numElmt; ++i)
1287 {
1288 for (int j = 0; j < m_nquad2; ++j)
1289 {
1290 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1291 &input[i * nPhys + j * m_nquad0 * m_nquad1],
1292 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1293 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
1294 m_nquad0);
1295 }
1296
1297 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
1298 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
1299 m_nquad2, 0.0, &Diff[2][i * nPhys],
1300 m_nquad0 * m_nquad1);
1301 }
1302
1303 // calculate full derivative
1304 if (m_isDeformed)
1305 {
1306 for (int i = 0; i < m_coordim; ++i)
1307 {
1308 Vmath::Vmul(ntot, m_derivFac[i * 3], 1, Diff[0], 1, out[i], 1);
1309 for (int j = 1; j < 3; ++j)
1310 {
1311 Vmath::Vvtvp(ntot, m_derivFac[i * 3 + j], 1, Diff[j], 1,
1312 out[i], 1, out[i], 1);
1313 }
1314 }
1315 }
1316 else
1317 {
1318 Array<OneD, NekDouble> t;
1319 for (int e = 0; e < m_numElmt; ++e)
1320 {
1321 for (int i = 0; i < m_coordim; ++i)
1322 {
1323 Vmath::Smul(m_nqe, m_derivFac[i * 3][e],
1324 Diff[0] + e * m_nqe, 1, t = out[i] + e * m_nqe,
1325 1);
1326
1327 for (int j = 1; j < 3; ++j)
1328 {
1329 Vmath::Svtvp(m_nqe, m_derivFac[i * 3 + j][e],
1330 Diff[j] + e * m_nqe, 1, out[i] + e * m_nqe,
1331 1, t = out[i] + e * m_nqe, 1);
1332 }
1333 }
1334 }
1335 }
1336 }
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
Definition: Blas.hpp:383
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.hpp:72
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.hpp:396
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.hpp:366
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.hpp:100

References Blas::Dgemm(), m_coordim, m_Deriv0, m_Deriv1, m_Deriv2, m_derivFac, Nektar::Collections::Operator::m_isDeformed, Nektar::Collections::Operator::m_nqe, m_nquad0, m_nquad1, m_nquad2, Nektar::Collections::Operator::m_numElmt, Nektar::Collections::Operator::m_stdExp, Vmath::Smul(), Vmath::Svtvp(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ operator()() [2/2]

void Nektar::Collections::PhysDeriv_SumFac_Hex::operator() ( int  dir,
const Array< OneD, const NekDouble > &  input,
Array< OneD, NekDouble > &  output,
Array< OneD, NekDouble > &  wsp 
)
inlinefinalvirtual

Implements Nektar::Collections::Operator.

Definition at line 1338 of file PhysDeriv.cpp.

1341 {
1342 int nPhys = m_stdExp->GetTotPoints();
1343 int ntot = m_numElmt * nPhys;
1344 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1345 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1346
1347 for (int i = 0; i < 3; ++i)
1348 {
1349 Diff[i] = wsp + i * ntot;
1350 }
1351
1353 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
1354 &Diff[0][0], m_nquad0);
1355
1356 for (int i = 0; i < m_numElmt; ++i)
1357 {
1358 for (int j = 0; j < m_nquad2; ++j)
1359 {
1360 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1361 &input[i * nPhys + j * m_nquad0 * m_nquad1],
1362 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1363 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
1364 m_nquad0);
1365 }
1366
1367 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
1368 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
1369 m_nquad2, 0.0, &Diff[2][i * nPhys],
1370 m_nquad0 * m_nquad1);
1371 }
1372
1373 // calculate full derivative
1374 if (m_isDeformed)
1375 {
1376 // calculate full derivative
1377 Vmath::Vmul(ntot, m_derivFac[dir * 3], 1, Diff[0], 1, output, 1);
1378 for (int j = 1; j < 3; ++j)
1379 {
1380 Vmath::Vvtvp(ntot, m_derivFac[dir * 3 + j], 1, Diff[j], 1,
1381 output, 1, output, 1);
1382 }
1383 }
1384 else
1385 {
1386 Array<OneD, NekDouble> t;
1387 for (int e = 0; e < m_numElmt; ++e)
1388 {
1389 Vmath::Smul(m_nqe, m_derivFac[dir * 3][e], Diff[0] + e * m_nqe,
1390 1, t = output + e * m_nqe, 1);
1391
1392 for (int j = 1; j < 3; ++j)
1393 {
1394 Vmath::Svtvp(m_nqe, m_derivFac[dir * 3 + j][e],
1395 Diff[j] + e * m_nqe, 1, output + e * m_nqe, 1,
1396 t = output + e * m_nqe, 1);
1397 }
1398 }
1399 }
1400 }

References Blas::Dgemm(), m_Deriv0, m_Deriv1, m_Deriv2, m_derivFac, Nektar::Collections::Operator::m_isDeformed, Nektar::Collections::Operator::m_nqe, m_nquad0, m_nquad1, m_nquad2, Nektar::Collections::Operator::m_numElmt, Nektar::Collections::Operator::m_stdExp, Vmath::Smul(), Vmath::Svtvp(), Vmath::Vmul(), and Vmath::Vvtvp().

Member Data Documentation

◆ m_coordim

int Nektar::Collections::PhysDeriv_SumFac_Hex::m_coordim
protected

Definition at line 1410 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Hex::m_Deriv0
protected

Definition at line 1414 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Hex::m_Deriv1
protected

Definition at line 1415 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_Deriv2

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Hex::m_Deriv2
protected

Definition at line 1416 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_derivFac

Array<TwoD, const NekDouble> Nektar::Collections::PhysDeriv_SumFac_Hex::m_derivFac
protected

Definition at line 1409 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Hex::m_nquad0
protected

Definition at line 1411 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Hex::m_nquad1
protected

Definition at line 1412 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().

◆ m_nquad2

const int Nektar::Collections::PhysDeriv_SumFac_Hex::m_nquad2
protected

Definition at line 1413 of file PhysDeriv.cpp.

Referenced by operator()(), and PhysDeriv_SumFac_Hex().