LCOV - code coverage report
Current view: top level - src/auxkernels - NodalPatchRecoveryAuxBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 31 37 83.8 %
Date: 2025-07-17 01:28:37 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.14