Line data Source code
1 : /**********************************************************************/ 2 : /* DO NOT MODIFY THIS HEADER */ 3 : /* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */ 4 : /* */ 5 : /* Copyright 2017 Battelle Energy Alliance, LLC */ 6 : /* ALL RIGHTS RESERVED */ 7 : /**********************************************************************/ 8 : 9 : #include "PKAGeneratorNeutronicsBase.h" 10 : #include "MagpieUtils.h" 11 : #include "MultiIndex.h" 12 : #include "DiscreteFissionPKAPDF.h" 13 : 14 : InputParameters 15 0 : PKAGeneratorNeutronicsBase::validParams() 16 : { 17 0 : InputParameters params = PKAGeneratorBase::validParams(); 18 0 : params.addParam<std::vector<PostprocessorName>>( 19 : "partial_reaction_rates", 20 : "Partial neutronic reaction rates per unit volume [sum_g xs_{r,g,i} * phi_g], " 21 : "r: reaction type, g: energy group, i: nuclide id.Provide number density as variable in " 22 : "rasterizer!"); 23 0 : params.addParam<std::vector<PostprocessorName>>( 24 : "averaged_number_densities", "The number density of the species averaged over the domain."); 25 0 : params.addClassDescription("PKA generator (neutronics) user object base class.\n Takes pdf and " 26 : "samples PKAs due to various interactions."); 27 0 : return params; 28 0 : } 29 : 30 0 : PKAGeneratorNeutronicsBase::PKAGeneratorNeutronicsBase(const InputParameters & parameters) 31 0 : : PKAGeneratorBase(parameters) 32 : { 33 0 : if (isParamValid("partial_reaction_rates")) 34 : { 35 : std::vector<PostprocessorName> names = 36 0 : getParam<std::vector<PostprocessorName>>("partial_reaction_rates"); 37 0 : _partial_neutronics_reaction_rates.resize(names.size()); 38 0 : _stored_reaction_rates.resize(names.size()); 39 0 : for (unsigned int j = 0; j < names.size(); ++j) 40 0 : if (_fe_problem.hasPostprocessor(names[j])) 41 0 : _partial_neutronics_reaction_rates[j] = &getPostprocessorValueByName(names[j]); 42 : else 43 : { 44 0 : Real real_value = -std::numeric_limits<Real>::max(); 45 0 : std::istringstream ss(names[j]); 46 : 47 0 : if (ss >> real_value && ss.eof()) 48 0 : _stored_reaction_rates[j] = real_value; 49 : else 50 0 : mooseError("Illegal entry in _partial_neutronics_reaction_rates: ", names[j]); 51 : 52 0 : _partial_neutronics_reaction_rates[j] = &_stored_reaction_rates[j]; 53 0 : } 54 0 : } 55 : else 56 : { 57 0 : _stored_reaction_rates = {1.0e-8}; 58 0 : _partial_neutronics_reaction_rates = {&_stored_reaction_rates[0]}; 59 : } 60 : 61 0 : if (isParamValid("averaged_number_densities")) 62 : { 63 : std::vector<PostprocessorName> names = 64 0 : getParam<std::vector<PostprocessorName>>("averaged_number_densities"); 65 0 : _averaged_number_densities.resize(names.size()); 66 0 : _stored_densities.resize(names.size()); 67 0 : for (unsigned int j = 0; j < names.size(); ++j) 68 0 : if (_fe_problem.hasPostprocessor(names[j])) 69 0 : _averaged_number_densities[j] = &getPostprocessorValueByName(names[j]); 70 : else 71 : { 72 0 : Real real_value = -std::numeric_limits<Real>::max(); 73 0 : std::istringstream ss(names[j]); 74 : 75 0 : if (ss >> real_value && ss.eof()) 76 0 : _stored_densities[j] = real_value; 77 : else 78 0 : mooseError("Illegal entry in _partial_neutronics_reaction_rates: ", names[j]); 79 : 80 0 : _averaged_number_densities[j] = &_stored_reaction_rates[j]; 81 0 : } 82 0 : } 83 : else 84 : { 85 0 : _averaged_number_densities.resize(_stored_reaction_rates.size()); 86 0 : _stored_densities.resize(_stored_reaction_rates.size()); 87 0 : for (unsigned int j = 0; j < _stored_densities.size(); ++j) 88 : { 89 0 : _stored_densities[j] = 1; 90 0 : _averaged_number_densities[j] = &_stored_densities[j]; 91 : } 92 : } 93 : 94 0 : if (_averaged_number_densities.size() != _partial_neutronics_reaction_rates.size()) 95 0 : mooseError("partial_reaction_rates and averaged_number_densities must have the same number of " 96 : "entries."); 97 0 : }