LCOV - code coverage report
Current view: top level - include/userobjects - LayeredAverageBase.h (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 31 31 100.0 %
Date: 2025-07-17 01:28:37 Functions: 19 24 79.2 %
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             : #pragma once
      11             : 
      12             : #include "LayeredIntegralBase.h"
      13             : 
      14             : /**
      15             :  * Base class for computing layered averages
      16             :  */
      17             : template <typename BaseType>
      18             : class LayeredAverageBase : public LayeredIntegralBase<BaseType>
      19             : {
      20             : public:
      21             :   static InputParameters validParams();
      22             : 
      23             :   LayeredAverageBase(const InputParameters & parameters);
      24             : 
      25             :   virtual void initialize() override;
      26             :   virtual void execute() override;
      27             :   virtual void finalize() override;
      28             :   virtual void threadJoin(const UserObject & y) override;
      29             : 
      30             :   using LayeredIntegralBase<BaseType>::gatherSum;
      31             :   using LayeredIntegralBase<BaseType>::getLayer;
      32             :   using LayeredIntegralBase<BaseType>::getLayerValue;
      33             : 
      34             : protected:
      35             :   /**
      36             :    * @returns The local integration volume (or area in the case of a side integral). This is not the
      37             :    * layer volume
      38             :    */
      39             :   virtual Real volume() const = 0;
      40             : 
      41             :   /// Value of the volume (area for side integrals) for each layer
      42             :   std::vector<Real> _layer_volumes;
      43             : 
      44             :   using LayeredIntegralBase<BaseType>::_current_elem;
      45             :   using LayeredIntegralBase<BaseType>::_num_layers;
      46             :   using LayeredIntegralBase<BaseType>::layerHasValue;
      47             :   using LayeredIntegralBase<BaseType>::setLayerValue;
      48             : };
      49             : 
      50             : template <typename BaseType>
      51             : InputParameters
      52      179531 : LayeredAverageBase<BaseType>::validParams()
      53             : {
      54      179531 :   InputParameters params = LayeredIntegralBase<BaseType>::validParams();
      55      179531 :   return params;
      56             : }
      57             : 
      58             : template <typename BaseType>
      59        4197 : LayeredAverageBase<BaseType>::LayeredAverageBase(const InputParameters & parameters)
      60        4197 :   : LayeredIntegralBase<BaseType>(parameters)
      61             : {
      62        4169 :   _layer_volumes.resize(_num_layers);
      63        4169 : }
      64             : 
      65             : template <typename BaseType>
      66             : void
      67        7139 : LayeredAverageBase<BaseType>::initialize()
      68             : {
      69        7139 :   LayeredIntegralBase<BaseType>::initialize();
      70             : 
      71       55233 :   for (auto & vol : _layer_volumes)
      72       48094 :     vol = 0.0;
      73        7139 : }
      74             : 
      75             : template <typename BaseType>
      76             : void
      77      569826 : LayeredAverageBase<BaseType>::execute()
      78             : {
      79      569826 :   LayeredIntegralBase<BaseType>::execute();
      80             : 
      81      569826 :   const auto layer = getLayer(_current_elem->vertex_average());
      82      569826 :   _layer_volumes[layer] += volume();
      83      569826 : }
      84             : 
      85             : template <typename BaseType>
      86             : void
      87        6522 : LayeredAverageBase<BaseType>::finalize()
      88             : {
      89        6522 :   LayeredIntegralBase<BaseType>::finalize();
      90             : 
      91        6522 :   gatherSum(_layer_volumes);
      92             : 
      93             :   // Compute the average for each layer
      94       50254 :   for (const auto i : index_range(_layer_volumes))
      95       43732 :     if (layerHasValue(i))
      96       28340 :       setLayerValue(i, getLayerValue(i) / _layer_volumes[i]);
      97        6522 : }
      98             : 
      99             : template <typename BaseType>
     100             : void
     101         617 : LayeredAverageBase<BaseType>::threadJoin(const UserObject & y)
     102             : {
     103         617 :   LayeredIntegralBase<BaseType>::threadJoin(y);
     104         617 :   const auto & lsa = static_cast<const LayeredAverageBase<BaseType> &>(y);
     105        4979 :   for (const auto i : index_range(_layer_volumes))
     106        4362 :     if (lsa.layerHasValue(i))
     107        2071 :       _layer_volumes[i] += lsa._layer_volumes[i];
     108         617 : }

Generated by: LCOV version 1.14