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
KoningDelarocheOpticalModel.hh
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#pragma once
18#include <cmath>
19#include <complex>
20#include <map>
21#include <string>
22#include <vector>
23
24#include "marley/CachedOpticalModel.hh"
25#include "marley/DecayScheme.hh"
26#include "marley/MassTable.hh"
27#include "marley/marley_utils.hh"
28
29namespace marley {
30
31 class JSON;
32
42
43 public:
44
47 class ParamConfig;
48
53 KoningDelarocheOpticalModel( int Z, int A, const JSON& om_config );
54
55 virtual std::complex< double > optical_model_potential( double r,
56 double fragment_KE_lab, int fragment_pdg, int two_j, int l, int two_s,
57 int target_charge = 0 ) override;
58
59 virtual double total_cross_section( double fragment_KE_lab,
60 int fragment_pdg, int two_s, size_t l_max, int target_charge = 0 )
61 override;
62
63 virtual void print( std::ostream& out ) const override;
64
65 private:
66
67 virtual double compute_transmission_coefficient( double total_KE_CM,
68 int fragment_pdg, int two_j, int l, int two_s, int target_charge = 0 )
69 override;
70
72 double total_CM_frame_KE_;
74 double fragment_mass_;
77 double fragment_KE_lab_;
79 double CM_frame_momentum_squared_;
80
81 // Storage for the mass of the nuclear target represented by this optical
82 // model potential. Its value will be adjusted based on the ionization
83 // state of the target.
84 double target_mass_;
85
86 // Helper function for computing optical model transmission coefficients
87 // and cross sections
88 std::complex< double > s_matrix_element( int fragment_pdg, int two_j,
89 int l, int two_s );
90
91 // Helper functions for computing the optical model potential
92 void calculate_om_parameters( int fragment_pdg, int two_j, int l,
93 int two_s );
94
95 // Compute the optical model potential at radius r
96 std::complex< double > omp( double r ) const;
97
98 // Computes the optical model potential minus the Coulomb potential at
99 // radius r
100 std::complex< double > omp_minus_Vc( double r ) const;
101
102 // Woods-Saxon shape
103 double f( double r, double R, double a ) const;
104
105 // Partial derivative with respect to r of the Woods-Saxon shape
106 double dfdr( double r, double R, double a ) const;
107
108 // Coulomb potential for a point particle with charge q*e interacting
109 // with a uniformly charged sphere with radius R and charge Q*e
110 double Vc( double r, double R, int Q, int q ) const;
111
112 // Non-derivative radial Schrödinger equation terms to use for computing
113 // transmission coefficients via the Numerov method
114 std::complex< double > a( double r, int l );
115
116 // Version of Schrodinger equation terms with the optical model potential
117 // U pre-computed
118 std::complex< double > a( double r, int l,
119 std::complex< double > U ) const;
120
121 // Neutron parameters
122 double v1n, v2n, v3n, v4n, w1n, w2n, d1n, d2n, d3n, vso1n, vso2n;
123 double wso1n, wso2n, Efn, Rvn, avn, Rdn, adn, Rso_n, aso_n;
124 // Proton parameters
125 double v1p, v2p, v3p, v4p, w1p, w2p, d1p, d2p, d3p, vso1p, vso2p;
126 double wso1p, wso2p, Efp, Vcbar_p, Rvp, avp, Rdp, adp, Rso_p, aso_p;
127 // Radius for nuclear Coulomb potential
128 double Rc;
129
130 // Mass of a charged pion
131 static constexpr double mpiplus = 139.57018; // MeV
132 // Squared pion Compton wavelength
133 static constexpr double lambda_piplus2 = ( marley_utils::hbar_c
134 / mpiplus ) * ( marley_utils::hbar_c / mpiplus ); // fm
135
136 // Temporary storage for optical model calculations
137 double Rv, av, Rd, ad, Rso, aso; // Geometrical parameters
138 double Vv, Wv, Wd, Vso, Wso; // Energy-dependent terms in the potential
139 double spin_orbit_eigenvalue; // Eigenvalue of the spin-orbit operator
140 int z; // Fragment atomic number
141
142 // Threshold for abs(U - Vc) used to find a suitable matching radius for
143 // computing transmission coefficients.
144 static constexpr double MATCHING_RADIUS_THRESHOLD = 1e-3;
145
148 double step_size_ = DEFAULT_NUMEROV_STEP_SIZE_;
149
156 static constexpr double DEFAULT_NUMEROV_STEP_SIZE_ = 0.1;
157
158 // More helper functions
159 void calculate_kinematic_variables( double KE_tot_CM, int fragment_pdg );
160 void update_target_mass( int target_charge );
161 };
162
164 public:
165
166 ParamConfig( const JSON& om_config );
167 const double& operator[]( const std::string& key ) const;
168
169 protected:
170
171 std::map< std::string, double > param_map_;
172 };
173
174}
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)
KoningDelarocheOpticalModel(int Z, int A, const JSON &om_config)
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.
virtual void print(std::ostream &out) const override
Print information about the optical model parameters.
int A() const
Get the mass number.
int Z() const
Get the atomic number.