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

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

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

Public Member Functions

 ~PhysDeriv_SumFac_Pyr () final
 
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
 
virtual void CheckFactors (StdRegions::FactorMap factors, int coll_phys_offset)
 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 COLLECTIONS_EXPORT ~Operator ()
 
unsigned int GetWspSize ()
 Get the size of the required workspace. More...
 
unsigned int GetNumElmt ()
 Get expansion pointer. More...
 
StdRegions::StdExpansionSharedPtr GetExpSharedPtr ()
 Get expansion pointer. 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
 
- Protected Attributes inherited from Nektar::Collections::Operator
bool m_isDeformed
 
StdRegions::StdExpansionSharedPtr m_stdExp
 
unsigned int m_numElmt
 
unsigned int m_nqe
 
unsigned int m_wspSize
 

Private Member Functions

 PhysDeriv_SumFac_Pyr (vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
 

Detailed Description

Phys deriv operator using sum-factorisation (Pyramid)

Definition at line 2134 of file PhysDeriv.cpp.

Constructor & Destructor Documentation

◆ ~PhysDeriv_SumFac_Pyr()

Nektar::Collections::PhysDeriv_SumFac_Pyr::~PhysDeriv_SumFac_Pyr ( )
inlinefinal

Definition at line 2139 of file PhysDeriv.cpp.

2140  {
2141  }

◆ PhysDeriv_SumFac_Pyr()

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

Definition at line 2354 of file PhysDeriv.cpp.

2358  : Operator(pCollExp, pGeomData, factors),
2359  m_nquad0 (m_stdExp->GetNumPoints(0)),
2360  m_nquad1 (m_stdExp->GetNumPoints(1)),
2361  m_nquad2 (m_stdExp->GetNumPoints(2))
2362  {
2363  LibUtilities::PointsKeyVector PtsKey = m_stdExp->GetPointsKeys();
2364 
2365  m_coordim = pCollExp[0]->GetCoordim();
2366 
2367  m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2368 
2369  const Array<OneD, const NekDouble>& z0
2370  = m_stdExp->GetBasis(0)->GetZ();
2371  const Array<OneD, const NekDouble>& z1
2372  = m_stdExp->GetBasis(1)->GetZ();
2373  const Array<OneD, const NekDouble>& z2
2374  = m_stdExp->GetBasis(2)->GetZ();
2375  m_fac0 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
2376  m_fac1 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
2377  m_fac2 = Array<OneD, NekDouble>(m_nquad0*m_nquad1*m_nquad2);
2378 
2379  int nq0_nq1 = m_nquad0*m_nquad1;
2380  for (int i = 0; i < m_nquad0; ++i)
2381  {
2382  for(int j = 0; j < m_nquad1; ++j)
2383  {
2384  int ifac = i+j*m_nquad0;
2385  for(int k = 0; k < m_nquad2; ++k)
2386  {
2387  m_fac0[ifac + k*nq0_nq1] =
2388  2.0/(1-z2[k]);
2389  m_fac1[ifac + k*nq0_nq1] =
2390  0.5*(1+z0[i]);
2391  m_fac2[ifac + k*nq0_nq1] =
2392  0.5*(1+z1[j]);
2393  }
2394  }
2395  }
2396 
2397  m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
2398  m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
2399  m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
2400 
2402  }
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:167
Operator(std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, std::shared_ptr< CoalescedGeomData > GeomData, StdRegions::FactorMap factors)
Constructor.
Definition: Operator.cpp:41
Array< TwoD, const NekDouble > m_derivFac
Definition: PhysDeriv.cpp:2341
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:246

Member Function Documentation

◆ CheckFactors()

virtual void Nektar::Collections::PhysDeriv_SumFac_Pyr::CheckFactors ( StdRegions::FactorMap  factors,
int  coll_phys_offset 
)
inlinevirtual

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 2333 of file PhysDeriv.cpp.

2335  {
2336  boost::ignore_unused(factors, coll_phys_offset);
2337  ASSERTL0(false, "Not valid for this operator.");
2338  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216

References ASSERTL0.

◆ operator()() [1/2]

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

2149  {
2150 
2151  int nPhys = m_stdExp->GetTotPoints();
2152  int ntot = m_numElmt*nPhys;
2153  Array<OneD, NekDouble> tmp0,tmp1,tmp2;
2154  Array<OneD, Array<OneD, NekDouble> > Diff(3);
2155  Array<OneD, Array<OneD, NekDouble> > out(3);
2156  out[0] = output0; out[1] = output1; out[2] = output2;
2157 
2158  for(int i = 0; i < 3; ++i)
2159  {
2160  Diff[i] = wsp + i*ntot;
2161  }
2162 
2163  // dEta0
2165  m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
2166  m_nquad0,0.0,&Diff[0][0],m_nquad0);
2167 
2168  int cnt = 0;
2169  for(int i = 0; i < m_numElmt; ++i)
2170  {
2171 
2172  // dEta 1
2173  for (int j = 0; j < m_nquad2; ++j)
2174  {
2175  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1,
2176  1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
2177  m_nquad0, m_Deriv1, m_nquad1, 0.0,
2178  &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
2179  m_nquad0);
2180  }
2181 
2182  // dEta 2
2184  1.0, &input[i*nPhys],m_nquad0*m_nquad1,
2185  m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
2186  m_nquad0*m_nquad1);
2187 
2188  // dxi0 = 2/(1-eta_2) d Eta_0
2189  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
2190  Diff[0].get()+cnt,1);
2191 
2192  // dxi1 = 2/(1-eta_2) d Eta_1
2193  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[1].get()+cnt,1,
2194  Diff[1].get()+cnt,1);
2195 
2196  // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
2197  Vmath::Vvtvp(nPhys,&m_fac1[0],1,Diff[0].get()+cnt,1,
2198  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2199 
2200  // dxi2 += (1+eta1)/(1-eta_2) d Eta_1
2201  Vmath::Vvtvp(nPhys,&m_fac2[0],1,Diff[1].get()+cnt,1,
2202  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2203  cnt += nPhys;
2204  }
2205 
2206  // calculate full derivative
2207  if(m_isDeformed)
2208  {
2209  for(int i = 0; i < m_coordim; ++i)
2210  {
2211  Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
2212  for(int j = 1; j < 3; ++j)
2213  {
2214  Vmath::Vvtvp (ntot, m_derivFac[i*3+j], 1,
2215  Diff[j], 1,
2216  out[i], 1,
2217  out[i], 1);
2218  }
2219  }
2220  }
2221  else
2222  {
2223  Array<OneD, NekDouble> t;
2224  for(int e = 0; e < m_numElmt; ++e)
2225  {
2226  for(int i = 0; i < m_coordim; ++i)
2227  {
2228  Vmath::Smul(m_nqe,m_derivFac[i*3][e],
2229  Diff[0] + e*m_nqe, 1,
2230  t = out[i] + e*m_nqe,1);
2231 
2232  for(int j = 1; j < 3; ++j)
2233  {
2234  Vmath::Svtvp (m_nqe, m_derivFac[i*3+j][e],
2235  Diff[j] + e*m_nqe, 1,
2236  out[i] + e*m_nqe, 1,
2237  t = out[i] + e*m_nqe, 1);
2238  }
2239  }
2240  }
2241  }
2242  }
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:394
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:192
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.cpp:565
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:513
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.cpp:225

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

