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

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

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

Public Member Functions

 ~PhysDeriv_SumFac_Prism () 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
 
- 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_Prism (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 (Prism)

Definition at line 1730 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Prism()

Nektar::Collections::PhysDeriv_SumFac_Prism::~PhysDeriv_SumFac_Prism ( )
finaldefault

◆ PhysDeriv_SumFac_Prism()

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

Definition at line 1923 of file PhysDeriv.cpp.

1926 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
1927 m_nquad0(m_stdExp->GetNumPoints(0)),
1928 m_nquad1(m_stdExp->GetNumPoints(1)),
1929 m_nquad2(m_stdExp->GetNumPoints(2))
1930 {
1931 m_coordim = pCollExp[0]->GetCoordim();
1932
1933 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1934
1935 const Array<OneD, const NekDouble> &z0 = m_stdExp->GetBasis(0)->GetZ();
1936 const Array<OneD, const NekDouble> &z2 = m_stdExp->GetBasis(2)->GetZ();
1937 m_fac0 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
1938 m_fac1 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
1939 for (int i = 0; i < m_nquad0; ++i)
1940 {
1941 for (int j = 0; j < m_nquad1; ++j)
1942 {
1943 for (int k = 0; k < m_nquad2; ++k)
1944 {
1945 m_fac0[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1946 2.0 / (1 - z2[k]);
1947 m_fac1[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1948 0.5 * (1 + z0[i]);
1949 }
1950 }
1951 }
1952
1953 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1954 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1955 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1956
1958 }
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:1911
StdRegions::ConstFactorMap factors

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

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 1904 of file PhysDeriv.cpp.

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

References ASSERTL0.

◆ operator()() [1/2]

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

1743 {
1744 int nPhys = m_stdExp->GetTotPoints();
1745 int ntot = m_numElmt * nPhys;
1746 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1747 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1748 Array<OneD, Array<OneD, NekDouble>> out(3);
1749 out[0] = output0;
1750 out[1] = output1;
1751 out[2] = output2;
1752
1753 for (int i = 0; i < 3; ++i)
1754 {
1755 Diff[i] = wsp + i * ntot;
1756 }
1757
1758 // dEta0
1760 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
1761 &Diff[0][0], m_nquad0);
1762
1763 int cnt = 0;
1764 for (int i = 0; i < m_numElmt; ++i)
1765 {
1766 // dEta 1
1767 for (int j = 0; j < m_nquad2; ++j)
1768 {
1769 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1770 &input[i * nPhys + j * m_nquad0 * m_nquad1],
1771 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1772 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
1773 m_nquad0);
1774 }
1775
1776 // dEta 2
1777 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
1778 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
1779 m_nquad2, 0.0, &Diff[2][i * nPhys],
1780 m_nquad0 * m_nquad1);
1781
1782 // dxi0 = 2/(1-eta_2) d Eta_0
1783 Vmath::Vmul(nPhys, &m_fac0[0], 1, Diff[0].get() + cnt, 1,
1784 Diff[0].get() + cnt, 1);
1785
1786 // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
1787 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, Diff[0].get() + cnt, 1,
1788 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1789 cnt += nPhys;
1790 }
1791
1792 // calculate full derivative
1793 if (m_isDeformed)
1794 {
1795 for (int i = 0; i < m_coordim; ++i)
1796 {
1797 Vmath::Vmul(ntot, m_derivFac[i * 3], 1, Diff[0], 1, out[i], 1);
1798 for (int j = 1; j < 3; ++j)
1799 {
1800 Vmath::Vvtvp(ntot, m_derivFac[i * 3 + j], 1, Diff[j], 1,
1801 out[i], 1, out[i], 1);
1802 }
1803 }
1804 }
1805 else
1806 {
1807 Array<OneD, NekDouble> t;
1808 for (int e = 0; e < m_numElmt; ++e)
1809 {
1810 for (int i = 0; i < m_coordim; ++i)
1811 {
1812 Vmath::Smul(m_nqe, m_derivFac[i * 3][e],
1813 Diff[0] + e * m_nqe, 1, t = out[i] + e * m_nqe,
1814 1);
1815
1816 for (int j = 1; j < 3; ++j)
1817 {
1818 Vmath::Svtvp(m_nqe, m_derivFac[i * 3 + j][e],
1819 Diff[j] + e * m_nqe, 1, out[i] + e * m_nqe,
1820 1, t = out[i] + e * m_nqe, 1);
1821 }
1822 }
1823 }
1824 }
1825 }
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, 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_Prism::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 1827 of file PhysDeriv.cpp.

