source: trunk/source/processes/hadronic/models/pre_equilibrium/exciton_model/src/G4PreCompoundTransitions.cc @ 968

Last change on this file since 968 was 962, checked in by garnier, 15 years ago

update processes

File size: 10.3 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// $Id: G4PreCompoundTransitions.cc,v 1.20 2009/02/10 16:01:37 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-02-ref-02 $
28//
29// -------------------------------------------------------------------
30//
31// GEANT4 Class file
32//
33//
34// File name:     G4PreCompoundIon
35//
36// Author:         V.Lara
37//
38// Modified: 
39// 16.02.2008 J. M. Quesada fixed bugs
40// 06.09.2008 J. M. Quesada added external choices for:
41//                      - "never go back"  hipothesis (useNGB=true)
42//                      -  CEM transition probabilities (useCEMtr=true)
43
44#include "G4PreCompoundTransitions.hh"
45#include "G4HadronicException.hh"
46
47const G4PreCompoundTransitions & G4PreCompoundTransitions::
48operator=(const G4PreCompoundTransitions &)
49{
50  throw G4HadronicException(__FILE__, __LINE__, "G4PreCompoundTransitions::operator= meant to not be accessable");
51  return *this;
52}
53
54
55G4bool G4PreCompoundTransitions::operator==(const G4PreCompoundTransitions &) const
56{
57  return false;
58}
59
60G4bool G4PreCompoundTransitions::operator!=(const G4PreCompoundTransitions &) const
61{
62  return true;
63}
64
65
66G4double G4PreCompoundTransitions::
67CalculateProbability(const G4Fragment & aFragment)
68{
69  //G4cout<<"In G4PreCompoundTransitions.cc  useNGB="<<useNGB<<G4endl;
70  //G4cout<<"In G4PreCompoundTransitions.cc  useCEMtr="<<useCEMtr<<G4endl;
71
72  // Fermi energy
73  const G4double FermiEnergy = G4PreCompoundParameters::GetAddress()->GetFermiEnergy();
74 
75  // Nuclear radius
76  const G4double r0 = G4PreCompoundParameters::GetAddress()->GetTransitionsr0();
77   
78  // In order to calculate the level density parameter
79  // G4EvaporationLevelDensityParameter theLDP;
80
81  // Number of holes
82  G4double H = aFragment.GetNumberOfHoles();
83  // Number of Particles
84  G4double P = aFragment.GetNumberOfParticles();
85  // Number of Excitons
86  G4double N = P+H;
87  // Nucleus
88  G4double A = aFragment.GetA();
89  G4double Z = static_cast<G4double>(aFragment.GetZ());
90  G4double U = aFragment.GetExcitationEnergy();
91 
92  if(U<10*eV) return 0.0;
93 
94  //J. M. Quesada (Feb. 08) new physics
95  // OPT=1 Transitions are calculated according to Gudima's paper (original in G4PreCompound from VL)
96  // OPT=2 Transitions are calculated according to Gupta's formulae
97  //
98 
99 
100 
101  if (useCEMtr){
102
103   
104    // Relative Energy (T_{rel})
105    G4double RelativeEnergy = (8.0/5.0)*FermiEnergy + U/N;
106   
107    // Sample kind of nucleon-projectile
108    G4bool ChargedNucleon(false);
109    G4double chtest = 0.5;
110    if (P > 0) chtest = aFragment.GetNumberOfCharged()/P;
111    if (G4UniformRand() < chtest) ChargedNucleon = true;
112   
113    // Relative Velocity:
114    // <V_{rel}>^2
115    G4double RelativeVelocitySqr(0.0);
116    if (ChargedNucleon) RelativeVelocitySqr = 2.0*RelativeEnergy/proton_mass_c2;
117    else RelativeVelocitySqr = 2.0*RelativeEnergy/neutron_mass_c2;
118   
119    // <V_{rel}>
120    G4double RelativeVelocity = std::sqrt(RelativeVelocitySqr);
121   
122    // Proton-Proton Cross Section
123    G4double ppXSection = (10.63/RelativeVelocitySqr - 29.92/RelativeVelocity + 42.9)*millibarn;
124    // Proton-Neutron Cross Section
125    G4double npXSection = (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)*millibarn;
126   
127    // Averaged Cross Section: \sigma(V_{rel})
128    //  G4double AveragedXSection = (ppXSection+npXSection)/2.0;
129    G4double AveragedXSection(0.0);
130    if (ChargedNucleon)
131      {
132        //JMQ: small bug fixed
133        //      AveragedXSection = ((Z-1.0) * ppXSection + (A-Z-1.0) * npXSection) / (A-1.0);
134        AveragedXSection = ((Z-1.0) * ppXSection + (A-Z) * npXSection) / (A-1.0);
135      }
136    else 
137      {
138        AveragedXSection = ((A-Z-1.0) * ppXSection + Z * npXSection) / (A-1.0);
139      }
140   
141    // Fermi relative energy ratio
142    G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
143   
144    // This factor is introduced to take into account the Pauli principle
145    G4double PauliFactor = 1.0 - (7.0/5.0)*FermiRelRatio;
146    if (FermiRelRatio > 0.5) PauliFactor += (2.0/5.0)*FermiRelRatio*std::pow(2.0 - (1.0/FermiRelRatio), 5.0/2.0);
147   
148    // Interaction volume
149    //  G4double Vint = (4.0/3.0)*pi*std::pow(2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity) , 3.0);
150    G4double xx=2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity);
151    G4double Vint = (4.0/3.0)*pi*xx*xx*xx;
152   
153    // Transition probability for \Delta n = +2
154   
155    TransitionProb1 = AveragedXSection*PauliFactor*std::sqrt(2.0*RelativeEnergy/proton_mass_c2)/Vint;
156    if (TransitionProb1 < 0.0) TransitionProb1 = 0.0; 
157   
158    G4double a = G4PreCompoundParameters::GetAddress()->GetLevelDensity();
159    // GE = g*E where E is Excitation Energy
160    G4double GE = (6.0/pi2)*a*A*U;
161   
162    G4double Fph = ((P*P+H*H+P-H)/4.0 - H/2.0);
163   
164    //G4bool NeverGoBack(false);
165    G4bool NeverGoBack;
166    if(useNGB)  NeverGoBack=true;
167    else NeverGoBack=false;
168   
169   
170    //JMQ/AH  bug fixed: if (U-Fph < 0.0) NeverGoBack = true;
171    if (GE-Fph < 0.0) NeverGoBack = true;
172   
173    // F(p+1,h+1)
174    G4double Fph1 = Fph + N/2.0;
175   
176    G4double ProbFactor = std::pow((GE-Fph)/(GE-Fph1),N+1.0);
177   
178   
179    if (NeverGoBack)
180      {
181      TransitionProb2 = 0.0;
182      TransitionProb3 = 0.0;
183      }
184    else 
185      {
186        // Transition probability for \Delta n = -2 (at F(p,h) = 0)
187        TransitionProb2 = TransitionProb1 * ProbFactor * (P*H*(N+1.0)*(N-2.0))/((GE-Fph)*(GE-Fph));
188        if (TransitionProb2 < 0.0) TransitionProb2 = 0.0; 
189       
190        // Transition probability for \Delta n = 0 (at F(p,h) = 0)
191        TransitionProb3 = TransitionProb1* ((N+1.0)/N) * ProbFactor  * (P*(P-1.0) + 4.0*P*H + H*(H-1.0))/(GE-Fph);
192        if (TransitionProb3 < 0.0) TransitionProb3 = 0.0; 
193      }
194   
195    //  G4cout<<"U = "<<U<<G4endl;
196    //  G4cout<<"N="<<N<<"  P="<<P<<"  H="<<H<<G4endl;
197    //  G4cout<<"l+ ="<<TransitionProb1<<"  l- ="<< TransitionProb2<<"  l0 ="<< TransitionProb3<<G4endl;
198    return TransitionProb1 + TransitionProb2 + TransitionProb3;
199  }
200 
201  else  {
202    //JMQ: Transition probabilities from Gupta's work
203   
204    G4double a = G4PreCompoundParameters::GetAddress()->GetLevelDensity();
205    // GE = g*E where E is Excitation Energy
206    G4double GE = (6.0/pi2)*a*A*U;
207   
208    G4double Kmfp=2.;
209     
210   
211    TransitionProb1=1./Kmfp*3./8.*1./c_light*1.0e-9*(1.4e+21*U-2./(N+1)*6.0e+18*U*U);
212    if (TransitionProb1 < 0.0) TransitionProb1 = 0.0;
213   
214    if (useNGB){
215      TransitionProb2=0.;
216      TransitionProb3=0.;
217    }
218    else{       
219      if (N<=1) TransitionProb2=0. ;   
220      else  TransitionProb2=1./Kmfp*3./8.*1./c_light*1.0e-9*(N-1.)*(N-2.)*P*H/(GE*GE)*(1.4e+21*U - 2./(N-1)*6.0e+18*U*U);     
221      if (TransitionProb2 < 0.0) TransitionProb2 = 0.0; 
222      TransitionProb3=0.;
223    }
224   
225      //  G4cout<<"U = "<<U<<G4endl;
226    //  G4cout<<"N="<<N<<"  P="<<P<<"  H="<<H<<G4endl;
227    //  G4cout<<"l+ ="<<TransitionProb1<<"  l- ="<< TransitionProb2<<"  l0 ="<< TransitionProb3<<G4endl;
228    return TransitionProb1 + TransitionProb2 + TransitionProb3;
229  }
230}
231
232
233G4Fragment G4PreCompoundTransitions::PerformTransition(const G4Fragment & aFragment)
234{
235  G4Fragment result(aFragment);
236  G4double ChosenTransition = G4UniformRand()*(TransitionProb1 + TransitionProb2 + TransitionProb3);
237  G4int deltaN = 0;
238  G4int Nexcitons = result.GetNumberOfExcitons();
239  if (ChosenTransition <= TransitionProb1) 
240    {
241      // Number of excitons is increased on \Delta n = +2
242      deltaN = 2;
243    } 
244  else if (ChosenTransition <= TransitionProb1+TransitionProb2) 
245    {
246      // Number of excitons is increased on \Delta n = -2
247      deltaN = -2;
248    }
249
250  // AH/JMQ: Randomly decrease the number of charges if deltaN is -2 and in proportion
251  // to the number charges w.r.t. number of particles,  PROVIDED that there are charged particles
252  if(deltaN < 0 && G4UniformRand() <= 
253     static_cast<G4double>(result.GetNumberOfCharged())/static_cast<G4double>(result.GetNumberOfParticles()) 
254     && (result.GetNumberOfCharged() >= 1)) {
255    result.SetNumberOfCharged(result.GetNumberOfCharged()+deltaN/2); // deltaN is negative!
256  }
257
258  // JMQ the following lines have to be before SetNumberOfCharged, otherwise the check on
259  // number of charged vs. number of particles fails
260  result.SetNumberOfParticles(result.GetNumberOfParticles()+deltaN/2);
261  result.SetNumberOfHoles(result.GetNumberOfHoles()+deltaN/2); 
262
263  // With weight Z/A, number of charged particles is increased with +1
264  if ( ( deltaN > 0 ) &&
265      (G4UniformRand() <= static_cast<G4double>(result.GetZ()-result.GetNumberOfCharged())/
266       std::max(static_cast<G4double>(result.GetA()-Nexcitons),1.)))
267    {
268      result.SetNumberOfCharged(result.GetNumberOfCharged()+deltaN/2);
269    }
270 
271  // Number of charged can not be greater that number of particles
272  if ( result.GetNumberOfParticles() < result.GetNumberOfCharged() ) 
273    {
274      result.SetNumberOfCharged(result.GetNumberOfParticles());
275    }
276 
277  return result;
278}
279
Note: See TracBrowser for help on using the repository browser.