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 "NodalPatchRecoveryAuxBase.h" 11 : 12 : InputParameters 13 30905 : NodalPatchRecoveryAuxBase::validParams() 14 : { 15 30905 : InputParameters params = AuxKernel::validParams(); 16 30905 : params.addClassDescription("This Auxkernel solves a least squares problem at each node to fit a " 17 : "value from quantities defined on quadrature points."); 18 30905 : params.addRequiredParam<UserObjectName>( 19 : "nodal_patch_recovery_uo", 20 : "The name of the userobject that sets up the least squares problem of the nodal patch."); 21 30905 : return params; 22 0 : } 23 : 24 1235 : NodalPatchRecoveryAuxBase::NodalPatchRecoveryAuxBase(const InputParameters & parameters) 25 1235 : : AuxKernel(parameters) 26 : { 27 1235 : if (!isNodal()) 28 0 : mooseError(name(), " only runs on nodal variables."); 29 1235 : } 30 : 31 : Real 32 98840 : NodalPatchRecoveryAuxBase::computeValue() 33 : { 34 : // get node-to-conneted-elem map 35 98840 : const auto & node_to_elem_map = _mesh.nodeToElemMap(); 36 98840 : auto node_to_elem_pair = node_to_elem_map.find(_current_node->id()); 37 : mooseAssert(node_to_elem_pair != node_to_elem_map.end(), "Missing entry in node to elem map"); 38 : 39 98840 : _elem_ids.clear(); 40 98840 : blockRestrictElements(_elem_ids, node_to_elem_pair->second); 41 : 42 : // consider the case for corner node 43 98840 : if (_elem_ids.size() == 1) 44 : { 45 15200 : const dof_id_type elem_id = _elem_ids[0]; 46 76000 : for (auto & n : _mesh.elemPtr(elem_id)->node_ref_range()) 47 : { 48 60800 : node_to_elem_pair = node_to_elem_map.find(n.id()); 49 60800 : std::vector<dof_id_type> elem_ids_candidate = node_to_elem_pair->second; 50 60800 : if (elem_ids_candidate.size() > _elem_ids.size()) 51 : { 52 26600 : std::vector<dof_id_type> elem_ids_candidate_restricted; 53 26600 : blockRestrictElements(elem_ids_candidate_restricted, elem_ids_candidate); 54 : 55 26600 : if (elem_ids_candidate_restricted.size() > _elem_ids.size()) 56 26600 : _elem_ids = elem_ids_candidate_restricted; 57 26600 : } 58 60800 : } 59 : } 60 : 61 : // get the value from a userobject (overridden in derived class) 62 197680 : return nodalPatchRecovery(); 63 : } 64 : 65 : void 66 125440 : NodalPatchRecoveryAuxBase::blockRestrictElements( 67 : std::vector<dof_id_type> & elem_ids, 68 : const std::vector<dof_id_type> & node_to_elem_pair_elems) const 69 : { 70 125440 : if (blockRestricted()) 71 0 : for (auto elem_id : node_to_elem_pair_elems) 72 : { 73 0 : for (const auto block_id : blockIDs()) 74 0 : if (block_id == _mesh.elemPtr(elem_id)->subdomain_id()) 75 0 : elem_ids.push_back(elem_id); 76 : } 77 : else 78 125440 : elem_ids = node_to_elem_pair_elems; 79 125440 : }