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_Tri Class Reference

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

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

Public Member Functions

virtual ~IProductWRTDerivBase_SumFac_Tri ()
 
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_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_jac
 
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
StdRegions::StdExpansionSharedPtr m_stdExp
 
unsigned int m_numElmt
 
unsigned int m_wspSize
 

Private Member Functions

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

Detailed Description

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

Definition at line 691 of file IProductWRTDerivBase.cpp.

Constructor & Destructor Documentation

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

Definition at line 696 of file IProductWRTDerivBase.cpp.

697  {
698  }
Nektar::Collections::IProductWRTDerivBase_SumFac_Tri::IProductWRTDerivBase_SumFac_Tri ( vector< StdRegions::StdExpansionSharedPtr pCollExp,
CoalescedGeomDataSharedPtr  pGeomData 
)
inlineprivate

Definition at line 806 of file IProductWRTDerivBase.cpp.

References Nektar::LibUtilities::eModified_A.

809  : Operator(pCollExp, pGeomData),
810  m_nquad0 (m_stdExp->GetNumPoints(0)),
811  m_nquad1 (m_stdExp->GetNumPoints(1)),
812  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
813  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
814  m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
815  m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
816  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
817  m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
818  m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
819  m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
820  {
821  LibUtilities::PointsKeyVector PtsKey = m_stdExp->GetPointsKeys();
822  m_coordim = m_stdExp->GetCoordim();
823 
824  m_derivFac = pGeomData->GetDerivFactors(pCollExp);
825  m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
826  m_wspSize = 4 * m_numElmt * (max(m_nquad0*m_nquad1,
828 
829  if(m_stdExp->GetBasis(0)->GetBasisType()
831  {
832  m_sortTopVertex = true;
833  }
834  else
835  {
836  m_sortTopVertex = false;
837  }
838 
839  const Array<OneD, const NekDouble>& z0
840  = m_stdExp->GetBasis(0)->GetZ();
841  const Array<OneD, const NekDouble>& z1
842  = m_stdExp->GetBasis(1)->GetZ();
843 
844  m_fac0 = Array<OneD, NekDouble>(m_nquad0*m_nquad1);
845  // set up geometric factor: 2/(1-z1)
846  for (int i = 0; i < m_nquad0; ++i)
847  {
848  for(int j = 0; j < m_nquad1; ++j)
849  {
850  m_fac0[i+j*m_nquad0] = 2.0/(1-z1[j]);
851  }
852  }
853 
854  m_fac1 = Array<OneD, NekDouble>(m_nquad0*m_nquad1);
855  // set up geometric factor: (1+z0)/(1-z1)
856  for (int i = 0; i < m_nquad0; ++i)
857  {
858  for(int j = 0; j < m_nquad1; ++j)
859  {
860  m_fac1[i+j*m_nquad0] = (1+z0[i])/(1-z1[j]);
861  }
862  }
863  }
Operator(std::vector< StdRegions::StdExpansionSharedPtr > pCollExp, boost::shared_ptr< CoalescedGeomData > GeomData)
Constructor.
Definition: Operator.h:112
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:242
Principle Modified Functions .
Definition: BasisType.h:49
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:146

Member Function Documentation

virtual void Nektar::Collections::IProductWRTDerivBase_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 
)
inlinevirtual

Perform operation.

Implements Nektar::Collections::Operator.

Definition at line 700 of file IProductWRTDerivBase.cpp.

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

706  {
707  unsigned int nPhys = m_stdExp->GetTotPoints();
708  unsigned int ntot = m_numElmt*nPhys;
709  unsigned int nmodes = m_stdExp->GetNcoeffs();
710  unsigned int nmax = max(ntot,m_numElmt*nmodes);
711  Array<OneD, Array<OneD, const NekDouble> > in(3);
712  Array<OneD, NekDouble> output, wsp1;
713  Array<OneD, Array<OneD, NekDouble> > tmp(2);
714 
715  in[0] = entry0; in[1] = entry1; in[2] = entry2;
716 
717  output = (m_coordim == 2)? entry2: entry3;
718 
719  tmp[0] = wsp; tmp[1] = wsp + nmax;
720  wsp1 = wsp + 2*nmax;
721 
722 
723  // calculate (dphi/dx,in[0]) = ((dphi/dxi_0 dxi_0/dx +
724  // dphi/dxi_1 dxi_1/dx),in[0])
725  // + (dphi/dy,in[1]) = ((dphi/dxi_0 dxi_0/dy +
726  // dphi/dxi_1 dxi_1/dy),in[1])
727  //
728  // Note dphi/dxi_0 =
729  // dphi/deta_0 deta_0/dxi_0 = dphi/deta_0 2/(1-eta_1)
730  //
731  // dphi/dxi_1 =
732  // dphi/deta_1 deta_1/dxi_1 + dphi/deta_1 deta_1/dxi_1 =
733  // dphi/deta_0 (1+eta_0)/(1-eta_1) + dphi/deta_1
734  //
735  // and so the full inner products are
736  //
737  // (dphi/dx,in[0]) + (dphi/dy,in[1])
738  // = (dphi/deta_0, ((2/(1-eta_1) (dxi_0/dx in[0]+dxi_0/dy in[1])
739  // + (1_eta_0)/(1-eta_1) (dxi_1/dx in[0]+dxi_1/dy in[1]))
740  // + (dphi/deta_1, (dxi_1/dx in[0] + dxi_1/dy in[1]))
741 
742  for(int i = 0; i < 2; ++i)
743  {
744  Vmath::Vmul (ntot,m_derivFac[i],1, in[0],1, tmp[i],1);
745 
746  for(int j = 1; j < m_coordim; ++j)
747  {
748  Vmath::Vvtvp (ntot,m_derivFac[i +j*2],1,
749  in[j],1, tmp[i], 1, tmp[i],1);
750  }
751  }
752 
753  // Multiply by factor: 2/(1-z1)
754  for (int i = 0; i < m_numElmt; ++i)
755  {
756  // scale tmp[0] by geometric factor: 2/(1-z1)
757  Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].get()+i*nPhys,1,
758  tmp[0].get()+i*nPhys,1);
759 
760  // scale tmp[1] by geometric factor (1+z0)/(1-z1)
761  Vmath::Vvtvp(nPhys,&m_fac1[0],1,tmp[1].get()+i*nPhys,1,
762  tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
763  }
764 
765  // Iproduct wrt derivative of base 0
768  m_jac, tmp[0], output, wsp1);
769 
770  // Iproduct wrt derivative of base 1
773  m_jac, tmp[1], tmp[0], wsp1);
774 
775  Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
776  }
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 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:135
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_Tri::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 778 of file IProductWRTDerivBase.cpp.

References ASSERTL0.

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

Member Data Documentation

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

Definition at line 797 of file IProductWRTDerivBase.cpp.

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

Definition at line 798 of file IProductWRTDerivBase.cpp.

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

Definition at line 792 of file IProductWRTDerivBase.cpp.

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

Definition at line 793 of file IProductWRTDerivBase.cpp.

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

Definition at line 794 of file IProductWRTDerivBase.cpp.

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

Definition at line 799 of file IProductWRTDerivBase.cpp.

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

Definition at line 800 of file IProductWRTDerivBase.cpp.

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

Definition at line 795 of file IProductWRTDerivBase.cpp.

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

Definition at line 801 of file IProductWRTDerivBase.cpp.

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

Definition at line 802 of file IProductWRTDerivBase.cpp.

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

Definition at line 796 of file IProductWRTDerivBase.cpp.

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

Definition at line 790 of file IProductWRTDerivBase.cpp.

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

Definition at line 791 of file IProductWRTDerivBase.cpp.

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

Definition at line 788 of file IProductWRTDerivBase.cpp.

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

Definition at line 789 of file IProductWRTDerivBase.cpp.

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

Definition at line 803 of file IProductWRTDerivBase.cpp.