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
marley::KoningDelarocheOpticalModel Class Reference

Nuclear optical model for fragment emission calculations. More...

#include <KoningDelarocheOpticalModel.hh>

Inheritance diagram for marley::KoningDelarocheOpticalModel:
marley::CachedOpticalModel marley::OpticalModel

Classes

class  ParamConfig
 

Public Member Functions

 KoningDelarocheOpticalModel (int Z, int A, const JSON &om_config)
 
virtual std::complex< double > optical_model_potential (double r, double fragment_KE_lab, int fragment_pdg, int two_j, int l, int two_s, int target_charge=0) override
 Calculate the optical model potential (including the Coulomb potential)
 
virtual void print (std::ostream &out) const override
 Print information about the optical model parameters.
 
virtual double total_cross_section (double fragment_KE_lab, int fragment_pdg, int two_s, size_t l_max, int target_charge=0) override
 Compute the energy-averaged total cross section (MeV -2) for a nuclear fragment projectile.
 
- Public Member Functions inherited from marley::CachedOpticalModel
 CachedOpticalModel (int Z, int A)
 
virtual double transmission_coefficient (double total_KE_CM, int fragment_pdg, int two_j, int l, int two_s, int target_charge=0) override
 Calculate the transmission coefficient for a nuclear fragment.
 
- Public Member Functions inherited from marley::OpticalModel
 OpticalModel (int Z, int A)
 
int A () const
 Get the mass number.
 
int Z () const
 Get the atomic number.
 

Additional Inherited Members

- Static Public Member Functions inherited from marley::CachedOpticalModel
static void set_use_cache (bool use_it)
 
- Protected Attributes inherited from marley::CachedOpticalModel
std::map< TCKey, std::shared_ptr< InterpolatingFunction > > tc_cache_
 Saved InterpolatingFunction objects corresponding to previously-encountered transmission coefficient requests.
 
- Protected Attributes inherited from marley::OpticalModel
int A_
 
int Z_
 
- Static Protected Attributes inherited from marley::CachedOpticalModel
static constexpr double MAX_TOTAL_KE_CM = 100.
 Maximum kinetic energy to use when interacting with the cache.
 
static constexpr double MIN_TOTAL_KE_CM = 1e-10
 Minimum kinetic energy to use when interacting with the cache.
 
static bool USE_CACHE = true
 Boolean switch that allows global enabling/disabling of the cache, which is used by default.
 

Detailed Description

Nuclear optical model for fragment emission calculations.

This class implements the global optical model potential of A. J. Koning and J. P. Delaroche, Nucl. Phys. A 713 (2003) 231-310. Numerov's method is used to integrate the Schrödinger equation during transmission coefficient and cross section calculations.

Definition at line 41 of file KoningDelarocheOpticalModel.hh.

Constructor & Destructor Documentation

◆ KoningDelarocheOpticalModel()

marley::KoningDelarocheOpticalModel::KoningDelarocheOpticalModel ( int Z,
int A,
const JSON & om_config )
Parameters
ZAtomic number of the desired nuclide
AMass number of the desired nuclide
om_configJSON object containing the parameter values for the optical model calculation

Definition at line 25 of file KoningDelarocheOpticalModel.cc.

