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

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

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

Public Member Functions

 ~IProductWRTDerivBase_SumFac_Pyr () 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_nquad2
 
const int m_nmodes0
 
const int m_nmodes1
 
const int m_nmodes2
 
Array< OneD, const NekDoublem_jacWStdW
 
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
 
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_Pyr (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 (Pyr)

Definition at line 1903 of file IProductWRTDerivBase.cpp.

Constructor & Destructor Documentation

◆ ~IProductWRTDerivBase_SumFac_Pyr()

Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::~IProductWRTDerivBase_SumFac_Pyr ( )
finaldefault

◆ IProductWRTDerivBase_SumFac_Pyr()

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

Definition at line 2097 of file IProductWRTDerivBase.cpp.

2100 : Operator(pCollExp, pGeomData, factors), IProductWRTDerivBase_Helper(),
2101 m_nquad0(m_stdExp->GetNumPoints(0)),
2102 m_nquad1(m_stdExp->GetNumPoints(1)),
2103 m_nquad2(m_stdExp->GetNumPoints(2)),
2104 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
2105 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
2106 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
2107 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
2108 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
2109 m_base2(m_stdExp->GetBasis(2)->GetBdata()),
2110 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
2111 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
2112 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
2113
2114 {
2115 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
2116 m_wspSize = 6 * m_numElmt *
2117 (max(m_nquad0 * m_nquad1 * m_nquad2,
2119 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2120
2121 if (m_stdExp->GetBasis(0)->GetBasisType() == LibUtilities::eModified_A)
2122 {
2123 m_sortTopVertex = true;
2124 }
2125 else
2126 {
2127 m_sortTopVertex = false;
2128 }
2129
2130 const Array<OneD, const NekDouble> &z0 = m_stdExp->GetBasis(0)->GetZ();
2131 const Array<OneD, const NekDouble> &z1 = m_stdExp->GetBasis(1)->GetZ();
2132 const Array<OneD, const NekDouble> &z2 = m_stdExp->GetBasis(2)->GetZ();
2133
2134 m_fac0 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
2135 m_fac1 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
2136 m_fac2 = Array<OneD, NekDouble>(m_nquad0 * m_nquad1 * m_nquad2);
2137
2138 for (int i = 0; i < m_nquad0; ++i)
2139 {
2140 for (int j = 0; j < m_nquad1; ++j)
2141 {
2142 for (int k = 0; k < m_nquad2; ++k)
2143 {
2144 // set up geometric factor: 2/(1-z2)
2145 m_fac0[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
2146 2.0 / (1 - z2[k]);
2147 // set up geometric factor: (1+z0)/(1-z2)
2148 m_fac1[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
2149 (1 + z0[i]) / (1 - z2[k]);
2150 // set up geometric factor: (1+z1)/(1-z2)
2151 m_fac2[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
2152 (1 + z1[j]) / (1 - z2[k]);
2153 }
2154 }
2155 }
2156 }
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_derivFac, m_fac0, m_fac1, m_fac2, m_jacWStdW, m_nmodes0, m_nmodes1, m_nmodes2, m_nquad0, m_nquad1, m_nquad2, 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_Pyr::CheckFactors ( StdRegions::FactorMap  factors,
int  coll_phys_offset 
)
inlineoverridevirtual

Check the validity of the supplied factor map.

Implements Nektar::Collections::Operator.

Definition at line 2070 of file IProductWRTDerivBase.cpp.

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

References ASSERTL0.

◆ operator()() [1/2]

void Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::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]) + (d\phi/dz,in[2]) \]

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 + d\phi/d\xi_2\, d\xi_2/dx),in[0]) + \]

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

\[ ((d\phi/d\xi_0\, d\xi_0/dz + d\phi/d\xi_1\, d\xi_1/dz + d\phi/d\xi_2\, d\xi_2/dz),in[2]) \, \]

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_2). \]

\[ d\phi/d\xi_1 = d\phi/d\eta_1\, d\eta_1/d\xi_1 = d\phi/d\eta_1\, 2/(1-\eta_2) \]

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

and so the full inner products are

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

