From 55a73118cb34a9491ecbe2de40cc942175a16bb8 Mon Sep 17 00:00:00 2001 From: Joshua Hansel Date: Tue, 28 Jan 2020 09:15:56 -0700 Subject: [PATCH] Created PPs to determine min/max/average of a material property Closes #14648 --- .../ElementAverageMaterialProperty.md | 9 ++ .../ElementExtremeMaterialProperty.md | 10 ++ .../ElementAverageMaterialProperty.h | 37 ++++++ .../ElementExtremeMaterialProperty.h | 53 ++++++++ .../ElementAverageMaterialProperty.C | 63 ++++++++++ .../ElementExtremeMaterialProperty.C | 117 ++++++++++++++++++ .../element_average_material_property.i | 47 +++++++ .../element_average_material_property_out.csv | 2 + .../element_average_material_property/tests | 12 ++ .../element_extreme_material_property.i | 53 ++++++++ .../element_extreme_material_property_out.csv | 2 + .../element_extreme_material_property/tests | 12 ++ 12 files changed, 417 insertions(+) create mode 100644 framework/doc/content/source/postprocessors/ElementAverageMaterialProperty.md create mode 100644 framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md create mode 100644 framework/include/postprocessors/ElementAverageMaterialProperty.h create mode 100644 framework/include/postprocessors/ElementExtremeMaterialProperty.h create mode 100644 framework/src/postprocessors/ElementAverageMaterialProperty.C create mode 100644 framework/src/postprocessors/ElementExtremeMaterialProperty.C create mode 100644 test/tests/postprocessors/element_average_material_property/element_average_material_property.i create mode 100644 test/tests/postprocessors/element_average_material_property/gold/element_average_material_property_out.csv create mode 100644 test/tests/postprocessors/element_average_material_property/tests create mode 100644 test/tests/postprocessors/element_extreme_material_property/element_extreme_material_property.i create mode 100644 test/tests/postprocessors/element_extreme_material_property/gold/element_extreme_material_property_out.csv create mode 100644 test/tests/postprocessors/element_extreme_material_property/tests diff --git a/framework/doc/content/source/postprocessors/ElementAverageMaterialProperty.md b/framework/doc/content/source/postprocessors/ElementAverageMaterialProperty.md new file mode 100644 index 000000000000..1f1ef598bd35 --- /dev/null +++ b/framework/doc/content/source/postprocessors/ElementAverageMaterialProperty.md @@ -0,0 +1,9 @@ +# ElementAverageMaterialProperty + +This post-processor computes the average of a material property over a domain. + +!syntax parameters /Postprocessors/ElementAverageMaterialProperty + +!syntax inputs /Postprocessors/ElementAverageMaterialProperty + +!syntax children /Postprocessors/ElementAverageMaterialProperty diff --git a/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md b/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md new file mode 100644 index 000000000000..e1be149f9b45 --- /dev/null +++ b/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md @@ -0,0 +1,10 @@ +# ElementExtremeMaterialProperty + +This post-processor computes the minimum or maximum of a material property from +all quadrature points in a domain. + +!syntax parameters /Postprocessors/ElementExtremeMaterialProperty + +!syntax inputs /Postprocessors/ElementExtremeMaterialProperty + +!syntax children /Postprocessors/ElementExtremeMaterialProperty diff --git a/framework/include/postprocessors/ElementAverageMaterialProperty.h b/framework/include/postprocessors/ElementAverageMaterialProperty.h new file mode 100644 index 000000000000..0e742cf9cf70 --- /dev/null +++ b/framework/include/postprocessors/ElementAverageMaterialProperty.h @@ -0,0 +1,37 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "ElementIntegralMaterialProperty.h" + +class ElementAverageMaterialProperty; + +template <> +InputParameters validParams(); + +/** + * Computes the average of a material property over a volume. + */ +class ElementAverageMaterialProperty : public ElementIntegralMaterialProperty +{ +public: + static InputParameters validParams(); + + ElementAverageMaterialProperty(const InputParameters & parameters); + + virtual void initialize() override; + virtual void execute() override; + virtual Real getValue() override; + virtual void threadJoin(const UserObject & y) override; + +protected: + /// Domain volume + Real _volume; +}; diff --git a/framework/include/postprocessors/ElementExtremeMaterialProperty.h b/framework/include/postprocessors/ElementExtremeMaterialProperty.h new file mode 100644 index 000000000000..cbc2dae1e595 --- /dev/null +++ b/framework/include/postprocessors/ElementExtremeMaterialProperty.h @@ -0,0 +1,53 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "ElementPostprocessor.h" + +class ElementExtremeMaterialProperty; + +template <> +InputParameters validParams(); + +/// Determines the minimum or maximum of a material property over a volume. +class ElementExtremeMaterialProperty : public ElementPostprocessor +{ +public: + static InputParameters validParams(); + + /// Type of extreme value to compute + enum ExtremeType + { + MAX, + MIN + }; + + ElementExtremeMaterialProperty(const InputParameters & parameters); + + virtual void initialize() override; + virtual void execute() override; + virtual Real getValue() override; + virtual void threadJoin(const UserObject & y) override; + +protected: + virtual void computeQpValue(); + + /// Material property for which to find extreme + const MaterialProperty & _mat_prop; + + /// Type of extreme value to compute + ExtremeType _type; + + /// Extreme value + Real _value; + + /// Current quadrature point + unsigned int _qp; +}; diff --git a/framework/src/postprocessors/ElementAverageMaterialProperty.C b/framework/src/postprocessors/ElementAverageMaterialProperty.C new file mode 100644 index 000000000000..e522fa9d4638 --- /dev/null +++ b/framework/src/postprocessors/ElementAverageMaterialProperty.C @@ -0,0 +1,63 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "ElementAverageMaterialProperty.h" + +registerMooseObject("MooseApp", ElementAverageMaterialProperty); + +defineLegacyParams(ElementAverageMaterialProperty); + +InputParameters +ElementAverageMaterialProperty::validParams() +{ + InputParameters params = ElementIntegralMaterialProperty::validParams(); + params.addClassDescription("Computes the average of a material property over a volume."); + return params; +} + +ElementAverageMaterialProperty::ElementAverageMaterialProperty(const InputParameters & parameters) + : ElementIntegralMaterialProperty(parameters), _volume(0.0) +{ +} + +void +ElementAverageMaterialProperty::initialize() +{ + ElementIntegralMaterialProperty::initialize(); + + _volume = 0.0; +} + +void +ElementAverageMaterialProperty::execute() +{ + ElementIntegralMaterialProperty::execute(); + + _volume += _current_elem_volume; +} + +Real +ElementAverageMaterialProperty::getValue() +{ + const Real integral = ElementIntegralMaterialProperty::getValue(); + + gatherSum(_volume); + + return integral / _volume; +} + +void +ElementAverageMaterialProperty::threadJoin(const UserObject & y) +{ + ElementIntegralMaterialProperty::threadJoin(y); + + const ElementAverageMaterialProperty & pps = + static_cast(y); + _volume += pps._volume; +} diff --git a/framework/src/postprocessors/ElementExtremeMaterialProperty.C b/framework/src/postprocessors/ElementExtremeMaterialProperty.C new file mode 100644 index 000000000000..07118c1e45da --- /dev/null +++ b/framework/src/postprocessors/ElementExtremeMaterialProperty.C @@ -0,0 +1,117 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "ElementExtremeMaterialProperty.h" + +#include +#include + +registerMooseObject("MooseApp", ElementExtremeMaterialProperty); + +defineLegacyParams(ElementExtremeMaterialProperty); + +InputParameters +ElementExtremeMaterialProperty::validParams() +{ + InputParameters params = ElementPostprocessor::validParams(); + + params.addRequiredParam("mat_prop", + "Material property for which to find extreme"); + MooseEnum type_options("max=0 min=1"); + params.addRequiredParam("value_type", + type_options, + "Type of extreme value to return: 'max' " + "returns the maximum value and 'min' returns " + "the minimum value."); + + params.addClassDescription( + "Determines the minimum or maximum of a material property over a volume."); + + return params; +} + +ElementExtremeMaterialProperty::ElementExtremeMaterialProperty(const InputParameters & parameters) + : ElementPostprocessor(parameters), + + _mat_prop(getMaterialProperty("mat_prop")), + _type((ExtremeType)(int)parameters.get("value_type")), + _value(_type == 0 ? -std::numeric_limits::max() : std::numeric_limits::max()), + _qp(0) +{ +} + +void +ElementExtremeMaterialProperty::initialize() +{ + switch (_type) + { + case MAX: + _value = -std::numeric_limits::max(); // start w/ the min + break; + + case MIN: + _value = std::numeric_limits::max(); // start w/ the max + break; + } +} + +void +ElementExtremeMaterialProperty::execute() +{ + for (_qp = 0; _qp < _qrule->n_points(); _qp++) + computeQpValue(); +} + +void +ElementExtremeMaterialProperty::computeQpValue() +{ + switch (_type) + { + case MAX: + _value = std::max(_value, _mat_prop[_qp]); + break; + + case MIN: + _value = std::min(_value, _mat_prop[_qp]); + break; + } +} + +Real +ElementExtremeMaterialProperty::getValue() +{ + switch (_type) + { + case MAX: + gatherMax(_value); + break; + case MIN: + gatherMin(_value); + break; + } + + return _value; +} + +void +ElementExtremeMaterialProperty::threadJoin(const UserObject & y) +{ + const ElementExtremeMaterialProperty & pps = + static_cast(y); + + switch (_type) + { + case MAX: + _value = std::max(_value, pps._value); + break; + case MIN: + _value = std::min(_value, pps._value); + break; + } +} diff --git a/test/tests/postprocessors/element_average_material_property/element_average_material_property.i b/test/tests/postprocessors/element_average_material_property/element_average_material_property.i new file mode 100644 index 000000000000..a7d7ba32a12f --- /dev/null +++ b/test/tests/postprocessors/element_average_material_property/element_average_material_property.i @@ -0,0 +1,47 @@ +[GlobalParams] + execute_on = 'INITIAL' +[] + +[Mesh] + type = GeneratedMesh + dim = 1 + nx = 4 + xmin = 0 + xmax = 1 +[] + +[Functions] + [./fn] + type = PiecewiseConstant + axis = x + x = '0 0.25 0.50 0.75' + y = '5 2 3 6' + [../] +[] + +[Materials] + [./mat] + type = GenericFunctionMaterial + prop_names = 'mat_prop' + prop_values = 'fn' + [../] +[] + +[Postprocessors] + [./avg] + type = ElementAverageMaterialProperty + mat_prop = mat_prop + [../] +[] + +[Problem] + solve = false +[] + +[Executioner] + type = Steady +[] + +[Outputs] + csv = true +[] diff --git a/test/tests/postprocessors/element_average_material_property/gold/element_average_material_property_out.csv b/test/tests/postprocessors/element_average_material_property/gold/element_average_material_property_out.csv new file mode 100644 index 000000000000..b1ade7a651c0 --- /dev/null +++ b/test/tests/postprocessors/element_average_material_property/gold/element_average_material_property_out.csv @@ -0,0 +1,2 @@ +time,avg +0,4 diff --git a/test/tests/postprocessors/element_average_material_property/tests b/test/tests/postprocessors/element_average_material_property/tests new file mode 100644 index 000000000000..865ee132cfb4 --- /dev/null +++ b/test/tests/postprocessors/element_average_material_property/tests @@ -0,0 +1,12 @@ +[Tests] + design = 'ElementAverageMaterialProperty.md' + issues = '#14648' + + [./test_average] + type = 'CSVDiff' + input = 'element_average_material_property.i' + csvdiff = 'element_average_material_property_out.csv' + + requirement = 'The system shall compute the the average value of a material property over the domain.' + [../] +[] diff --git a/test/tests/postprocessors/element_extreme_material_property/element_extreme_material_property.i b/test/tests/postprocessors/element_extreme_material_property/element_extreme_material_property.i new file mode 100644 index 000000000000..39447b6c2f1b --- /dev/null +++ b/test/tests/postprocessors/element_extreme_material_property/element_extreme_material_property.i @@ -0,0 +1,53 @@ +[GlobalParams] + execute_on = 'INITIAL' +[] + +[Mesh] + type = GeneratedMesh + dim = 1 + nx = 4 + xmin = 0 + xmax = 1 +[] + +[Functions] + [./fn] + type = PiecewiseConstant + axis = x + x = '0 0.25 0.50 0.75' + y = '5 2 3 4' + [../] +[] + +[Materials] + [./mat] + type = GenericFunctionMaterial + prop_names = 'mat_prop' + prop_values = 'fn' + [../] +[] + +[Postprocessors] + [./min] + type = ElementExtremeMaterialProperty + mat_prop = mat_prop + value_type = min + [../] + [./max] + type = ElementExtremeMaterialProperty + mat_prop = mat_prop + value_type = max + [../] +[] + +[Problem] + solve = false +[] + +[Executioner] + type = Steady +[] + +[Outputs] + csv = true +[] diff --git a/test/tests/postprocessors/element_extreme_material_property/gold/element_extreme_material_property_out.csv b/test/tests/postprocessors/element_extreme_material_property/gold/element_extreme_material_property_out.csv new file mode 100644 index 000000000000..f211940cd955 --- /dev/null +++ b/test/tests/postprocessors/element_extreme_material_property/gold/element_extreme_material_property_out.csv @@ -0,0 +1,2 @@ +time,max,min +0,5,2 diff --git a/test/tests/postprocessors/element_extreme_material_property/tests b/test/tests/postprocessors/element_extreme_material_property/tests new file mode 100644 index 000000000000..aeae378c607b --- /dev/null +++ b/test/tests/postprocessors/element_extreme_material_property/tests @@ -0,0 +1,12 @@ +[Tests] + design = 'ElementExtremeMaterialProperty.md' + issues = '#14648' + + [./test_min_max] + type = 'CSVDiff' + input = 'element_extreme_material_property.i' + csvdiff = 'element_extreme_material_property_out.csv' + + requirement = 'The system shall compute the the extreme (min/max) values of a material property over the domain.' + [../] +[]