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

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

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

Public Member Functions

 ~PhysDeriv_SumFac_Tri () 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
 
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_Tri (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 (Tri)

Definition at line 1040 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Tri()

Nektar::Collections::PhysDeriv_SumFac_Tri::~PhysDeriv_SumFac_Tri ( )
finaldefault

◆ PhysDeriv_SumFac_Tri()

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

Definition at line 1203 of file PhysDeriv.cpp.

1206 : Operator(pCollExp, pGeomData, factors), PhysDeriv_Helper(),
1207 m_nquad0(m_stdExp->GetNumPoints(0)),
1208 m_nquad1(m_stdExp->GetNumPoints(1))
1209 {
1210 m_coordim = pCollExp[0]->GetCoordim();
1211
1212 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1213
1214 const Array<OneD, const NekDouble> &z0 = m_stdExp->GetBasis(0)->GetZ();
1215 const Array<OneD, const NekDouble> &z1 = m_stdExp->GetBasis(1)->GetZ();
1216 m_fac0 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1);
1217 // set up geometric factor: 0.5*(1+z0)
1218 for (int i = 0; i < m_nquad0; ++i)
1219 {
1220 for (int j = 0; j < m_nquad1; ++j)
1221 {
1222 m_fac0[i + j * m_nquad0] = 0.5 * (1 + z0[i]);
1223 }
1224 }
1225
1226 m_fac1 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1);
1227 // set up geometric factor: 2/(1-z1)
1228 for (int i = 0; i < m_nquad0; ++i)
1229 {
1230 for (int j = 0; j < m_nquad1; ++j)
1231 {
1232 m_fac1[i + j * m_nquad0] = 2.0 / (1 - z1[j]);
1233 }
1234 }
1235
1236 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1237 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1239 }
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:1196
StdRegions::ConstFactorMap factors

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

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 1186 of file PhysDeriv.cpp.

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

References ASSERTL0.

◆ operator()() [1/2]

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

1053 {
1054 const int nqtot = m_nquad0 * m_nquad1;
1055 const int nqcol = nqtot * m_numElmt;
1056
1057 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
1058 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
1059
1060 Array<OneD, NekDouble> diff0(nqcol, wsp);
1061 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
1062
1063 // Tensor Product Derivative
1064 Blas::Dgemm('N', 'N', m_nquad0, m_nquad1 * m_numElmt, m_nquad0, 1.0,
1065 m_Deriv0, m_nquad0, input.get(), m_nquad0, 0.0, diff0.get(),
1066 m_nquad0);
1067
1068 int cnt = 0;
1069 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
1070 {
1071 // scale diff0 by geometric factor: 2/(1-z1)
1072 Vmath::Vmul(nqtot, &m_fac1[0], 1, diff0.get() + cnt, 1,
1073 diff0.get() + cnt, 1);
1074
1075 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1076 input.get() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
1077 diff1.get() + cnt, m_nquad0);
1078
1079 // add to diff1 by diff0 scaled by: (1_z0)/(1-z1)
1080 Vmath::Vvtvp(nqtot, m_fac0.get(), 1, diff0.get() + cnt, 1,
1081 diff1.get() + cnt, 1, diff1.get() + cnt, 1);
1082 }
1083
1084 if (m_isDeformed)
1085 {
1086 Vmath::Vmul(nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
1087 Vmath::Vvtvp(nqcol, m_derivFac[1], 1, diff1, 1, output0, 1, output0,
1088 1);
1089 Vmath::Vmul(nqcol, m_derivFac[2], 1, diff0, 1, output1, 1);
1090 Vmath::Vvtvp(nqcol, m_derivFac[3], 1, diff1, 1, output1, 1, output1,
1091 1);
1092
1093 if (m_coordim == 3)
1094 {
1095 Vmath::Vmul(nqcol, m_derivFac[4], 1, diff0, 1, output2, 1);
1096 Vmath::Vvtvp(nqcol, m_derivFac[5], 1, diff1, 1, output2, 1,
1097 output2, 1);
1098 }
1099 }
1100 else
1101 {
1102 Array<OneD, NekDouble> t;
1103 for (int e = 0; e < m_numElmt; ++e)
1104 {
1105 Vmath::Smul(m_nqe, m_derivFac[0][e], diff0 + e * m_nqe, 1,
1106 t = output0 + e * m_nqe, 1);
1107 Vmath::Svtvp(m_nqe, m_derivFac[1][e], diff1 + e * m_nqe, 1,
1108 output0 + e * m_nqe, 1, t = output0 + e * m_nqe,
1109 1);
1110
1111 Vmath::Smul(m_nqe, m_derivFac[2][e], diff0 + e * m_nqe, 1,
1112 t = output1 + e * m_nqe, 1);
1113 Vmath::Svtvp(m_nqe, m_derivFac[3][e], diff1 + e * m_nqe, 1,
1114 output1 + e * m_nqe, 1, t = output1 + e * m_nqe,
1115 1);
1116 }
1117
1118 if (m_coordim == 3)
1119 {
1120 for (int e = 0; e < m_numElmt; ++e)
1121 {
1122 Vmath::Smul(m_nqe, m_derivFac[4][e], diff0 + e * m_nqe, 1,
1123 t = output2 + e * m_nqe, 1);
1124 Vmath::Svtvp(m_nqe, m_derivFac[5][e], diff1 + e * m_nqe, 1,
1125 output2 + e * m_nqe, 1,
1126 t = output2 + e * m_nqe, 1);
1127 }
1128 }
1129 }
1130 }
#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, m_fac0, m_fac1, 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_Tri::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 1132 of file PhysDeriv.cpp.

