void MeshSurfaceExtraction::get2DSurfaceElements(const std::vector<MeshLib::Element*> &all_elements, std::vector<MeshLib::Element*> &sfc_elements, const MathLib::Vector3 &dir, double angle, unsigned mesh_dimension) { if (mesh_dimension<2 || mesh_dimension>3) ERR("Cannot handle meshes of dimension %i", mesh_dimension); bool const complete_surface = (MathLib::scalarProduct(dir, dir) == 0); double const pi (boost::math::constants::pi<double>()); double const cos_theta (std::cos(angle * pi / 180.0)); MathLib::Vector3 const norm_dir (dir.getNormalizedVector()); for (auto elem = all_elements.cbegin(); elem != all_elements.cend(); ++elem) { const unsigned element_dimension ((*elem)->getDimension()); if (element_dimension < mesh_dimension) continue; if (element_dimension == 2) { if (!complete_surface) { MeshLib::Element* face = *elem; if (MathLib::scalarProduct(FaceRule::getSurfaceNormal(face).getNormalizedVector(), norm_dir) > cos_theta) continue; } sfc_elements.push_back(*elem); } else { if (!(*elem)->isBoundaryElement()) continue; const unsigned nFaces ((*elem)->getNFaces()); for (unsigned j=0; j<nFaces; ++j) { if ((*elem)->getNeighbor(j) != nullptr) continue; auto const face = std::unique_ptr<MeshLib::Element const>{(*elem)->getFace(j)}; if (!complete_surface) { if (MathLib::scalarProduct(FaceRule::getSurfaceNormal(face.get()).getNormalizedVector(), norm_dir) < cos_theta) { continue; } } if (face->getGeomType() == MeshElemType::TRIANGLE) sfc_elements.push_back(new MeshLib::Tri(*static_cast<const MeshLib::Tri*>(face.get()))); else sfc_elements.push_back(new MeshLib::Quad(*static_cast<const MeshLib::Quad*>(face.get()))); } } } }
const Node* Element::getNode(unsigned i) const { #ifndef NDEBUG if (i < getNumberOfNodes()) #endif return _nodes[i]; #ifndef NDEBUG ERR("Error in MeshLib::Element::getNode() - Index %d in %s", i, MeshElemType2String(getGeomType()).c_str()); return nullptr; #endif }