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

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

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

Public Member Functions

 ~PhysDeriv_SumFac_Pyr () 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
 
- 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_Pyr (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 (Pyramid)

Definition at line 1970 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Pyr()

Nektar::Collections::PhysDeriv_SumFac_Pyr::~PhysDeriv_SumFac_Pyr ( )
finaldefault

◆ PhysDeriv_SumFac_Pyr()

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

Definition at line 2180 of file PhysDeriv.cpp.

2183 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
2184 m_nquad0(m_stdExp->GetNumPoints(0)),
2185 m_nquad1(m_stdExp->GetNumPoints(1)),
2186 m_nquad2(m_stdExp->GetNumPoints(2))
2187 {
2188 m_coordim = pCollExp[0]->GetCoordim();
2189
2190 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2191
2192 const Array<OneD, const NekDouble> &z0 = m_stdExp->GetBasis(0)->GetZ();
2193 const Array<OneD, const NekDouble> &z1 = m_stdExp->GetBasis(1)->GetZ();
2194 const Array<OneD, const NekDouble> &z2 = m_stdExp->GetBasis(2)->GetZ();
2195 m_fac0 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
2196 m_fac1 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
2197 m_fac2 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
2198
2199 int nq0_nq1 = m_nquad0 * m_nquad1;
2200 for (int i = 0; i < m_nquad0; ++i)
2201 {
2202 for (int j = 0; j < m_nquad1; ++j)
2203 {
2204 int ifac = i + j * m_nquad0;
2205 for (int k = 0; k < m_nquad2; ++k)
2206 {
2207 m_fac0[ifac + k * nq0_nq1] = 2.0 / (1 - z2[k]);
2208 m_fac1[ifac + k * nq0_nq1] = 0.5 * (1 + z0[i]);
2209 m_fac2[ifac + k * nq0_nq1] = 0.5 * (1 + z1[j]);
2210 }
2211 }
2212 }
2213
2214 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
2215 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
2216 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
2217
2219 }
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:2167
StdRegions::ConstFactorMap factors

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

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 2160 of file PhysDeriv.cpp.

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

References ASSERTL0.

◆ operator()() [1/2]

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 
)
inlinefinalvirtual

Perform operation.

Implements Nektar::Collections::Operator.

Definition at line 1978 of file PhysDeriv.cpp.

1983 {
1984 int nPhys = m_stdExp->GetTotPoints();
1985 int ntot = m_numElmt * nPhys;
1986 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
1987 Array<OneD, Array<OneD, NekDouble>> Diff(3);
1988 Array<OneD, Array<OneD, NekDouble>> out(3);
1989 out[0] = output0;
1990 out[1] = output1;
1991 out[2] = output2;
1992
1993 for (int i = 0; i < 3; ++i)
1994 {
1995 Diff[i] = wsp + i * ntot;
1996 }
1997
1998 // dEta0
2000 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
2001 &Diff[0][0], m_nquad0);
2002
2003 int cnt = 0;
2004 for (int i = 0; i < m_numElmt; ++i)
2005 {
2006 // dEta 1
2007 for (int j = 0; j < m_nquad2; ++j)
2008 {
2009 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
2010 &input[i * nPhys + j * m_nquad0 * m_nquad1],
2011 m_nquad0, m_Deriv1, m_nquad1, 0.0,
2012 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
2013 m_nquad0);
2014 }
2015
2016 // dEta 2
2017 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
2018 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
2019 m_nquad2, 0.0, &Diff[2][i * nPhys],
2020 m_nquad0 * m_nquad1);
2021
2022 // dxi0 = 2/(1-eta_2) d Eta_0
2023 Vmath::Vmul(nPhys, &m_fac0[0], 1, Diff[0].get() + cnt, 1,
2024 Diff[0].get() + cnt, 1);
2025
2026 // dxi1 = 2/(1-eta_2) d Eta_1
2027 Vmath::Vmul(nPhys, &m_fac0[0], 1, Diff[1].get() + cnt, 1,
2028 Diff[1].get() + cnt, 1);
2029
2030 // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
2031 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, Diff[0].get() + cnt, 1,
2032 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2033
2034 // dxi2 += (1+eta1)/(1-eta_2) d Eta_1
2035 Vmath::Vvtvp(nPhys, &m_fac2[0], 1, Diff[1].get() + cnt, 1,
2036 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2037 cnt += nPhys;
2038 }
2039
2040 // calculate full derivative
2041 if (m_isDeformed)
2042 {
2043 for (int i = 0; i < m_coordim; ++i)
2044 {
2045 Vmath::Vmul(ntot, m_derivFac[i * 3], 1, Diff[0], 1, out[i], 1);
2046 for (int j = 1; j < 3; ++j)
2047 {
2048 Vmath::Vvtvp(ntot, m_derivFac[i * 3 + j], 1, Diff[j], 1,
2049 out[i], 1, out[i], 1);
2050 }
2051 }
2052 }
2053 else
2054 {
2055 Array<OneD, NekDouble> t;
2056 for (int e = 0; e < m_numElmt; ++e)
2057 {
2058 for (int i = 0; i < m_coordim; ++i)
2059 {
2060 Vmath::Smul(m_nqe, m_derivFac[i * 3][e],
2061 Diff[0] + e * m_nqe, 1, t = out[i] + e * m_nqe,
2062 1);
2063
2064 for (int j = 1; j < 3; ++j)
2065 {
2066 Vmath::Svtvp(m_nqe, m_derivFac[i * 3 + j][e],
2067 Diff[j] + e * m_nqe, 1, out[i] + e * m_nqe,
2068 1, t = out[i] + e * m_nqe, 1);
2069 }
2070 }
2071 }
2072 }
2073 }
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, 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_Pyr::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 2075 of file PhysDeriv.cpp.