◆ operator()() [2/2]

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

2248  {
2249  int nPhys = m_stdExp->GetTotPoints();
2250  int ntot = m_numElmt*nPhys;
2251  Array<OneD, NekDouble> tmp0,tmp1,tmp2;
2252  Array<OneD, Array<OneD, NekDouble> > Diff(3);
2253 
2254  for(int i = 0; i < 3; ++i)
2255  {
2256  Diff[i] = wsp + i*ntot;
2257  }
2258 
2259  // dEta0
2261  m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
2262  m_nquad0,0.0,&Diff[0][0],m_nquad0);
2263 
2264  int cnt = 0;
2265  for(int i = 0; i < m_numElmt; ++i)
2266  {
2267  // dEta 1
2268  for (int j = 0; j < m_nquad2; ++j)
2269  {
2270  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nquad1,
2271  1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
2272  m_nquad0, m_Deriv1, m_nquad1, 0.0,
2273  &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
2274  m_nquad0);
2275  }
2276 
2277  // dEta 2
2279  1.0, &input[i*nPhys],m_nquad0*m_nquad1,
2280  m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
2281  m_nquad0*m_nquad1);
2282 
2283  // dxi0 = 2/(1-eta_2) d Eta_0
2284  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
2285  Diff[0].get()+cnt,1);
2286 
2287  // dxi1 = 2/(1-eta_2) d Eta_1
2288  Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[1].get()+cnt,1,
2289  Diff[1].get()+cnt,1);
2290 
2291  // dxi2 = (1+eta0)/(1-eta_2) d Eta_0 + d/dEta2;
2292  Vmath::Vvtvp(nPhys,&m_fac1[0],1,Diff[0].get()+cnt,1,
2293  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2294  // dxi2 = (1+eta1)/(1-eta_2) d Eta_1 + d/dEta2;
2295  Vmath::Vvtvp(nPhys,&m_fac2[0],1,Diff[1].get()+cnt,1,
2296  Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2297  cnt += nPhys;
2298  }
2299 
2300  // calculate full derivative
2301  if(m_isDeformed)
2302  {
2303  // calculate full derivative
2304  Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
2305  for(int j = 1; j < 3; ++j)
2306  {
2307  Vmath::Vvtvp (ntot, m_derivFac[dir*3+j], 1,
2308  Diff[j], 1,
2309  output, 1,
2310  output, 1);
2311  }
2312  }
2313  else
2314  {
2315  Array<OneD, NekDouble> t;
2316  for(int e = 0; e < m_numElmt; ++e)
2317  {
2318  Vmath::Smul(m_nqe,m_derivFac[dir*3][e],
2319  Diff[0] + e*m_nqe, 1,
2320  t = output + e*m_nqe,1);
2321 
2322  for(int j = 1; j < 3; ++j)
2323  {
2324  Vmath::Svtvp (m_nqe, m_derivFac[dir*3+j][e],
2325  Diff[j] + e*m_nqe, 1,
2326  output + e*m_nqe, 1,
2327  t = output + e*m_nqe, 1);
2328  }
2329  }
2330  }
2331  }

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

