LCOV - code coverage report
Current view: top level - src/userobjects - PolyatomicRecoil.C (source / functions) Hit Total Coverage
Test: idaholab/magpie: 5710af Lines: 94 95 98.9 %
Date: 2025-07-21 23:34:39 Functions: 8 8 100.0 %
Legend: Lines: hit not hit

          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             : #ifdef GSL_ENABLED
       9             : 
      10             : #include "PolyatomicRecoil.h"
      11             : #include "PolyatomicDisplacementFunction.h"
      12             : #include "PolyatomicDamageEnergyFunction.h"
      13             : #include "PolyatomicDisplacementDerivativeFunction.h"
      14             : #include "MooseMesh.h"
      15             : 
      16             : // mytrim includes
      17             : #include <mytrim/element.h>
      18             : 
      19             : registerMooseObject("MagpieApp", PolyatomicRecoil);
      20             : 
      21             : InputParameters
      22          88 : PolyatomicRecoil::validParams()
      23             : {
      24          88 :   InputParameters params = GeneralUserObject::validParams();
      25          88 :   params += ParkinCoulterInterface::validParams();
      26         176 :   params.addRequiredParam<std::vector<unsigned int>>("Z", "Atomic numbers");
      27         176 :   params.addRequiredParam<std::vector<Real>>("A", "Mass numbers");
      28         176 :   params.addRequiredParam<std::vector<Real>>("number_fraction", "Number fractions");
      29         176 :   MooseEnum nrt_damage_types("TOTAL NET ENERGY NET_DERIVATIVE", "TOTAL");
      30         176 :   params.addParam<MooseEnum>(
      31             :       "damage_type",
      32             :       nrt_damage_types,
      33             :       "NRT damage types TOTAL: total number of atoms that have been dispaced during cascade [nij "
      34             :       "in PK JNM, 101, 1981]\n"
      35             :       "NET: number of atoms displaced and not recaptured [nij in PK JNM, 101, 1981]\n"
      36             :       "ENERGY: energy deposted by recoil of type i and energy E[nu_i in PK JNM, 88, 1980]\n"
      37             :       "NET_DERIVATIVE: derivative of NET w.r.t. the partial number fractions.");
      38         176 :   params.addParam<std::string>("displacement_file_base",
      39             :                                "The output file base for displacement function in csv format.");
      40         176 :   params.addRequiredRangeCheckedParam<Real>(
      41             :       "Emax", "Emax > 0", "Maximum desired energy to which displacement functions are computed");
      42          88 :   params.addClassDescription(
      43             :       "PolyatomicRecoil allows computation of total and net displacement functions,"
      44             :       "damage energy functions, and the derivative of the net displacement functions w.r.t. number "
      45             :       "fractions.");
      46          88 :   params.set<ExecFlagEnum>("execute_on") = EXEC_INITIAL;
      47          88 :   params.suppressParameter<ExecFlagEnum>("execute_on");
      48          88 :   return params;
      49          88 : }
      50             : 
      51          44 : PolyatomicRecoil::PolyatomicRecoil(const InputParameters & parameters)
      52          44 :   : GeneralUserObject(parameters), ParkinCoulterInterface(this)
      53             : {
      54          44 : }
      55             : 
      56             : std::vector<unsigned int>
      57          36 : PolyatomicRecoil::atomicNumbers() const
      58             : {
      59         108 :   return getParam<std::vector<unsigned int>>("Z");
      60             : }
      61             : 
      62             : std::vector<Real>
      63          36 : PolyatomicRecoil::massNumbers() const
      64             : {
      65         108 :   return getParam<std::vector<Real>>("A");
      66             : }
      67             : 
      68             : std::vector<Real>
      69          20 : PolyatomicRecoil::numberFractions() const
      70             : {
      71          60 :   return getParam<std::vector<Real>>("number_fraction");
      72             : }
      73             : 
      74             : void
      75          16 : PolyatomicRecoil::initDamageFunctions()
      76             : {
      77             :   // set the displacement function type
      78          16 :   nrt_type type = TOTAL;
      79          48 :   if (getParam<MooseEnum>("damage_type") == "NET")
      80           4 :     type = NET;
      81          36 :   else if (getParam<MooseEnum>("damage_type") == "ENERGY")
      82           4 :     type = ENERGY;
      83          24 :   else if (getParam<MooseEnum>("damage_type") == "NET_DERIVATIVE")
      84           4 :     type = NET_DERIVATIVE;
      85             : 
      86          16 :   if (type == ENERGY)
      87           8 :     _padf = std::make_unique<PolyatomicDamageEnergyFunction>(polyMat(), type, _Ecap);
      88          12 :   else if (type == NET_DERIVATIVE)
      89             :   {
      90           8 :     _padf = std::make_unique<PolyatomicDisplacementFunction>(polyMat(), NET, _Ecap);
      91           8 :     _padf_derivative = std::make_unique<PolyatomicDisplacementDerivativeFunction>(
      92           8 :         polyMat(), type, dynamic_cast<PolyatomicDisplacementFunction *>(_padf.get()), _Ecap);
      93             :   }
      94             :   else
      95          16 :     _padf = std::make_unique<PolyatomicDisplacementFunction>(polyMat(), type, _Ecap);
      96          16 : }
      97             : 
      98             : void
      99          16 : PolyatomicRecoil::execute()
     100             : {
     101          16 :   computeDamageFunctions();
     102          16 : }
     103             : 
     104             : void
     105          16 : PolyatomicRecoil::finalize()
     106             : {
     107          16 :   std::vector<unsigned int> atomic_numbers = atomicNumbers();
     108          16 :   std::vector<Real> mass_numbers = massNumbers();
     109             : 
     110             :   // displacement functions
     111          32 :   if (isParamValid("displacement_file_base"))
     112             :   {
     113          16 :     std::ofstream displacement_file;
     114          48 :     displacement_file.open(getParam<std::string>("displacement_file_base") + ".csv");
     115             : 
     116             :     PolyatomicDisplacementFunction * displacement_function =
     117          16 :         dynamic_cast<PolyatomicDisplacementFunction *>(_padf.get());
     118             :     PolyatomicDamageEnergyFunction * energy_function =
     119          16 :         dynamic_cast<PolyatomicDamageEnergyFunction *>(_padf.get());
     120             : 
     121          16 :     displacement_file << "energy (eV)";
     122          16 :     if (_padf_derivative)
     123          12 :       for (unsigned int projectile = 0; projectile < _padf_derivative->nSpecies(); ++projectile)
     124          24 :         for (unsigned int target = 0; target < _padf_derivative->nSpecies(); ++target)
     125          48 :           for (unsigned int derivative = 0; derivative < _padf_derivative->nSpecies(); ++derivative)
     126             :           {
     127             :             unsigned int projectile_zaid =
     128          32 :                 1000 * atomic_numbers[projectile] + mass_numbers[projectile];
     129          32 :             unsigned int target_zaid = 1000 * atomic_numbers[target] + mass_numbers[target];
     130             :             unsigned int derivative_zaid =
     131          32 :                 1000 * atomic_numbers[derivative] + mass_numbers[derivative];
     132          96 :             displacement_file << ", d(" << projectile_zaid << "->" << target_zaid << ") / d("
     133          32 :                               << derivative_zaid << ")";
     134             :           }
     135             :     else
     136             :     {
     137          12 :       if (displacement_function)
     138          24 :         for (unsigned int projectile = 0; projectile < _padf->nSpecies(); ++projectile)
     139          48 :           for (unsigned int target = 0; target < _padf->nSpecies(); ++target)
     140             :           {
     141             :             unsigned int projectile_zaid =
     142          32 :                 1000 * atomic_numbers[projectile] + mass_numbers[projectile];
     143          32 :             unsigned int target_zaid = 1000 * atomic_numbers[target] + mass_numbers[target];
     144          64 :             displacement_file << "," << projectile_zaid << "->" << target_zaid;
     145             :           }
     146           4 :       else if (energy_function)
     147          12 :         for (unsigned int projectile = 0; projectile < _padf->nSpecies(); ++projectile)
     148             :         {
     149             :           unsigned int projectile_zaid =
     150           8 :               1000 * atomic_numbers[projectile] + mass_numbers[projectile];
     151           8 :           displacement_file << "," << projectile_zaid;
     152             :         }
     153             :       else
     154           0 :         mooseError("Displacement object does not have right type");
     155             :     }
     156             : 
     157             :     displacement_file << std::endl;
     158             : 
     159          16 :     if (_padf_derivative)
     160         104 :       for (unsigned int n = 0; n < _padf->nEnergySteps(); ++n)
     161             :       {
     162             :         displacement_file << _padf_derivative->energyPoint(n);
     163         300 :         for (unsigned int projectile = 0; projectile < _padf_derivative->nSpecies(); ++projectile)
     164         600 :           for (unsigned int target = 0; target < _padf_derivative->nSpecies(); ++target)
     165        1200 :             for (unsigned int derivative = 0; derivative < _padf_derivative->nSpecies();
     166             :                  ++derivative)
     167         800 :               displacement_file << ","
     168             :                                 << _padf_derivative->linearInterpolation(
     169             :                                        _padf_derivative->energyPoint(n),
     170             :                                        projectile,
     171             :                                        target,
     172         800 :                                        derivative);
     173             :         displacement_file << std::endl;
     174             :       }
     175             :     else
     176             :     {
     177          12 :       if (displacement_function)
     178             :       {
     179         364 :         for (unsigned int n = 0; n < _padf->nEnergySteps(); ++n)
     180             :         {
     181             :           displacement_file << _padf->energyPoint(n);
     182        1068 :           for (unsigned int projectile = 0; projectile < _padf->nSpecies(); ++projectile)
     183        2136 :             for (unsigned int target = 0; target < _padf->nSpecies(); ++target)
     184             :             {
     185             :               Real delta_ij =
     186        2848 :                   getParam<MooseEnum>("damage_type") == "TOTAL" && target == projectile ? 1 : 0;
     187        1424 :               displacement_file << ","
     188        1424 :                                 << delta_ij + displacement_function->linearInterpolation(
     189        1424 :                                                   _padf->energyPoint(n), projectile, target);
     190             :             }
     191             :           displacement_file << std::endl;
     192             :         }
     193             :       }
     194           4 :       else if (energy_function)
     195             :       {
     196         404 :         for (unsigned int n = 0; n < _padf->nEnergySteps(); ++n)
     197             :         {
     198             :           displacement_file << _padf->energyPoint(n);
     199        1200 :           for (unsigned int projectile = 0; projectile < _padf->nSpecies(); ++projectile)
     200         800 :             displacement_file << ","
     201             :                               << energy_function->linearInterpolation(_padf->energyPoint(n),
     202         800 :                                                                       projectile);
     203             :           displacement_file << std::endl;
     204             :         }
     205             :       }
     206             :     }
     207             : 
     208          16 :     displacement_file.close();
     209          16 :   }
     210          16 : }
     211             : 
     212             : #endif

Generated by: LCOV version 1.14