From 752e5bfb5b2ca4f73d1509a434aa197683c3738b Mon Sep 17 00:00:00 2001 From: Yeon Sang Jung Date: Mon, 4 Oct 2021 11:10:10 -0500 Subject: [PATCH] adding reporting id vpp, refs idaholab#19217 --- .../IntegralReportingIDVPP.h | 48 +++++ .../IntegralReportingIDVPP.C | 165 ++++++++++++++++++ .../reporting_id_vpp_out_integral_0001.csv | 65 +++++++ .../vectorpostprocessors/reporting_id_vpp.i | 108 ++++++++++++ .../test/tests/vectorpostprocessors/tests | 11 ++ 5 files changed, 397 insertions(+) create mode 100644 modules/reactor/include/vectorpostprocessors/IntegralReportingIDVPP.h create mode 100644 modules/reactor/src/vectorpostprocessors/IntegralReportingIDVPP.C create mode 100644 modules/reactor/test/tests/vectorpostprocessors/gold/reporting_id_vpp_out_integral_0001.csv create mode 100644 modules/reactor/test/tests/vectorpostprocessors/reporting_id_vpp.i create mode 100644 modules/reactor/test/tests/vectorpostprocessors/tests diff --git a/modules/reactor/include/vectorpostprocessors/IntegralReportingIDVPP.h b/modules/reactor/include/vectorpostprocessors/IntegralReportingIDVPP.h new file mode 100644 index 000000000000..58b748f5c452 --- /dev/null +++ b/modules/reactor/include/vectorpostprocessors/IntegralReportingIDVPP.h @@ -0,0 +1,48 @@ +//* 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 "ElementVariableVectorPostprocessor.h" + +#include + +/** + * This IntegralReportingIDVPP source code is to integrate variables based on reporting IDs + */ +class IntegralReportingIDVPP : public ElementVariableVectorPostprocessor +{ +public: + static InputParameters validParams(); + IntegralReportingIDVPP(const InputParameters & parameters); + + virtual void initialize() override; + virtual void execute() override; + virtual void finalize() override; + virtual void threadJoin(const UserObject & uo) override; + +protected: + /// Number of variables to be integrated on pins + const unsigned int _nvar; + /// Reporting IDs in use + const std::vector _reporting_id; + /// Number of reporting IDs in use + const unsigned int _n_reporting_id; + // Map of element ids to parsed vpp ids + std::map _unique_vpp_ids; + /// Vectors holding reporting IDs + std::vector _var_reporting_ids; + /// Coupled MOOSE variables to be integrated + std::vector _vars; + /// Quadrature point values of coupled MOOSE variables + std::vector _var_values; + /// Vectors holding variable integrals over reporting IDs + std::vector _var_integrals; +}; diff --git a/modules/reactor/src/vectorpostprocessors/IntegralReportingIDVPP.C b/modules/reactor/src/vectorpostprocessors/IntegralReportingIDVPP.C new file mode 100644 index 000000000000..c19844309af6 --- /dev/null +++ b/modules/reactor/src/vectorpostprocessors/IntegralReportingIDVPP.C @@ -0,0 +1,165 @@ +//* 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 "IntegralReportingIDVPP.h" + +#include "MooseVariable.h" +#include "MooseMesh.h" + +#include "libmesh/mesh_base.h" + +registerMooseObject("ReactorApp", IntegralReportingIDVPP); + +InputParameters +IntegralReportingIDVPP::validParams() +{ + InputParameters params = ElementVariableVectorPostprocessor::validParams(); + params.addRequiredParam>( + "reporting_id", "The types of reporting id by which to separate integrals."); + params.addClassDescription( + "This IntegralReportingIDVPP source code is to integrate variables based on reporting IDs"); + return params; +} + +IntegralReportingIDVPP::IntegralReportingIDVPP(const InputParameters & parameters) + : ElementVariableVectorPostprocessor(parameters), + _nvar(coupledComponents("variable")), + _reporting_id(getParam>("reporting_id")), + _n_reporting_id(_reporting_id.size()) +{ + // numbers of parsed vpp ids + dof_id_type n_vpp_ids; + // list of extra_integer id + std::set ids; + + std::set _reporting_id_copy(_reporting_id.begin(), _reporting_id.end()); + // initial setting for parsing + ExtraElementIDName id_type = *_reporting_id_copy.begin(); + _reporting_id_copy.erase(id_type); + unsigned int id_index = getElementIDIndexByName(id_type); + if (blockRestricted()) + ids = getElemIDsOnBlocks(id_index, blockIDs()); + else + ids = getAllElemIDs(id_index); + n_vpp_ids = ids.size(); + for (auto & elem : _mesh.getMesh().active_local_element_ptr_range()) + { + if (!hasBlocks(elem->subdomain_id())) + continue; + // initializing vpp_id based on the first reporting id value + auto id = elem->get_extra_integer(id_index); + _unique_vpp_ids[elem->id()] = std::distance(ids.begin(), std::find(ids.begin(), ids.end(), id)); + } + + // looping over reporting ids + while (!_reporting_id_copy.empty()) + { + id_type = *_reporting_id_copy.begin(); + _reporting_id_copy.erase(id_type); + id_index = getElementIDIndexByName(id_type); + // parsing reporting ids (find unique combinations of reporting ids) + std::set> unique_ids; + for (const auto & elem : _mesh.getMesh().active_local_element_ptr_range()) + { + if (!hasBlocks(elem->subdomain_id())) + continue; + auto elem_id = elem->id(); + dof_id_type id1 = _unique_vpp_ids[elem_id]; + dof_id_type id2 = elem->get_extra_integer(id_index); + auto it = unique_ids.find(std::pair(id1, id2)); + if (it == unique_ids.end()) + unique_ids.insert(std::pair(id1, id2)); + } + comm().set_union(unique_ids); + // update parsed vpp ids + n_vpp_ids = unique_ids.size(); + for (const auto & elem : _mesh.getMesh().active_local_element_ptr_range()) + { + if (!hasBlocks(elem->subdomain_id())) + continue; + dof_id_type id1 = _unique_vpp_ids[elem->id()]; + dof_id_type id2 = elem->get_extra_integer(id_index); + _unique_vpp_ids[elem->id()] = std::distance( + unique_ids.begin(), + std::find( + unique_ids.begin(), unique_ids.end(), std::pair(id1, id2))); + } + } + + // set up variable vector containing parsed reporting ids + for (unsigned int i = 0; i < _n_reporting_id; ++i) + { + id_type = _reporting_id[i]; + auto & p = declareVector("Level-" + std::to_string(i) + "-" + id_type); + p.resize(n_vpp_ids); + // collect local map of local vpp id to reporting id + std::map reporting_ids; + for (const auto & elem : _mesh.getMesh().active_local_element_ptr_range()) + { + if (!hasBlocks(elem->subdomain_id())) + continue; + auto vpp_id = _unique_vpp_ids[elem->id()]; + if (reporting_ids.find(vpp_id) == reporting_ids.end()) + reporting_ids[vpp_id] = elem->get_extra_integer(getElementIDIndexByName(id_type)); + } + // create global map of local vpp id to reporting id + comm().set_union(reporting_ids); + for (auto it : reporting_ids) + p[it.first] = it.second; + _var_reporting_ids.push_back(&p); + } + + // declare vectors containg integral values + for (unsigned int i = 0; i < _nvar; ++i) + { + _vars.push_back(getVar("variable", i)); + _var_values.push_back(&coupledValue("variable", i)); + auto & p = declareVector(_vars[i]->name()); + p.resize(n_vpp_ids); + _var_integrals.push_back(&p); + } +} + +void +IntegralReportingIDVPP::initialize() +{ + for (unsigned int ivar = 0; ivar < _nvar; ++ivar) + for (size_t i = 0; i < (*_var_integrals[ivar]).size(); ++i) + (*_var_integrals[ivar])[i] = 0; +} + +void +IntegralReportingIDVPP::execute() +{ + if (hasBlocks(_current_elem->subdomain_id())) + { + auto ipos = _unique_vpp_ids[_current_elem->id()]; + for (unsigned int ivar = 0; ivar < _nvar; ++ivar) + if (_vars[ivar]->hasBlocks(_current_elem->subdomain_id())) + for (unsigned int qp = 0; qp < _qrule->n_points(); qp++) + (*_var_integrals[ivar])[ipos] += _JxW[qp] * _coord[qp] * (*_var_values[ivar])[qp]; + } +} + +void +IntegralReportingIDVPP::finalize() +{ + for (unsigned int ivar = 0; ivar < _nvar; ++ivar) + gatherSum(*_var_integrals[ivar]); +} + +void +IntegralReportingIDVPP::threadJoin(const UserObject & s) +{ + const IntegralReportingIDVPP & sibling = static_cast(s); + + for (unsigned int ivar = 0; ivar < _nvar; ++ivar) + for (size_t i = 0; i < (*_var_integrals[ivar]).size(); ++i) + (*_var_integrals[ivar])[i] += (*sibling._var_integrals[ivar])[i]; +} diff --git a/modules/reactor/test/tests/vectorpostprocessors/gold/reporting_id_vpp_out_integral_0001.csv b/modules/reactor/test/tests/vectorpostprocessors/gold/reporting_id_vpp_out_integral_0001.csv new file mode 100644 index 000000000000..207216c04f90 --- /dev/null +++ b/modules/reactor/test/tests/vectorpostprocessors/gold/reporting_id_vpp_out_integral_0001.csv @@ -0,0 +1,65 @@ +Level-0-assembly_id,Level-1-pin_id,value +0,0,1.5671877195416 +0,1,1.5069863622713 +0,2,1.3888237414075 +0,3,1.2173342143126 +0,4,1.5069863622713 +0,5,1.4490498864433 +0,6,1.3354739906409 +0,7,1.1705334893373 +0,8,1.3888237414075 +0,9,1.3354739906409 +0,10,1.2307596343731 +0,11,1.0787875868243 +0,12,1.2173342143126 +0,13,1.1705334893373 +0,14,1.0787875868243 +0,15,0.9455496753278 +1,0,0.99904037162165 +1,1,0.74234175714638 +1,2,0.45713179810106 +1,3,0.15435705940956 +1,4,0.96063200921654 +1,5,0.71382572120417 +1,6,0.43957170982704 +1,7,0.14842276281255 +1,8,0.88532353029201 +1,9,0.657865552518 +1,10,0.40511160801102 +1,11,0.13678720164245 +1,12,0.77600532884632 +1,13,0.5766144950035 +1,14,0.35507745371261 +1,15,0.11989695716944 +2,0,0.99904037162165 +2,1,0.96063200921654 +2,2,0.88532353029201 +2,3,0.77600532884632 +2,4,0.74234175714638 +2,5,0.71382572120417 +2,6,0.657865552518 +2,7,0.5766144950035 +2,8,0.45713179810106 +2,9,0.43957170982704 +2,10,0.40511160801102 +2,11,0.35507745371261 +2,12,0.15435705940956 +2,13,0.14842276281255 +2,14,0.13678720164245 +2,15,0.11989695716944 +3,0,0.63684064003929 +3,1,0.47322307065213 +3,2,0.29140453553409 +3,3,0.098396889891493 +3,4,0.47322307065213 +3,5,0.35163068056988 +3,6,0.21653666621981 +3,7,0.073114282680312 +3,8,0.29140453553409 +3,9,0.21653666621981 +3,10,0.1333404277161 +3,11,0.045024293667973 +3,12,0.098396889891493 +3,13,0.073114282680312 +3,14,0.045024293667973 +3,15,0.015202593593918 diff --git a/modules/reactor/test/tests/vectorpostprocessors/reporting_id_vpp.i b/modules/reactor/test/tests/vectorpostprocessors/reporting_id_vpp.i new file mode 100644 index 000000000000..cf31e7a24a29 --- /dev/null +++ b/modules/reactor/test/tests/vectorpostprocessors/reporting_id_vpp.i @@ -0,0 +1,108 @@ +[Mesh] + [pin1] + type = ConcentricCircleMeshGenerator + num_sectors = 4 + radii = '0.4 0.5' + rings = '2 1 1' + has_outer_square = on + pitch = 1.26 + preserve_volumes = yes + smoothing_max_it = 3 + [] + + [pin2] + type = ConcentricCircleMeshGenerator + num_sectors = 4 + radii = '0.3 0.4' + rings = '2 1 1' + has_outer_square = on + pitch = 1.26 + preserve_volumes = yes + smoothing_max_it = 3 + [] + + [assembly1] + type = CartesianIDPatternedMeshGenerator + inputs = 'pin1 pin2' + pattern = ' 1 0 1 0; + 0 1 0 1; + 1 0 1 0; + 0 1 0 1' + assign_type = 'cell' + id_name = 'pin_id' + [] + + [assembly2] + type = CartesianIDPatternedMeshGenerator + inputs = 'pin1 pin2' + pattern = ' 0 1 1 0; + 1 0 0 1; + 1 0 0 1; + 0 1 1 0' + assign_type = 'cell' + id_name = 'pin_id' + [] + + [core] + type = CartesianIDPatternedMeshGenerator + inputs = 'assembly1 assembly2' + pattern = '0 1; + 1 0' + assign_type = 'cell' + id_name = 'assembly_id' + [] +[] + +[Executioner] + type = Steady +[] + +[Problem] + solve = false +[] + +[AuxVariables] + [pin_id] + family = MONOMIAL + order = CONSTANT + [] + [assembly_id] + family = MONOMIAL + order = CONSTANT + [] + [value] + order = FIRST + [] +[] + +[AuxKernels] + [set_pin_id] + type = ElemExtraIDAux + variable = pin_id + extra_id_name = pin_id + [] + [set_assembly_id] + type = ElemExtraIDAux + variable = assembly_id + extra_id_name = assembly_id + [] + [set_value] + type = ParsedAux + use_xyzt = true + function = 'cos(3.14159265*(x+0.63)/(20.16)) * cos(3.14159265*(-y+0.63)/(20.16))' + variable = value + [] +[] + +[VectorPostprocessors] + [integral] + type = IntegralReportingIDVPP + variable = 'value' + reporting_id = 'assembly_id pin_id' + [] +[] +[Outputs] + exodus = false + csv = true + execute_on = timestep_end +[] diff --git a/modules/reactor/test/tests/vectorpostprocessors/tests b/modules/reactor/test/tests/vectorpostprocessors/tests new file mode 100644 index 000000000000..dde48064c1aa --- /dev/null +++ b/modules/reactor/test/tests/vectorpostprocessors/tests @@ -0,0 +1,11 @@ +[Tests] + design = 'vectorpostprocessors/IntegralReportingIDVPP.md' + issues = '#19217' + [reporting_id_vpp] + type = 'CSVDiff' + input = 'reporting_id_vpp.i' + csvdiff = 'reporting_id_vpp_out_integral_0001.csv' + requirement ='The system shall generate vector processed data based on reporting ID for 2d problem' + recover = false + [] +[] \ No newline at end of file