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

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

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

Public Member Functions

virtual ~PhysDeriv_SumFac_Tet ()
 
virtual void operator() (const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
 Perform operation. More...
 
virtual void operator() (int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
 
- Public Member Functions inherited from Nektar::Collections::Operator
 Operator (std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData)
 Constructor. More...
 
virtual COLLECTIONS_EXPORT ~Operator ()
 
int GetWspSize ()
 Get the size of the required workspace. More...
 

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
 
Array< OneD, NekDoublem_fac3
 
- Protected Attributes inherited from Nektar::Collections::Operator
StdRegions::StdExpansionSharedPtr m_stdExp
 
unsigned int m_numElmt
 
unsigned int m_wspSize
 

Private Member Functions

 PhysDeriv_SumFac_Tet (vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
 

Detailed Description

Phys deriv operator using sum-factorisation (Tet)

Definition at line 1078 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Tet()

virtual Nektar::Collections::PhysDeriv_SumFac_Tet::~PhysDeriv_SumFac_Tet ( )
inlinevirtual

Definition at line 1083 of file PhysDeriv.cpp.

1084  {
1085  }

◆ PhysDeriv_SumFac_Tet()

Nektar::Collections::PhysDeriv_SumFac_Tet::PhysDeriv_SumFac_Tet ( vector< StdRegions::StdExpansionSharedPtr pCollExp,
CoalescedGeomDataSharedPtr  pGeomData 
)
inlineprivate

Definition at line 1272 of file PhysDeriv.cpp.

References Nektar::Collections::ePhysDeriv, Nektar::Collections::eSumFac, Nektar::LibUtilities::eTetrahedron, Nektar::Collections::GetOperatorFactory(), and Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::RegisterCreatorFunction().

1275  : Operator(pCollExp, pGeomData),
1276  m_nquad0 (m_stdExp->GetNumPoints(0)),
1277  m_nquad1 (m_stdExp->GetNumPoints(1)),
1278  m_nquad2 (m_stdExp->GetNumPoints(2))
1279  {
1280  LibUtilities::PointsKeyVector PtsKey = m_stdExp->GetPointsKeys();
1281 
1282  m_coordim = pCollExp[0]->GetCoordim();
1283 
1284  m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1285 
1286  m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1287  m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1288  m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1289 
1291 
1292  const Array<OneD, const NekDouble>& z0
1293  = m_stdExp->GetBasis(0)->GetZ();
1294  const Array<OneD, const NekDouble>& z1
1295  = m_stdExp->GetBasis(1)->GetZ();
1296  const Array<OneD, const NekDouble>& z2
1297  = m_stdExp->GetBasis(2)->GetZ();
1298 
1299  m_fac0 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1300  m_fac1 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1301  m_fac2 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1302  m_fac3 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1303  // calculate 2.0/((1-eta_1)(1-eta_2))
1304  for (int i = 0; i < m_nquad0; ++i)
1305  {
1306  for(int j = 0; j < m_nquad1; ++j)
1307  {
1308  for(int k = 0; k < m_nquad2; ++k)
1309  {
1310 
1311  m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1312  = 4.0/((1-z1[j])*(1-z2[k]));
1313  m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1314  = 2.0*(1+z0[i])/((1-z1[j])*(1-z2[k]));
1315  m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1316  = 2.0/(1-z2[k]);
1317  m_fac3[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1318  = (1+z1[j])/(1-z2[k]);
1319  }
1320  }
1321  }
1322 
1323  }
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:246
Operator(std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData)
Constructor.
Definition: Operator.h:113
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:148
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1258

Member Function Documentation

◆ operator()() [1/2]

virtual void Nektar::Collections::PhysDeriv_SumFac_Tet::operator() ( const Array< OneD, const NekDouble > &  input,
Array< OneD, NekDouble > &  output0,
Array< OneD, NekDouble > &  output1,
Array< OneD, NekDouble > &  output2,
Array< OneD, NekDouble > &  wsp 
)
inlinevirtual

Perform operation.

Implements Nektar::Collections::Operator.

Definition at line 1087 of file PhysDeriv.cpp.

References Blas::Dgemm(), Vmath::Vmul(), and Vmath::Vvtvp().

1093  {
1094  int nPhys = m_stdExp->GetTotPoints();
1095  int ntot = m_numElmt*nPhys;
1096  Array<OneD, NekDouble> tmp0,tmp1,tmp2;
1097  Array<OneD, Array<OneD, NekDouble> > Diff(3);
1098  Array<OneD, Array<OneD, NekDouble> > out(3);
1099  out[0] = output0; out[1] = output1; out[2] = output2;
1100 
1101  for(int i = 0; i < 3; ++i)
1102  {
1103  Diff[i] = wsp + i*ntot;
1104  }
1105 
1106  // dEta0
1108  m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1109  m_nquad0,0.0,&Diff[0][0],m_nquad0);
1110 
1111  // dEta2
1112  for(int i = 0; i < m_numElmt; ++i)
1113  {
1115  1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1116  m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1117  m_nquad0*m_nquad1);
1118  }
1119 
1120  for(int i = 0; i < m_numElmt; ++i)
1121  {
1122 
1123  // dEta1
1124  for (int j = 0; j < m_nquad2; ++j)
1125  {
1126  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1,
1127  1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1128  m_nquad0, m_Deriv1, m_nquad1, 0.0,
1129  &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1130  m_nquad0);
1131  }
1132 
1133  // dxi2 = (1 + eta_1)/(1 -eta_2)*dEta1 + dEta2
1134  Vmath::Vvtvp(nPhys, m_fac3.get(), 1,
1135  Diff[1].get() + i*nPhys, 1,
1136  Diff[2].get() + i*nPhys, 1,
1137  Diff[2].get() + i*nPhys, 1);
1138 
1139  // dxi1 = 2/(1 - eta_2) dEta1
1140  Vmath::Vmul(nPhys, m_fac2.get(), 1,
1141  Diff[1].get() + i*nPhys, 1,
1142  Diff[1].get() + i*nPhys, 1);
1143 
1144  // dxi1 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi1
1145  Vmath::Vvtvp(nPhys, m_fac1.get(), 1,
1146  Diff[0].get() + i*nPhys, 1,
1147  Diff[1].get() + i*nPhys, 1,
1148  Diff[1].get() + i*nPhys, 1);
1149 
1150  // dxi2 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi2
1151  Vmath::Vvtvp(nPhys, m_fac1.get(), 1,
1152  Diff[0].get() + i*nPhys, 1,
1153  Diff[2].get() + i*nPhys, 1,
1154  Diff[2].get() + i*nPhys, 1);
1155 
1156  // dxi0 = 4.0/((1-eta_1)(1-eta_2)) dEta0
1157  Vmath::Vmul(nPhys, m_fac0.get(), 1,
1158  Diff[0].get() + i*nPhys, 1,
1159  Diff[0].get() + i*nPhys, 1);
1160 
1161  }
1162 
1163  // calculate full derivative
1164  for(int i = 0; i < m_coordim; ++i)
1165  {
1166  Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
1167  for(int j = 1; j < 3; ++j)
1168  {
1169  Vmath::Vvtvp (ntot, m_derivFac[i*3+j], 1,
1170  Diff[j], 1, out[i], 1, out[i], 1);
1171  }
1172  }
1173  }
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.cpp:445
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 A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:148
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1258
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.cpp:186

◆ operator()() [2/2]

virtual void Nektar::Collections::PhysDeriv_SumFac_Tet::operator() ( int  dir,
const Array< OneD, const NekDouble > &  input,
Array< OneD, NekDouble > &  output,
Array< OneD, NekDouble > &  wsp 
)
inlinevirtual

Implements Nektar::Collections::Operator.

Definition at line 1175 of file PhysDeriv.cpp.

References Blas::Dgemm(), Vmath::Vmul(), and Vmath::Vvtvp().

1180  {
1181  int nPhys = m_stdExp->GetTotPoints();
1182  int ntot = m_numElmt*nPhys;
1183  Array<OneD, NekDouble> tmp0,tmp1,tmp2;
1184  Array<OneD, Array<OneD, NekDouble> > Diff(3);
1185 
1186  for(int i = 0; i < 3; ++i)
1187  {
1188  Diff[i] = wsp + i*ntot;
1189  }
1190 
1191  // dEta0
1193  m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1194  m_nquad0,0.0,&Diff[0][0],m_nquad0);
1195 
1196  // dEta2
1197  for(int i = 0; i < m_numElmt; ++i)
1198  {
1200  1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1201  m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1202  m_nquad0*m_nquad1);
1203  }
1204 
1205  for(int i = 0; i < m_numElmt; ++i)
1206  {
1207 
1208  // dEta1
1209  for (int j = 0; j < m_nquad2; ++j)
1210  {
1211  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1,
1212  1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1213  m_nquad0, m_Deriv1, m_nquad1, 0.0,
1214  &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1215  m_nquad0);
1216  }
1217 
1218  // dxi2 = (1 + eta_1)/(1 -eta_2)*dEta1 + dEta2
1219  Vmath::Vvtvp(nPhys, m_fac3.get(), 1,
1220  Diff[1].get() + i*nPhys, 1,
1221  Diff[2].get() + i*nPhys, 1,
1222  Diff[2].get() + i*nPhys, 1);
1223 
1224  // dxi1 = 2/(1 - eta_2) dEta1
1225  Vmath::Vmul(nPhys, m_fac2.get(), 1,
1226  Diff[1].get() + i*nPhys, 1,
1227  Diff[1].get() + i*nPhys, 1);
1228 
1229  // dxi1 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi1
1230  Vmath::Vvtvp(nPhys, m_fac1.get(), 1,
1231  Diff[0].get() + i*nPhys, 1,
1232  Diff[1].get() + i*nPhys, 1,
1233  Diff[1].get() + i*nPhys, 1);
1234 
1235  // dxi2 = 2.0(1+eta_0)/((1-eta_1)(1-eta_2)) dEta0 + dxi2
1236  Vmath::Vvtvp(nPhys, m_fac1.get(), 1,
1237  Diff[0].get() + i*nPhys, 1,
1238  Diff[2].get() + i*nPhys, 1,
1239  Diff[2].get() + i*nPhys, 1);
1240 
1241  // dxi0 = 4.0/((1-eta_1)(1-eta_2)) dEta0
1242  Vmath::Vmul(nPhys, m_fac0.get(), 1,
1243  Diff[0].get() + i*nPhys, 1,
1244  Diff[0].get() + i*nPhys, 1);
1245 
1246  }
1247 
1248  // calculate full derivative
1249  Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
1250  for(int j = 1; j < 3; ++j)
1251  {
1252  Vmath::Vvtvp (ntot, m_derivFac[dir*3+j], 1,
1253  Diff[j], 1, output, 1, output, 1);
1254  }
1255  }
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.cpp:445
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 A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:148
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:1258
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.cpp:186