\[ (d\phi/d\eta_0, ((2/(1-\eta_2) (d\xi_0/dx in[0] + d\xi_0/dy in[1] + (1-\eta_0)/(1-\eta_2) (d\xi_2/dx in[0] + d\xi_2/dy in[1] + d\xi_2/dz in[2] )) + \]

\[ (d\phi/d\eta_1, ((2/(1-\eta_2) (d\xi_1/dx in[0] + d\xi_0/dy in[1] + d\xi_0/dz in[2]) + (1-\eta_1)/(1-\eta_2) (d\xi_2/dx in[0] + d\xi_2/dy in[1] + d\xi_2/dz in[2] )) \]

\[ (d\phi/d\eta_2, (d\xi_2/dx in[0] + d\xi_2/dy in[1] + d\xi_2/dz in[2])) \]

Implements Nektar::Collections::Operator.

Definition at line 1964 of file IProductWRTDerivBase.cpp.

1969 {
1970 unsigned int nPhys = m_stdExp->GetTotPoints();
1971 unsigned int ntot = m_numElmt * nPhys;
1972 unsigned int nmodes = m_stdExp->GetNcoeffs();
1973 unsigned int nmax = max(ntot, m_numElmt * nmodes);
1974 Array<OneD, Array<OneD, const NekDouble>> in(3);
1975 Array<OneD, NekDouble> output, wsp1;
1976 Array<OneD, Array<OneD, NekDouble>> tmp(3);
1977
1978 in[0] = entry0;
1979 in[1] = entry1;
1980 in[2] = entry2;
1981
1982 output = entry3;
1983
1984 for (int i = 0; i < 3; ++i)
1985 {
1986 tmp[i] = wsp + i * nmax;
1987 }
1988
1989 if (m_isDeformed)
1990 {
1991 // calculate dx/dxi in[0] + dy/dxi in[1] + dz/dxi in[2]
1992 for (int i = 0; i < 3; ++i)
1993 {
1994 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1995 for (int j = 1; j < 3; ++j)
1996 {
1997 Vmath::Vvtvp(ntot, m_derivFac[i + 3 * j], 1, in[j], 1,
1998 tmp[i], 1, tmp[i], 1);
1999 }
2000 }
2001 }
2002 else
2003 {
2004 Array<OneD, NekDouble> t;
2005 for (int e = 0; e < m_numElmt; ++e)
2006 {
2007 // calculate dx/dxi in[0] + dy/dxi in[1] + dz/dxi in[2]
2008 for (int i = 0; i < 3; ++i)
2009 {
2010 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
2011 t = tmp[i] + e * m_nqe, 1);
2012 for (int j = 1; j < 3; ++j)
2013 {
2014 Vmath::Svtvp(m_nqe, m_derivFac[i + 3 * j][e],
2015 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
2016 1, t = tmp[i] + e * m_nqe, 1);
2017 }
2018 }
2019 }
2020 }
2021
2022 wsp1 = wsp + 3 * nmax;
2023
2024 // Sort into eta factors
2025 for (int i = 0; i < m_numElmt; ++i)
2026 {
2027 // scale tmp[0] by fac0
2028 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[0].get() + i * nPhys, 1,
2029 tmp[0].get() + i * nPhys, 1);
2030
2031 // scale tmp[2] by fac1 and add to tmp0
2032 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, tmp[2].get() + i * nPhys, 1,
2033 tmp[0].get() + i * nPhys, 1, tmp[0].get() + i * nPhys,
2034 1);
2035
2036 // scale tmp[1] by fac0
2037 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[1].get() + i * nPhys, 1,
2038 tmp[1].get() + i * nPhys, 1);
2039
2040 // scale tmp[2] by fac2 and add to tmp1
2041 Vmath::Vvtvp(nPhys, &m_fac2[0], 1, tmp[2].get() + i * nPhys, 1,
2042 tmp[1].get() + i * nPhys, 1, tmp[1].get() + i * nPhys,
2043 1);
2044 }
2045
2046 // calculate Iproduct WRT Std Deriv
2049 m_base2, m_jacWStdW, tmp[0], output, wsp1);
2050
2053 m_base2, m_jacWStdW, tmp[1], tmp[0], wsp1);
2054 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
2055
2058 m_derbase2, m_jacWStdW, tmp[2], tmp[0], wsp1);
2059 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
2060 }
void PyrIProduct(bool sortTopVert, 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:405
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_base2, m_derbase0, m_derbase1, m_derbase2, m_derivFac, m_fac0, m_fac1, m_fac2, Nektar::Collections::Operator::m_isDeformed, m_jacWStdW, m_nmodes0, m_nmodes1, m_nmodes2, Nektar::Collections::Operator::m_nqe, m_nquad0, m_nquad1, m_nquad2, Nektar::Collections::Operator::m_numElmt, m_sortTopVertex, Nektar::Collections::Operator::m_stdExp, Nektar::Collections::PyrIProduct(), Vmath::Smul(), Vmath::Svtvp(), Vmath::Vadd(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ operator()() [2/2]

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

2066 {
2067 NEKERROR(ErrorUtil::efatal, "Not valid for this operator.");
2068 }
#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_Pyr::m_base0
protected

Definition at line 2084 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_base1

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

Definition at line 2085 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_base2

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

Definition at line 2086 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_derbase0

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

Definition at line 2087 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_derbase1

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

Definition at line 2088 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_derbase2

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

Definition at line 2089 of file IProductWRTDerivBase.cpp.

Referenced by operator()().

◆ m_derivFac

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

Definition at line 2090 of file IProductWRTDerivBase.cpp.

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

◆ m_fac0

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

Definition at line 2091 of file IProductWRTDerivBase.cpp.

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

◆ m_fac1

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

Definition at line 2092 of file IProductWRTDerivBase.cpp.

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

◆ m_fac2

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

Definition at line 2093 of file IProductWRTDerivBase.cpp.

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

◆ m_jacWStdW

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

Definition at line 2083 of file IProductWRTDerivBase.cpp.

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

◆ m_nmodes0

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_nmodes0
protected

Definition at line 2080 of file IProductWRTDerivBase.cpp.

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

◆ m_nmodes1

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_nmodes1
protected

Definition at line 2081 of file IProductWRTDerivBase.cpp.

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

◆ m_nmodes2

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_nmodes2
protected

Definition at line 2082 of file IProductWRTDerivBase.cpp.

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

◆ m_nquad0

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_nquad0
protected

Definition at line 2077 of file IProductWRTDerivBase.cpp.

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

◆ m_nquad1

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_nquad1
protected

Definition at line 2078 of file IProductWRTDerivBase.cpp.

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

◆ m_nquad2

const int Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_nquad2
protected

Definition at line 2079 of file IProductWRTDerivBase.cpp.

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

◆ m_sortTopVertex

bool Nektar::Collections::IProductWRTDerivBase_SumFac_Pyr::m_sortTopVertex
protected

Definition at line 2094 of file IProductWRTDerivBase.cpp.

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