source: trunk/source/processes/hadronic/models/cascade/evaporation/src/G4BEChargedChannel.cc @ 1340

Last change on this file since 1340 was 819, checked in by garnier, 16 years ago

import all except CVS

File size: 7.7 KB
Line 
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// Implementation of the HETC88 code into Geant4.
28// Evaporation and De-excitation parts
29// T. Lampen, Helsinki Institute of Physics, May-2000
30
31#include "G4BEChargedChannel.hh"
32
33
34G4BEChargedChannel::G4BEChargedChannel()
35{
36    verboseLevel = 0;
37}
38
39
40G4BEChargedChannel::~G4BEChargedChannel()
41{
42}
43
44
45void G4BEChargedChannel::calculateProbability()
46{
47  G4int residualZ = nucleusZ - particleZ;
48  G4int residualA = nucleusA - particleA;
49
50//    Check if nucleus is too small, if this evaporation channel
51//    leads to an impossible residual nucleus or if there is no enough
52//    energy.
53  if ( nucleusA < 2.0 * particleA || 
54       nucleusZ < 2.0 * particleZ ||
55       residualA <= residualZ || 
56       excitationEnergy - getThresh() - correction < 0 )
57    {
58      if ( verboseLevel >= 6 )
59        G4cout << "G4BEChargedChannel : calculateProbability for " << getName() << " = 0 " << G4endl;
60      emissionProbability = 0;
61      return;
62    }
63
64  // In HETC88 s-s0 was used in std::exp( s ), in which s0 was either 50 or
65  // max(s_i), where i goes over all channels.
66
67  G4double levelParam = getLevelDensityParameter();
68  G4double s        = 2 * std::sqrt( levelParam  * ( excitationEnergy - getThresh() - correction ) );
69  G4double constant = A / 2 * ( 2 * spin + 1 ) * ( 1 + coulombFactor() );
70  G4double eye1     = ( std::pow( s, 2. ) - 3 * s + 3 ) / ( 4 * std::pow( levelParam, 2. ) ) * std::exp( s );
71
72  emissionProbability = constant * std::pow( G4double(residualA), 0.6666666 ) * eye1;
73
74  if ( verboseLevel >= 6 )
75    G4cout << "G4BEChargedChannel : calculateProbability for " << getName() << G4endl
76           << "                    res A = " << residualA << G4endl
77           << "                    res Z = " << residualZ << G4endl
78           << "                 c*(c_i+1) = "<< constant << G4endl
79           << "                  qmfactor = "<< qmFactor() << G4endl
80           << "             coulombfactor = "<< coulombFactor() << G4endl
81           << "                        E = " << excitationEnergy << G4endl
82           << "               correction = " << correction << G4endl
83           << "                     eye1 = " << eye1 << G4endl
84           << "               levelParam = " << levelParam << G4endl
85           << "                   thresh = " << getThresh() << G4endl
86           << "                        s = " << s << G4endl
87           << "              probability = " << emissionProbability << G4endl;
88
89  return;
90}
91
92
93G4double G4BEChargedChannel::sampleKineticEnergy()
94{
95//    G4double randExp1;
96//    G4double randExp2;
97//    G4double s;
98//    G4double levelParam;
99//    G4double kineticEnergyAv;
100//    G4double kineticEnergy;
101 
102//    randExp1 = RandExponential::shoot( 1 );
103//    randExp2 = RandExponential::shoot( 1 );
104//    levelParam = getLevelDensityParameter();
105//    s = 2 * std::sqrt( levelParam  * ( excitationEnergy - getThresh() - correction ) );
106//    kineticEnergyAv = 2 * ( std::pow( s, 3. ) - 6.0 * std::pow( s, 2. ) + 15.0 * s - 15.0 )  /
107//        ( ( 2.0 * std::pow( s, 2. ) - 6.0 * s + 6.0 ) * levelParam );
108 
109//    kineticEnergy = 0.5 * ( randExp1 + randExp2 ) * kineticEnergyAv + getThresh() - getQ();
110
111//    if ( verboseLevel >= 10 )
112//      G4cout << "  G4BEChargedChannel : sampleKineticEnergy() " << G4endl
113//         << "         kinetic e = " << kineticEnergy << G4endl
114//         << "           average = " << kineticEnergyAv << G4endl
115//         << "                 s = " << s << G4endl
116//         << "        levelParam = " << levelParam << G4endl
117//         << "          randExp1 = " << randExp1 << G4endl
118//         << "          randExp2 = " << randExp2 << G4endl;
119
120  G4double levelParam;
121  levelParam = getLevelDensityParameter();
122 
123  const G4double xMax  = excitationEnergy - getThresh() - correction; // maximum number
124  const G4double xProb = ( - 1 + std::sqrt ( 1 + 4 * levelParam * xMax ) ) / ( 2 * levelParam ); // most probable value
125  const G4double m = xProb * std::exp ( 2 * std::sqrt ( levelParam * ( xMax - xProb ) ) ); // maximum value of P(x)
126
127  // Sample x according to density function P(x) with rejection method
128  G4double r1;
129  G4double r2;
130  G4int koe=0;
131  do
132    {
133      r1 = G4UniformRand() * xMax;
134      r2 = G4UniformRand() * m;
135      koe++;
136    }
137  while (  r1 * std::exp ( 2 * std::sqrt ( levelParam * ( xMax - r1 ) ) )  < r2 );
138
139//  G4cout << "Q ch " << koe << G4endl;
140  G4double kineticEnergy = r1 + getCoulomb(); // add coulomb potential;
141
142  if ( verboseLevel >= 10 )
143    G4cout << " G4BENeutronChannel : sampleKineticEnergy() " << G4endl
144           << "       kinetic n e = " << kineticEnergy << G4endl
145           << "        levelParam = " << levelParam << G4endl
146           << "             thresh= " << getThresh() << G4endl;
147
148  return kineticEnergy;
149}
150
151
152G4double G4BEChargedChannel::coulombFactorForProton()
153{
154  //  Coefficient c_p:s for empirical cross section formula are
155  //  defined with the proton constant.  See Dostrovsky, Phys. Rev.,
156  //  vol. 116, 1959.
157  G4double t[7] = { 0.08 , 0 , -0.06 , -0.1 , -0.1 , -0.1 , -0.1 };
158  G4int Z = nucleusZ - particleZ;
159
160  if ( Z >= 70.0 ) return t[6];
161  if ( Z <= 10.0 ) return t[0];
162 
163  // Linear interpolation
164  G4int   n = G4int( 0.1 * Z + 1.0 ); 
165  G4float x = ( 10 * n - Z ) * 0.1; 
166  G4double ret_val =  x * t[n - 2] + ( 1.0 - x ) * t[n-1];
167
168  return ret_val;
169}
170
171
172G4double G4BEChargedChannel::qmFactorForProton()
173{
174  //  Coefficient k_p for empirical cross section formula are defined
175  //  with the proton constant.  See Dostrovsky, Phys. Rev., vol. 116,
176  //  1959
177  G4double t[7] = {  0.36, 0.51, 0.60, 0.66, 0.68, 0.69, 0.69 };
178  G4int Z = nucleusZ - particleZ;
179
180  if ( Z >= 70.0 ) return t[6];
181  if ( Z <= 10.0 ) return t[0];
182
183  // Linear interpolation
184  G4int   n = G4int( 0.1 * Z + 1.0 ); 
185  G4float x = ( 10 * n - Z ) * 0.1; 
186  return x * t[n - 2] + ( 1.0 - x ) * t[n-1];
187}
188
189
190G4double G4BEChargedChannel::qmFactorForAlpha()
191{
192//  Coefficient k_alpha for empirical cross section formula presented
193//  in Dostrovsky, Phys. Rev., vol. 116, 1959
194
195  G4double t[7] = {  0.77, 0.81, 0.85, 0.89, 0.93, 0.97,  1.00 };
196  G4int Z = nucleusZ - particleZ;
197
198  if ( Z >= 70.0 ) return t[6];
199  if ( Z <= 10.0 ) return t[0];
200
201  // Linear interpolation
202  G4int   n = G4int( 0.1 * Z + 1.0 ); 
203  G4float x = ( 10 * n - Z ) * 0.1; 
204  return x * t[n - 2] + ( 1.0 - x ) * t[n-1];
205}
Note: See TracBrowser for help on using the repository browser.