1830 {
1831 int nPhys = m_stdExp->GetTotPoints();
1832 int ntot = m_numElmt * nPhys;
1833 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1834 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1835
1836 for (int i = 0; i < 3; ++i)
1837 {
1838 Diff[i] = wsp + i * ntot;
1839 }
1840
1841 // dEta0
1843 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
1844 &Diff[0][0], m_nquad0);
1845
1846 int cnt = 0;
1847 for (int i = 0; i < m_numElmt; ++i)
1848 {
1849 // dEta 1
1850 for (int j = 0; j < m_nquad2; ++j)
1851 {
1852 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1853 &input[i * nPhys + j * m_nquad0 * m_nquad1],
1854 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1855 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
1856 m_nquad0);
1857 }
1858
1859 // dEta 2
1860 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
1861 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
1862 m_nquad2, 0.0, &Diff[2][i * nPhys],
1863 m_nquad0 * m_nquad1);
1864
1865 // dxi0 = 2/(1-eta_2) d Eta_0
1866 Vmath::Vmul(nPhys, &m_fac0[0], 1, Diff[0].get() + cnt, 1,
1867 Diff[0].get() + cnt, 1);
1868
1869 // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
1870 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, Diff[0].get() + cnt, 1,
1871 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1872 cnt += nPhys;
1873 }
1874
1875 // calculate full derivative
1876 if (m_isDeformed)
1877 {
1878 // calculate full derivative
1879 Vmath::Vmul(ntot, m_derivFac[dir * 3], 1, Diff[0], 1, output, 1);
1880 for (int j = 1; j < 3; ++j)
1881 {
1882 Vmath::Vvtvp(ntot, m_derivFac[dir * 3 + j], 1, Diff[j], 1,
1883 output, 1, output, 1);
1884 }
1885 }
1886 else
1887 {
1888 Array<OneD, NekDouble> t;
1889 for (int e = 0; e < m_numElmt; ++e)
1890 {
1891 Vmath::Smul(m_nqe, m_derivFac[dir * 3][e], Diff[0] + e * m_nqe,
1892 1, t = output + e * m_nqe, 1);
1893
1894 for (int j = 1; j < 3; ++j)
1895 {
1896 Vmath::Svtvp(m_nqe, m_derivFac[dir * 3 + j][e],
1897 Diff[j] + e * m_nqe, 1, output + e * m_nqe, 1,
1898 t = output + e * m_nqe, 1);
1899 }
1900 }
1901 }
1902 }

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

Definition at line 1912 of file PhysDeriv.cpp.

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

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Prism::m_Deriv0
protected

Definition at line 1916 of file PhysDeriv.cpp.

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

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Prism::m_Deriv1
protected

Definition at line 1917 of file PhysDeriv.cpp.

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

◆ m_Deriv2

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Prism::m_Deriv2
protected

Definition at line 1918 of file PhysDeriv.cpp.

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

◆ m_derivFac

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

Definition at line 1911 of file PhysDeriv.cpp.

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

◆ m_fac0

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

Definition at line 1919 of file PhysDeriv.cpp.

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

◆ m_fac1

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

Definition at line 1920 of file PhysDeriv.cpp.

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

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Prism::m_nquad0
protected

Definition at line 1913 of file PhysDeriv.cpp.

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

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Prism::m_nquad1
protected

Definition at line 1914 of file PhysDeriv.cpp.

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

◆ m_nquad2

const int Nektar::Collections::PhysDeriv_SumFac_Prism::m_nquad2
protected

Definition at line 1915 of file PhysDeriv.cpp.

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