FuncSpaceData FuncSpaceData::getForNonSerendipitySpace() const { if(!_serendipity) return *this; int type = elementType(); bool serendip = false; if(type == TYPE_PYR) return FuncSpaceData(true, _tag, _pyramidalSpace, _nij, _nk, &serendip); else return FuncSpaceData(true, _tag, _spaceOrder, &serendip); }
FuncSpaceData FuncSpaceData::getForPrimaryElement() const { int type = elementType(); int primTag = ElementType::getType(type, 1, elementIsOnlySerendipity()); if(primTag == _tag) return *this; if(type == TYPE_PYR) return FuncSpaceData(true, primTag, _pyramidalSpace, _nij, _nk, &_serendipity); else return FuncSpaceData(true, primTag, _spaceOrder, &_serendipity); }
double taylorDistanceFace(MElement *el, GFace *gf) { const int nV = el->getNumVertices(); const GradientBasis *gb = BasisFactory::getGradientBasis(FuncSpaceData(el)); // Coordinates of vertices fullMatrix<double> nodesXYZ(nV, 3); el->getNodesCoord(nodesXYZ); // Normal to CAD at vertices std::vector<SVector3> normCAD(nV); for (int i=0; i<nV; i++) { SPoint2 pCAD; reparamMeshVertexOnFace(el->getVertex(i), gf, pCAD); normCAD[i] = gf->normal(pCAD); normCAD[i].normalize(); } // Compute distance return sqrt(taylorDistanceSq2D(gb, nodesXYZ, normCAD)); }
double taylorDistanceEdge(MLine *l, GEdge *ge) { const int nV = l->getNumVertices(); const GradientBasis *gb = BasisFactory::getGradientBasis(FuncSpaceData(l)); // Coordinates of vertices fullMatrix<double> nodesXYZ(nV, 3); l->getNodesCoord(nodesXYZ); // Tangent to CAD at vertices std::vector<SVector3> tanCAD(nV); for (int i=0; i<nV; i++) { double tCAD; reparamMeshVertexOnEdge(l->getVertex(i), ge, tCAD); tanCAD[i] = ge->firstDer(tCAD); tanCAD[i].normalize(); } // Compute distance return sqrt(taylorDistanceSq1D(gb, nodesXYZ, tanCAD)); }