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 "PKAFissionFragmentNeutronics.h" 10 : #include "PKAGeneratorBase.h" 11 : #include "PKAGeneratorNeutronicsBase.h" 12 : #include "MultiIndex.h" 13 : 14 : registerMooseObject("MagpieApp", PKAFissionFragmentNeutronics); 15 : 16 : InputParameters 17 0 : PKAFissionFragmentNeutronics::validParams() 18 : { 19 0 : InputParameters params = PKAGeneratorNeutronicsBase::validParams(); 20 0 : params.addClassDescription( 21 : "PKA generator (fission) user object.\n Takes pdf and samples PKAs due to fission."); 22 0 : return params; 23 0 : } 24 : 25 0 : PKAFissionFragmentNeutronics::PKAFissionFragmentNeutronics(const InputParameters & parameters) 26 0 : : PKAGeneratorNeutronicsBase(parameters) 27 : { 28 0 : } 29 : 30 : void 31 0 : PKAFissionFragmentNeutronics::setPDF(const std::vector<unsigned int> & ZAID, 32 : const std::vector<Real> & energies, 33 : const MultiIndex<Real> & probabilities) 34 : { 35 0 : _pdf = DiscreteFissionPKAPDF(ZAID, energies, probabilities); 36 0 : } 37 : 38 : void 39 0 : PKAFissionFragmentNeutronics::appendPKAs(std::vector<MyTRIM_NS::IonBase> & ion_list, 40 : const MyTRIMRasterizer::PKAParameters & pka_parameters, 41 : const MyTRIMRasterizer::AveragedData & averaged_data) const 42 : { 43 0 : const auto dt = pka_parameters._dt; 44 0 : const auto vol = pka_parameters._volume; 45 0 : const auto recoil_rate_scaling = pka_parameters._recoil_rate_scaling; 46 : 47 : mooseAssert(dt >= 0, 48 : "Passed a negative time window into PKAFissionFragmentNeutronics::appendPKAs"); 49 : mooseAssert(vol >= 0, "Passed a negative volume into PKAFissionFragmentNeutronics::appendPKAs"); 50 : 51 0 : if (averaged_data._elements.size() != _partial_neutronics_reaction_rates.size()) 52 0 : mooseError("Size of averaged_data and partial_reaction_rates must be equal"); 53 : 54 0 : for (unsigned int nuclide = 0; nuclide < _partial_neutronics_reaction_rates.size(); ++nuclide) 55 : { 56 : unsigned int num_fission = 57 0 : std::floor(recoil_rate_scaling * dt * vol * (*_partial_neutronics_reaction_rates[nuclide]) / 58 0 : (*_averaged_number_densities[nuclide] * averaged_data._site_volume) * 59 : averaged_data._elements[nuclide] + 60 0 : getRandomReal()); 61 : 62 0 : for (unsigned i = 0; i < num_fission; ++i) 63 : { 64 : std::vector<MyTRIM_NS::IonBase> ion; 65 : // at this point sample will have Z, m, E 66 0 : _pdf.drawSample(ion); 67 : 68 : // set stopping criteria 69 0 : ion[0].setEf(); 70 0 : ion[1].setEf(); 71 : 72 : // the tag is the element this PKA get registered as upon stopping 73 : // -1 means the PKA will be ignored 74 0 : ion[0]._tag = ionTag(pka_parameters, ion[0]._Z, ion[0]._m); 75 0 : ion[1]._tag = ionTag(pka_parameters, ion[1]._Z, ion[1]._m); 76 : 77 : // set location of the fission event 78 0 : setPosition(ion[0]); 79 0 : ion[1]._pos = ion[0]._pos; 80 : 81 : // set random direction for ion 1 and opposite direction for ion 2 82 0 : setRandomDirection(ion[0]); 83 0 : ion[1]._dir = -ion[0]._dir; 84 : 85 : // add PKAs to list 86 0 : ion_list.push_back(ion[0]); 87 0 : ion_list.push_back(ion[1]); 88 0 : } 89 : } 90 0 : }