Member Data Documentation

◆ m_coordim

int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_coordim
protected

Definition at line 2342 of file PhysDeriv.cpp.

◆ m_Deriv0

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Pyr::m_Deriv0
protected

Definition at line 2346 of file PhysDeriv.cpp.

◆ m_Deriv1

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Pyr::m_Deriv1
protected

Definition at line 2347 of file PhysDeriv.cpp.

◆ m_Deriv2

NekDouble* Nektar::Collections::PhysDeriv_SumFac_Pyr::m_Deriv2
protected

Definition at line 2348 of file PhysDeriv.cpp.

◆ m_derivFac

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

Definition at line 2341 of file PhysDeriv.cpp.

◆ m_fac0

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

Definition at line 2349 of file PhysDeriv.cpp.

◆ m_fac1

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

Definition at line 2350 of file PhysDeriv.cpp.

◆ m_fac2

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

Definition at line 2351 of file PhysDeriv.cpp.

◆ m_nquad0

const int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_nquad0
protected

Definition at line 2343 of file PhysDeriv.cpp.

◆ m_nquad1

const int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_nquad1
protected

Definition at line 2344 of file PhysDeriv.cpp.

◆ m_nquad2

const int Nektar::Collections::PhysDeriv_SumFac_Pyr::m_nquad2
protected

Definition at line 2345 of file PhysDeriv.cpp.