26 : marley::CachedOpticalModel( Z, A )
27{
28 // Set the step size (fm) for numerically solving the Schrodinger equation
29 // using Numerov's method
30 get_from_json( "step_size", om_config, step_size_,
31 DEFAULT_NUMEROV_STEP_SIZE_ );
32
33 // Calculate the target mass
34 const auto& mt = marley::MassTable::Instance();
35 target_mass_ = mt.get_atomic_mass( Z, A );
36
37 // Parse the JSON input needed to set up the optical model parameters
38 marley::KoningDelarocheOpticalModel::ParamConfig om( om_config );
39
40 // Initialize the spherical optical model parameters (see
41 // https://doi.org/10.1103/PhysRevC.107.014602)
42
43 int N = A_ - Z_; // Neutron number
44 double alpha = ( N - Z_ ) / static_cast< double >( A_ );
45
46 double A_to_the_one_third = std::pow( A_, 1.0/3.0 );
47
48 // Neutrons
49 v1n = om["v10"] - om["v1A"]*A_ - om["v1alpha"]*alpha; // MeV
50 v2n = om["vn20"] - om["vn2A"]*A_; // MeV^(-1)
51 v3n = om["vn30"] - om["vn3A"]*A_; // MeV^(-2)
52 v4n = om["v40"]; // MeV^(-3)
53 w1n = om["wn10"] + om["wn1A"]*A_; // MeV
54 w2n = om["w20"] + om["w2A"]*A_; // MeV
55 d1n = om["d10"] - om["d1alpha"]*alpha; // MeV
56 d2n = om["d20"] + om["d2A"]/( 1. + std::exp(
57 ( A_ - om["d2A3"]) / om["d2A2"] )
58 ); // MeV^(-1)
59 d3n = om["d30"]; // MeV
60 vso1n = om["vSO10"] + om["vSO1A"]*A_; // MeV
61 vso2n = om["vSO20"]; // MeV^(-1)
62 wso1n = om["wSO10"]; // MeV
63 wso2n = om["wSO20"]; // MeV
64 Efn = -11.2814 + 0.02646*A_; // MeV
65 Rvn = om["rV0"]*A_to_the_one_third - om["rVA"]; // fm
66 avn = om["aV0"] - om["aVA"]*A_; // fm
67 Rdn = om["rD0"]*A_to_the_one_third
68 - om["rDA"]*std::pow( A_to_the_one_third, 2 ); // fm
69 adn = om["anD0"] - om["anDA"]*A_; // fm
70 Rso_n = om["rSO0"]*A_to_the_one_third - om["rSOA"]; // fm
71 aso_n = om["aSO0"]; // fm
72
73 // Protons
74 v1p = om["v10"] - om["v1A"]*A_ + om["v1alpha"]*alpha; // MeV
75 v2p = om["vp20"] + om["vp2A"]*A_; // MeV^(-1)
76 v3p = om["vp30"] + om["vp3A"]*A_; // MeV^(-2)
77 v4p = om["v40"]; // MeV^(-3)
78 w1p = om["wp10"] + om["wp1A"]*A_; // MeV
79 w2p = om["w20"] + om["w2A"]*A_; // MeV
80 d1p = om["d10"] + om["d1alpha"]*alpha; // MeV
81 d2p = om["d20"] + om["d2A"]/( 1. + std::exp(
82 ( A_ - om["d2A3"]) / om["d2A2"] )
83 ); // MeV^(-1)
84 d3p = om["d30"]; // MeV
85 vso1p = om["vSO10"] + om["vSO1A"]*A_; // MeV
86 vso2p = om["vSO20"]; // MeV^(-1)
87 wso1p = om["wSO10"]; // MeV
88 wso2p = om["wSO20"]; // MeV
89 Efp = -8.4075 + 0.01378*A_; // MeV
90 Rvp = om["rV0"]*A_to_the_one_third - om["rVA"]; // fm
91 avp = om["aV0"] - om["aVA"]*A_; // fm
92 Rdp = om["rD0"]*A_to_the_one_third
93 - om["rDA"]*std::pow( A_to_the_one_third, 2 ); // fm
94 adp = om["apD0"] + om["apDA"]*A_; // fm
95 Rso_p = om["rSO0"]*A_to_the_one_third - om["rSOA"]; // fm
96 aso_p = om["aSO0"]; // fm
97 Rc = om["rC0"]*A_to_the_one_third + om["rCA"]/A_to_the_one_third
98 + om["rCA2"]*std::pow( A_to_the_one_third, -4 ); // fm
99
100 // Note that Koning and Delaroche approximated (6/5)*e^2 = 1.73 in their
101 // original paper, following a book by Wilkinson cited in their bibliography.
102 Vcbar_p = 6. * Z_ * marley_utils::e2 / ( 5. * Rc ); // MeV
103}
static const MassTable & Instance()
Get a const reference to the singleton instance of the MassTable.
Definition MassTable.cc:69
int A() const
Get the mass number.
int Z() const
Get the atomic number.

