Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 3 : //* 4 : //* All rights reserved, see COPYRIGHT for full restrictions 5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT 6 : //* 7 : //* Licensed under LGPL 2.1, please see LICENSE for details 8 : //* https://www.gnu.org/licenses/lgpl-2.1.html 9 : 10 : #include "ElemExtrema.h" 11 : 12 : // libMesh includes 13 : #include "libmesh/elem.h" 14 : 15 : const Point & 16 2 : ElemExtrema::vertexPoint(const libMesh::Elem * elem) const 17 : { 18 2 : return elem->point(vertex()); 19 : } 20 : 21 : std::unique_ptr<const libMesh::Elem> 22 4 : ElemExtrema::buildEdge(const libMesh::Elem * elem) const 23 : { 24 : mooseAssert(atEdge(), "Did not intersect edge"); 25 : mooseAssert(first < elem->n_vertices(), "Invalid first vertex for given element"); 26 : mooseAssert(second < elem->n_vertices(), "Invalid second vertex for given element"); 27 : 28 4 : for (const auto e : elem->edge_index_range()) 29 2 : if (elem->is_node_on_edge(first, e) && elem->is_node_on_edge(second, e)) 30 2 : return elem->build_edge_ptr(e); 31 : 32 2 : mooseError("Element does not contain vertices in ElemExtrema"); 33 : } 34 : 35 : std::string 36 12 : ElemExtrema::print() const 37 : { 38 12 : std::stringstream oss; 39 : if (atVertex()) 40 10 : oss << "at vertex " << vertex(); 41 : else if (atEdge()) 42 1 : oss << "at edge with vertices " << first << " and " << second; 43 : else 44 1 : oss << "not at extrema"; 45 12 : return oss.str(); 46 12 : } 47 : 48 : bool 49 3 : ElemExtrema::isValid(const Elem * const elem, const Point & point) const 50 : { 51 : mooseAssert(first == RayTracingCommon::invalid_vertex || first < elem->n_vertices(), 52 : "Invalid first vertex for given element"); 53 : mooseAssert(second == RayTracingCommon::invalid_vertex || second < elem->n_vertices(), 54 : "Invalid second vertex for given element"); 55 : 56 : if (atVertex()) 57 1 : return vertexPoint(elem).absolute_fuzzy_equals(point); 58 2 : if (elem->dim() == 3 && atEdge()) 59 1 : return buildEdge(elem)->contains_point(point); 60 : 61 : return true; 62 : } 63 : 64 : std::ostream & 65 12 : operator<<(std::ostream & os, const ElemExtrema & elem_extrema) 66 : { 67 12 : os << elem_extrema.print(); 68 12 : return os; 69 : }