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 "ElemSideNeighborLayersTester.h" 11 : #include "MooseMesh.h" 12 : 13 : // invalid_processor_id 14 : #include "libmesh/dof_object.h" 15 : 16 : registerMooseObject("MooseApp", ElemSideNeighborLayersTester); 17 : 18 : InputParameters 19 44162 : ElemSideNeighborLayersTester::validParams() 20 : { 21 44162 : InputParameters params = ElementUOProvider::validParams(); 22 44162 : params.addParam<unsigned int>( 23 : "rank", 24 : libMesh::DofObject::invalid_processor_id, 25 : "The rank for which the ghosted elements are recorded (Default: ALL)"); 26 : 27 44162 : params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN; 28 : 29 44162 : params.addRelationshipManager( 30 : "ElementSideNeighborLayers", 31 : Moose::RelationshipManagerType::GEOMETRIC | Moose::RelationshipManagerType::ALGEBRAIC, 32 : 33 0 : [](const InputParameters & obj_params, InputParameters & rm_params) 34 : { 35 900 : rm_params.set<unsigned short>("layers") = 36 900 : obj_params.get<unsigned short>("element_side_neighbor_layers"); 37 900 : } 38 : 39 : ); 40 : 41 44162 : params.addRequiredParam<unsigned short>("element_side_neighbor_layers", 42 : "Number of layers to ghost"); 43 : 44 44162 : params.addClassDescription("User object to calculate ghosted elements on a single processor or " 45 : "the union across all processors."); 46 44162 : return params; 47 0 : } 48 : 49 679 : ElemSideNeighborLayersTester::ElemSideNeighborLayersTester(const InputParameters & parameters) 50 679 : : ElementUOProvider(parameters), _rank(getParam<unsigned int>("rank")) 51 : { 52 679 : } 53 : 54 : void 55 614 : ElemSideNeighborLayersTester::initialize() 56 : { 57 614 : _ghost_data.clear(); 58 614 : } 59 : 60 : void 61 614 : ElemSideNeighborLayersTester::execute() 62 : { 63 614 : auto my_processor_id = processor_id(); 64 : 65 614 : if (_rank == libMesh::DofObject::invalid_processor_id || my_processor_id == _rank) 66 : { 67 313669 : for (const auto & current_elem : _fe_problem.getNonlinearEvaluableElementRange()) 68 313435 : _evaluable_data.emplace(current_elem->id()); 69 : 70 234 : const auto & mesh = _subproblem.mesh().getMesh(); 71 : 72 934996 : for (const auto & elem : mesh.active_element_ptr_range()) 73 467381 : if (elem->processor_id() != my_processor_id) 74 160105 : _ghost_data.emplace(elem->id()); 75 : } 76 614 : } 77 : 78 : void 79 614 : ElemSideNeighborLayersTester::finalize() 80 : { 81 614 : _communicator.set_union(_ghost_data); 82 614 : _communicator.set_union(_evaluable_data); 83 614 : } 84 : 85 : unsigned long 86 7154172 : ElemSideNeighborLayersTester::getElementalValueLong(dof_id_type element_id, 87 : const std::string & field_name) const 88 : { 89 7154172 : if (field_name == "evaluable") 90 33264 : return _evaluable_data.find(element_id) != _evaluable_data.end(); 91 7120908 : else if (field_name == "ghosted") 92 7120908 : return _ghost_data.find(element_id) != _ghost_data.end(); 93 : 94 0 : return std::numeric_limits<unsigned long>::max(); 95 : }