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