Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Public Member Functions | Protected Attributes | Private Member Functions | List of all members
Nektar::Collections::IProductWRTDerivBase_SumFac_Tet Class Reference

Inner product WRT deriv base operator using sum-factorisation (Tet) More...

Inheritance diagram for Nektar::Collections::IProductWRTDerivBase_SumFac_Tet:
Inheritance graph
[legend]
Collaboration diagram for Nektar::Collections::IProductWRTDerivBase_SumFac_Tet:
Collaboration graph
[legend]

Public Member Functions

virtual void operator() (const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, 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, boost::shared_ptr< CoalescedGeomData > GeomData)
 Constructor. More...
 
virtual COLLECTIONS_EXPORT ~Operator ()
 
int GetWspSize ()
 Get the size of the required workspace. More...
 

Protected Attributes

const int m_nquad0
 
const int m_nquad1
 
const int m_nquad2
 
const int m_nmodes0
 
const int m_nmodes1
 
const int m_nmodes2
 
Array< OneD, const NekDoublem_jac
 
Array< OneD, const NekDoublem_base0
 
Array< OneD, const NekDoublem_base1
 
Array< OneD, const NekDoublem_base2
 
Array< OneD, const NekDoublem_derbase0
 
Array< OneD, const NekDoublem_derbase1
 
Array< OneD, const NekDoublem_derbase2
 
Array< TwoD, const NekDoublem_derivFac
 
Array< OneD, NekDoublem_fac0
 
Array< OneD, NekDoublem_fac1
 
Array< OneD, NekDoublem_fac2
 
Array< OneD, NekDoublem_fac3
 
bool m_sortTopEdge
 
- Protected Attributes inherited from Nektar::Collections::Operator
StdRegions::StdExpansionSharedPtr m_stdExp
 
unsigned int m_numElmt
 
unsigned int m_wspSize
 

Private Member Functions

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

Detailed Description

Inner product WRT deriv base operator using sum-factorisation (Tet)

Definition at line 1015 of file IProductWRTDerivBase.cpp.

Constructor & Destructor Documentation

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

Definition at line 1174 of file IProductWRTDerivBase.cpp.

References Nektar::LibUtilities::eModified_A.

