LCOV - code coverage report
Current view: top level - src/auxkernels - NodalPatchRecoveryAuxBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 419b9d Lines: 31 37 83.8 %
Date: 2025-08-08 20:01:16 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       31095 : NodalPatchRecoveryAuxBase::validParams()
      14             : {
      15       31095 :   InputParameters params = AuxKernel::validParams();
      16       31095 :   params.addClassDescription("This Auxkernel solves a least squares problem at each node to fit a "
      17             :                              "value from quantities defined on quadrature points.");
      18       31095 :   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       31095 :   return params;
      22           0 : }
      23             : 
      24        1330 : NodalPatchRecoveryAuxBase::NodalPatchRecoveryAuxBase(const InputParameters & parameters)
      25        1330 :   : AuxKernel(parameters)
      26             : {
      27        1330 :   if (!isNodal())
      28           0 :     mooseError(name(), " only runs on nodal variables.");
      29        1330 : }
      30             : 
      31             : Real
      32      113666 : NodalPatchRecoveryAuxBase::computeValue()
      33             : {
      34             :   // get node-to-conneted-elem map
      35      113666 :   const auto & node_to_elem_map = _mesh.nodeToElemMap();
      36      113666 :   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      113666 :   _elem_ids.clear();
      40      113666 :   blockRestrictElements(_elem_ids, node_to_elem_pair->second);
      41             : 
      42             :   // consider the case for corner node
      43      113666 :   if (_elem_ids.size() == 1)
      44             :   {
      45       17480 :     const dof_id_type elem_id = _elem_ids[0];
      46       87400 :     for (auto & n : _mesh.elemPtr(elem_id)->node_ref_range())
      47             :     {
      48       69920 :       node_to_elem_pair = node_to_elem_map.find(n.id());
      49       69920 :       std::vector<dof_id_type> elem_ids_candidate = node_to_elem_pair->second;
      50       69920 :       if (elem_ids_candidate.size() > _elem_ids.size())
      51             :       {
      52       30590 :         std::vector<dof_id_type> elem_ids_candidate_restricted;
      53       30590 :         blockRestrictElements(elem_ids_candidate_restricted, elem_ids_candidate);
      54             : 
      55       30590 :         if (elem_ids_candidate_restricted.size() > _elem_ids.size())
      56       30590 :           _elem_ids = elem_ids_candidate_restricted;
      57       30590 :       }
      58       69920 :     }
      59             :   }
      60             : 
      61             :   // get the value from a userobject (overridden in derived class)
      62      227332 :   return nodalPatchRecovery();
      63             : }
      64             : 
      65             : void
      66      144256 : 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      144256 :   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      144256 :     elem_ids = node_to_elem_pair_elems;
      79      144256 : }

Generated by: LCOV version 1.14