LCOV - code coverage report
Current view: top level - src/loops - ComputeNodalAuxVarsThread.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #32971 (54bef8) with base c6cf66 Lines: 60 60 100.0 %
Date: 2026-05-29 20:35:17 Functions: 21 21 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 "ComputeNodalAuxVarsThread.h"
      11             : 
      12             : // MOOSE includes
      13             : #include "AuxiliarySystem.h"
      14             : #include "AuxKernel.h"
      15             : #include "FEProblem.h"
      16             : #include "MooseMesh.h"
      17             : 
      18             : #include "libmesh/threads.h"
      19             : 
      20             : template <typename AuxKernelType>
      21             : Threads::spin_mutex ComputeNodalAuxVarsThread<AuxKernelType>::writable_variable_mutex;
      22             : 
      23             : template <typename AuxKernelType>
      24      136321 : ComputeNodalAuxVarsThread<AuxKernelType>::ComputeNodalAuxVarsThread(
      25             :     FEProblemBase & fe_problem, const MooseObjectWarehouse<AuxKernelType> & storage)
      26             :   : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(fe_problem),
      27      272642 :     _aux_sys(fe_problem.getAuxiliarySystem()),
      28      136321 :     _storage(storage)
      29             : {
      30      136321 : }
      31             : 
      32             : // Splitting Constructor
      33             : template <typename AuxKernelType>
      34       12703 : ComputeNodalAuxVarsThread<AuxKernelType>::ComputeNodalAuxVarsThread(ComputeNodalAuxVarsThread & x,
      35             :                                                                     Threads::split split)
      36             :   : ThreadedNodeLoop<ConstNodeRange, ConstNodeRange::const_iterator>(x, split),
      37       12703 :     _aux_sys(x._aux_sys),
      38       12703 :     _storage(x._storage)
      39             : {
      40       12703 : }
      41             : 
      42             : template <typename AuxKernelType>
      43             : void
      44      340785 : ComputeNodalAuxVarsThread<AuxKernelType>::subdomainChanged()
      45             : {
      46      340785 :   std::set<TagID> needed_vector_tags;
      47      340785 :   std::set<TagID> needed_matrix_tags;
      48             : 
      49      340785 :   const auto & block_kernels = _storage.getActiveBlockObjects(_tid);
      50             : 
      51      760021 :   for (const auto & block : _block_ids)
      52             :   {
      53      419236 :     const auto iter = block_kernels.find(block);
      54             : 
      55      419236 :     if (iter != block_kernels.end())
      56      821170 :       for (const auto & aux : iter->second)
      57             :       {
      58      465535 :         auto & matrix_tags = aux->getFEVariableCoupleableMatrixTags();
      59      465535 :         needed_matrix_tags.insert(matrix_tags.begin(), matrix_tags.end());
      60      465535 :         auto & vector_tags = aux->getFEVariableCoupleableVectorTags();
      61      465535 :         needed_vector_tags.insert(vector_tags.begin(), vector_tags.end());
      62             :       }
      63             :   }
      64             : 
      65      340785 :   _fe_problem.setActiveFEVariableCoupleableMatrixTags(needed_matrix_tags, _tid);
      66      340785 :   _fe_problem.setActiveFEVariableCoupleableVectorTags(needed_vector_tags, _tid);
      67      340785 : }
      68             : 
      69             : template <typename AuxKernelType>
      70             : void
      71    22488449 : ComputeNodalAuxVarsThread<AuxKernelType>::onNode(ConstNodeRange::const_iterator & node_it)
      72             : {
      73    22488449 :   const Node * node = *node_it;
      74             : 
      75    22488449 :   const auto & block_ids = _aux_sys.mesh().getNodeBlockIds(*node);
      76             : 
      77    22488449 :   if (_block_ids != block_ids)
      78             :   {
      79      340785 :     _block_ids.clear();
      80      340785 :     _block_ids.insert(block_ids.begin(), block_ids.end());
      81      340785 :     subdomainChanged();
      82             :   }
      83             : 
      84    22488449 :   _fe_problem.reinitNode(node, _tid);
      85             : 
      86             :   // Get a map of all active block restricted AuxKernel objects
      87    22488449 :   const auto & block_kernels = _storage.getActiveBlockObjects(_tid);
      88             : 
      89             :   // Loop over all SubdomainIDs for the current node, if an AuxKernel is active on this block then
      90             :   // compute it.
      91    45093060 :   for (const auto & block : block_ids)
      92             :   {
      93    22604613 :     const auto iter = block_kernels.find(block);
      94             : 
      95    22604613 :     if (iter != block_kernels.end())
      96    40047579 :       for (const auto & aux : iter->second)
      97             :       {
      98    22880431 :         aux->compute();
      99             :         // This is the same conditional check that the aux kernel performs internally before calling
     100             :         // computeValue and _var.setNodalValue. We don't want to attempt to insert into the solution
     101             :         // if we don't actually have any dofs on this node
     102    22880429 :         if (aux->variable().isNodalDefined())
     103    20436330 :           aux->variable().insert(_aux_sys.solution());
     104             : 
     105             :         // update the aux solution vector if writable coupled variables are used
     106    22880429 :         if (aux->hasWritableCoupledVariables())
     107             :         {
     108        2160 :           for (auto * var : aux->getWritableCoupledVariables())
     109        1440 :             if (var->isNodalDefined())
     110             :               // insert into the global solution vector
     111        1440 :               var->insert(_aux_sys.solution());
     112             : 
     113             :           // make solution values available for dependent AuxKernels
     114         720 :           _fe_problem.reinitNode(node, _tid);
     115             :         }
     116             :       }
     117             :   }
     118    22488447 : }
     119             : 
     120             : template <typename AuxKernelType>
     121             : void
     122      149022 : ComputeNodalAuxVarsThread<AuxKernelType>::post()
     123             : {
     124      149022 :   _fe_problem.clearActiveFEVariableCoupleableVectorTags(_tid);
     125      149022 :   _fe_problem.clearActiveFEVariableCoupleableMatrixTags(_tid);
     126      149022 : }
     127             : 
     128             : template <typename AuxKernelType>
     129             : void
     130       12703 : ComputeNodalAuxVarsThread<AuxKernelType>::join(const ComputeNodalAuxVarsThread & /*y*/)
     131             : {
     132       12703 : }
     133             : 
     134             : template <typename AuxKernelType>
     135             : void
     136      149024 : ComputeNodalAuxVarsThread<AuxKernelType>::printGeneralExecutionInformation() const
     137             : {
     138      149024 :   if (!_fe_problem.shouldPrintExecution(_tid) || !_storage.hasActiveObjects())
     139      148559 :     return;
     140             : 
     141         465 :   const auto & console = _fe_problem.console();
     142         465 :   const auto & execute_on = _fe_problem.getCurrentExecuteOnFlag();
     143         465 :   console << "[DBG] Beginning nodal loop of nodal " << MooseUtils::prettyCppType<AuxKernelType>()
     144         465 :           << " on " << execute_on << std::endl;
     145         465 :   console << "[DBG] Ordering of the kernels on each block they are defined on:" << std::endl;
     146             :   // TODO Check that all objects are active at this point
     147        1395 :   console << _storage.activeObjectsToFormattedString() << std::endl;
     148             : }
     149             : 
     150             : template class ComputeNodalAuxVarsThread<AuxKernel>;
     151             : template class ComputeNodalAuxVarsThread<VectorAuxKernel>;
     152             : template class ComputeNodalAuxVarsThread<ArrayAuxKernel>;

Generated by: LCOV version 1.14