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

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

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

Public Member Functions

 ~PhysDeriv_SumFac_Quad () 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
 
- 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 UpdateFactors (StdRegions::FactorMap factors)
 Update the supplied factor map. More...
 
virtual COLLECTIONS_EXPORT void UpdateVarcoeffs (StdRegions::VarCoeffMap &varcoeffs)
 Update the supplied variable coefficients. 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 (bool defaultIn=true)
 
unsigned int GetOutputSize (bool defaultOut=true)
 

Protected Attributes

int m_coordim
 
const int m_nquad0
 
const int m_nquad1
 
Array< TwoD, const NekDoublem_derivFac
 
NekDoublem_Deriv0
 
NekDoublem_Deriv1
 
- 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...
 
unsigned int m_inputSizeOther
 Number of modes or quadrature points, opposite to m_inputSize. More...
 
unsigned int m_outputSizeOther
 Number of modes or quadrature points, opposite to m_outputSize. More...
 

Private Member Functions

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

Additional Inherited Members

- Protected Member Functions inherited from Nektar::Collections::PhysDeriv_Helper
 PhysDeriv_Helper ()
 

Detailed Description

Phys deriv operator using sum-factorisation (Quad)

Definition at line 841 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Quad()

Nektar::Collections::PhysDeriv_SumFac_Quad::~PhysDeriv_SumFac_Quad ( )
finaldefault

◆ PhysDeriv_SumFac_Quad()

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

Definition at line 978 of file PhysDeriv.cpp.

981 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
982 m_nquad0(m_stdExp->GetNumPoints(0)),
983 m_nquad1(m_stdExp->GetNumPoints(1))
984 {
985 m_coordim = pCollExp[0]->GetCoordim();
986
987 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
988
989 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
990 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
992 }
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:217
unsigned int m_numElmt
number of elements that the operator is applied on
Definition: Operator.h:219
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:973
StdRegions::ConstFactorMap factors

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

Member Function Documentation

◆ operator()() [1/2]

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

854 {
855 const int nqtot = m_nquad0 * m_nquad1;
856 const int nqcol = nqtot * m_numElmt;
857
858 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
859 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
860
861 Array<OneD, NekDouble> diff0(nqcol, wsp);
862 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
863
865 m_Deriv0, m_nquad0, input.get(), m_nquad0, 0.0, diff0.get(),
866 m_nquad0);
867
868 int cnt = 0;
869 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
870 {
871 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
872 input.get() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
873 diff1.get() + cnt, m_nquad0);
874 }
875
876 if (m_isDeformed)
877 {
878 Vmath::Vmul(nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
879 Vmath::Vvtvp(nqcol, m_derivFac[1], 1, diff1, 1, output0, 1, output0,
880 1);
881 Vmath::Vmul(nqcol, m_derivFac[2], 1, diff0, 1, output1, 1);
882 Vmath::Vvtvp(nqcol, m_derivFac[3], 1, diff1, 1, output1, 1, output1,
883 1);
884
885 if (m_coordim == 3)
886 {
887 Vmath::Vmul(nqcol, m_derivFac[4], 1, diff0, 1, output2, 1);
888 Vmath::Vvtvp(nqcol, m_derivFac[5], 1, diff1, 1, output2, 1,
889 output2, 1);
890 }
891 }
892 else
893 {
894 Array<OneD, NekDouble> t;
895 for (int e = 0; e < m_numElmt; ++e)
896 {
897 Vmath::Smul(m_nqe, m_derivFac[0][e], diff0 + e * m_nqe, 1,
898 t = output0 + e * m_nqe, 1);
899 Vmath::Svtvp(m_nqe, m_derivFac[1][e], diff1 + e * m_nqe, 1,
900 output0 + e * m_nqe, 1, t = output0 + e * m_nqe,
901 1);
902
903 Vmath::Smul(m_nqe, m_derivFac[2][e], diff0 + e * m_nqe, 1,
904 t = output1 + e * m_nqe, 1);
905 Vmath::Svtvp(m_nqe, m_derivFac[3][e], diff1 + e * m_nqe, 1,
906 output1 + e * m_nqe, 1, t = output1 + e * m_nqe,
907 1);
908 }
909
910 if (m_coordim == 3)
911 {
912 for (int e = 0; e < m_numElmt; ++e)
913 {
914 Vmath::Smul(m_nqe, m_derivFac[4][e], diff0 + e * m_nqe, 1,
915 t = output2 + e * m_nqe, 1);
916 Vmath::Svtvp(m_nqe, m_derivFac[5][e], diff1 + e * m_nqe, 1,
917 output2 + e * m_nqe, 1,
918 t = output2 + e * m_nqe, 1);
919 }
920 }
921 }
922 }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:242
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 ASSERTL1, Blas::Dgemm(), m_coordim, m_Deriv0, m_Deriv1, m_derivFac, Nektar::Collections::Operator::m_isDeformed, Nektar::Collections::Operator::m_nqe, m_nquad0, m_nquad1, Nektar::Collections::Operator::m_numElmt, Nektar::Collections::Operator::m_wspSize, Vmath::Smul(), Vmath::Svtvp(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ operator()() [2/2]

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

927 {
928 const int nqtot = m_nquad0 * m_nquad1;
929 const int nqcol = nqtot * m_numElmt;
930
931 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
932 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
933
934 Array<OneD, NekDouble> diff0(nqcol, wsp);
935 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
936
938 m_Deriv0, m_nquad0, input.get(), m_nquad0, 0.0, diff0.get(),
939 m_nquad0);
940
941 int cnt = 0;
942 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
943 {
944 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
945 input.get() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
946 diff1.get() + cnt, m_nquad0);
947 }
948
949 if (m_isDeformed)
950 {
951 Vmath::Vmul(nqcol, m_derivFac[2 * dir], 1, diff0, 1, output, 1);
952 Vmath::Vvtvp(nqcol, m_derivFac[2 * dir + 1], 1, diff1, 1, output, 1,
953 output, 1);
954 }
955 else
956 {
957 Array<OneD, NekDouble> t;
958 for (int e = 0; e < m_numElmt; ++e)
959 {
960 Vmath::Smul(m_nqe, m_derivFac[2 * dir][e], diff0 + e * m_nqe, 1,
961 t = output + e * m_nqe, 1);
962 Vmath::Svtvp(m_nqe, m_derivFac[2 * dir + 1][e],
963 diff1 + e * m_nqe, 1, output + e * m_nqe, 1,
964 t = output + e * m_nqe, 1);
965 }
966 }
967 }

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

Member Data Documentation

◆ m_coordim

int Nektar::Collections::PhysDeriv_SumFac_Quad::m_coordim
protected

Definition at line 970 of file PhysDeriv.cpp.

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

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Quad::m_Deriv0
protected

Definition at line 974 of file PhysDeriv.cpp.

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

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Quad::m_Deriv1
protected

Definition at line 975 of file PhysDeriv.cpp.

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

◆ m_derivFac

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

Definition at line 973 of file PhysDeriv.cpp.

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

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Quad::m_nquad0
protected

Definition at line 971 of file PhysDeriv.cpp.

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

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Quad::m_nquad1
protected

Definition at line 972 of file PhysDeriv.cpp.

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