1135 {
1136 const int nqtot = m_nquad0 * m_nquad1;
1137 const int nqcol = nqtot * m_numElmt;
1138
1139 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
1140 ASSERTL1(input.size() >= nqcol, "Incorrect input size");
1141
1142 Array<OneD, NekDouble> diff0(nqcol, wsp);
1143 Array<OneD, NekDouble> diff1(nqcol, wsp + nqcol);
1144
1145 // Tensor Product Derivative
1146 Blas::Dgemm('N', 'N', m_nquad0, m_nquad1 * m_numElmt, m_nquad0, 1.0,
1147 m_Deriv0, m_nquad0, input.get(), m_nquad0, 0.0, diff0.get(),
1148 m_nquad0);
1149
1150 int cnt = 0;
1151 for (int i = 0; i < m_numElmt; ++i, cnt += nqtot)
1152 {
1153 // scale diff0 by geometric factor: 2/(1-z1)
1154 Vmath::Vmul(nqtot, &m_fac1[0], 1, diff0.get() + cnt, 1,
1155 diff0.get() + cnt, 1);
1156
1157 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1158 input.get() + cnt, m_nquad0, m_Deriv1, m_nquad1, 0.0,
1159 diff1.get() + cnt, m_nquad0);
1160
1161 // add to diff1 by diff0 scaled by: (1_z0)/(1-z1)
1162 Vmath::Vvtvp(nqtot, m_fac0.get(), 1, diff0.get() + cnt, 1,
1163 diff1.get() + cnt, 1, diff1.get() + cnt, 1);
1164 }
1165
1166 if (m_isDeformed)
1167 {
1168 Vmath::Vmul(nqcol, m_derivFac[2 * dir], 1, diff0, 1, output, 1);
1169 Vmath::Vvtvp(nqcol, m_derivFac[2 * dir + 1], 1, diff1, 1, output, 1,
1170 output, 1);
1171 }
1172 else
1173 {
1174 Array<OneD, NekDouble> t;
1175 for (int e = 0; e < m_numElmt; ++e)
1176 {
1177 Vmath::Smul(m_nqe, m_derivFac[2 * dir][e], diff0 + e * m_nqe, 1,
1178 t = output + e * m_nqe, 1);
1179 Vmath::Svtvp(m_nqe, m_derivFac[2 * dir + 1][e],
1180 diff1 + e * m_nqe, 1, output + e * m_nqe, 1,
1181 t = output + e * m_nqe, 1);
1182 }
1183 }
1184 }

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

Definition at line 1193 of file PhysDeriv.cpp.

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

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tri::m_Deriv0
protected

Definition at line 1197 of file PhysDeriv.cpp.

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

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tri::m_Deriv1
protected

Definition at line 1198 of file PhysDeriv.cpp.

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

◆ m_derivFac

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

Definition at line 1196 of file PhysDeriv.cpp.

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

◆ m_fac0

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

Definition at line 1199 of file PhysDeriv.cpp.

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

◆ m_fac1

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

Definition at line 1200 of file PhysDeriv.cpp.

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

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Tri::m_nquad0
protected

Definition at line 1194 of file PhysDeriv.cpp.

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

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Tri::m_nquad1
protected

Definition at line 1195 of file PhysDeriv.cpp.

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