From 55da0b2931a259aaf53e6f78d0077b4e4fa1fd0e Mon Sep 17 00:00:00 2001 From: Sebastian Schunert Date: Thu, 9 Aug 2018 10:37:08 -0600 Subject: [PATCH] mass number matching (#300) --- include/userobjects/PKAGeneratorBase.h | 3 +++ src/userobjects/PKAGeneratorBase.C | 27 +++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/include/userobjects/PKAGeneratorBase.h b/include/userobjects/PKAGeneratorBase.h index f1e156a0..5a2885a2 100644 --- a/include/userobjects/PKAGeneratorBase.h +++ b/include/userobjects/PKAGeneratorBase.h @@ -58,6 +58,9 @@ class PKAGeneratorBase : public DiscreteElementUserObject const std::vector & rasterizer_m, Real Z, Real m) const; + + /// tolerance for mass number matching during tagging + const Real _mass_number_tolerance; }; #endif // PKAGENERATORBASE_H diff --git a/src/userobjects/PKAGeneratorBase.C b/src/userobjects/PKAGeneratorBase.C index 0841e27d..9ee46860 100644 --- a/src/userobjects/PKAGeneratorBase.C +++ b/src/userobjects/PKAGeneratorBase.C @@ -10,16 +10,22 @@ #include "MagpieUtils.h" #include -template<> -InputParameters validParams() +template <> +InputParameters +validParams() { InputParameters params = validParams(); - params.addClassDescription("PKA generator user object base class.\n Takes pdf and samples PKAs due to various interactions."); + params.addParam("mass_number_tolerance", + 0.5, + "Tolerance for matching mass numbers of recoils with rasterizer isotopes."); + params.addClassDescription("PKA generator user object base class.\n Takes pdf and samples PKAs " + "due to various interactions."); return params; } -PKAGeneratorBase::PKAGeneratorBase(const InputParameters & parameters) : - DiscreteElementUserObject(parameters) +PKAGeneratorBase::PKAGeneratorBase(const InputParameters & parameters) + : DiscreteElementUserObject(parameters), + _mass_number_tolerance(getParam("mass_number_tolerance")) { setRandomResetFrequency(EXEC_TIMESTEP_END); } @@ -31,10 +37,13 @@ PKAGeneratorBase::setPosition(MyTRIM_NS::IonBase & ion) const } int -PKAGeneratorBase::ionTag(const std::vector & rasterizer_Z, const std::vector & rasterizer_m, Real Z, Real m) const +PKAGeneratorBase::ionTag(const std::vector & rasterizer_Z, + const std::vector & rasterizer_m, + Real Z, + Real m) const { - // this function relies on the exact representation of whole numbers in IEEE floating point numbers - // up to a reasonable upper limit [Z < m < 300] + // this function relies on the exact representation of whole numbers in IEEE floating point + // numbers up to a reasonable upper limit [Z < m < 300] unsigned int count = std::count(rasterizer_Z.begin(), rasterizer_Z.end(), Z); if (count == 1) { @@ -45,7 +54,7 @@ PKAGeneratorBase::ionTag(const std::vector & rasterizer_Z, const std::vect } else if (count > 1) for (unsigned int j = 0; j < rasterizer_Z.size(); ++j) - if (rasterizer_Z[j] == Z && rasterizer_m[j] == m) + if (rasterizer_Z[j] == Z && std::abs(rasterizer_m[j] - m) < _mass_number_tolerance) return j; return -1; }