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 : // MOOSE includes 11 : #include "SamplerReceiver.h" 12 : #include "Function.h" 13 : 14 : registerMooseObject("StochasticToolsApp", SamplerReceiver); 15 : 16 : InputParameters 17 33092 : SamplerReceiver::validParams() 18 : { 19 33092 : InputParameters params = Control::validParams(); 20 33092 : params.addClassDescription( 21 : "Control for receiving data from a Sampler via SamplerParameterTransfer."); 22 33092 : params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN; 23 33092 : return params; 24 0 : } 25 : 26 16546 : SamplerReceiver::SamplerReceiver(const InputParameters & parameters) : Control(parameters) {} 27 : 28 : void 29 48132 : SamplerReceiver::execute() 30 : { 31 : // Send parameters from root 32 48132 : _communicator.broadcast(_parameters); 33 48132 : _communicator.broadcast(_values); 34 48132 : if (_parameters.size() != _values.size()) 35 0 : mooseError("Internal error: Number of parameters does not match number of values."); 36 : 37 : // Loop through all the parameters and set the controllable values for each parameter. 38 138106 : for (const auto & i : index_range(_parameters)) 39 : { 40 : const std::string & param_name = _parameters[i]; 41 : const std::vector<Real> & value = _values[i]; 42 : 43 89982 : ControllableParameter control_param = getControllableParameterByName(param_name); 44 : 45 : // Real 46 89978 : if (control_param.check<Real>()) 47 : { 48 : // There must be enough data to populate the controlled parameter 49 73120 : if (value.size() != 1) 50 4 : mooseError("The Real parameter '", 51 : param_name, 52 : "' expects a single value, but the vector supplying its values has a size of ", 53 4 : value.size(), 54 : "."); 55 73116 : control_param.set<Real>(value[0]); 56 : } 57 16858 : else if (control_param.check<std::vector<Real>>()) 58 16858 : control_param.set<std::vector<Real>>(value); 59 : else 60 : // If the loop gets here it failed to find what it was looking for 61 0 : mooseError("Unable to locate a Real or std::vector<Real> parameter with the name '", 62 : param_name, 63 : ".'"); 64 : } 65 48124 : } 66 : 67 : void 68 24572 : SamplerReceiver::transfer(const std::map<std::string, std::vector<Real>> & param_values) 69 : { 70 : // We'll only transfer on the root processor and gather later 71 24572 : if (processor_id() == 0) 72 : { 73 24572 : _parameters.clear(); 74 24572 : _values.clear(); 75 75128 : for (const auto & pv : param_values) 76 : { 77 50556 : _parameters.push_back(pv.first); 78 50556 : _values.push_back(pv.second); 79 : } 80 : } 81 24572 : }