Nektar++
Loading...
Searching...
No Matches
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.
 
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< LocalRegions::ExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData, StdRegions::FactorMap factors)
 Constructor.
 
virtual ~Operator ()=default
 
virtual COLLECTIONS_EXPORT void UpdateFactors (StdRegions::FactorMap factors)
 Update the supplied factor map.
 
virtual COLLECTIONS_EXPORT void UpdateVarcoeffs (StdRegions::VarCoeffMap &varcoeffs)
 Update the supplied variable coefficients.
 
unsigned int GetWspSize ()
 Get the size of the required workspace.
 
unsigned int GetNumElmt ()
 Get number of elements.
 
StdRegions::StdExpansionSharedPtr GetExpSharedPtr ()
 Get expansion pointer.
 
unsigned int GetInputSize (void)
 
unsigned int GetOutputSize (void)
 
unsigned int GetPhysSize (void)
 
unsigned int GetCoeffSize (void)
 

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
 
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
 
unsigned int m_outputSize
 number of modes or quadrature points that are taken as output from an operator
 

Private Member Functions

 PhysDeriv_SumFac_Quad (vector< LocalRegions::ExpansionSharedPtr > 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 828 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< LocalRegions::ExpansionSharedPtr pCollExp,
CoalescedGeomDataSharedPtr  pGeomData,
StdRegions::FactorMap  factors 
)
inlineprivate

Definition at line 965 of file PhysDeriv.cpp.

968 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
969 m_nquad0(m_stdExp->GetNumPoints(0)),
970 m_nquad1(m_stdExp->GetNumPoints(1))
971 {
972 m_coordim = pCollExp[0]->GetCoordim();
973
974 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
975
976 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
977 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
979 }
StdRegions::StdExpansionSharedPtr m_stdExp
Definition Operator.h:230
unsigned int m_numElmt
number of elements that the operator is applied on
Definition Operator.h:232
Operator(std::vector< LocalRegions::ExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData, StdRegions::FactorMap factors)
Constructor.
Definition Operator.cpp:66
Array< TwoD, const NekDouble > m_derivFac

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

841 {
842 const int nqtot = m_nquad0 * m_nquad1;
843 const int nqcol = nqtot * m_numElmt;
844
845 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
846 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
847
848 Array<OneD, NekDouble> diff0(nqcol, wsp);
849 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
850
852 m_Deriv0, m_nquad0, input.data(), m_nquad0, 0.0,
853 diff0.data(), m_nquad0);
854
855 int cnt = 0;
856 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
857 {
858 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
859 input.data() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
860 diff1.data() + cnt, m_nquad0);
861 }
862
863 if (m_isDeformed)
864 {
865 Vmath::Vmul(nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
866 Vmath::Vvtvp(nqcol, m_derivFac[1], 1, diff1, 1, output0, 1, output0,
867 1);
868 Vmath::Vmul(nqcol, m_derivFac[2], 1, diff0, 1, output1, 1);
869 Vmath::Vvtvp(nqcol, m_derivFac[3], 1, diff1, 1, output1, 1, output1,
870 1);
871
872 if (m_coordim == 3)
873 {
874 Vmath::Vmul(nqcol, m_derivFac[4], 1, diff0, 1, output2, 1);
875 Vmath::Vvtvp(nqcol, m_derivFac[5], 1, diff1, 1, output2, 1,
876 output2, 1);
877 }
878 }
879 else
880 {
881 Array<OneD, NekDouble> t;
882 for (int e = 0; e < m_numElmt; ++e)
883 {
884 Vmath::Smul(m_nqe, m_derivFac[0][e], diff0 + e * m_nqe, 1,
885 t = output0 + e * m_nqe, 1);
886 Vmath::Svtvp(m_nqe, m_derivFac[1][e], diff1 + e * m_nqe, 1,
887 output0 + e * m_nqe, 1, t = output0 + e * m_nqe,
888 1);
889
890 Vmath::Smul(m_nqe, m_derivFac[2][e], diff0 + e * m_nqe, 1,
891 t = output1 + e * m_nqe, 1);
892 Vmath::Svtvp(m_nqe, m_derivFac[3][e], diff1 + e * m_nqe, 1,
893 output1 + e * m_nqe, 1, t = output1 + e * m_nqe,
894 1);
895 }
896
897 if (m_coordim == 3)
898 {
899 for (int e = 0; e < m_numElmt; ++e)
900 {
901 Vmath::Smul(m_nqe, m_derivFac[4][e], diff0 + e * m_nqe, 1,
902 t = output2 + e * m_nqe, 1);
903 Vmath::Svtvp(m_nqe, m_derivFac[5][e], diff1 + e * m_nqe, 1,
904 output2 + e * m_nqe, 1,
905 t = output2 + e * m_nqe, 1);
906 }
907 }
908 }
909 }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
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:324
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 911 of file PhysDeriv.cpp.

914 {
915 const int nqtot = m_nquad0 * m_nquad1;
916 const int nqcol = nqtot * m_numElmt;
917
918 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
919 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
920
921 Array<OneD, NekDouble> diff0(nqcol, wsp);
922 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
923
925 m_Deriv0, m_nquad0, input.data(), m_nquad0, 0.0,
926 diff0.data(), m_nquad0);
927
928 int cnt = 0;
929 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
930 {
931 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
932 input.data() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
933 diff1.data() + cnt, m_nquad0);
934 }
935
936 if (m_isDeformed)
937 {
938 Vmath::Vmul(nqcol, m_derivFac[2 * dir], 1, diff0, 1, output, 1);
939 Vmath::Vvtvp(nqcol, m_derivFac[2 * dir + 1], 1, diff1, 1, output, 1,
940 output, 1);
941 }
942 else
943 {
944 Array<OneD, NekDouble> t;
945 for (int e = 0; e < m_numElmt; ++e)
946 {
947 Vmath::Smul(m_nqe, m_derivFac[2 * dir][e], diff0 + e * m_nqe, 1,
948 t = output + e * m_nqe, 1);
949 Vmath::Svtvp(m_nqe, m_derivFac[2 * dir + 1][e],
950 diff1 + e * m_nqe, 1, output + e * m_nqe, 1,
951 t = output + e * m_nqe, 1);
952 }
953 }
954 }

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 957 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 961 of file PhysDeriv.cpp.

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

◆ m_Deriv1

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

Definition at line 962 of file PhysDeriv.cpp.

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

◆ m_derivFac

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

Definition at line 960 of file PhysDeriv.cpp.

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

◆ m_nquad0

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

Definition at line 958 of file PhysDeriv.cpp.

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

◆ m_nquad1

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

Definition at line 959 of file PhysDeriv.cpp.

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