MARLEY (Model of Argon Reaction Low Energy Yields) v2.0.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
Loading...
Searching...
No Matches
BackshiftedFermiGasModel.cc
1
4//
5// This file is part of MARLEY (Model of Argon Reaction Low Energy Yields)
6//
7// MARLEY is free software: you can redistribute it and/or modify it under the
8// terms of version 3 of the GNU General Public License as published by the
9// Free Software Foundation.
10//
11// For the full text of the license please see COPYING or
12// visit http://opensource.org/licenses/GPL-3.0
13//
14// Please respect the MCnet academic usage guidelines. See GUIDELINES
15// or visit https://www.montecarlonet.org/GUIDELINES for details.
16
17#include <cmath>
18
19#include "marley/marley_utils.hh"
20#include "marley/MassTable.hh"
21#include "marley/BackshiftedFermiGasModel.hh"
22
24 : Z_(Z), A_(A)
25{
26 int N = A_ - Z_;
27 double A_third = std::pow(A_, 1.0/3.0);
28
29 // Parameters from global level density fit
30 static constexpr double alpha = 0.0722396; // MeV^(-1)
31 static constexpr double beta = 0.195267; // MeV^(-1)
32 static constexpr double gamma_1 = 0.410289; // MeV(-1)
33 static constexpr double delta_global = 0.173015; // MeV
34
35 // Asymptotic level density parameter
36 a_tilde_ = alpha*A_ + beta*std::pow(A_third, 2);
37
38 // Damping parameter
39 gamma_ = gamma_1 / A_third;
40
42
43 // Shell correction energy
46
47 // Energy shift
48 Delta_BFM_ = delta_global;
49 bool z_odd = Z % 2;
50 bool n_odd = N % 2;
51 // There will be no change to the energy shift if the nucleus is odd-even
52 if (z_odd && n_odd) Delta_BFM_ += -12/std::sqrt(A_);
53 else if (!z_odd && !n_odd) Delta_BFM_ += 12/std::sqrt(A_);
54
55 // Spin cut-off parameter
56 sigma_d_global_ = 0.83*std::pow(A_, 0.26);
57 Sn_ = mt.get_fragment_separation_energy(Z_, A_, marley_utils::NEUTRON);
58}
59
60// rho(Ex, J, Pi) assuming equipartition of parity (the parameter Pi is unused)
62 marley::Parity /*Pi*/)
63{
64 return 0.5 * level_density(Ex, two_J);
65}
66
68 double rho = level_density(Ex);
69 // Spin-cutoff parameter sigma_ is updated by previous call to
70 // this->level_density(Ex)
71 double two_sigma2 = 2 * std::pow(sigma_, 2);
72 return ((two_J + 1) / two_sigma2) * std::exp(-0.25 * std::pow(two_J + 1, 2)
73 / two_sigma2) * rho;
74}
75
78
79 // Effective excitation energy
80 double U = Ex - Delta_BFM_;
81
82 // Level density parameter
83 double a;
84 if (U <= 0) { // Equivalently, Ex <= Delta_BFM_
85 // Use first-order Taylor expansion for small energies
86 a = a_tilde_ * (1 + gamma_ * delta_W_);
87 }
88 else {
89 a = a_tilde_ * (1 + (delta_W_ / U) * (1 - std::exp(-gamma_ * U)));
90 }
91
94 const double Ed = 0.;
95
96 // Compute the spin cut-off parameter sigma_
97
98 // To avoid numerical problems, we will always use the discrete spin cutoff
99 // parameter for U <= Ed.
100 // The TALYS manual suggests using this for Ex <= Ed, but this isn't a huge
101 // change. The actual TALYS code may make this same choice.
104 if (U <= Ed) sigma_ = sigma_d_global_;
105 else {
106
107 if (Ex >= Sn_) {
108 double sigma_F2 = compute_sigma_F2(Ex, a);
109 sigma_ = std::sqrt(sigma_F2);
110 }
111 else {
112
113 // sigma_F2 evaluated for Ex == Sn for the linear interpolation
114 double sigma_F2_Sn = compute_sigma_F2(Sn_, a);
115
116 // Ed < Ex < Sn_
117 double sigma_d2 = std::pow(sigma_d_global_, 2);
118 sigma_ = std::sqrt(sigma_d2 + (Ex - Ed)
119 * (sigma_F2_Sn - sigma_d2) / (Sn_ - Ed));
120 }
121 }
122
123 // For very small excitation energies, take the limit of the total
124 // level density as U -> 0 to prevent numerical issues.
125 if (U <= 0) {
126 static const double exp1 = std::exp(1);
127 return exp1 * a / (12 * sigma_);
128 }
129
130 double aU = a * U;
131 double sqrt_aU = std::sqrt(aU);
132 return std::pow(12 * sigma_ * (std::sqrt(2 * sqrt_aU)*U*std::exp(-2 * sqrt_aU)
133 + std::exp(-aU - 1)/a), -1);
134}
double Sn_
neutron separation energy (MeV)
double gamma_
damping parameter (MeV -1)
int Z_
atomic number for this nuclide
double a_tilde_
asymptotic level density parameter (MeV -1)
int A_
mass number for this nuclide
double compute_sigma_F2(double Ex, double a)
Helper function used when evaluating the spin cutoff parameter.
double Delta_BFM_
excitation energy shift (MeV)
virtual double level_density(double Ex) override
double delta_W_
shell correction energy (MeV)
double sigma_d_global_
global fit for discrete-region spin cut-off parameter
Singleton lookup table for particle and atomic masses.
Definition MassTable.hh:30
double get_fragment_separation_energy(int Z, int A, int pdg, bool theory_ok=true) const
Get the separation energy for emission of a nuclear fragment from a nucleus.
Definition MassTable.cc:206
static const MassTable & Instance()
Get a const reference to the singleton instance of the MassTable.
Definition MassTable.cc:69
double get_mass_excess(int Z, int A, bool theory_ok=true) const
Get the mass excess of a nucleus.
Definition MassTable.cc:183
double liquid_drop_model_mass_excess(int Z, int A) const
Calculate a theoretical mass excess for a nucleus using the liquid drop model.
Definition MassTable.cc:238
Type-safe representation of a parity value (either +1 or -1)
Definition Parity.hh:25