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 8705 : NodalPatchRecoveryAuxBase::validParams() 14 : { 15 8705 : InputParameters params = AuxKernel::validParams(); 16 17410 : params.addClassDescription("This Auxkernel solves a least squares problem at each node to fit a " 17 : "value from quantities defined on quadrature points."); 18 26115 : 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 8705 : return params; 22 0 : } 23 : 24 1315 : NodalPatchRecoveryAuxBase::NodalPatchRecoveryAuxBase(const InputParameters & parameters) 25 1315 : : AuxKernel(parameters) 26 : { 27 1315 : if (!isNodal()) 28 0 : mooseError(name(), " only runs on nodal variables."); 29 1315 : } 30 : 31 : Real 32 131200 : NodalPatchRecoveryAuxBase::computeValue() 33 : { 34 : // get node-to-conneted-elem map 35 131200 : const auto & node_to_elem_map = _mesh.nodeToElemMap(); 36 131200 : 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 131200 : _elem_ids.clear(); 40 131200 : blockRestrictElements(_elem_ids, node_to_elem_pair->second); 41 : 42 : // consider the case for corner node 43 131200 : if (_elem_ids.size() == 1) 44 : { 45 15908 : const dof_id_type elem_id = _elem_ids[0]; 46 80852 : for (auto & n : _mesh.elemPtr(elem_id)->node_ref_range()) 47 : { 48 64944 : node_to_elem_pair = node_to_elem_map.find(n.id()); 49 64944 : std::vector<dof_id_type> elem_ids_candidate = node_to_elem_pair->second; 50 64944 : if (elem_ids_candidate.size() > _elem_ids.size()) 51 : { 52 28044 : std::vector<dof_id_type> elem_ids_candidate_restricted; 53 28044 : blockRestrictElements(elem_ids_candidate_restricted, elem_ids_candidate); 54 : 55 28044 : if (elem_ids_candidate_restricted.size() > _elem_ids.size()) 56 28044 : _elem_ids = elem_ids_candidate_restricted; 57 28044 : } 58 64944 : } 59 : } 60 : 61 : // get the value from a userobject (overridden in derived class) 62 262400 : return nodalPatchRecovery(); 63 : } 64 : 65 : void 66 159244 : 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 159244 : 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 159244 : elem_ids = node_to_elem_pair_elems; 79 159244 : }