2078 {
2079 int nPhys = m_stdExp->GetTotPoints();
2080 int ntot = m_numElmt * nPhys;
2081 Array<OneD, NekDouble> tmp0, tmp1, tmp2;
2082 Array<OneD, Array<OneD, NekDouble>> Diff(3);
2083
2084 for (int i = 0; i < 3; ++i)
2085 {
2086 Diff[i] = wsp + i * ntot;
2087 }
2088
2089 // dEta0
2091 m_nquad0, 1.0, m_Deriv0, m_nquad0, &input[0], m_nquad0, 0.0,
2092 &Diff[0][0], m_nquad0);
2093
2094 int cnt = 0;
2095 for (int i = 0; i < m_numElmt; ++i)
2096 {
2097 // dEta 1
2098 for (int j = 0; j < m_nquad2; ++j)
2099 {
2100 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
2101 &input[i * nPhys + j * m_nquad0 * m_nquad1],
2102 m_nquad0, m_Deriv1, m_nquad1, 0.0,
2103 &Diff[1][i * nPhys + j * m_nquad0 * m_nquad1],
2104 m_nquad0);
2105 }
2106
2107 // dEta 2
2108 Blas::Dgemm('N', 'T', m_nquad0 * m_nquad1, m_nquad2, m_nquad2, 1.0,
2109 &input[i * nPhys], m_nquad0 * m_nquad1, m_Deriv2,
2110 m_nquad2, 0.0, &Diff[2][i * nPhys],
2111 m_nquad0 * m_nquad1);
2112
2113 // dxi0 = 2/(1-eta_2) d Eta_0
2114 Vmath::Vmul(nPhys, &m_fac0[0], 1, Diff[0].get() + cnt, 1,
2115 Diff[0].get() + cnt, 1);
2116
2117 // dxi1 = 2/(1-eta_2) d Eta_1
2118 Vmath::Vmul(nPhys, &m_fac0[0], 1, Diff[1].get() + cnt, 1,
2119 Diff[1].get() + cnt, 1);
2120
2121 // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
2122 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, Diff[0].get() + cnt, 1,
2123 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2124
2125 // dxi2 = (1+eta1)/(1-eta_2) d Eta_1 + d/dEta2;
2126 Vmath::Vvtvp(nPhys, &m_fac2[0], 1, Diff[1].get() + cnt, 1,
2127 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2128 cnt += nPhys;
2129 }
2130
2131 // calculate full derivative
2132 if (m_isDeformed)
2133 {
2134 // calculate full derivative
2135 Vmath::Vmul(ntot, m_derivFac[dir * 3], 1, Diff[0], 1, output, 1);
2136 for (int j = 1; j < 3; ++j)
2137 {
2138 Vmath::Vvtvp(ntot, m_derivFac[dir * 3 + j], 1, Diff[j], 1,
2139 output, 1, output, 1);
2140 }
2141 }
2142 else
2143 {
2144 Array<OneD, NekDouble> t;
2145 for (int e = 0; e < m_numElmt; ++e)
2146 {
2147 Vmath::Smul(m_nqe, m_derivFac[dir * 3][e], Diff[0] + e * m_nqe,
2148 1, t = output + e * m_nqe, 1);
2149
2150 for (int j = 1; j < 3; ++j)
2151 {
2152 Vmath::Svtvp(m_nqe, m_derivFac[dir * 3 + j][e],
2153 Diff[j] + e * m_nqe, 1, output + e * m_nqe, 1,
2154 t = output + e * m_nqe, 1);
2155 }
2156 }
2157 }
2158 }

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

Definition at line 2168 of file PhysDeriv.cpp.

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

◆ m_Deriv0

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

Definition at line 2172 of file PhysDeriv.cpp.

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

◆ m_Deriv1

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

Definition at line 2173 of file PhysDeriv.cpp.

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

◆ m_Deriv2

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

Definition at line 2174 of file PhysDeriv.cpp.

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

◆ m_derivFac

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

Definition at line 2167 of file PhysDeriv.cpp.

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

◆ m_fac0

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

Definition at line 2175 of file PhysDeriv.cpp.

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

◆ m_fac1

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

Definition at line 2176 of file PhysDeriv.cpp.

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

◆ m_fac2

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

Definition at line 2177 of file PhysDeriv.cpp.

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

◆ m_nquad0

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

Definition at line 2169 of file PhysDeriv.cpp.

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

◆ m_nquad1

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

Definition at line 2170 of file PhysDeriv.cpp.

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

◆ m_nquad2

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

Definition at line 2171 of file PhysDeriv.cpp.

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