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 11251 : GhostHigherDLowerDPointNeighbors::validParams() 28 : { 29 11251 : InputParameters params = RelationshipManager::validParams(); 30 11251 : params.set<bool>("attach_geometric_early") = false; 31 11251 : return params; 32 0 : } 33 : 34 3666 : GhostHigherDLowerDPointNeighbors::GhostHigherDLowerDPointNeighbors(const InputParameters & params) 35 3666 : : RelationshipManager(params) 36 : { 37 3666 : } 38 : 39 858 : GhostHigherDLowerDPointNeighbors::GhostHigherDLowerDPointNeighbors( 40 858 : const GhostHigherDLowerDPointNeighbors & other) 41 858 : : RelationshipManager(other) 42 : { 43 858 : } 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 248 : 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 248 : const auto & node_to_elem_map = _moose_mesh->nodeToElemMap(); 62 : 63 : static const CouplingMatrix * const null_mat = nullptr; 64 248 : const auto mesh_dim = _mesh->mesh_dimension(); 65 248 : std::unordered_set<dof_id_type> visited_nodes; 66 : 67 20334 : for (const Elem * const elem : as_range(range_begin, range_end)) 68 : { 69 10043 : if (elem->dim() != mesh_dim) 70 : // not a higher-dimensional element 71 1419 : continue; 72 : 73 61745 : for (const auto & node : elem->node_ref_range()) 74 : { 75 : // We want to ghost the adjoining lower-d elements if the node hasn't been partitioned yet 76 : // (e.g. we don't know what processes it will be) or if its processor id matches our 77 : // processes's id 78 53121 : const auto node_pid = node.processor_id(); 79 53121 : if (node_pid == p || node_pid == DofObject::invalid_processor_id) 80 : { 81 50674 : const auto [_, inserted] = visited_nodes.insert(node.id()); 82 50674 : if (!inserted) 83 : // We've already considered this node 84 36768 : continue; 85 : 86 13906 : const auto & elem_node_neighbors = libmesh_map_find(node_to_elem_map, node.id()); 87 71751 : for (const auto elem_id : elem_node_neighbors) 88 : { 89 57845 : const Elem * const elem_node_neighbor = _mesh->elem_ptr(elem_id); 90 57845 : if (elem_node_neighbor->dim() != mesh_dim && elem_node_neighbor->processor_id() != p) 91 170 : coupled_elements.emplace(elem_node_neighbor, null_mat); 92 : } 93 : } 94 : } 95 248 : } 96 248 : } 97 : 98 : bool 99 17256 : GhostHigherDLowerDPointNeighbors::operator>=(const RelationshipManager & other) const 100 : { 101 31605 : return dynamic_cast<const GhostHigherDLowerDPointNeighbors *>(&other) || 102 31605 : dynamic_cast<const GhostLowerDElems *>(&other); 103 : } 104 : 105 : std::unique_ptr<GhostingFunctor> 106 858 : GhostHigherDLowerDPointNeighbors::clone() const 107 : { 108 858 : return _app.getFactory().copyConstruct(*this); 109 : }