added: support for Integrand::AVERAGE flag in LR integrands
This commit is contained in:
parent
4a347ed412
commit
a4b38fff9d
@ -1187,6 +1187,32 @@ bool ASMu2D::integrate (Integrand& integrand,
|
||||
dXidu[1] = el->vmax() - el->vmin();
|
||||
}
|
||||
|
||||
if (integrand.getIntegrandType() & Integrand::AVERAGE)
|
||||
{
|
||||
// --- Compute average value of basis functions over the element -----
|
||||
|
||||
fe.Navg.resize(el->support().size(), true);
|
||||
double area = 0.0;
|
||||
int ip = (iel-1)*nGP*nGP;
|
||||
for (int j = 0; j < nGP; j++)
|
||||
for (int i = 0; i < nGP; i++, ip++)
|
||||
{
|
||||
SplineUtils::extractBasis(spline1[ip],fe.N,dNdu);
|
||||
|
||||
// Compute Jacobian determinant of coordinate mapping
|
||||
// and multiply by weight of current integration point
|
||||
double detJac = utl::Jacobian(Jac,fe.dNdX,Xnod,dNdu,false);
|
||||
double weight = dA*wg[i]*wg[j];
|
||||
|
||||
// Numerical quadrature
|
||||
fe.Navg.add(fe.N,detJac*weight);
|
||||
area += detJac*weight;
|
||||
}
|
||||
|
||||
// Divide by element area
|
||||
fe.Navg /= area;
|
||||
}
|
||||
|
||||
// Initialize element quantities
|
||||
LocalIntegral* A = integrand.getLocalIntegral(el->support().size(),fe.iel);
|
||||
if (!integrand.initElement(MNPC[iel-1],fe,X,nRed*nRed,*A))
|
||||
|
@ -1089,6 +1089,38 @@ bool ASMu3D::integrate (Integrand& integrand,
|
||||
dXidu[2] = el->getParmin(2);
|
||||
}
|
||||
|
||||
if (integrand.getIntegrandType() & Integrand::AVERAGE)
|
||||
{
|
||||
// --- Compute average value of basis functions over the element -----
|
||||
|
||||
int ip = (iel-1)*nGP*nGP*nGP + firstIp;
|
||||
fe.Navg.resize(el->support().size(),true);
|
||||
double vol = 0.0;
|
||||
int ig = 1;
|
||||
for (int k = 0; k < nGP; k++)
|
||||
for (int j = 0; j < nGP; j++)
|
||||
for (int i = 0; i < nGP; i++, ++ip, ++ig)
|
||||
{
|
||||
B.fillColumn(1, BN.getColumn(ig));
|
||||
B.fillColumn(2, BdNdu.getColumn(ig)*2.0/du);
|
||||
B.fillColumn(3, BdNdv.getColumn(ig)*2.0/dv);
|
||||
B.fillColumn(4, BdNdw.getColumn(ig)*2.0/dw);
|
||||
this->evaluateBasis(fe, dNdu, C, B);
|
||||
|
||||
// Compute Jacobian determinant of coordinate mapping
|
||||
// and multiply by weight of current integration point
|
||||
double detJac = utl::Jacobian(Jac,fe.dNdX,Xnod,dNdu,false);
|
||||
double weight = dV*wg[i]*wg[j]*wg[k];
|
||||
|
||||
// Numerical quadrature
|
||||
fe.Navg.add(fe.N,detJac*weight);
|
||||
vol += detJac*weight;
|
||||
}
|
||||
|
||||
// Divide by element volume
|
||||
fe.Navg /= vol;
|
||||
}
|
||||
|
||||
// Initialize element quantities
|
||||
LocalIntegral* A = integrand.getLocalIntegral(el->support().size(),fe.iel);
|
||||
if (!integrand.initElement(MNPC[iel-1],fe,X,nRed*nRed*nRed,*A))
|
||||
|
Loading…
Reference in New Issue
Block a user