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

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

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

Public Member Functions

 ~IProductWRTDerivBase_SumFac_Tri () final=default
 
void operator() (const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) final
 
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

const int m_nquad0
 
const int m_nquad1
 
const int m_nmodes0
 
const int m_nmodes1
 
const bool m_colldir0
 
const bool m_colldir1
 
int m_coordim
 
Array< TwoD, const NekDoublem_derivFac
 
Array< OneD, const NekDoublem_jacWStdW
 
Array< OneD, const NekDoublem_base0
 
Array< OneD, const NekDoublem_base1
 
Array< OneD, const NekDoublem_derbase0
 
Array< OneD, const NekDoublem_derbase1
 
Array< OneD, NekDoublem_fac0
 
Array< OneD, NekDoublem_fac1
 
bool m_sortTopVertex
 
- 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

 IProductWRTDerivBase_SumFac_Tri (vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
 
- Private Member Functions inherited from Nektar::Collections::IProductWRTDerivBase_Helper
 IProductWRTDerivBase_Helper ()
 

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

Detailed Description

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

Definition at line 1011 of file IProductWRTDerivBase.cpp.

Constructor & Destructor Documentation

◆ ~IProductWRTDerivBase_SumFac_Tri()

Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::~IProductWRTDerivBase_SumFac_Tri ( )
finaldefault

◆ IProductWRTDerivBase_SumFac_Tri()

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

Definition at line 1165 of file IProductWRTDerivBase.cpp.

1168 : Operator(pCollExp, pGeomData, factors), IProductWRTDerivBase_Helper(),
1169 m_nquad0(m_stdExp->GetNumPoints(0)),
1170 m_nquad1(m_stdExp->GetNumPoints(1)),
1171 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1172 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1173 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1174 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1175 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1176 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1177 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1178 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
1179 {
1180 m_coordim = pCollExp[0]->GetCoordim();
1181 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1182 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1183 m_wspSize =
1184 4 * m_numElmt * (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1));
1185
1186 if (m_stdExp->GetBasis(0)->GetBasisType() == LibUtilities::eModified_A)
1187 {
1188 m_sortTopVertex = true;
1189 }
1190 else
1191 {
1192 m_sortTopVertex = false;
1193 }
1194
1195 const Array<OneD, const NekDouble> &z0 = m_stdExp->GetBasis(0)->GetZ();
1196 const Array<OneD, const NekDouble> &z1 = m_stdExp->GetBasis(1)->GetZ();
1197
1198 m_fac0 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1);
1199 // set up geometric factor: 2/(1-z1)
1200 for (int i = 0; i < m_nquad0; ++i)
1201 {
1202 for (int j = 0; j < m_nquad1; ++j)
1203 {
1204 m_fac0[i + j * m_nquad0] = 2.0 / (1 - z1[j]);
1205 }
1206 }
1207
1208 m_fac1 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1);
1209 // set up geometric factor: (1+z0)/(1-z1)
1210 for (int i = 0; i < m_nquad0; ++i)
1211 {
1212 for (int j = 0; j < m_nquad1; ++j)
1213 {
1214 m_fac1[i + j * m_nquad0] = (1 + z0[i]) / (1 - z1[j]);
1215 }
1216 }
1217 }
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
@ eModified_A
Principle Modified Functions .
Definition: BasisType.h:48
StdRegions::ConstFactorMap factors

References Nektar::LibUtilities::eModified_A, m_coordim, m_derivFac, m_fac0, m_fac1, m_jacWStdW, m_nmodes0, m_nmodes1, m_nquad0, m_nquad1, Nektar::Collections::Operator::m_numElmt, m_sortTopVertex, Nektar::Collections::Operator::m_stdExp, and Nektar::Collections::Operator::m_wspSize.

Member Function Documentation

◆ CheckFactors()

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

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

References ASSERTL0.

◆ operator()() [1/2]

void Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::operator() ( const Array< OneD, const NekDouble > &  entry0,
Array< OneD, NekDouble > &  entry1,
Array< OneD, NekDouble > &  entry2,
Array< OneD, NekDouble > &  entry3,
Array< OneD, NekDouble > &  wsp 
)
inlinefinalvirtual

This method calculates:

\[ (d\phi/dx,in[0]) + (d\phi/dy,in[1]) \]

which can be represented in terms of local cartesian derivaties as:

\[ ((d\phi/d\xi_0\, d\xi_0/dx + d\phi/d\xi_1\, d\xi_1/dx),in[0]) + \]

\[ ((d\phi/d\xi_0\, d\xi_0/dy + d\phi/d\xi_1\, d\xi_1/dy),in[1]) + \]

where we note that

\[ d\phi/d\xi_0 = d\phi/d\eta_0\, d\eta_0/d\xi_0 = d\phi/d\eta_0 2/(1-\eta_1) \]

\[ d\phi/d\xi_1 = d\phi/d\eta_1\, d\eta_1/d\xi_1 + d\phi/d\eta_1\, d\eta_1/d\xi_1 = d\phi/d\eta_0 (1+\eta_0)/(1-\eta_1) + d\phi/d\eta_1 \]

and so the full inner products are

