Skip to content

Commit

Permalink
Refactor PolyatomicRecoil to accomodate DPAUserObject (idaholab#410)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sebastian Schunert committed Dec 27, 2019
1 parent cb47a43 commit 7d52267
Show file tree
Hide file tree
Showing 13 changed files with 171 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = pc_Al2O3_energy
damage_type = ENERGY
[../]
Expand Down
1 change: 0 additions & 1 deletion examples/nrt_comparison/Al2O3/pc_1981_Al2O3_net.i
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = pc_Al2O3_net
damage_type = NET
[../]
Expand Down
1 change: 0 additions & 1 deletion examples/nrt_comparison/TaO/pc_1981_TaO_energy.i
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = pc_TaO_energy
damage_type = ENERGY
[../]
Expand Down
1 change: 0 additions & 1 deletion examples/nrt_comparison/TaO/pc_1981_TaO_net.i
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = pc_TaO_net
damage_type = NET
[../]
Expand Down
1 change: 0 additions & 1 deletion examples/nrt_comparison/UC/pc_1981_UC_damage_energy.i
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = pc_UC_energy
damage_type = ENERGY
[../]
Expand Down
1 change: 0 additions & 1 deletion examples/nrt_comparison/UC/pc_1981_UC_net.i
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = pc_UC_net_case4
damage_type = NET
[../]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
Emax = 1e7
uniform_energy_spacing = 0.1
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = parkin_coulter_UxZr1-xC_case3
damage_type = ENERGY
[../]
Expand Down
42 changes: 42 additions & 0 deletions include/userobjects/ParkinCoulterBase.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**********************************************************************/
/* DO NOT MODIFY THIS HEADER */
/* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */
/* */
/* Copyright 2017 Battelle Energy Alliance, LLC */
/* ALL RIGHTS RESERVED */
/**********************************************************************/
#ifdef GSL_ENABLED

#pragma once

#include "GeneralUserObject.h"

class ParkinCoulterBase;
class PolyatomicDisplacementFunction;
class PolyatomicDamageEnergyFunction;
class PolyatomicDisplacementDerivativeFunction;

template <>
InputParameters validParams<ParkinCoulterBase>();

class ParkinCoulterBase : public GeneralUserObject
{
public:
ParkinCoulterBase(const InputParameters & parameters);
void initialize() override {}

protected:
/// recomputes the Polyatomic damage functions
void computeDamageFunctions();

std::vector<unsigned int> _atomic_numbers;
std::vector<Real> _mass_numbers;
std::vector<std::vector<Real>> _Ecap;

std::vector<MyTRIM_NS::Element> _poly_mat;

std::unique_ptr<PolyatomicDisplacementFunctionBase> _padf;
std::unique_ptr<PolyatomicDisplacementDerivativeFunction> _padf_derivative;
};

#endif // GSL_ENABLED
15 changes: 3 additions & 12 deletions include/userobjects/PolyatomicRecoil.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

#pragma once

#include "GeneralUserObject.h"
#include "ParkinCoulterBase.h"

class PolyatomicRecoil;
class PolyatomicDisplacementFunction;
Expand All @@ -19,21 +19,12 @@ class PolyatomicDisplacementDerivativeFunction;
template <>
InputParameters validParams<PolyatomicRecoil>();

class PolyatomicRecoil : public GeneralUserObject
class PolyatomicRecoil : public ParkinCoulterBase
{
public:
PolyatomicRecoil(const InputParameters & parameters);

void execute() override;
void initialize() override {}
void finalize() override;

protected:
std::vector<unsigned int> _atomic_numbers;
std::vector<Real> _mass_numbers;

std::unique_ptr<PolyatomicDisplacementFunctionBase> _padf;
std::unique_ptr<PolyatomicDisplacementDerivativeFunction> _padf_derivative;
void execute() override;
};

#endif // GSL_ENABLED
117 changes: 117 additions & 0 deletions src/userobjects/ParkinCoulterBase.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/**********************************************************************/
/* DO NOT MODIFY THIS HEADER */
/* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */
/* */
/* Copyright 2017 Battelle Energy Alliance, LLC */
/* ALL RIGHTS RESERVED */
/**********************************************************************/
#ifdef GSL_ENABLED

#include "ParkinCoulterBase.h"
#include "PolyatomicDisplacementFunction.h"
#include "PolyatomicDamageEnergyFunction.h"
#include "PolyatomicDisplacementDerivativeFunction.h"
#include "MooseMesh.h"

// mytrim includes
#include <mytrim/element.h>

template <>
InputParameters
validParams<ParkinCoulterBase>()
{
InputParameters params = validParams<GeneralUserObject>();
params.addRequiredParam<std::vector<unsigned int>>("Z", "Atomic numbers");
params.addRequiredParam<std::vector<Real>>("A", "Mass numbers");
params.addRequiredParam<std::vector<Real>>("number_fraction", "Number fractions");
params.addRequiredParam<std::vector<Real>>("displacement_thresholds", "Dispacement thresholds");
params.addParam<std::vector<Real>>("lattice_binding_energies", "Lattice binding energies");
params.addParam<std::vector<std::vector<Real>>>(
"Ecap", "Capture energy Ecap_ij of species i being trapped in j site");
params.addRangeCheckedParam<Real>("uniform_energy_spacing_threshold",
10,
"uniform_energy_spacing_threshold >= 0",
"Threshold below which energy points are spaced uniformly.");
params.addRangeCheckedParam<Real>("uniform_energy_spacing",
0.25,
"uniform_energy_spacing > 0",
"Uniform energy spacing below the threshold");
params.addRequiredRangeCheckedParam<Real>(
"logarithmic_energy_spacing",
"logarithmic_energy_spacing > 1",
"Spacing of the energy points En in log space energy_spacing = E_{n+1} / En");
params.addRequiredRangeCheckedParam<Real>(
"Emax", "Emax > 0", "Maximum desired energy to which displacement functions are computed");

// this should only be run once
params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN;
params.suppressParameter<ExecFlagEnum>("execute_on");
return params;
}

ParkinCoulterBase::ParkinCoulterBase(const InputParameters & parameters)
: GeneralUserObject(parameters),
_atomic_numbers(getParam<std::vector<unsigned int>>("Z")),
_mass_numbers(getParam<std::vector<Real>>("A"))
{
_Ecap = {{}};
if (isParamValid("Ecap"))
_Ecap = getParam<std::vector<std::vector<Real>>>("Ecap");

std::vector<Real> N = getParam<std::vector<Real>>("number_fraction");
std::vector<Real> threshold = getParam<std::vector<Real>>("displacement_thresholds");
std::vector<Real> bind;
if (isParamValid("lattice_binding_energies"))
bind = getParam<std::vector<Real>>("lattice_binding_energies");
else
bind.assign(_atomic_numbers.size(), 0.0);

if (_atomic_numbers.size() != _mass_numbers.size() || _atomic_numbers.size() != N.size() ||
_atomic_numbers.size() != threshold.size() || _atomic_numbers.size() != bind.size())
mooseError("Size mismatch for at least one parameter array. Z, A, number_fraction, "
"displacement_thresholds and lattice_binding_energies"
"must all have the same length.");

for (unsigned int j = 0; j < _atomic_numbers.size(); ++j)
{
MyTRIM_NS::Element element;
element._Z = _atomic_numbers[j];
element._m = _mass_numbers[j];
element._t = N[j];
element._Edisp = threshold[j];
element._Elbind = bind[j];
_poly_mat.push_back(element);
}

if (getParam<Real>("Emax") < getParam<Real>("uniform_energy_spacing_threshold"))
mooseError("Emax must be larger than uniform_energy_spacing_threshold.");
}

void
ParkinCoulterBase::computeDamageFunctions()
{
Real energy = _padf->minEnergy();
Real Emax = getParam<Real>("Emax");
Real threshold = getParam<Real>("uniform_energy_spacing_threshold");
Real dE = getParam<Real>("uniform_energy_spacing");
Real logdE = getParam<Real>("logarithmic_energy_spacing");

for (;;) // while (energy <= Emax)
{
energy = energy < threshold ? energy + dE : energy * logdE;
if (energy > Emax)
{
_padf->advanceDisplacements(Emax);
break;
}

// increment displacements for value of energy
_padf->advanceDisplacements(energy);
}

if (_padf_derivative)
for (unsigned int n = 1; n < _padf->nEnergySteps(); ++n)
_padf_derivative->advanceDisplacements(_padf->energyPoint(n));
}

#endif
93 changes: 9 additions & 84 deletions src/userobjects/PolyatomicRecoil.C
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,7 @@ template <>
InputParameters
validParams<PolyatomicRecoil>()
{
InputParameters params = validParams<GeneralUserObject>();
params.addRequiredParam<std::vector<unsigned int>>("Z", "Atomic numbers");
params.addRequiredParam<std::vector<Real>>("A", "Mass numbers");
params.addRequiredParam<std::vector<Real>>("number_fraction", "Number fractions");
params.addRequiredParam<std::vector<Real>>("displacement_thresholds", "Dispacement thresholds");
params.addParam<std::vector<Real>>("lattice_binding_energies", "Lattice binding energies");
params.addParam<std::vector<std::vector<Real>>>(
"Ecap", "Capture energy Ecap_ij of species i being trapped in j site");
params.addRangeCheckedParam<Real>("uniform_energy_spacing_threshold",
10,
"uniform_energy_spacing_threshold >= 0",
"Threshold below which energy points are spaced uniformly.");
params.addRangeCheckedParam<Real>("uniform_energy_spacing",
0.25,
"uniform_energy_spacing > 0",
"Uniform energy spacing below the threshold");
params.addRequiredRangeCheckedParam<Real>(
"logarithmic_energy_spacing",
"logarithmic_energy_spacing > 1",
"Spacing of the energy points En in log space energy_spacing = E_{n+1} / En");
params.addRequiredRangeCheckedParam<Real>(
"Emax", "Emax > 0", "Maximum desired energy to which displacement functions are computed");
InputParameters params = validParams<ParkinCoulterBase>();
MooseEnum nrt_damage_types("TOTAL NET ENERGY NET_DERIVATIVE", "TOTAL");
params.addParam<MooseEnum>(
"damage_type",
Expand All @@ -59,44 +38,14 @@ validParams<PolyatomicRecoil>()
"PolyatomicRecoil allows computation of total and net displacement functions,"
"damage energy functions, and the derivative of the net displacement functions w.r.t. number "
"fractions.");
params.set<ExecFlagEnum>("execute_on") = EXEC_INITIAL;
params.suppressParameter<ExecFlagEnum>("execute_on");
return params;
}

PolyatomicRecoil::PolyatomicRecoil(const InputParameters & parameters)
: GeneralUserObject(parameters),
_atomic_numbers(getParam<std::vector<unsigned int>>("Z")),
_mass_numbers(getParam<std::vector<Real>>("A"))
: ParkinCoulterBase(parameters)
{
std::vector<Real> N = getParam<std::vector<Real>>("number_fraction");
std::vector<Real> threshold = getParam<std::vector<Real>>("displacement_thresholds");
std::vector<Real> bind;
if (isParamValid("lattice_binding_energies"))
bind = getParam<std::vector<Real>>("lattice_binding_energies");
else
bind.assign(_atomic_numbers.size(), 0.0);

std::vector<std::vector<Real>> Ecap = {{}};
if (isParamValid("Ecap"))
Ecap = getParam<std::vector<std::vector<Real>>>("Ecap");

if (_atomic_numbers.size() != _mass_numbers.size() || _atomic_numbers.size() != N.size() ||
_atomic_numbers.size() != threshold.size() || _atomic_numbers.size() != bind.size())
mooseError("Size mismatch for at least one parameter array. Z, A, number_fraction, "
"displacement_thresholds and lattice_binding_energies"
"must all have the same length.");

std::vector<MyTRIM_NS::Element> poly_mat;
for (unsigned int j = 0; j < _atomic_numbers.size(); ++j)
{
MyTRIM_NS::Element element;
element._Z = _atomic_numbers[j];
element._m = _mass_numbers[j];
element._t = N[j];
element._Edisp = threshold[j];
element._Elbind = bind[j];
poly_mat.push_back(element);
}

// set the displacement function type
nrt_type type = TOTAL;
if (getParam<MooseEnum>("damage_type") == "NET")
Expand All @@ -107,45 +56,21 @@ PolyatomicRecoil::PolyatomicRecoil(const InputParameters & parameters)
type = NET_DERIVATIVE;

if (type == ENERGY)
_padf = libmesh_make_unique<PolyatomicDamageEnergyFunction>(poly_mat, type, Ecap);
_padf = libmesh_make_unique<PolyatomicDamageEnergyFunction>(_poly_mat, type, _Ecap);
else if (type == NET_DERIVATIVE)
{
_padf = libmesh_make_unique<PolyatomicDisplacementFunction>(poly_mat, NET, Ecap);
_padf = libmesh_make_unique<PolyatomicDisplacementFunction>(_poly_mat, NET, _Ecap);
_padf_derivative = libmesh_make_unique<PolyatomicDisplacementDerivativeFunction>(
poly_mat, type, dynamic_cast<PolyatomicDisplacementFunction *>(_padf.get()), Ecap);
_poly_mat, type, dynamic_cast<PolyatomicDisplacementFunction *>(_padf.get()), _Ecap);
}
else
_padf = libmesh_make_unique<PolyatomicDisplacementFunction>(poly_mat, type, Ecap);

if (getParam<Real>("Emax") < getParam<Real>("uniform_energy_spacing_threshold"))
mooseError("Emax must be larger than uniform_energy_spacing_threshold.");
_padf = libmesh_make_unique<PolyatomicDisplacementFunction>(_poly_mat, type, _Ecap);
}

