mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 05:35:49 -04:00
Respond to @smharper comments on #1144
This commit is contained in:
parent
463ab5f06b
commit
a39f77a408
3 changed files with 25 additions and 26 deletions
|
|
@ -31,15 +31,12 @@ constexpr int FIT_F {2}; // Fission
|
|||
|
||||
class WindowedMultipole {
|
||||
public:
|
||||
// Types, aliases
|
||||
using cdouble = std::complex<double>;
|
||||
|
||||
// Constructors, destructors
|
||||
WindowedMultipole(hid_t group);
|
||||
|
||||
// Methods
|
||||
|
||||
//! Evaluate the windowed multipole equations for cross sections in the
|
||||
//! \brief Evaluate the windowed multipole equations for cross sections in the
|
||||
//! resolved resonance regions
|
||||
//!
|
||||
//! \param E Incident neutron energy in [eV]
|
||||
|
|
@ -47,8 +44,9 @@ public:
|
|||
//! \return Tuple of elastic scattering, absorption, and fission cross sections in [b]
|
||||
std::tuple<double, double, double> evaluate(double E, double sqrtkT);
|
||||
|
||||
//! Evaluates the windowed multipole equations for the derivative of cross
|
||||
//! sections in the resolved resonance regions with respect to temperature.
|
||||
//! \brief Evaluates the windowed multipole equations for the derivative of
|
||||
//! cross sections in the resolved resonance regions with respect to
|
||||
//! temperature.
|
||||
//!
|
||||
//! \param E Incident neutron energy in [eV]
|
||||
//! \param sqrtkT Square root of temperature times Boltzmann constant
|
||||
|
|
@ -59,7 +57,7 @@ public:
|
|||
// Data members
|
||||
std::string name_; //!< Name of nuclide
|
||||
bool fissionable_; //!< Is the nuclide fissionable?
|
||||
xt::xtensor<cdouble, 2> data_; //!< Poles and residues
|
||||
xt::xtensor<std::complex<double>, 2> data_; //!< Poles and residues
|
||||
double sqrt_awr_; //!< Square root of atomic weight ratio
|
||||
double E_min_; //!< Minimum energy in [eV]
|
||||
double E_max_; //!< Maximum energy in [eV]
|
||||
|
|
|
|||
|
|
@ -513,8 +513,6 @@ void Nuclide::calculate_xs(int i_sab, double E, int i_log_union,
|
|||
use_mp = (E >= multipole_->E_min_ && E <= multipole_->E_max_);
|
||||
}
|
||||
|
||||
int i_temp = -1;
|
||||
|
||||
// Evaluate multipole or interpolate
|
||||
if (use_mp) {
|
||||
// Call multipole kernel
|
||||
|
|
@ -556,13 +554,16 @@ void Nuclide::calculate_xs(int i_sab, double E, int i_log_union,
|
|||
// Find the appropriate temperature index.
|
||||
double kT = sqrtkT*sqrtkT;
|
||||
double f;
|
||||
int i_temp = -1;
|
||||
switch (settings::temperature_method) {
|
||||
case TEMPERATURE_NEAREST:
|
||||
{
|
||||
double max_diff = INFTY;
|
||||
for (int t = 0; t < kTs_.size(); ++t) {
|
||||
if (std::abs(kTs_[t] - kT) < max_diff) {
|
||||
double diff = std::abs(kTs_[t] - kT);
|
||||
if (diff < max_diff) {
|
||||
i_temp = t;
|
||||
max_diff = diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -615,29 +616,29 @@ void Nuclide::calculate_xs(int i_sab, double E, int i_log_union,
|
|||
micro_xs.interp_factor = f;
|
||||
|
||||
// Calculate microscopic nuclide total cross section
|
||||
micro_xs.total = (1.0 - f)*xs(i_grid,XS_TOTAL)
|
||||
+ f*xs(i_grid + 1,XS_TOTAL);
|
||||
micro_xs.total = (1.0 - f)*xs(i_grid, XS_TOTAL)
|
||||
+ f*xs(i_grid + 1, XS_TOTAL);
|
||||
|
||||
// Calculate microscopic nuclide absorption cross section
|
||||
micro_xs.absorption = (1.0 - f)*xs(i_grid,XS_ABSORPTION)
|
||||
+ f*xs(i_grid + 1,XS_ABSORPTION);
|
||||
micro_xs.absorption = (1.0 - f)*xs(i_grid, XS_ABSORPTION)
|
||||
+ f*xs(i_grid + 1, XS_ABSORPTION);
|
||||
|
||||
if (fissionable_) {
|
||||
// Calculate microscopic nuclide total cross section
|
||||
micro_xs.fission = (1.0 - f)*xs(i_grid,XS_FISSION)
|
||||
+ f*xs(i_grid + 1,XS_FISSION);
|
||||
micro_xs.fission = (1.0 - f)*xs(i_grid, XS_FISSION)
|
||||
+ f*xs(i_grid + 1, XS_FISSION);
|
||||
|
||||
// Calculate microscopic nuclide nu-fission cross section
|
||||
micro_xs.nu_fission = (1.0 - f)*xs(i_grid,XS_NU_FISSION)
|
||||
+ f*xs(i_grid + 1,XS_NU_FISSION);
|
||||
micro_xs.nu_fission = (1.0 - f)*xs(i_grid, XS_NU_FISSION)
|
||||
+ f*xs(i_grid + 1, XS_NU_FISSION);
|
||||
} else {
|
||||
micro_xs.fission = 0.0;
|
||||
micro_xs.nu_fission = 0.0;
|
||||
}
|
||||
|
||||
// Calculate microscopic nuclide photon production cross section
|
||||
micro_xs.photon_prod = (1.0 - f)*xs(i_grid,XS_PHOTON_PROD)
|
||||
+ f*xs(i_grid + 1,XS_PHOTON_PROD);
|
||||
micro_xs.photon_prod = (1.0 - f)*xs(i_grid, XS_PHOTON_PROD)
|
||||
+ f*xs(i_grid + 1, XS_PHOTON_PROD);
|
||||
|
||||
// Depletion-related reactions
|
||||
if (simulation::need_depletion_rx) {
|
||||
|
|
@ -680,7 +681,7 @@ void Nuclide::calculate_xs(int i_sab, double E, int i_log_union,
|
|||
}
|
||||
|
||||
// Initialize sab treatment to false
|
||||
micro_xs.index_sab = -1;
|
||||
micro_xs.index_sab = C_NONE;
|
||||
micro_xs.sab_frac = 0.0;
|
||||
|
||||
// Initialize URR probability table treatment to false
|
||||
|
|
@ -695,10 +696,10 @@ void Nuclide::calculate_xs(int i_sab, double E, int i_log_union,
|
|||
// If the particle is in the unresolved resonance range and there are
|
||||
// probability tables, we need to determine cross sections from the table
|
||||
if (settings::urr_ptables_on && urr_present_ && !use_mp) {
|
||||
int n = urr_data_[i_temp].n_energy_;
|
||||
if ((E > urr_data_[i_temp].energy_(0)) &&
|
||||
(E < urr_data_[i_temp].energy_(n-1))) {
|
||||
this->calculate_urr_xs(i_temp, E);
|
||||
int n = urr_data_[micro_xs.index_temp].n_energy_;
|
||||
if ((E > urr_data_[micro_xs.index_temp].energy_(0)) &&
|
||||
(E < urr_data_[micro_xs.index_temp].energy_(n-1))) {
|
||||
this->calculate_urr_xs(micro_xs.index_temp, E);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ WindowedMultipole::evaluate_deriv(double E, double sqrtkT)
|
|||
|
||||
if (sqrtkT == 0.0) {
|
||||
fatal_error("Windowed multipole temperature derivatives are not implemented"
|
||||
"for 0 Kelvin cross sections.");
|
||||
" for 0 Kelvin cross sections.");
|
||||
}
|
||||
|
||||
// Locate us
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue