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

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

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

Public Member Functions

virtual ~PhysDeriv_SumFac_Pyr ()
 
virtual void operator() (const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
 Perform operation. More...
 
virtual void operator() (int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
 
- Public Member Functions inherited from Nektar::Collections::Operator
 Operator (std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData)
 Constructor. More...
 
virtual COLLECTIONS_EXPORT ~Operator ()
 
int GetWspSize ()
 Get the size of the required workspace. More...
 

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
 
Array< OneD, NekDoublem_fac0
 
Array< OneD, NekDoublem_fac1
 
Array< OneD, NekDoublem_fac2
 
- Protected Attributes inherited from Nektar::Collections::Operator
StdRegions::StdExpansionSharedPtr m_stdExp
 
unsigned int m_numElmt
 
unsigned int m_wspSize
 

Private Member Functions

 PhysDeriv_SumFac_Pyr (vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
 

Detailed Description

Phys deriv operator using sum-factorisation (Pyramid)

Definition at line 1541 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Pyr()

virtual Nektar::Collections::PhysDeriv_SumFac_Pyr::~PhysDeriv_SumFac_Pyr ( )
inlinevirtual

Definition at line 1546 of file PhysDeriv.cpp.

1547  {
1548  }

◆ PhysDeriv_SumFac_Pyr()

Nektar::Collections::PhysDeriv_SumFac_Pyr::PhysDeriv_SumFac_Pyr ( vector< StdRegions::StdExpansionSharedPtr pCollExp,
CoalescedGeomDataSharedPtr  pGeomData 
)
inlineprivate

Definition at line 1703 of file PhysDeriv.cpp.

References Nektar::Collections::ePhysDeriv, Nektar::LibUtilities::ePyramid, Nektar::Collections::eSumFac, Nektar::Collections::GetOperatorFactory(), and Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::RegisterCreatorFunction().

1706  : Operator(pCollExp, pGeomData),
1707  m_nquad0 (m_stdExp->GetNumPoints(0)),
1708  m_nquad1 (m_stdExp->GetNumPoints(1)),
1709  m_nquad2 (m_stdExp->GetNumPoints(2))
1710  {
1711  LibUtilities::PointsKeyVector PtsKey = m_stdExp->GetPointsKeys();
1712 
1713  m_coordim = pCollExp[0]->GetCoordim();
1714 
1715  m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1716 
1717  const Array<OneD, const NekDouble>& z0
1718  = m_stdExp->GetBasis(0)->GetZ();
1719  const Array<OneD, const NekDouble>& z1
1720  = m_stdExp->GetBasis(1)->GetZ();
1721  const Array<OneD, const NekDouble>& z2
1722  = m_stdExp->GetBasis(2)->GetZ();
1723  m_fac0 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1724  m_fac1 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1725  m_fac2 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1726 
1727  int nq0_nq1 = m_nquad0*m_nquad1;
1728  for (int i = 0; i < m_nquad0; ++i)
1729  {
1730  for(int j = 0; j < m_nquad1; ++j)
1731  {
1732  int ifac = i+j*m_nquad0;
1733  for(int k = 0; k < m_nquad2; ++k)
1734  {
1735  m_fac0[ifac + k*nq0_nq1] =
1736  2.0/(1-z2[k]);
1737  m_fac1[ifac + k*nq0_nq1] =
1738  0.5*(1+z0[i]);
1739  m_fac2[ifac + k*nq0_nq1] =
1740  0.5*(1+z1[j]);
1741  }
1742  }
1743  }
1744 
1745  m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1746  m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1747  m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1748 
1749  m_wspSize = 3*m_nquad0*m_nquad1*m_nquad2*m_numElmt;
1750  }
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:246
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1690
Operator(std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData)
Constructor.
Definition: Operator.h:113
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:148

Member Function Documentation

◆ operator()() [1/2]

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

Perform operation.

Implements Nektar::Collections::Operator.

Definition at line 1550 of file PhysDeriv.cpp.

References Blas::Dgemm(), Vmath::Vmul(), and Vmath::Vvtvp().

1556  {
1557  int nPhys = m_stdExp->GetTotPoints();
1558  int ntot = m_numElmt*nPhys;
1559  Array<OneD, NekDouble> tmp0,tmp1,tmp2;
1560  Array<OneD, Array<OneD, NekDouble> > Diff(3);
1561  Array<OneD, Array<OneD, NekDouble> > out(3);
1562  out[0] = output0; out[1] = output1; out[2] = output2;
1563 
1564  for(int i = 0; i < 3; ++i)
1565  {
1566  Diff[i] = wsp + i*ntot;
1567  }
1568 
1569  // dEta0
1571  m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1572  m_nquad0,0.0,&Diff[0][0],m_nquad0);
1573 
1574  int cnt = 0;
1575  for(int i = 0; i < m_numElmt; ++i)
1576  {
1577 
1578  // dEta 1
1579  for (int j = 0; j < m_nquad2; ++j)
1580  {
1581  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1,
1582  1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1583  m_nquad0, m_Deriv1, m_nquad1, 0.0,
1584  &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1585  m_nquad0);
1586  }
1587 
1588  // dEta 2
1589  Blas::Dgemm('N','T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1590  1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1591  m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1592  m_nquad0*m_nquad1);
1593 
1594  // dxi0 = 2/(1-eta_2) d Eta_0
1595  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
1596  Diff[0].get()+cnt,1);
1597 
1598  // dxi1 = 2/(1-eta_2) d Eta_1
1599  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[1].get()+cnt,1,
1600  Diff[1].get()+cnt,1);
1601 
1602  // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
1603  Vmath::Vvtvp(nPhys,&m_fac1[0],1,Diff[0].get()+cnt,1,
1604  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
1605  // dxi2 += (1+eta1)/(1-eta_2) d Eta_1
1606  Vmath::Vvtvp(nPhys,&m_fac2[0],1,Diff[1].get()+cnt,1,
1607  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
1608  cnt += nPhys;
1609  }
1610 
1611  // calculate full derivative
1612  for(int i = 0; i < m_coordim; ++i)
1613  {
1614  Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
1615  for(int j = 1; j < 3; ++j)
1616  {
1617  Vmath::Vvtvp (ntot, m_derivFac[i*3+j], 1,
1618  Diff[j], 1, out[i], 1, out[i], 1);
1619  }
1620  }
1621  }
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1690
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:445
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 A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:148
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:186

◆ operator()() [2/2]

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

Implements Nektar::Collections::Operator.

Definition at line 1623 of file PhysDeriv.cpp.

References Blas::Dgemm(), Vmath::Vmul(), and Vmath::Vvtvp().

1628  {
1629  int nPhys = m_stdExp->GetTotPoints();
1630  int ntot = m_numElmt*nPhys;
1631  Array<OneD, NekDouble> tmp0,tmp1,tmp2;
1632  Array<OneD, Array<OneD, NekDouble> > Diff(3);
1633 
1634  for(int i = 0; i < 3; ++i)
1635  {
1636  Diff[i] = wsp + i*ntot;
1637  }
1638 
1639  // dEta0
1641  m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1642  m_nquad0,0.0,&Diff[0][0],m_nquad0);
1643 
1644  int cnt = 0;
1645  for(int i = 0; i < m_numElmt; ++i)
1646  {
1647  // dEta 1
1648  for (int j = 0; j < m_nquad2; ++j)
1649  {
1650  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1,
1651  1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1652  m_nquad0, m_Deriv1, m_nquad1, 0.0,
1653  &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1654  m_nquad0);
1655  }
1656 
1657  // dEta 2
1658  Blas::Dgemm('N','T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1659  1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1660  m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1661  m_nquad0*m_nquad1);
1662 
1663  // dxi0 = 2/(1-eta_2) d Eta_0
1664  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
1665  Diff[0].get()+cnt,1);
1666 
1667  // dxi1 = 2/(1-eta_2) d Eta_1
1668  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[1].get()+cnt,1,
1669  Diff[1].get()+cnt,1);
1670 
1671  // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
1672  Vmath::Vvtvp(nPhys,&m_fac1[0],1,Diff[0].get()+cnt,1,
1673  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
1674  // dxi2 = (1+eta1)/(1-eta_2) d Eta_1 + d/dEta2;
1675  Vmath::Vvtvp(nPhys,&m_fac2[0],1,Diff[1].get()+cnt,1,
1676  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
1677  cnt += nPhys;
1678  }
1679 
1680  // calculate full derivative
1681  Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
1682  for(int j = 1; j < 3; ++j)
1683  {
1684  Vmath::Vvtvp (ntot, m_derivFac[dir*3+j], 1,
1685  Diff[j], 1, output, 1, output, 1);
1686  }
1687  }
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1690
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:445
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 A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:148
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:186

Member Data Documentation

◆ m_coordim

int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_coordim
protected

Definition at line 1691 of file PhysDeriv.cpp.

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Pyr::m_Deriv0
protected

Definition at line 1695 of file PhysDeriv.cpp.

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Pyr::m_Deriv1
protected

Definition at line 1696 of file PhysDeriv.cpp.

◆ m_Deriv2

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Pyr::m_Deriv2
protected

Definition at line 1697 of file PhysDeriv.cpp.

◆ m_derivFac

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

Definition at line 1690 of file PhysDeriv.cpp.

◆ m_fac0

Array<OneD, NekDouble> Nektar::Collections::PhysDeriv_SumFac_Pyr::m_fac0
protected

Definition at line 1698 of file PhysDeriv.cpp.

◆ m_fac1

Array<OneD, NekDouble> Nektar::Collections::PhysDeriv_SumFac_Pyr::m_fac1
protected

Definition at line 1699 of file PhysDeriv.cpp.

◆ m_fac2

Array<OneD, NekDouble> Nektar::Collections::PhysDeriv_SumFac_Pyr::m_fac2
protected

Definition at line 1700 of file PhysDeriv.cpp.

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_nquad0
protected

Definition at line 1692 of file PhysDeriv.cpp.

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_nquad1
protected

Definition at line 1693 of file PhysDeriv.cpp.

◆ m_nquad2

const int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_nquad2
protected

Definition at line 1694 of file PhysDeriv.cpp.