changed: move bezier bases to protected scope

and some reorganization of calculations to fix usage
with shared models and mixed
This commit is contained in:
Arne Morten Kvarving 2018-11-29 10:49:20 +01:00
parent c2162ab8db
commit b3b7846332
3 changed files with 39 additions and 14 deletions

View File

@ -543,11 +543,7 @@ bool ASMu2D::generateFEMTopology ()
nnod = lrspline->nBasisFunctions();
nel = lrspline->nElements();
const int p1 = lrspline->order(0);
const int p2 = lrspline->order(1);
bezier_u = getBezierBasis(p1);
bezier_v = getBezierBasis(p2);
this->generateBezierBasis();
if (!MLGN.empty()) {
if (MLGN.size() != nnod)
@ -567,11 +563,9 @@ bool ASMu2D::generateFEMTopology ()
myMLGE.resize(nel);
myMNPC.resize(nel);
myBezierExtract.resize(nel);
lrspline->generateIDs();
size_t iel = 0;
RealArray extrMat;
for (const LR::Element* elm : lrspline->getAllElements())
{
myMLGE[iel] = ++gEl; // global element number over all patches
@ -580,17 +574,14 @@ bool ASMu2D::generateFEMTopology ()
int lnod = 0;
for (LR::Basisfunction* b : elm->support())
myMNPC[iel][lnod++] = b->getId();
// Get bezier extraction matrix
PROFILE1("Bezier extraction");
lrspline->getBezierExtraction(iel,extrMat);
myBezierExtract[iel].resize(elm->nBasisFunctions(),p1*p2);
myBezierExtract[iel++].fill(extrMat.data(),extrMat.size());
++iel;
}
for (size_t inod = 0; inod < nnod; inod++)
myMLGN[inod] = ++gNod;
this->generateBezierExtraction();
return true;
}
@ -2517,3 +2508,29 @@ bool ASMu2D::refine (const LR::RefineData& prm,
<< std::endl;
return true;
}
void ASMu2D::generateBezierBasis()
{
bezier_u = this->getBezierBasis(geo->order(0));
bezier_v = this->getBezierBasis(geo->order(1));
}
void ASMu2D::generateBezierExtraction()
{
const int p1 = geo->order(0);
const int p2 = geo->order(1);
myBezierExtract.resize(nel);
RealArray extrMat;
int iel = 0;
for (const LR::Element* elm : geo->getAllElements())
{
// Get bezier extraction matrix
PROFILE1("Bezier extraction");
geo->getBezierExtraction(iel,extrMat);
myBezierExtract[iel].resize(elm->nBasisFunctions(),p1*p2);
myBezierExtract[iel++].fill(extrMat.data(),extrMat.size());
}
}

View File

@ -582,6 +582,12 @@ protected:
//! \brief Converts current tensor spline object to LR-spline.
LR::LRSplineSurface* createLRfromTensor();
//! \brief Generate bezier basis.
void generateBezierBasis();
//! \brief Generate bezier extraction operators.
void generateBezierExtraction();
public:
//! \brief Returns the number of elements on a boundary.
virtual size_t getNoBoundaryElms(char lIndex, char ldim) const;
@ -605,10 +611,10 @@ protected:
const Matrices& bezierExtract; //!< Bezier extraction matrices
Matrices myBezierExtract; //!< Bezier extraction matrices
private:
Go::BsplineBasis bezier_u; //!< Bezier basis in the u-direction
Go::BsplineBasis bezier_v; //!< Bezier basis in the v-direction
private:
mutable double aMin; //!< Minimum element area for adaptive refinement
};

View File

@ -279,6 +279,8 @@ bool ASMu2Dmx::generateFEMTopology ()
#endif
geo = m_basis[geoBasis-1].get();
this->generateBezierBasis();
this->generateBezierExtraction();
return true;
}