References marley::CachedOpticalModel::CachedOpticalModel(), marley::OpticalModel::A(), marley::MassTable::Instance(), and marley::OpticalModel::Z().

Member Function Documentation

◆ optical_model_potential()

std::complex< double > marley::KoningDelarocheOpticalModel::optical_model_potential ( double r,
double fragment_KE_lab,
int fragment_pdg,
int two_j,
int l,
int two_s,
int target_charge = 0 )
overridevirtual

Calculate the optical model potential (including the Coulomb potential)

Parameters
rDistance from nuclear center (fm)
fragment_KE_labFragment kinetic energy (MeV) in the lab frame
fragment_pdgPDG code for the nuclear fragment
two_jTwo times the total angular momentum of the fragment
lOrbital angular momentum of the fragment
two_sTwo times the spin of the fragment
target_chargeNet charge of the target atom
Returns
Complex-valued optical model potential (MeV)
Todo
TODO: find a better way of doing this!

Implements marley::OpticalModel.

Definition at line 106 of file KoningDelarocheOpticalModel.cc.

109{
110 update_target_mass( target_charge );
111
112 // The calculate_kinematic_variables() function will set the fragment_mass_
113 // member variable, but we need that value in advance in order to provide the
114 // total CM frame kinetic energy as input. To get around this, retrieve the
115 // fragment mass directly from the mass table instead
117 const auto& mt = marley::MassTable::Instance();
118 double m_fragment = mt.get_particle_mass( fragment_pdg );
119
120 double KE_tot_CM = std::max( 0., marley_utils::real_sqrt(
121 std::pow(target_mass_ + m_fragment, 2)
122 + 2.*target_mass_*fragment_KE_lab) - m_fragment - target_mass_ );
123
124 calculate_kinematic_variables( KE_tot_CM, fragment_pdg );
125 calculate_om_parameters( fragment_pdg, two_j, l, two_s );
126 return omp( r );
127}

References marley::MassTable::Instance().

◆ print()

void marley::KoningDelarocheOpticalModel::print ( std::ostream & out) const
overridevirtual

Print information about the optical model parameters.

Implements marley::OpticalModel.

Definition at line 559 of file KoningDelarocheOpticalModel.cc.

560{
561 out << "----------------------------------------------------------\n";
562 out << "KD optical model for Z = " << Z_ << ", A = " << A_ << '\n';
563 out << "----------------------------------------------------------\n";
564 out << "Neutron parameters:\n\n";
565
566 out << " v1n = " << v1n << " MeV\n";
567 out << " v2n = " << v2n << " MeV^{-1}\n";
568 out << " v3n = " << v3n << " MeV^{-2}\n";
569 out << " v4n = " << v4n << " MeV^{-3}\n\n";
570
571 out << " w1n = " << w1n << " MeV\n";
572 out << " w2n = " << w2n << " MeV\n\n";
573
574 out << " d1n = " << d1n << " MeV\n";
575 out << " d2n = " << d2n << " MeV^{-1}\n";
576 out << " d3n = " << d3n << " MeV\n\n";
577
578 out << " vso1n = " << vso1n << " MeV\n";
579 out << " vso2n = " << vso2n << " MeV^{-1}\n\n";
580
581 out << " wso1n = " << wso1n << " MeV\n";
582 out << " wso2n = " << wso2n << " MeV\n\n";
583
584 out << " Efn = " << Efn << " MeV\n\n";
585
586 out << " Rvn = " << Rvn << " fm\n";
587 out << " avn = " << avn << " fm\n";
588 out << " Rdn = " << Rdn << " fm\n";
589 out << " adn = " << adn << " fm\n";
590 out << " Rso_n = " << Rso_n << " fm\n";
591 out << " aso_n = " << aso_n << " fm\n";
592
593 out << "----------------------------------------------------------\n";
594 out << "Proton parameters:\n\n";
595
596 out << " v1p = " << v1p << " MeV\n";
597 out << " v2p = " << v2p << " MeV^{-1}\n";
598 out << " v3p = " << v3p << " MeV^{-2}\n";
599 out << " v4p = " << v4p << " MeV^{-3}\n\n";
600
601 out << " w1p = " << w1p << " MeV\n";
602 out << " w2p = " << w2p << " MeV\n\n";
603
604 out << " d1p = " << d1p << " MeV\n";
605 out << " d2p = " << d2p << " MeV^{-1}\n";
606 out << " d3p = " << d3p << " MeV\n\n";
607
608 out << " vso1p = " << vso1p << " MeV\n";
609 out << " vso2p = " << vso2p << " MeV^{-1}\n\n";
610
611 out << " wso1p = " << wso1p << " MeV\n";
612 out << " wso2p = " << wso2p << " MeV\n\n";
613
614 out << " Efp = " << Efp << " MeV\n\n";
615
616 out << " Rvp = " << Rvp << " fm\n";
617 out << " avp = " << avp << " fm\n";
618 out << " Rdp = " << Rdp << " fm\n";
619 out << " adp = " << adp << " fm\n";
620 out << " Rso_p = " << Rso_p << " fm\n";
621 out << " aso_p = " << aso_p << " fm\n\n";
622
623 out << " Rc = " << Rc << " fm\n";
624 out << " Vcbar_p = " << Vcbar_p << " MeV\n";
625 out << "----------------------------------------------------------\n";
626 out << " Step size = " << step_size_ << " fm\n";
627 out << "----------------------------------------------------------\n";
628}

