Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/de_excitation/util/src/G4KalbachCrossSection.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 //
 27 //
 28 // V.Ivanchenko 26.02.2018
 29 // 
 30 
 31 #include "G4KalbachCrossSection.hh"
 32 #include "G4Exp.hh"
 33 #include "G4Pow.hh"
 34 
 35 //from subroutine sigpar of PRECO-2000  by Constance Kalbach Walker
 36 //     Calculate optical model reaction cross sections
 37 //     using the empirical parameterization
 38 //     of Narasimha Murthy, Chaterjee, and Gupta
 39 //     going over to the geometrical limit at high energy.
 40 //
 41 //           Proton cross sections scaled down with signor for a<100
 42 //           (appropriate for becchetti-greenlees potential).
 43 //           p2 reduced and global red'n factor introduced below Bc
 44 //           Neutron cross sections scaled down with signor for a<40
 45 //           Scaled up for A>210 (added June '98 to conform with
 46 //           my published papers)
 47 //           (appropriate for Mani et al potential)
 48 //
 49 
 50 // index: 0-neutron, 1-proton, 2-deuteron, 3-triton, 4-He3, 5-He4
 51 // parameters: p0, p1, p2, lambda0, lambda1, mu0, mu1, nu0, nu1, nu2, ra
 52 
 53 static const G4double paramK[6][11] = {
 54   // n from mani, melkanoff and iori
 55   {-312., 0.,      0.,  12.10,  -11.27, 234.1, 38.26, 1.55,  -106.1, 1280.8, 0.0},
 56   // p from  becchetti and greenlees (but modified with sub-barrier
 57   // correction function and p2 changed from -449)
 58   {15.72, 9.65, -300.,  0.00437,-16.58, 244.7, 0.503, 273.1, -182.4, -1.872, 0.0},
 59   // d from o.m. of perey and perey
 60   {0.798, 420.3,-1651., 0.00619, -7.54, 583.5, 0.337, 421.8, -474.5, -3.592, 0.8},
 61   // t from o.m. of hafele, flynn et al
 62   {-21.45,484.7,-1608., 0.0186, -8.9,   686.3, 0.325, 368.9, -522.2, -4.998, 0.8},
 63   // 3he from o.m. of gibson et al
 64   {-2.88,205.6, -1487.,0.00459,-8.93,   611.2, 0.35 , 473.8, -468.2, -2.225, 0.8},
 65   // alpha from huizenga and igo 
 66   { 10.95,-85.2, 1146.,  0.0643,-13.96, 781.2,  0.29, -304.7,-470.0, -8.580, 1.2}
 67 };
 68 
 69 G4double G4KalbachCrossSection::ComputePowerParameter(G4int resA, G4int idx)
 70 {
 71   return G4Pow::GetInstance()->powZ(resA, paramK[idx][6]);
 72 }
 73 
 74 G4double 
 75 G4KalbachCrossSection::ComputeCrossSection(G4double K, G4double cb,  
 76                    G4double resA13, G4double amu1, 
 77                    G4int idx, G4int Z, G4int A, 
 78                    G4int resA)
 79 {
 80   G4double sig = 0.0;
 81   G4double signor = 1.0; 
 82   G4double lambda, mu, nu;
 83   G4double ec = std::min(4.0, 100./(G4double)resA);  // in MeV
 84   if(0 < Z) { ec = cb; }
 85 
 86   G4double ecsq = ec*ec;
 87   G4double elab = K * (A + resA) / G4double(resA);    
 88     
 89   if(idx == 0) { // parameterization for neutron
 90 
 91     if(resA < 40)       { signor =0.7 + resA*0.0075; }
 92     else if(resA > 210) { signor = 1. + (resA-210)*0.004; }
 93     lambda = paramK[idx][3]/resA13 + paramK[idx][4];
 94     mu = (paramK[idx][5] + paramK[idx][6]*resA13)*resA13;
 95     // JMQ 20.11.2008 very low energy behaviour corrected 
 96     //                (problem for A (apprx.)>60) fix for avoiding  
 97     //                neutron xs going to zero at very low energies
 98     nu = std::abs((paramK[idx][7]*resA + paramK[idx][8]*resA13)*resA13 
 99       + paramK[idx][9]);
100 
101   } else { // parameterization for charged 
102     // proton correction
103     if(idx == 1) {
104       if (resA <= 60)      { signor = 0.92; }
105       else if (resA < 100) { signor = 0.8 + resA*0.002; }
106     }
107     lambda = paramK[idx][3]*resA + paramK[idx][4];
108     mu = paramK[idx][5]*amu1;
109     nu = amu1* (paramK[idx][7] + paramK[idx][8]*ec + paramK[idx][9]*ecsq);
110   }
111   /*
112     G4cout << "## idx=" << idx << " K=" << K << " elab=" << elab 
113            << " ec=" << ec << " lambda=" << lambda << " mu=" << mu 
114            << "  nu=" << nu << G4endl; 
115   */
116   // threashold cross section
117   if(elab < ec) {
118     G4double p = paramK[idx][0];
119     if(0 < Z) { p += paramK[idx][1]/ec + paramK[idx][2]/ecsq; }
120     G4double a = -2*p*ec + lambda - nu/ecsq;
121     G4double b = p*ecsq + mu + 2*nu/ec;
122     G4double det = a*a - 4*p*b;
123     G4double ecut = (det > 0.0) ? (std::sqrt(det) - a)/(2*p) : -a/(2*p);
124 
125     //G4cout << "  elab= " << elab << " ecut= " << ecut << " sig= " << sig
126     //       << "  sig1= " << (p*elab*elab + a*elab + b)*signor << G4endl;
127     // If ecut>0, sig=0 at elab=ecut
128     if(0 == idx) {
129       sig = (lambda*ec + mu + nu/ec)*signor*std::sqrt(elab/ec);
130     } else if(elab >= ecut) { 
131       sig = (p*elab*elab + a*elab + b)*signor; 
132 
133       // extra proton correction
134       if(1 == idx) {
135   // c and w are for global correction factor for 
136   // they are scaled down for light targets where ec is low.
137   G4double cc = std::min(3.15, ec*0.5);
138   G4double signor2 = (ec - elab - cc) *3.15/ (0.7*cc);
139   sig /= (1. + G4Exp(signor2));
140       }
141     }
142     //G4cout << "       ecut= " << ecut << " a= " << a << "  b= " << b 
143     //     <<  " signor= " << signor << " sig= " << sig << G4endl;  
144 
145     // high energy cross section
146   } else {
147     // etest is the energy above which the rxn cross section is
148     // compared with the geometrical limit and the max taken.
149 
150     // neutron parameters
151     G4double etest  = 32.;
152     G4double xnulam = 1.0;
153 
154     // parameters for charged
155     static const G4double flow = 1.e-18;
156     static const G4double spill= 1.e+18;
157     if(0 < Z) {
158       etest = 0.0;
159       xnulam = nu / lambda;
160       xnulam = std::min(xnulam, spill); 
161       if (xnulam >= flow) { 
162   if(1 == idx) { etest = std::sqrt(xnulam) + 7.; }
163   else         { etest = 1.2 *std::sqrt(xnulam); }
164       }
165     }
166     // ** For xnulam.gt.0, sig reaches a maximum at sqrt(xnulam).
167     sig = (lambda*elab + mu + nu/elab)*signor;
168     if (xnulam >= flow && elab >= etest) {
169       G4double geom = std::sqrt(A*K);
170       geom = 1.23*resA13 + paramK[idx][10] + 4.573/geom;
171       geom = 31.416 * geom * geom;
172       sig = std::max(sig, geom);
173     }
174   }
175   sig = std::max(sig, 0.0);
176   //G4cout << "  ---- sig= " << sig << G4endl;
177   return sig;
178 }
179