bool ASMs1D::getGridParameters (RealArray& prm, int nSegPerSpan) const { if (!curv) return false; if (nSegPerSpan < 1) { std::cerr <<" *** ASMs1D::getGridParameters: Too few knot-span points " << nSegPerSpan+1 << std::endl; return false; } RealArray::const_iterator uit = curv->basis().begin(); double ucurr = 0.0, uprev = *(uit++); while (uit != curv->basis().end()) { ucurr = *(uit++); if (ucurr > uprev) if (nSegPerSpan == 1) prm.push_back(uprev); else for (int i = 0; i < nSegPerSpan; i++) { double xg = (double)(2*i-nSegPerSpan)/(double)nSegPerSpan; prm.push_back(0.5*(ucurr*(1.0+xg) + uprev*(1.0-xg))); } uprev = ucurr; } if (ucurr > prm.back()) prm.push_back(ucurr); return true; }
bool ASMs1D::refine (const RealArray& xi) { if (!curv || xi.empty()) return false; if (xi.front() < 0.0 || xi.back() > 1.0) return false; if (shareFE) return true; RealArray extraKnots; RealArray::const_iterator uit = curv->basis().begin(); double ucurr, uprev = *(uit++); while (uit != curv->basis().end()) { ucurr = *(uit++); if (ucurr > uprev) for (size_t i = 0; i < xi.size(); i++) if (i > 0 && xi[i] < xi[i-1]) return false; else extraKnots.push_back(ucurr*xi[i] + uprev*(1.0-xi[i])); uprev = ucurr; } curv->insertKnot(extraKnots); return true; }
static void assemSparse (const RealArray& V, SparseMatrix& SM, size_t col, const IntVec& mnen, const int* meqn, const int* mpmceq, const int* mmceq, const Real* ttcc) { for (size_t d = 0; d < mnen.size(); d++, col++) { Real vd = d < V.size() ? V[d] : V.back(); int ieq = mnen[d]; int ceq = -ieq; if (ieq > 0) SM(ieq,col) += vd; else if (ceq > 0) for (int ip = mpmceq[ceq-1]; ip < mpmceq[ceq]-1; ip++) { ieq = meqn[mmceq[ip]-1]; SM(ieq,col) += vd; } } }