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

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

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

Public Member Functions

 ~PhysDeriv_SumFac_Tet () 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
 
Array< OneD, NekDoublem_fac0
 
Array< OneD, NekDoublem_fac1
 
Array< OneD, NekDoublem_fac2
 
Array< OneD, NekDoublem_fac3
 
- 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_Tet (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 (Tet)

Definition at line 1448 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Tet()

Nektar::Collections::PhysDeriv_SumFac_Tet::~PhysDeriv_SumFac_Tet ( )
finaldefault

◆ PhysDeriv_SumFac_Tet()

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

Definition at line 1673 of file PhysDeriv.cpp.

1676 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
1677 m_nquad0(m_stdExp->GetNumPoints(0)),
1678 m_nquad1(m_stdExp->GetNumPoints(1)),
1679 m_nquad2(m_stdExp->GetNumPoints(2))
1680 {
1681 m_coordim = pCollExp[0]->GetCoordim();
1682
1683 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1684
1685 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1686 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1687 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1688
1690
1691 const Array<OneD, const NekDouble> &z0 = m_stdExp->GetBasis(0)->GetZ();
1692 const Array<OneD, const NekDouble> &z1 = m_stdExp->GetBasis(1)->GetZ();
1693 const Array<OneD, const NekDouble> &z2 = m_stdExp->GetBasis(2)->GetZ();
1694
1695 m_fac0 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
1696 m_fac1 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
1697 m_fac2 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
1698 m_fac3 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
1699
1700 // calculate 2.0/((1-eta_1)(1-eta_2))
1701 for (int i = 0; i < m_nquad0; ++i)
1702 {
1703 for (int j = 0; j < m_nquad1; ++j)
1704 {
1705 for (int k = 0; k < m_nquad2; ++k)
1706 {
1707 m_fac0[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1708 4.0 / ((1 - z1[j]) * (1 - z2[k]));
1709 m_fac1[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1710 2.0 * (1 + z0[i]) / ((1 - z1[j]) * (1 - z2[k]));
1711 m_fac2[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1712 2.0 / (1 - z2[k]);
1713 m_fac3[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1714 (1 + z1[j]) / (1 - z2[k]);
1715 }
1716 }
1717 }
1718 }
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:1659
StdRegions::ConstFactorMap factors

References m_coordim, m_Deriv0, m_Deriv1, m_Deriv2, m_derivFac, m_fac0, m_fac1, m_fac2, m_fac3, 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_Tet::CheckFactors ( StdRegions::FactorMap  factors,
int  coll_phys_offset 
)
inlineoverridevirtual

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 1652 of file PhysDeriv.cpp.

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

References ASSERTL0.

◆ operator()() [1/2]

void Nektar::Collections::PhysDeriv_SumFac_Tet::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 1456 of file PhysDeriv.cpp.

1461 {
1462 int nPhys = m_stdExp->GetTotPoints();
1463 int ntot = m_numElmt * nPhys;
1464 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1465 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1466 Array<OneD, Array<OneD, NekDouble>> out(3);
1467 out[0] = output0;
1468 out[1] = output1;
1469 out[2] = output2;
1470
1471 for (int i = 0; i < 3; ++i)
1472 {
1473 Diff[i] = wsp + i * ntot;
1474 }
1475
1476 // dEta0
1478 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
1479 &Diff[0][0], m_nquad0);
1480
1481 // dEta2
1482 for (int i = 0; i < m_numElmt; ++i)
1483 {
1484 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
1485 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
1486 m_nquad2, 0.0, &Diff[2][i * nPhys],
1487 m_nquad0 * m_nquad1);
1488 }
1489
1490 for (int i = 0; i < m_numElmt; ++i)
1491 {
1492 // dEta1
1493 for (int j = 0; j < m_nquad2; ++j)
1494 {
1495 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1496 &input[i * nPhys + j * m_nquad0 * m_nquad1],
1497 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1498 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
1499 m_nquad0);
1500 }
1501
1502 // dxi2 = (1 + eta_1)/(1 -eta_2)*dEta1 + dEta2
1503 Vmath::Vvtvp(nPhys, m_fac3.get(), 1, Diff[1].get() + i * nPhys, 1,
1504 Diff[2].get() + i * nPhys, 1,
1505 Diff[2].get() + i * nPhys, 1);
1506
1507 // dxi1 = 2/(1 - eta_2) dEta1
1508 Vmath::Vmul(nPhys, m_fac2.get(), 1, Diff[1].get() + i * nPhys, 1,
1509 Diff[1].get() + i * nPhys, 1);
1510
1511 // dxi1 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi1
1512 Vmath::Vvtvp(nPhys, m_fac1.get(), 1, Diff[0].get() + i * nPhys, 1,
1513 Diff[1].get() + i * nPhys, 1,
1514 Diff[1].get() + i * nPhys, 1);
1515
1516 // dxi2 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi2
1517 Vmath::Vvtvp(nPhys, m_fac1.get(), 1, Diff[0].get() + i * nPhys, 1,
1518 Diff[2].get() + i * nPhys, 1,
1519 Diff[2].get() + i * nPhys, 1);
1520
1521 // dxi0 = 4.0/((1-eta_1)(1-eta_2)) dEta0
1522 Vmath::Vmul(nPhys, m_fac0.get(), 1, Diff[0].get() + i * nPhys, 1,
1523 Diff[0].get() + i * nPhys, 1);
1524 }
1525
1526 // calculate full derivative
1527 if (m_isDeformed)
1528 {
1529 for (int i = 0; i < m_coordim; ++i)
1530 {
1531 Vmath::Vmul(ntot, m_derivFac[i * 3], 1, Diff[0], 1, out[i], 1);
1532 for (int j = 1; j < 3; ++j)
1533 {
1534 Vmath::Vvtvp(ntot, m_derivFac[i * 3 + j], 1, Diff[j], 1,
1535 out[i], 1, out[i], 1);
1536 }
1537 }
1538 }
1539 else
1540 {
1541 Array<OneD, NekDouble> t;
1542 for (int e = 0; e < m_numElmt; ++e)
1543 {
1544 for (int i = 0; i < m_coordim; ++i)
1545 {
1546 Vmath::Smul(m_nqe, m_derivFac[i * 3][e],
1547 Diff[0] + e * m_nqe, 1, t = out[i] + e * m_nqe,
1548 1);
1549 for (int j = 1; j < 3; ++j)
1550 {
1551 Vmath::Svtvp(m_nqe, m_derivFac[i * 3 + j][e],
1552 Diff[j] + e * m_nqe, 1, out[i] + e * m_nqe,
1553 1, t = out[i] + e * m_nqe, 1);
1554 }
1555 }
1556 }
1557 }
1558 }
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, m_fac0, m_fac1, m_fac2, m_fac3, 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_Tet::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 1560 of file PhysDeriv.cpp.

1563 {
1564 int nPhys = m_stdExp->GetTotPoints();
1565 int ntot = m_numElmt * nPhys;
1566 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1567 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1568
1569 for (int i = 0; i < 3; ++i)
1570 {
1571 Diff[i] = wsp + i * ntot;
1572 }
1573
1574 // dEta0
1576 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
1577 &Diff[0][0], m_nquad0);
1578
1579 // dEta2
1580 for (int i = 0; i < m_numElmt; ++i)
1581 {
1582 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
1583 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
1584 m_nquad2, 0.0, &Diff[2][i * nPhys],
1585 m_nquad0 * m_nquad1);
1586 }
1587
1588 for (int i = 0; i < m_numElmt; ++i)
1589 {
1590 // dEta1
1591 for (int j = 0; j < m_nquad2; ++j)
1592 {
1593 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1594 &input[i * nPhys + j * m_nquad0 * m_nquad1],
1595 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1596 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
1597 m_nquad0);
1598 }
1599
1600 // dxi2 = (1 + eta_1)/(1 -eta_2)*dEta1 + dEta2
1601 Vmath::Vvtvp(nPhys, m_fac3.get(), 1, Diff[1].get() + i * nPhys, 1,
1602 Diff[2].get() + i * nPhys, 1,
1603 Diff[2].get() + i * nPhys, 1);
1604
1605 // dxi1 = 2/(1 - eta_2) dEta1
1606 Vmath::Vmul(nPhys, m_fac2.get(), 1, Diff[1].get() + i * nPhys, 1,
1607 Diff[1].get() + i * nPhys, 1);
1608
1609 // dxi1 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi1
1610 Vmath::Vvtvp(nPhys, m_fac1.get(), 1, Diff[0].get() + i * nPhys, 1,
1611 Diff[1].get() + i * nPhys, 1,
1612 Diff[1].get() + i * nPhys, 1);
1613
1614 // dxi2 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi2
1615 Vmath::Vvtvp(nPhys, m_fac1.get(), 1, Diff[0].get() + i * nPhys, 1,
1616 Diff[2].get() + i * nPhys, 1,
1617 Diff[2].get() + i * nPhys, 1);
1618
1619 // dxi0 = 4.0/((1-eta_1)(1-eta_2)) dEta0
1620 Vmath::Vmul(nPhys, m_fac0.get(), 1, Diff[0].get() + i * nPhys, 1,
1621 Diff[0].get() + i * nPhys, 1);
1622 }
1623
1624 // calculate full derivative
1625 if (m_isDeformed)
1626 {
1627 // calculate full derivative
1628 Vmath::Vmul(ntot, m_derivFac[dir * 3], 1, Diff[0], 1, output, 1);
1629 for (int j = 1; j < 3; ++j)
1630 {
1631 Vmath::Vvtvp(ntot, m_derivFac[dir * 3 + j], 1, Diff[j], 1,
1632 output, 1, output, 1);
1633 }
1634 }
1635 else
1636 {
1637 Array<OneD, NekDouble> t;
1638 for (int e = 0; e < m_numElmt; ++e)
1639 {
1640 Vmath::Smul(m_nqe, m_derivFac[dir * 3][e], Diff[0] + e * m_nqe,
1641 1, t = output + e * m_nqe, 1);
1642 for (int j = 1; j < 3; ++j)
1643 {
1644 Vmath::Svtvp(m_nqe, m_derivFac[dir * 3 + j][e],
1645 Diff[j] + e * m_nqe, 1, output + e * m_nqe, 1,
1646 t = output + e * m_nqe, 1);
1647 }
1648 }
1649 }
1650 }

