MARLEY (Model of Argon Reaction Low Energy Yields)  v1.2.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
KoningDelarocheOpticalModel.hh
1 //
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 <vector>
21 
22 #include "marley/DecayScheme.hh"
23 #include "marley/MassTable.hh"
24 #include "marley/OpticalModel.hh"
25 #include "marley/marley_utils.hh"
26 
27 namespace marley {
28 
38 
39  public:
40 
45  KoningDelarocheOpticalModel(int Z, int A, double step_size
46  = DEFAULT_NUMEROV_STEP_SIZE_);
47 
48  virtual std::complex<double> optical_model_potential(double r,
49  double fragment_KE_lab, int fragment_pdg, int two_j, int l, int two_s,
50  int target_charge = 0) override;
51 
52  virtual double transmission_coefficient(double total_KE_CM,
53  int fragment_pdg, int two_j, int l, int two_s, int target_charge = 0)
54  override;
55 
56  virtual double total_cross_section(double fragment_KE_lab,
57  int fragment_pdg, int two_s, size_t l_max, int target_charge = 0)
58  override;
59 
60  private:
61 
63  double total_CM_frame_KE_;
65  double fragment_mass_;
68  double fragment_KE_lab_;
70  double CM_frame_momentum_squared_;
71 
72  // Storage for the mass of the nuclear target represented by this
73  // optical model potential. Its value will be adjusted based on
74  // the ionization state of the target.
75  double target_mass_;
76 
77  // Helper function for computing optical model transmission coefficients
78  // and cross sections
79  std::complex<double> s_matrix_element(int fragment_pdg, int two_j,
80  int l, int two_s);
81 
82  // Helper functions for computing the optical model potential
83  void calculate_om_parameters(int fragment_pdg, int two_j, int l,
84  int two_s);
85 
86  // Compute the optical model potential at radius r
87  std::complex<double> omp(double r) const;
88 
89  // Computes the optical model potential minus the Coulomb potential at
90  // radius r
91  std::complex<double> omp_minus_Vc(double r) const;
92 
93  // Woods-Saxon shape
94  double f(double r, double R, double a) const;
95 
96  // Partial derivative with respect to r of the Woods-Saxon shape
97  double dfdr(double r, double R, double a) const;
98 
99  // Coulomb potential for a point particle with charge q*e interacting
100  // with a uniformly charged sphere with radius R and charge Q*e
101  double Vc(double r, double R, int Q, int q) const;
102 
103  // Non-derivative radial Schrödinger equation terms to use for computing
104  // transmission coefficients via the Numerov method
105  std::complex<double> a(double r, int l);
106 
107  // Version of Schrodinger equation terms with the optical model potential
108  // U pre-computed
109  std::complex<double> a(double r, int l, std::complex<double> U) const;
110 
111  // Neutron parameters
112  double v1n, v2n, v3n, v4n, w1n, w2n, d1n, d2n, d3n, vso1n, vso2n;
113  double wso1n, wso2n, Efn, Rvn, avn, Rdn, adn, Rso_n, aso_n;
114  // Proton parameters
115  double v1p, v2p, v3p, v4p, w1p, w2p, d1p, d2p, d3p, vso1p, vso2p;
116  double wso1p, wso2p, Efp, Vcbar_p, Rvp, avp, Rdp, adp, Rso_p, aso_p;
117  // Radius for nuclear Coulomb potential
118  double Rc;
119 
120  // Mass of a charged pion
121  static constexpr double mpiplus = 139.57018; // MeV
122  // Squared pion Compton wavelength
123  static constexpr double lambda_piplus2 = (marley_utils::hbar_c
124  / mpiplus) * (marley_utils::hbar_c / mpiplus); // fm
125 
126  // Temporary storage for optical model calculations
127  double Rv, av, Rd, ad, Rso, aso; // Geometrical parameters
128  double Vv, Wv, Wd, Vso, Wso; // Energy-dependent terms in the potential
129  double spin_orbit_eigenvalue; // Eigenvalue of the spin-orbit operator
130  int z; // Fragment atomic number
131 
132  // Threshold for abs(U - Vc) used to find a suitable matching radius for
133  // computing transmission coefficients.
134  static constexpr double MATCHING_RADIUS_THRESHOLD = 1e-3;
135 
138  double step_size_ = DEFAULT_NUMEROV_STEP_SIZE_;
139 
146  static constexpr double DEFAULT_NUMEROV_STEP_SIZE_ = 0.1;
147 
148  // More helper functions
149  void calculate_kinematic_variables(double KE_tot_CM, int fragment_pdg);
150  void update_target_mass(int target_charge);
151  };
152 
153 }
Nuclear optical model for fragment emission calculations.
Definition: KoningDelarocheOpticalModel.hh:37
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)
Definition: KoningDelarocheOpticalModel.cc:25
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.
Definition: KoningDelarocheOpticalModel.cc:292
KoningDelarocheOpticalModel(int Z, int A, double step_size=DEFAULT_NUMEROV_STEP_SIZE_)
Definition: KoningDelarocheOpticalModel.cc:194
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.
Definition: KoningDelarocheOpticalModel.cc:256
Abstract base class for nuclear optical model implementations.
Definition: OpticalModel.hh:23
int A() const
Get the mass number.
Definition: OpticalModel.hh:97
int Z() const
Get the atomic number.
Definition: OpticalModel.hh:95