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 "ParsedVectorReporter.h" 11 : 12 : registerMooseObject("OptimizationApp", ParsedVectorReporter); 13 : 14 : InputParameters 15 134 : ParsedVectorReporter::validParams() 16 : { 17 134 : InputParameters params = ParsedReporterBase::validParams(); 18 134 : params.addClassDescription("Apply parsed functions to vector entries held in reporters."); 19 268 : params.addRequiredParam<std::vector<ReporterName>>("reporter_names", "Reporter names "); 20 134 : return params; 21 0 : } 22 : 23 67 : ParsedVectorReporter::ParsedVectorReporter(const InputParameters & parameters) 24 : : ParsedReporterBase(parameters), 25 67 : _output_reporter( 26 201 : declareValueByName<std::vector<Real>>(getParam<std::string>("name"), REPORTER_MODE_ROOT)) 27 : { 28 : // get reporters to operate on 29 : const std::vector<ReporterName> reporter_names( 30 201 : getParam<std::vector<ReporterName>>("reporter_names")); 31 67 : if (reporter_names.size() != _reporter_symbols.size()) 32 0 : paramError( 33 : "reporter_names", 34 : "reporter_names and reporter_symbols must be the same size: Number of reporter_names=", 35 : reporter_names.size(), 36 : "; Number of reporter_symbols=", 37 : _reporter_symbols.size()); 38 : 39 67 : _reporter_data.resize(reporter_names.size()); 40 224 : for (const auto rep_index : index_range(_reporter_data)) 41 157 : _reporter_data[rep_index] = 42 314 : &getReporterValueByName<std::vector<Real>>(reporter_names[rep_index], REPORTER_MODE_ROOT); 43 67 : } 44 : 45 : void 46 346 : ParsedVectorReporter::finalize() 47 : { 48 : // check vector sizes of reporters 49 346 : const std::size_t entries(_reporter_data[0]->size()); 50 1052 : for (const auto rep_index : index_range(_reporter_data)) 51 708 : if (entries != _reporter_data[rep_index]->size()) 52 : { 53 : const std::vector<ReporterName> reporter_names( 54 4 : getParam<std::vector<ReporterName>>("reporter_names")); 55 4 : mooseError("All vectors being operated on must be the same size.", 56 : "\nsize of ", 57 2 : reporter_names[0].getCombinedName(), 58 : " = ", 59 : entries, 60 : "\nsize of ", 61 2 : reporter_names[rep_index].getCombinedName(), 62 : " = ", 63 2 : _reporter_data[rep_index]->size()); 64 0 : } 65 : 66 344 : _output_reporter.resize(entries, 0.0); 67 716 : for (const auto i : make_range(entries)) 68 : { 69 1158 : for (const auto rep_index : index_range(_reporter_data)) 70 786 : _func_params[rep_index] = _reporter_data[rep_index]->at(i); 71 : 72 372 : if (_use_t) 73 0 : _func_params[_reporter_data.size()] = _t; 74 : 75 372 : _output_reporter[i] = evaluate(_func_F); 76 : } 77 344 : }