◆ total_cross_section()

double marley::KoningDelarocheOpticalModel::total_cross_section ( double fragment_KE_lab,
int fragment_pdg,
int two_s,
size_t l_max,
int target_charge = 0 )
overridevirtual

Compute the energy-averaged total cross section (MeV -2) for a nuclear fragment projectile.

The total cross section given here by the optical model may be directly compared to experiment. Expressions exist for the optical model elastic and reaction (absorption) cross sections, but these are hard to directly compare to the data because the absorption cross section includes the compound elastic channel.

For more details, see appendix A (especially equation A.12) of S. Gardiner, "Nuclear Effects in Neutrino Detection," PhD thesis, University of California, Davis, 2018. Note that we assume in this function that the target nucleus has zero spin (spherical optical model).

Parameters
fragment_KE_labLab-frame kinetic energy of the incident projectile (MeV)
fragment_pdgProjectile's PDG code
two_sTwo times the spin of the projectile
l_maxThe maximum value of the orbital angular momentum quantum number \(\ell\) to include in the sum over S-matrix elements
target_chargeNet charge of the target atom (used to adjust the atomic mass by the appropriate number of electron masses if the target is ionized)
Returns
Energy-averaged total scattering cross section (MeV -2)
Todo
TODO: find a better way of doing this!

Implements marley::OpticalModel.

Definition at line 275 of file KoningDelarocheOpticalModel.cc.

278{
279 update_target_mass( target_charge );
280
281 // The calculate_kinematic_variables() function will set the fragment_mass_
282 // member variable, but we need that value in advance in order to provide the
283 // total CM frame kinetic energy as input. To get around this, retrieve the
284 // fragment mass directly from the mass table instead
286 const auto& mt = marley::MassTable::Instance();
287 double m_fragment = mt.get_particle_mass( fragment_pdg );
288
289 double KE_tot_CM = std::max( 0., marley_utils::real_sqrt(
290 std::pow(target_mass_ + m_fragment, 2)
291 + 2.*target_mass_*fragment_KE_lab) - m_fragment - target_mass_ );
292
293 calculate_kinematic_variables( KE_tot_CM, fragment_pdg );
294
295 double sum = 0.;
296 for ( size_t l = 0; l <= l_max; ++l ) {
297 int two_l = 2*l;
298 for ( int two_j = std::abs(two_l - two_s);
299 two_j <= two_l + two_s; two_j += 2 )
300 {
301 std::complex< double > S = s_matrix_element( fragment_pdg, two_j,
302 l, two_s );
303 sum += ( two_j + 1 ) * ( 1. - S.real() );
304 }
305 }
306
307 // Compute the cross section in natural units (MeV^(-2))
308 double xs = marley_utils::two_pi * sum / ( (two_s + 1)
309 * CM_frame_momentum_squared_ );
310 return xs;
311}

References marley::MassTable::Instance().


The documentation for this class was generated from the following files: