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 44027 : ElemSideNeighborLayersTester::validParams() 20 : { 21 44027 : InputParameters params = ElementUOProvider::validParams(); 22 44027 : 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 44027 : params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN; 28 : 29 44027 : params.addRelationshipManager( 30 : "ElementSideNeighborLayers", 31 : Moose::RelationshipManagerType::GEOMETRIC | Moose::RelationshipManagerType::ALGEBRAIC, 32 : 33 0 : [](const InputParameters & obj_params, InputParameters & rm_params) 34 : { 35 813 : rm_params.set<unsigned short>("layers") = 36 813 : obj_params.get<unsigned short>("element_side_neighbor_layers"); 37 813 : } 38 : 39 : ); 40 : 41 44027 : params.addRequiredParam<unsigned short>("element_side_neighbor_layers", 42 : "Number of layers to ghost"); 43 : 44 44027 : params.addClassDescription("User object to calculate ghosted elements on a single processor or " 45 : "the union across all processors."); 46 44027 : return params; 47 0 : } 48 : 49 612 : ElemSideNeighborLayersTester::ElemSideNeighborLayersTester(const InputParameters & parameters) 50 612 : : ElementUOProvider(parameters), _rank(getParam<unsigned int>("rank")) 51 : { 52 612 : } 53 : 54 : void 55 547 : ElemSideNeighborLayersTester::initialize() 56 : { 57 547 : _ghost_data.clear(); 58 547 : } 59 : 60 : void 61 547 : ElemSideNeighborLayersTester::execute() 62 : { 63 547 : auto my_processor_id = processor_id(); 64 : 65 547 : if (_rank == libMesh::DofObject::invalid_processor_id || my_processor_id == _rank) 66 : { 67 278824 : for (const auto & current_elem : _fe_problem.getNonlinearEvaluableElementRange()) 68 278615 : _evaluable_data.emplace(current_elem->id()); 69 : 70 209 : const auto & mesh = _subproblem.mesh().getMesh(); 71 : 72 831107 : for (const auto & elem : mesh.active_element_ptr_range()) 73 415449 : if (elem->processor_id() != my_processor_id) 74 142312 : _ghost_data.emplace(elem->id()); 75 : } 76 547 : } 77 : 78 : void 79 547 : ElemSideNeighborLayersTester::finalize() 80 : { 81 547 : _communicator.set_union(_ghost_data); 82 547 : _communicator.set_union(_evaluable_data); 83 547 : } 84 : 85 : unsigned long 86 6359260 : ElemSideNeighborLayersTester::getElementalValueLong(dof_id_type element_id, 87 : const std::string & field_name) const 88 : { 89 6359260 : if (field_name == "evaluable") 90 29568 : return _evaluable_data.find(element_id) != _evaluable_data.end(); 91 6329692 : else if (field_name == "ghosted") 92 6329692 : return _ghost_data.find(element_id) != _ghost_data.end(); 93 : 94 0 : return std::numeric_limits<unsigned long>::max(); 95 : }