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

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

update ti head

File size: 10.4 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.27 2010/10/20 00:47:46 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-03-ref-09 $
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// 30.10.2009 J.M.Quesada: CEM transition probabilities have been renormalized
44//                       (IAEA benchmark)
45// 20.08.2010 V.Ivanchenko move constructor and destructor to the source and
46//                         optimise the code
47//
48
49#include "G4PreCompoundTransitions.hh"
50#include "G4HadronicException.hh"
51#include "G4PreCompoundParameters.hh"
52#include "G4Proton.hh"
53#include "Randomize.hh"
54#include "G4Pow.hh"
55
56G4PreCompoundTransitions::G4PreCompoundTransitions() 
57{
58  proton = G4Proton::Proton();
59  FermiEnergy = G4PreCompoundParameters::GetAddress()->GetFermiEnergy();
60  r0 = G4PreCompoundParameters::GetAddress()->GetTransitionsr0();
61  aLDP = G4PreCompoundParameters::GetAddress()->GetLevelDensity();
62  g4pow = G4Pow::GetInstance();
63}
64
65G4PreCompoundTransitions::~G4PreCompoundTransitions() 
66{}
67
68// Calculates transition probabilities with
69// DeltaN = +2 (Trans1) -2 (Trans2) and 0 (Trans3)
70G4double G4PreCompoundTransitions::
71CalculateProbability(const G4Fragment & aFragment)
72{
73  // Number of holes
74  G4int H = aFragment.GetNumberOfHoles();
75  // Number of Particles
76  G4int P = aFragment.GetNumberOfParticles();
77  // Number of Excitons
78  G4int N = P+H;
79  // Nucleus
80  G4int A = aFragment.GetA_asInt();
81  G4int Z = aFragment.GetZ_asInt();
82  G4double U = aFragment.GetExcitationEnergy();
83
84  //G4cout << aFragment << G4endl;
85 
86  if(U < 10*eV) { return 0.0; }
87 
88  //J. M. Quesada (Feb. 08) new physics
89  // OPT=1 Transitions are calculated according to Gudima's paper
90  //       (original in G4PreCompound from VL)
91  // OPT=2 Transitions are calculated according to Gupta's formulae
92  //
93  if (useCEMtr){
94
95    // Relative Energy (T_{rel})
96    G4double RelativeEnergy = 1.6*FermiEnergy + U/G4double(N);
97   
98    // Sample kind of nucleon-projectile
99    G4bool ChargedNucleon(false);
100    G4double chtest = 0.5;
101    if (P > 0) { 
102      chtest = G4double(aFragment.GetNumberOfCharged())/G4double(P); 
103    }
104    if (G4UniformRand() < chtest) { ChargedNucleon = true; }
105   
106    // Relative Velocity:
107    // <V_{rel}>^2
108    G4double RelativeVelocitySqr(0.0);
109    if (ChargedNucleon) { 
110      RelativeVelocitySqr = 2.0*RelativeEnergy/CLHEP::proton_mass_c2; 
111    } else { 
112      RelativeVelocitySqr = 2.0*RelativeEnergy/CLHEP::neutron_mass_c2; 
113    }
114   
115    // <V_{rel}>
116    G4double RelativeVelocity = std::sqrt(RelativeVelocitySqr);
117   
118    // Proton-Proton Cross Section
119    G4double ppXSection = 
120      (10.63/RelativeVelocitySqr - 29.92/RelativeVelocity + 42.9)
121      * CLHEP::millibarn;
122    // Proton-Neutron Cross Section
123    G4double npXSection = 
124      (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)
125      * CLHEP::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)*ppXSection + (A-Z)*npXSection)/G4double(A-1);
135      }
136    else 
137      {
138        AveragedXSection = ((A-Z-1)*ppXSection + Z*npXSection)/G4double(A-1);
139        //AveragedXSection = ((A-Z-1)*npXSection + Z*ppXSection)/G4double(A-1);
140      }
141   
142    // Fermi relative energy ratio
143    G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
144   
145    // This factor is introduced to take into account the Pauli principle
146    G4double PauliFactor = 1.0 - 1.4*FermiRelRatio;
147    if (FermiRelRatio > 0.5) {
148      G4double x = 2.0 - 1.0/FermiRelRatio;
149      PauliFactor += 0.4*FermiRelRatio*x*x*std::sqrt(x);
150      //PauliFactor +=
151      //(2.0/5.0)*FermiRelRatio*std::pow(2.0 - (1.0/FermiRelRatio), 5.0/2.0);
152    }
153    // Interaction volume
154    //  G4double Vint = (4.0/3.0)
155    //*pi*std::pow(2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity) , 3.0);
156    G4double xx = 2.0*r0 + hbarc/(CLHEP::proton_mass_c2*RelativeVelocity);
157    //    G4double Vint = (4.0/3.0)*CLHEP::pi*xx*xx*xx;
158    G4double Vint = CLHEP::pi*xx*xx*xx/0.75;
159   
160    // Transition probability for \Delta n = +2
161   
162    TransitionProb1 = AveragedXSection*PauliFactor
163      *std::sqrt(2.0*RelativeEnergy/CLHEP::proton_mass_c2)/Vint;
164
165    //JMQ 281009  phenomenological factor in order to increase
166    //   equilibrium contribution
167    //   G4double factor=5.0;
168    //   TransitionProb1 *= factor;
169    //
170    if (TransitionProb1 < 0.0) { TransitionProb1 = 0.0; } 
171   
172    // GE = g*E where E is Excitation Energy
173    G4double GE = (6.0/pi2)*aLDP*A*U;
174   
175    //G4double Fph = ((P*P+H*H+P-H)/4.0 - H/2.0);
176    G4double Fph = G4double(P*P+H*H+P-3*H)/4.0;
177   
178    G4bool NeverGoBack(false);
179    if(useNGB) { NeverGoBack=true; }
180   
181    //JMQ/AH  bug fixed: if (U-Fph < 0.0) NeverGoBack = true;
182    if (GE-Fph < 0.0) { NeverGoBack = true; }
183   
184    // F(p+1,h+1)
185    G4double Fph1 = Fph + N/2.0;
186   
187    G4double ProbFactor = g4pow->powN((GE-Fph)/(GE-Fph1),N+1);
188   
189    if (NeverGoBack)
190      {
191        TransitionProb2 = 0.0;
192        TransitionProb3 = 0.0;
193      }
194    else 
195      {
196        // Transition probability for \Delta n = -2 (at F(p,h) = 0)
197        TransitionProb2 = 
198          TransitionProb1 * ProbFactor * (P*H*(N+1)*(N-2))/((GE-Fph)*(GE-Fph));
199        if (TransitionProb2 < 0.0) { TransitionProb2 = 0.0; } 
200       
201        // Transition probability for \Delta n = 0 (at F(p,h) = 0)
202        TransitionProb3 = TransitionProb1*(N+1)* ProbFactor 
203          * (P*(P-1) + 4.0*P*H + H*(H-1))/(N*(GE-Fph));
204        if (TransitionProb3 < 0.0) { TransitionProb3 = 0.0; }
205      }
206  } else {
207    //JMQ: Transition probabilities from Gupta's work   
208    // GE = g*E where E is Excitation Energy
209    G4double GE = (6.0/pi2)*aLDP*A*U;
210 
211    G4double Kmfp=2.;
212       
213    //TransitionProb1=1./Kmfp*3./8.*1./c_light*1.0e-9*(1.4e+21*U-2./(N+1)*6.0e+18*U*U);
214    TransitionProb1 = 3.0e-9*(1.4e+21*U - 1.2e+19*U*U/G4double(N+1))
215      /(8*Kmfp*CLHEP::c_light);
216    if (TransitionProb1 < 0.0) { TransitionProb1 = 0.0; }
217
218    TransitionProb2=0.;
219    TransitionProb3=0.;
220   
221    if (!useNGB && N > 1) {
222      // 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);     
223      TransitionProb2 = 
224        3.0e-9*(N-2)*P*H*(1.4e+21*U*(N-1) - 1.2e+19*U*U)/(8*Kmfp*c_light*GE*GE);     
225      if (TransitionProb2 < 0.0) TransitionProb2 = 0.0; 
226    }
227  }
228  //  G4cout<<"U = "<<U<<G4endl;
229  //  G4cout<<"N="<<N<<"  P="<<P<<"  H="<<H<<G4endl;
230  //  G4cout<<"l+ ="<<TransitionProb1<<"  l- ="<< TransitionProb2
231  //   <<"  l0 ="<< TransitionProb3<<G4endl;
232  return TransitionProb1 + TransitionProb2 + TransitionProb3;
233}
234
235void G4PreCompoundTransitions::PerformTransition(G4Fragment & result)
236{
237  G4double ChosenTransition = 
238    G4UniformRand()*(TransitionProb1 + TransitionProb2 + TransitionProb3);
239  G4int deltaN = 0;
240  //  G4int Nexcitons = result.GetNumberOfExcitons();
241  G4int Npart     = result.GetNumberOfParticles();
242  G4int Ncharged  = result.GetNumberOfCharged();
243  G4int Nholes    = result.GetNumberOfHoles();
244  if (ChosenTransition <= TransitionProb1) 
245    {
246      // Number of excitons is increased on \Delta n = +2
247      deltaN = 2;
248    } 
249  else if (ChosenTransition <= TransitionProb1+TransitionProb2) 
250    {
251      // Number of excitons is increased on \Delta n = -2
252      deltaN = -2;
253    }
254
255  // AH/JMQ: Randomly decrease the number of charges if deltaN is -2 and 
256  // in proportion to the number charges w.r.t. number of particles, 
257  // PROVIDED that there are charged particles
258  deltaN /= 2;
259
260  //G4cout << "deltaN= " << deltaN << G4endl;
261
262  // JMQ the following lines have to be before SetNumberOfCharged, otherwise the check on
263  // number of charged vs. number of particles fails
264  result.SetNumberOfParticles(Npart+deltaN);
265  result.SetNumberOfHoles(Nholes+deltaN); 
266
267  if(deltaN < 0) {
268    if( Ncharged >= 1 && G4int(Npart*G4UniformRand()) <= Ncharged) 
269      { 
270        result.SetNumberOfCharged(Ncharged+deltaN); // deltaN is negative!
271      }
272
273  } else if ( deltaN > 0 ) {
274    // With weight Z/A, number of charged particles is increased with +1
275    G4int A = result.GetA_asInt();
276    G4int Z = result.GetZ_asInt();
277    if( G4int(std::max(1, A - Npart)*G4UniformRand()) <= Z) 
278      {
279        result.SetNumberOfCharged(Ncharged+deltaN);
280      }
281  }
282 
283  // Number of charged can not be greater that number of particles
284  if ( Npart < Ncharged ) 
285    {
286      result.SetNumberOfCharged(Npart);
287    }
288  //G4cout << "### After transition" << G4endl;
289  //G4cout << result << G4endl;
290}
291
Note: See TracBrowser for help on using the repository browser.