Member Data Documentation

◆ m_coordim

int Nektar::Collections::PhysDeriv_SumFac_Tet::m_coordim
protected

Definition at line 1259 of file PhysDeriv.cpp.

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tet::m_Deriv0
protected

Definition at line 1263 of file PhysDeriv.cpp.

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tet::m_Deriv1
protected

Definition at line 1264 of file PhysDeriv.cpp.

◆ m_Deriv2

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Tet::m_Deriv2
protected

Definition at line 1265 of file PhysDeriv.cpp.

◆ m_derivFac

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

Definition at line 1258 of file PhysDeriv.cpp.

◆ m_fac0

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

Definition at line 1266 of file PhysDeriv.cpp.

◆ m_fac1

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

Definition at line 1267 of file PhysDeriv.cpp.

◆ m_fac2

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

Definition at line 1268 of file PhysDeriv.cpp.

◆ m_fac3

Array<OneD, NekDouble> Nektar::Collections::PhysDeriv_SumFac_Tet::m_fac3
protected

Definition at line 1269 of file PhysDeriv.cpp.

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Tet::m_nquad0
protected

Definition at line 1260 of file PhysDeriv.cpp.

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Tet::m_nquad1
protected

Definition at line 1261 of file PhysDeriv.cpp.

◆ m_nquad2

const int Nektar::Collections::PhysDeriv_SumFac_Tet::m_nquad2
protected

Definition at line 1262 of file PhysDeriv.cpp.