void
PolyatomicRecoil::execute()
{
Real energy = _padf->minEnergy();
Real Emax = getParam<Real>("Emax");
Real threshold = getParam<Real>("uniform_energy_spacing_threshold");
Real dE = getParam<Real>("uniform_energy_spacing");
Real logdE = getParam<Real>("logarithmic_energy_spacing");

for (;;) // while (energy <= Emax)
{
energy = energy < threshold ? energy + dE : energy * logdE;
if (energy > Emax)
{
_padf->advanceDisplacements(Emax);
break;
}

// increment displacements for value of energy
_padf->advanceDisplacements(energy);
}

if (_padf_derivative)
for (unsigned int n = 1; n < _padf->nEnergySteps(); ++n)
_padf_derivative->advanceDisplacements(_padf->energyPoint(n));
computeDamageFunctions();
}

void
Expand Down
1 change: 0 additions & 1 deletion tests/userobjects/parkin_coulter/huang_ghoniem_92.i
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
logarithmic_energy_spacing = 1.1

Emax = 1.0e3
execute_on = timestep_end

displacement_file_base = 'huang_ghoniem_n_ij'
[../]
Expand Down
1 change: 0 additions & 1 deletion tests/userobjects/parkin_coulter/parkin_coulter_Al2O3.i
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
Emax = 1e3
uniform_energy_spacing = 0.2
uniform_energy_spacing_threshold = 10
execute_on = timestep_end
displacement_file_base = parkin_coulter_Al2O3
damage_type = NET
[../]
Expand Down

0 comments on commit 7d52267

Please sign in to comment.