1177  : Operator (pCollExp, pGeomData),
1178  m_nquad0 (m_stdExp->GetNumPoints(0)),
1179  m_nquad1 (m_stdExp->GetNumPoints(1)),
1180  m_nquad2 (m_stdExp->GetNumPoints(2)),
1181  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1182  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1183  m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1184  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1185  m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1186  m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1187  m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1188  m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1189  m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1190 
1191  {
1192  m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
1195  m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1196 
1197 
1198  const Array<OneD, const NekDouble>& z0
1199  = m_stdExp->GetBasis(0)->GetZ();
1200  const Array<OneD, const NekDouble>& z1
1201  = m_stdExp->GetBasis(1)->GetZ();
1202  const Array<OneD, const NekDouble>& z2
1203  = m_stdExp->GetBasis(2)->GetZ();
1204 
1205  m_fac0 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1206  m_fac1 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1207  m_fac2 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1208  m_fac3 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
1209  // calculate 2.0/((1-eta_1)(1-eta_2))
1210  for (int i = 0; i < m_nquad0; ++i)
1211  {
1212  for(int j = 0; j < m_nquad1; ++j)
1213  {
1214  for(int k = 0; k < m_nquad2; ++k)
1215  {
1216 
1217  m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1218  = 4.0/((1-z1[j])*(1-z2[k]));
1219  m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1220  = (1+z0[i])*0.5;
1221  m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1222  = 2.0/(1-z2[k]);
1223  m_fac3[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1224  = (1+z1[j])*0.5;
1225  }
1226  }
1227  }
1228 
1229  if(m_stdExp->GetBasis(0)->GetBasisType()
1231  {
1232  m_sortTopEdge = true;
1233  }
1234  else
1235  {
1236  m_sortTopEdge = false;
1237  }
1238 
1239  }
Operator(std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, boost::shared_ptr< CoalescedGeomData > GeomData)
Constructor.
Definition: Operator.h:112
Principle Modified Functions .
Definition: BasisType.h:49
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:146

Member Function Documentation

virtual void Nektar::Collections::IProductWRTDerivBase_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 1020 of file IProductWRTDerivBase.cpp.

References Nektar::Collections::TetIProduct(), Vmath::Vadd(), Vmath::Vmul(), and Vmath::Vvtvp().

1026  {
1027  unsigned int nPhys = m_stdExp->GetTotPoints();
1028  unsigned int ntot = m_numElmt*nPhys;
1029  unsigned int nmodes = m_stdExp->GetNcoeffs();
1030  unsigned int nmax = max(ntot,m_numElmt*nmodes);
1031  Array<OneD, Array<OneD, const NekDouble> > in(3);
1032  Array<OneD, NekDouble> output, wsp1;
1033  Array<OneD, Array<OneD, NekDouble> > tmp(3);
1034 
1035  in[0] = entry0; in[1] = entry1;
1036  in[2] = entry2;
1037 
1038  output = entry3;
1039 
1040  for(int i = 0; i < 3; ++i)
1041  {
1042  tmp[i] = wsp + i*nmax;
1043  }
1044 
1045 
1046  // calculate (dphi/dx,in[0]) = ((dphi/dxi_0 dxi_0/dx +
1047  // dphi/dxi_1 dxi_1/dx +
1048  // dphi/dxi_2 dxi_2/dx),in[0])
1049  // + (dphi/dy,in[1]) = ((dphi/dxi_0 dxi_0/dy +
1050  // dphi/dxi_1 dxi_1/dy +
1051  // dphi/dxi_2 dxi_2/dy),in[1])
1052  // + (dphi/dz,in[2]) = ((dphi/dxi_0 dxi_0/dz +
1053  // dphi/dxi_1 dxi_1/dz +
1054  // dphi/dxi_2 dxi_2/dz),in[1])
1055  //
1056  // Note dphi/dxi_0 =
1057  // dphi/deta_0 4/((1-eta_1)(1-eta2))
1058  //
1059  // dphi/dxi_1 =
1060  // dphi/deta_0 2(1+eta_0)/((1-eta_1)(1-eta_2)) +
1061  // dphi/deta_1 2/(1-eta_2)
1062  //
1063  // dphi/dxi_2 =
1064  // dphi/deta_0 2(1+eta_0)/((1-eta_1)(1-eta_2)) +
1065  // dphi/deta_1 (1+eta_1)/(1-eta_2) + dphi/deta_2
1066  //
1067  // and so the full inner products are
1068  //
1069  // (dphi/dx,in[0]) + (dphi/dy,in[1]) + (dphi/dz,in[2])
1070  // = (dphi/deta_0, fac0 (tmp0 + fac1(tmp1 + tmp2)))
1071  // + (dphi/deta_1, fac2 (tmp1 + fac3 tmp2))
1072  // + (dphi/deta_2, tmp2)
1073  //
1074  // tmp0 = (dxi_0/dx in[0] + dxi_0/dy in[1] + dxi_0/dz in[2])
1075  // tmp1 = (dxi_1/dx in[0] + dxi_1/dy in[1] + dxi_1/dz in[2])
1076  // tmp2 = (dxi_2/dx in[0] + dxi_2/dy in[1] + dxi_2/dz in[2])
1077 
1078  // fac0 = 4/((1-eta_1)(1-eta2))
1079  // fac1 = (1+eta_0)/2
1080  // fac2 = 2/(1-eta_2)
1081  // fac3 = (1+eta_1)/2
1082 
1083  for(int i = 0; i < 3; ++i)
1084  {
1085  Vmath::Vmul (ntot,m_derivFac[i],1, in[0],1,tmp[i],1);
1086  for(int j = 1; j < 3; ++j)
1087  {
1088  Vmath::Vvtvp (ntot,m_derivFac[i+3*j],1,
1089  in[j],1, tmp[i], 1, tmp[i],1);
1090  }
1091  }
1092 
1093  wsp1 = wsp + 3*nmax;
1094 
1095  // Sort into eta factors
1096  for (int i = 0; i < m_numElmt; ++i)
1097  {
1098  // add tmp[1] + tmp[2]
1099  Vmath::Vadd(nPhys, tmp[1].get() + i*nPhys, 1,
1100  tmp[2].get() + i*nPhys, 1,
1101  wsp1.get(), 1);
1102 
1103  // scale wsp1 by fac1 and add to tmp0
1104  Vmath::Vvtvp(nPhys,&m_fac1[0],1,wsp1.get(),1,
1105  tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
1106 
1107  // scale tmp[0] by fac0
1108  Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].get()+i*nPhys,1,
1109  tmp[0].get()+i*nPhys,1);
1110 
1111  // scale tmp[2] by fac3 and add to tmp1
1112  Vmath::Vvtvp(nPhys,&m_fac3[0],1,tmp[2].get()+i*nPhys,1,
1113  tmp[1].get()+i*nPhys,1,tmp[1].get()+i*nPhys,1);
1114 
1115  // scale tmp[1] by fac2
1116  Vmath::Vmul(nPhys,&m_fac2[0],1,tmp[1].get()+i*nPhys,1,
1117  tmp[1].get()+i*nPhys,1);
1118  }
1119 
1120 
1121  // calculate Iproduct WRT Std Deriv
1122  TetIProduct(m_sortTopEdge, m_numElmt,
1126  m_jac,tmp[0],output,wsp1);
1127 
1128  TetIProduct(m_sortTopEdge, m_numElmt,
1132  m_jac,tmp[1],tmp[0],wsp1);
1133  Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1134 
1135  TetIProduct(m_sortTopEdge, m_numElmt,
1139  m_jac,tmp[2],tmp[0],wsp1);
1140  Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1141  }
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:442
void TetIProduct(bool sortTopEdge, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: IProduct.cpp:428
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:146
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.cpp:299
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:183
virtual void Nektar::Collections::IProductWRTDerivBase_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 1143 of file IProductWRTDerivBase.cpp.

References ASSERTL0.

1148  {
1149  ASSERTL0(false, "Not valid for this operator.");
1150  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198

Member Data Documentation

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_base0
protected

Definition at line 1160 of file IProductWRTDerivBase.cpp.

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_base1
protected

Definition at line 1161 of file IProductWRTDerivBase.cpp.

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_base2
protected

Definition at line 1162 of file IProductWRTDerivBase.cpp.

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_derbase0
protected

Definition at line 1163 of file IProductWRTDerivBase.cpp.

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_derbase1
protected

Definition at line 1164 of file IProductWRTDerivBase.cpp.

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_derbase2
protected

Definition at line 1165 of file IProductWRTDerivBase.cpp.

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

Definition at line 1166 of file IProductWRTDerivBase.cpp.

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

Definition at line 1167 of file IProductWRTDerivBase.cpp.

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

Definition at line 1168 of file IProductWRTDerivBase.cpp.

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

Definition at line 1169 of file IProductWRTDerivBase.cpp.

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

Definition at line 1170 of file IProductWRTDerivBase.cpp.

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_jac
protected

Definition at line 1159 of file IProductWRTDerivBase.cpp.

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_nmodes0
protected

Definition at line 1156 of file IProductWRTDerivBase.cpp.

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_nmodes1
protected

Definition at line 1157 of file IProductWRTDerivBase.cpp.

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_nmodes2
protected

Definition at line 1158 of file IProductWRTDerivBase.cpp.

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_nquad0
protected

Definition at line 1153 of file IProductWRTDerivBase.cpp.

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_nquad1
protected

Definition at line 1154 of file IProductWRTDerivBase.cpp.

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_nquad2
protected

Definition at line 1155 of file IProductWRTDerivBase.cpp.

bool Nektar::Collections::IProductWRTDerivBase_SumFac_Tet::m_sortTopEdge
protected

Definition at line 1171 of file IProductWRTDerivBase.cpp.