\[ (d\phi/dx,in[0]) + (dphi/dy,in[1]) = (d\phi/d\eta_0, ((2/(1-\eta_1) (d\xi_0/dx in[0] + d\xi_0/dy in[1]) + (1-\eta_0)/(1-\eta_1) (d\xi_1/dx in[0]+d\xi_1/dy in[1])) + (d\phi/d\eta_1, (d\xi_1/dx in[0] + d\xi_1/dy in[1])) \]

Implements Nektar::Collections::Operator.

Definition at line 1050 of file IProductWRTDerivBase.cpp.

1055 {
1056 unsigned int nPhys = m_stdExp->GetTotPoints();
1057 unsigned int ntot = m_numElmt * nPhys;
1058 unsigned int nmodes = m_stdExp->GetNcoeffs();
1059 unsigned int nmax = max(ntot, m_numElmt * nmodes);
1060 Array<OneD, Array<OneD, const NekDouble>> in(3);
1061 Array<OneD, NekDouble> output, wsp1;
1062 Array<OneD, Array<OneD, NekDouble>> tmp(2);
1063
1064 in[0] = entry0;
1065 in[1] = entry1;
1066 in[2] = entry2;
1067
1068 output = (m_coordim == 2) ? entry2 : entry3;
1069
1070 tmp[0] = wsp;
1071 tmp[1] = wsp + nmax;
1072 wsp1 = wsp + 2 * nmax;
1073
1074 if (m_isDeformed)
1075 {
1076 for (int i = 0; i < 2; ++i)
1077 {
1078 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1079 for (int j = 1; j < m_coordim; ++j)
1080 {
1081 Vmath::Vvtvp(ntot, m_derivFac[i + 2 * j], 1, in[j], 1,
1082 tmp[i], 1, tmp[i], 1);
1083 }
1084 }
1085 }
1086 else
1087 {
1088 Array<OneD, NekDouble> t;
1089 for (int e = 0; e < m_numElmt; ++e)
1090 {
1091 // calculate dx/dxi in[0] + dy/dxi in[1]
1092 for (int i = 0; i < 2; ++i)
1093 {
1094 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
1095 t = tmp[i] + e * m_nqe, 1);
1096 for (int j = 1; j < m_coordim; ++j)
1097 {
1098 Vmath::Svtvp(m_nqe, m_derivFac[i + 2 * j][e],
1099 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
1100 1, t = tmp[i] + e * m_nqe, 1);
1101 }
1102 }
1103 }
1104 }
1105
1106 // Multiply by factor: 2/(1-z1)
1107 for (int i = 0; i < m_numElmt; ++i)
1108 {
1109 // scale tmp[0] by geometric factor: 2/(1-z1)
1110 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[0].get() + i * nPhys, 1,
1111 tmp[0].get() + i * nPhys, 1);
1112
1113 // scale tmp[1] by geometric factor (1+z0)/(1-z1)
1114 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, tmp[1].get() + i * nPhys, 1,
1115 tmp[0].get() + i * nPhys, 1, tmp[0].get() + i * nPhys,
1116 1);
1117 }
1118
1119 // Iproduct wrt derivative of base 0
1121 m_nmodes1, m_derbase0, m_base1, m_jacWStdW, tmp[0], output,
1122 wsp1);
1123
1124 // Iproduct wrt derivative of base 1
1126 m_nmodes1, m_base0, m_derbase1, m_jacWStdW, tmp[1], tmp[0],
1127 wsp1);
1128
1129 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1130 }
void TriIProduct(bool sortTopVertex, int numElmt, int nquad0, int nquad1, int nmodes0, int nmodes1, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: IProduct.cpp:128
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 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.hpp:180
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 m_base0, m_base1, m_coordim, m_derbase0, m_derbase1, m_derivFac, m_fac0, m_fac1, Nektar::Collections::Operator::m_isDeformed, m_jacWStdW, m_nmodes0, m_nmodes1, Nektar::Collections::Operator::m_nqe, m_nquad0, m_nquad1, Nektar::Collections::Operator::m_numElmt, m_sortTopVertex, Nektar::Collections::Operator::m_stdExp, Vmath::Smul(), Vmath::Svtvp(), Nektar::Collections::TriIProduct(), Vmath::Vadd(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ operator()() [2/2]

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

1136 {
1137 NEKERROR(ErrorUtil::efatal, "Not valid for this operator.");
1138 }
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Definition: ErrorUtil.hpp:202

References Nektar::ErrorUtil::efatal, and NEKERROR.

Member Data Documentation

◆ m_base0

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

Definition at line 1156 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_base1

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

Definition at line 1157 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_colldir0

const bool Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_colldir0
protected

Definition at line 1151 of file IProductWRTDerivBase.cpp.

◆ m_colldir1

const bool Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_colldir1
protected

Definition at line 1152 of file IProductWRTDerivBase.cpp.

◆ m_coordim

int Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_coordim
protected

Definition at line 1153 of file IProductWRTDerivBase.cpp.

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

◆ m_derbase0

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

Definition at line 1158 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_derbase1

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

Definition at line 1159 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_derivFac

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

Definition at line 1154 of file IProductWRTDerivBase.cpp.

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

◆ m_fac0

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

Definition at line 1160 of file IProductWRTDerivBase.cpp.

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

◆ m_fac1

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

Definition at line 1161 of file IProductWRTDerivBase.cpp.

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

◆ m_jacWStdW

Array<OneD, const NekDouble> Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_jacWStdW
protected

Definition at line 1155 of file IProductWRTDerivBase.cpp.

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

◆ m_nmodes0

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_nmodes0
protected

Definition at line 1149 of file IProductWRTDerivBase.cpp.

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

◆ m_nmodes1

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_nmodes1
protected

Definition at line 1150 of file IProductWRTDerivBase.cpp.

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

◆ m_nquad0

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_nquad0
protected

Definition at line 1147 of file IProductWRTDerivBase.cpp.

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

◆ m_nquad1

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_nquad1
protected

Definition at line 1148 of file IProductWRTDerivBase.cpp.

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

◆ m_sortTopVertex

bool Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::m_sortTopVertex
protected

Definition at line 1162 of file IProductWRTDerivBase.cpp.

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