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 : // App includes 11 : #include "GhostHigherDLowerDPointNeighbors.h" 12 : #include "Executioner.h" 13 : #include "FEProblemBase.h" 14 : #include "MooseApp.h" 15 : #include "GhostLowerDElems.h" 16 : 17 : // libMesh includes 18 : #include "libmesh/elem.h" 19 : #include "libmesh/mesh_base.h" 20 : #include "libmesh/boundary_info.h" 21 : 22 : registerMooseObject("MooseApp", GhostHigherDLowerDPointNeighbors); 23 : 24 : using namespace libMesh; 25 : 26 : InputParameters 27 23226 : GhostHigherDLowerDPointNeighbors::validParams() 28 : { 29 23226 : InputParameters params = RelationshipManager::validParams(); 30 23226 : params.set<bool>("attach_geometric_early") = false; 31 23226 : return params; 32 0 : } 33 : 34 4006 : GhostHigherDLowerDPointNeighbors::GhostHigherDLowerDPointNeighbors(const InputParameters & params) 35 4006 : : RelationshipManager(params) 36 : { 37 4006 : } 38 : 39 949 : GhostHigherDLowerDPointNeighbors::GhostHigherDLowerDPointNeighbors( 40 949 : const GhostHigherDLowerDPointNeighbors & other) 41 949 : : RelationshipManager(other) 42 : { 43 949 : } 44 : 45 : std::string 46 0 : GhostHigherDLowerDPointNeighbors::getInfo() const 47 : { 48 0 : std::ostringstream oss; 49 0 : oss << "GhostHigherDLowerDPointNeighbors"; 50 0 : return oss.str(); 51 0 : } 52 : 53 : void 54 240 : GhostHigherDLowerDPointNeighbors::operator()(const MeshBase::const_element_iterator & range_begin, 55 : const MeshBase::const_element_iterator & range_end, 56 : const processor_id_type p, 57 : map_type & coupled_elements) 58 : { 59 : mooseAssert(_moose_mesh, 60 : "The MOOSE mesh must be non-null in order for this relationship manager to work."); 61 240 : const auto & node_to_elem_map = _moose_mesh->nodeToElemMap(); 62 : 63 : static const CouplingMatrix * const null_mat = nullptr; 64 : 65 19578 : for (const Elem * const elem : as_range(range_begin, range_end)) 66 : { 67 9669 : if (elem->dim() != _mesh->mesh_dimension()) 68 : // not a higher-dimensional element 69 1362 : continue; 70 : 71 60160 : for (const auto & node : elem->node_ref_range()) 72 : { 73 : // We want to ghost the adjoining lower-d elements if the node hasn't been partitioned yet 74 : // (e.g. we don't know what processes it will be) or if its processor id matches our 75 : // processes's id 76 51853 : if (node.processor_id() != p) 77 2339 : continue; 78 : 79 49514 : const auto & elem_node_neighbors = libmesh_map_find(node_to_elem_map, node.id()); 80 335247 : for (const auto elem_id : elem_node_neighbors) 81 : { 82 285733 : const Elem * const elem_node_neighbor = _mesh->elem_ptr(elem_id); 83 300749 : if (elem_node_neighbor->dim() != _mesh->mesh_dimension() && 84 15016 : elem_node_neighbor->processor_id() != p) 85 281 : coupled_elements.emplace(elem_node_neighbor, null_mat); 86 : } 87 : } 88 240 : } 89 240 : } 90 : 91 : bool 92 18786 : GhostHigherDLowerDPointNeighbors::operator>=(const RelationshipManager & other) const 93 : { 94 34408 : return dynamic_cast<const GhostHigherDLowerDPointNeighbors *>(&other) || 95 34408 : dynamic_cast<const GhostLowerDElems *>(&other); 96 : } 97 : 98 : std::unique_ptr<GhostingFunctor> 99 949 : GhostHigherDLowerDPointNeighbors::clone() const 100 : { 101 949 : return _app.getFactory().copyConstruct(*this); 102 : }