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

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...
 

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::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 (Quad)

Definition at line 871 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 1014 of file PhysDeriv.cpp.

1017 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
1018 m_nquad0(m_stdExp->GetNumPoints(0)),
1019 m_nquad1(m_stdExp->GetNumPoints(1))
1020 {
1021 m_coordim = pCollExp[0]->GetCoordim();
1022
1023 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1024
1025 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1026 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1028 }
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:1009
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

◆ CheckFactors()

void Nektar::Collections::PhysDeriv_SumFac_Quad::CheckFactors ( StdRegions::FactorMap  factors,
int  coll_phys_offset 
)
inlineoverridevirtual

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 999 of file PhysDeriv.cpp.

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

References ASSERTL0.

◆ 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 879 of file PhysDeriv.cpp.

884 {
885 const int nqtot = m_nquad0 * m_nquad1;
886 const int nqcol = nqtot * m_numElmt;
887
888 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
889 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
890
891 Array<OneD, NekDouble> diff0(nqcol, wsp);
892 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
893
895 m_Deriv0, m_nquad0, input.get(), m_nquad0, 0.0, diff0.get(),
896 m_nquad0);
897
898 int cnt = 0;
899 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
900 {
901 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
902 input.get() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
903 diff1.get() + cnt, m_nquad0);
904 }
905
906 if (m_isDeformed)
907 {
908 Vmath::Vmul(nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
909 Vmath::Vvtvp(nqcol, m_derivFac[1], 1, diff1, 1, output0, 1, output0,
910 1);
911 Vmath::Vmul(nqcol, m_derivFac[2], 1, diff0, 1, output1, 1);
912 Vmath::Vvtvp(nqcol, m_derivFac[3], 1, diff1, 1, output1, 1, output1,
913 1);
914
915 if (m_coordim == 3)
916 {
917 Vmath::Vmul(nqcol, m_derivFac[4], 1, diff0, 1, output2, 1);
918 Vmath::Vvtvp(nqcol, m_derivFac[5], 1, diff1, 1, output2, 1,
919 output2, 1);
920 }
921 }
922 else
923 {
924 Array<OneD, NekDouble> t;
925 for (int e = 0; e < m_numElmt; ++e)
926 {
927 Vmath::Smul(m_nqe, m_derivFac[0][e], diff0 + e * m_nqe, 1,
928 t = output0 + e * m_nqe, 1);
929 Vmath::Svtvp(m_nqe, m_derivFac[1][e], diff1 + e * m_nqe, 1,
930 output0 + e * m_nqe, 1, t = output0 + e * m_nqe,
931 1);
932
933 Vmath::Smul(m_nqe, m_derivFac[2][e], diff0 + e * m_nqe, 1,
934 t = output1 + e * m_nqe, 1);
935 Vmath::Svtvp(m_nqe, m_derivFac[3][e], diff1 + e * m_nqe, 1,
936 output1 + e * m_nqe, 1, t = output1 + e * m_nqe,
937 1);
938 }
939
940 if (m_coordim == 3)
941 {
942 for (int e = 0; e < m_numElmt; ++e)
943 {
944 Vmath::Smul(m_nqe, m_derivFac[4][e], diff0 + e * m_nqe, 1,
945 t = output2 + e * m_nqe, 1);
946 Vmath::Svtvp(m_nqe, m_derivFac[5][e], diff1 + e * m_nqe, 1,
947 output2 + e * m_nqe, 1,
948 t = output2 + e * m_nqe, 1);
949 }
950 }
951 }
952 }
#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 954 of file PhysDeriv.cpp.

957 {
958 const int nqtot = m_nquad0 * m_nquad1;
959 const int nqcol = nqtot * m_numElmt;
960
961 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
962 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
963
964 Array<OneD, NekDouble> diff0(nqcol, wsp);
965 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
966
968 m_Deriv0, m_nquad0, input.get(), m_nquad0, 0.0, diff0.get(),
969 m_nquad0);
970
971 int cnt = 0;
972 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
973 {
974 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
975 input.get() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
976 diff1.get() + cnt, m_nquad0);
977 }
978
979 if (m_isDeformed)
980 {
981 Vmath::Vmul(nqcol, m_derivFac[2 * dir], 1, diff0, 1, output, 1);
982 Vmath::Vvtvp(nqcol, m_derivFac[2 * dir + 1], 1, diff1, 1, output, 1,
983 output, 1);
984 }
985 else
986 {
987 Array<OneD, NekDouble> t;
988 for (int e = 0; e < m_numElmt; ++e)
989 {
990 Vmath::Smul(m_nqe, m_derivFac[2 * dir][e], diff0 + e * m_nqe, 1,
991 t = output + e * m_nqe, 1);
992 Vmath::Svtvp(m_nqe, m_derivFac[2 * dir + 1][e],
993 diff1 + e * m_nqe, 1, output + e * m_nqe, 1,
994 t = output + e * m_nqe, 1);
995 }
996 }
997 }

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 1006 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 1010 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 1011 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 1009 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 1007 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 1008 of file PhysDeriv.cpp.

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