ASMu3Dmx::assembleL2matrices: support for a separate geometry basis
This commit is contained in:
parent
9f399aa78d
commit
0576f121b0
@ -791,9 +791,13 @@ size_t ASMu3D::getNoBoundaryElms (char lIndex, char ldim) const
|
|||||||
|
|
||||||
|
|
||||||
void ASMu3D::getGaussPointParameters (RealArray& uGP, int dir, int nGauss,
|
void ASMu3D::getGaussPointParameters (RealArray& uGP, int dir, int nGauss,
|
||||||
int iEl, const double* xi) const
|
int iEl, const double* xi,
|
||||||
|
const LR::LRSplineVolume* spline) const
|
||||||
{
|
{
|
||||||
const LR::Element* el = lrspline->getElement(iEl-1);
|
if (!spline)
|
||||||
|
spline = lrspline.get();
|
||||||
|
|
||||||
|
const LR::Element* el = spline->getElement(iEl-1);
|
||||||
double start = el->getParmin(dir);
|
double start = el->getParmin(dir);
|
||||||
double stop = el->getParmax(dir);
|
double stop = el->getParmax(dir);
|
||||||
|
|
||||||
|
@ -601,8 +601,10 @@ protected:
|
|||||||
//! \param[in] nGauss Number of Gauss points along a knot-span
|
//! \param[in] nGauss Number of Gauss points along a knot-span
|
||||||
//! \param[in] iel 1-based element index
|
//! \param[in] iel 1-based element index
|
||||||
//! \param[in] xi Dimensionless Gauss point coordinates [-1,1]
|
//! \param[in] xi Dimensionless Gauss point coordinates [-1,1]
|
||||||
|
//! \param[in] spline If given get gauss points for this spline instead of integration basis
|
||||||
void getGaussPointParameters(RealArray& uGP, int dir, int nGauss,
|
void getGaussPointParameters(RealArray& uGP, int dir, int nGauss,
|
||||||
int iel, const double* xi) const;
|
int iel, const double* xi,
|
||||||
|
const LR::LRSplineVolume* spline = nullptr) const;
|
||||||
|
|
||||||
//! \brief Calculates parameter values for the Greville points.
|
//! \brief Calculates parameter values for the Greville points.
|
||||||
//! \param[out] prm Parameter values in given direction for all points
|
//! \param[out] prm Parameter values in given direction for all points
|
||||||
|
@ -110,9 +110,9 @@ bool ASMu3D::assembleL2matrices (SparseMatrix& A, StdVector& B,
|
|||||||
{
|
{
|
||||||
size_t nnod = this->getNoProjectionNodes();
|
size_t nnod = this->getNoProjectionNodes();
|
||||||
|
|
||||||
const LR::LRSplineVolume* itg = this->getBasis(ASM::INTEGRATION_BASIS);
|
const LR::LRSplineVolume* geo = this->getBasis(ASM::GEOMETRY_BASIS);
|
||||||
const LR::LRSplineVolume* proj = this->getBasis(ASM::PROJECTION_BASIS);
|
const LR::LRSplineVolume* proj = this->getBasis(ASM::PROJECTION_BASIS);
|
||||||
const bool separateProjBasis = proj != itg;
|
const bool separateProjBasis = proj != geo;
|
||||||
const bool useModelMNPC = !separateProjBasis && this->getNoBasis() == 1;
|
const bool useModelMNPC = !separateProjBasis && this->getNoBasis() == 1;
|
||||||
|
|
||||||
const int p1 = proj->order(0);
|
const int p1 = proj->order(0);
|
||||||
@ -157,7 +157,8 @@ bool ASMu3D::assembleL2matrices (SparseMatrix& A, StdVector& B,
|
|||||||
Go::BasisDerivs spl2;
|
Go::BasisDerivs spl2;
|
||||||
int ielp = group[t][e];
|
int ielp = group[t][e];
|
||||||
const LR::Element* elm = proj->getElement(ielp);
|
const LR::Element* elm = proj->getElement(ielp);
|
||||||
int iel = lrspline->getElementContaining(elm->midpoint())+1;
|
int iel = lrspline->getElementContaining(elm->midpoint()) + 1;
|
||||||
|
int ielG = geo->getElementContaining(elm->midpoint()) + 1;
|
||||||
|
|
||||||
if (continuous)
|
if (continuous)
|
||||||
{
|
{
|
||||||
@ -165,17 +166,17 @@ bool ASMu3D::assembleL2matrices (SparseMatrix& A, StdVector& B,
|
|||||||
if (!this->getElementCoordinates(Xnod,iel)) {
|
if (!this->getElementCoordinates(Xnod,iel)) {
|
||||||
ok = false;
|
ok = false;
|
||||||
continue;
|
continue;
|
||||||
} else if ((dV = 0.125*this->getParametricVolume(iel)) < 0.0) {
|
} else if ((dV = 0.125*elm->volume()) < 0.0) {
|
||||||
ok = false; // topology error (probably logic error)
|
ok = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute parameter values of the Gauss points over this element
|
// Compute parameter values of the Gauss points over this element
|
||||||
std::array<RealArray,3> gpar, unstrGpar;
|
std::array<RealArray,3> gpar, unstrGpar;
|
||||||
this->getGaussPointParameters(gpar[0],0,ng1,iel,xg);
|
this->getGaussPointParameters(gpar[0],0,ng1,ielp+1,xg,proj);
|
||||||
this->getGaussPointParameters(gpar[1],1,ng2,iel,yg);
|
this->getGaussPointParameters(gpar[1],1,ng2,ielp+1,yg,proj);
|
||||||
this->getGaussPointParameters(gpar[2],2,ng3,iel,zg);
|
this->getGaussPointParameters(gpar[2],2,ng3,ielp+1,zg,proj);
|
||||||
expandTensorGrid(gpar.data(),unstrGpar.data());
|
expandTensorGrid(gpar.data(),unstrGpar.data());
|
||||||
|
|
||||||
// Evaluate the secondary solution at all integration points
|
// Evaluate the secondary solution at all integration points
|
||||||
@ -200,7 +201,7 @@ bool ASMu3D::assembleL2matrices (SparseMatrix& A, StdVector& B,
|
|||||||
{
|
{
|
||||||
if (continuous)
|
if (continuous)
|
||||||
{
|
{
|
||||||
itg->computeBasis(gpar[0][i],gpar[1][j],gpar[2][k],spl2,iel-1);
|
geo->computeBasis(gpar[0][i],gpar[1][j],gpar[2][k],spl2,ielG-1);
|
||||||
SplineUtils::extractBasis(spl2,phi,dNdu);
|
SplineUtils::extractBasis(spl2,phi,dNdu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user