References Blas::Dgemm(), m_Deriv0, m_Deriv1, m_Deriv2, m_derivFac, m_fac0, m_fac1, m_fac2, m_fac3, 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_Tet::m_coordim
protected

Definition at line 1660 of file PhysDeriv.cpp.

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

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tet::m_Deriv0
protected

Definition at line 1664 of file PhysDeriv.cpp.

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

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tet::m_Deriv1
protected

Definition at line 1665 of file PhysDeriv.cpp.

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

◆ m_Deriv2

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tet::m_Deriv2
protected

Definition at line 1666 of file PhysDeriv.cpp.

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

◆ m_derivFac

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

Definition at line 1659 of file PhysDeriv.cpp.

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

◆ m_fac0

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

Definition at line 1667 of file PhysDeriv.cpp.

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

◆ m_fac1

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

Definition at line 1668 of file PhysDeriv.cpp.

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

◆ m_fac2

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

Definition at line 1669 of file PhysDeriv.cpp.

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

◆ m_fac3

Array<OneD, NekDouble> Nektar::Collections::PhysDeriv_SumFac_Tet::m_fac3
protected

Definition at line 1670 of file PhysDeriv.cpp.

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

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Tet::m_nquad0
protected

Definition at line 1661 of file PhysDeriv.cpp.

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

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Tet::m_nquad1
protected

Definition at line 1662 of file PhysDeriv.cpp.

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

◆ m_nquad2

const int Nektar::Collections::PhysDeriv_SumFac_Tet::m_nquad2
protected

Definition at line 1663 of file PhysDeriv.cpp.

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