bool ASMu2D::getGrevilleParameters (RealArray& prm, int dir) const { if (!lrspline || dir < 0 || dir > 1) return false; prm.clear(); prm.reserve(lrspline->nBasisFunctions()); for(LR::Basisfunction *b : lrspline->getAllBasisfunctions()) prm.push_back(b->getGrevilleParameter()[dir]); return true; }
bool SplineField2D::valueGrid (RealArray& val, const int* npe) const { val.clear(); if (!basis) return false; // Compute parameter values of the visualization points std::array<RealArray,2> gpar; for (int dir = 0; dir < 2; dir++) { int nSegPerSpan = npe[dir] - 1; if (nSegPerSpan < 1) return false; RealArray::const_iterator uit = basis->basis(dir).begin(); double ucurr = 0.0, uprev = *(uit++); while (uit != basis->basis(dir).end()) { ucurr = *(uit++); if (ucurr > uprev) if (nSegPerSpan == 1) gpar[dir].push_back(uprev); else for (int i = 0; i < nSegPerSpan; i++) { double xg = (double)(2*i-nSegPerSpan)/(double)nSegPerSpan; gpar[dir].push_back(0.5*(ucurr*(1.0+xg) + uprev*(1.0-xg))); } uprev = ucurr; } if (ucurr > gpar[dir].back()) gpar[dir].push_back(ucurr); } // Evaluate the field in the visualization points val.reserve(gpar[0].size()*gpar[1].size()); for (size_t j = 0; j < gpar[1].size(); j++) for (size_t i = 0; i < gpar[0].size(); i++) { Go::BasisPtsSf spline; basis->computeBasis(gpar[0][i],gpar[1][j],spline); IntVec ip; ASMs2D::scatterInd(basis->numCoefs_u(),basis->numCoefs_v(), basis->order_u(),basis->order_v(), spline.left_idx,ip); Vector Vnod; utl::gather(ip,1,values,Vnod); val.push_back(Vnod.dot(spline.basisValues)); } return true; }
void FieldsFuncBase::addPatchField (ASMbase* pch, const RealArrays& coefs) { if (coefs.size() == 1) field.push_back(Fields::create(pch,coefs.front(),1,pch->getNoFields(1))); else if (coefs.size() > 1) { RealArray coef; coef.reserve(coefs.size()*coefs.front().size()); for (size_t i = 0; i < coefs.front().size(); i++) for (size_t j = 0; j < coefs.size(); j++) coef.push_back(coefs[j][i]); field.push_back(Fields::create(pch,coef,1,pch->getNoFields(1))); } }