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

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

import all except CVS

File size: 8.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// $Id: G4PreCompoundTransitions.cc,v 1.13 2007/07/23 12:48:54 ahoward Exp $
28// GEANT4 tag $Name:  $
29//
30// by V. Lara
31
32#include "G4PreCompoundTransitions.hh"
33#include "G4HadronicException.hh"
34
35const G4PreCompoundTransitions & G4PreCompoundTransitions::
36operator=(const G4PreCompoundTransitions &)
37{
38  throw G4HadronicException(__FILE__, __LINE__, "G4PreCompoundTransitions::operator= meant to not be accessable");
39  return *this;
40}
41
42
43G4bool G4PreCompoundTransitions::operator==(const G4PreCompoundTransitions &) const
44{
45  return false;
46}
47
48G4bool G4PreCompoundTransitions::operator!=(const G4PreCompoundTransitions &) const
49{
50  return true;
51}
52
53
54G4double G4PreCompoundTransitions::
55CalculateProbability(const G4Fragment & aFragment)
56{
57  // Fermi energy
58  const G4double FermiEnergy = G4PreCompoundParameters::GetAddress()->GetFermiEnergy();
59 
60  // Nuclear radius
61  const G4double r0 = G4PreCompoundParameters::GetAddress()->GetTransitionsr0();
62   
63  // In order to calculate the level density parameter
64  // G4EvaporationLevelDensityParameter theLDP;
65
66  // Number of holes
67  G4double H = aFragment.GetNumberOfHoles();
68  // Number of Particles
69  G4double P = aFragment.GetNumberOfParticles();
70  // Number of Excitons
71  G4double N = P+H;
72  // Nucleus
73  G4double A = aFragment.GetA();
74  G4double Z = static_cast<G4double>(aFragment.GetZ());
75  G4double U = aFragment.GetExcitationEnergy();
76
77  // Relative Energy (T_{rel})
78  G4double RelativeEnergy = (8.0/5.0)*FermiEnergy + U/N;
79 
80  // Sample kind of nucleon-projectile
81  G4bool ChargedNucleon(false);
82  G4double chtest = 0.5;
83  if (P > 0) chtest = aFragment.GetNumberOfCharged()/P;
84  if (G4UniformRand() < chtest) ChargedNucleon = true;
85
86  // Relative Velocity:
87  // <V_{rel}>^2
88  G4double RelativeVelocitySqr(0.0);
89  if (ChargedNucleon) RelativeVelocitySqr = 2.0*RelativeEnergy/proton_mass_c2;
90  else RelativeVelocitySqr = 2.0*RelativeEnergy/neutron_mass_c2;
91
92  // <V_{rel}>
93  G4double RelativeVelocity = std::sqrt(RelativeVelocitySqr);
94
95  // Proton-Proton Cross Section
96  G4double ppXSection = (10.63/RelativeVelocitySqr - 29.92/RelativeVelocity + 42.9)*millibarn;
97  // Proton-Neutron Cross Section
98  G4double npXSection = (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)*millibarn;
99 
100  // Averaged Cross Section: \sigma(V_{rel})
101  //  G4double AveragedXSection = (ppXSection+npXSection)/2.0;
102  G4double AveragedXSection(0.0);
103  if (ChargedNucleon)
104    {
105      AveragedXSection = ((Z-1.0) * ppXSection + (A-Z-1.0) * npXSection) / (A-1.0);
106    }
107  else 
108    {
109      AveragedXSection = ((A-Z-1.0) * ppXSection + Z * npXSection) / (A-1.0);
110    }
111
112  // Fermi relative energy ratio
113  G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
114
115  // This factor is introduced to take into account the Pauli principle
116  G4double PauliFactor = 1.0 - (7.0/5.0)*FermiRelRatio;
117  if (FermiRelRatio > 0.5) PauliFactor += (2.0/5.0)*FermiRelRatio*std::pow(2.0 - (1.0/FermiRelRatio), 5.0/2.0);
118
119  // Interaction volume
120  G4double Vint = (4.0/3.0)*pi*std::pow(2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity) , 3.0);
121
122  // Transition probability for \Delta n = +2
123  //  TransitionProb1 = 0.00332*AveragedXSection*PauliFactor*std::sqrt(RelativeEnergy)/
124  //    std::pow(1.2 + 1.0/(4.7*RelativeVelocity), 3.0);
125  TransitionProb1 = AveragedXSection*PauliFactor*std::sqrt(2.0*RelativeEnergy/proton_mass_c2)/Vint;
126  if (TransitionProb1 < 0.0) TransitionProb1 = 0.0; 
127
128  // g = (6.0/pi2)*aA;
129  //  G4double a = theLDP.LevelDensityParameter(A,Z,U-G4PairingCorrection::GetInstance()->GetPairingCorrection(A,Z));
130  G4double a = G4PreCompoundParameters::GetAddress()->GetLevelDensity();
131  // GE = g*E where E is Excitation Energy
132  G4double GE = (6.0/pi2)*a*A*U;
133
134
135  // F(p,h) = 0.25*(p^2 + h^2 + p - h) - 0.5*h
136  G4double Fph = ((P*P+H*H+P-H)/4.0 - H/2.0);
137  G4bool NeverGoBack(false);
138  //AH  if (U-Fph < 0.0) NeverGoBack = true;
139  if (GE-Fph < 0.0) NeverGoBack = true;
140  // F(p+1,h+1)
141  G4double Fph1 = Fph + N/2.0;
142  // (n+1)/n ((g*E - F(p,h))/(g*E - F(p+1,h+1)))^(n+1)
143  G4double ProbFactor = std::pow((GE-Fph)/(GE-Fph1),N+1.0);
144
145
146  if (NeverGoBack)
147    {
148      TransitionProb2 = 0.0;
149      TransitionProb3 = 0.0;
150    }
151  else 
152    {
153      // Transition probability for \Delta n = -2 (at F(p,h) = 0)
154      //  TransitionProb2 = max(0, (TransitionProb1*P*H*(P+H+1.0)*(P+H-2.0))/(GE*GE));
155      //  TransitionProb2 = (TransitionProb1*P*H*(P+H+1.0)*(P+H-2.0))/(GE*GE);
156      TransitionProb2 = TransitionProb1 * ProbFactor * (P*H*(N+1.0)*(N-2.0))/((GE-Fph)*(GE-Fph));
157      if (TransitionProb2 < 0.0) TransitionProb2 = 0.0; 
158     
159     
160      // Transition probability for \Delta n = 0 (at F(p,h) = 0)
161      //  TransitionProb3 = TransitionProb1*(P+H+1.0)*(P*(P-1.0)+4.0*P*H+H*(H-1.0))/((P+H)*GE);
162      TransitionProb3 = TransitionProb1 * ProbFactor * ((N+1.0)/N) * (P*(P-1.0) + 4.0*P*H + H*(H-1.0))/(GE-Fph);
163      if (TransitionProb3 < 0.0) TransitionProb3 = 0.0; 
164    }
165 
166  return TransitionProb1 + TransitionProb2 + TransitionProb3;
167}
168
169
170G4Fragment G4PreCompoundTransitions::PerformTransition(const G4Fragment & aFragment)
171{
172  G4Fragment result(aFragment);
173  G4double ChosenTransition = G4UniformRand()*(TransitionProb1 + TransitionProb2 + TransitionProb3);
174  G4int deltaN = 0;
175  G4int Nexcitons = result.GetNumberOfExcitons();
176  if (ChosenTransition <= TransitionProb1) 
177    {
178      // Number of excitons is increased on \Delta n = +2
179      deltaN = 2;
180    } 
181  else if (ChosenTransition <= TransitionProb1+TransitionProb2) 
182    {
183      // Number of excitons is increased on \Delta n = -2
184      deltaN = -2;
185    }
186
187  // AH/JMQ: Randomly decrease the number of charges if deltaN is -2 and in proportion to the number charges w.r.t. number of particles
188  if(deltaN < 0 && G4UniformRand() <= static_cast<G4double>(result.GetNumberOfCharged())/static_cast<G4double>(result.GetNumberOfParticles()) && (result.GetNumberOfCharged() >= 1))
189    result.SetNumberOfCharged(result.GetNumberOfCharged()+deltaN/2); // deltaN is negative!
190
191  // result.SetNumberOfParticles was here
192  // result.SetNumberOfHoles was here
193  // the following lines have to be before SetNumberOfCharged, otherwise the check on number of charged vs. number of particles fails
194  result.SetNumberOfParticles(result.GetNumberOfParticles()+deltaN/2);
195  result.SetNumberOfHoles(result.GetNumberOfHoles()+deltaN/2); 
196
197  // With weight Z/A, number of charged particles is decreased on +1
198  //  if ((deltaN > 0 || result.GetNumberOfCharged() > 0) && // AH/JMQ check is now in initialize within G4VPreCompoundFragment
199  if ( ( deltaN > 0 ) &&
200      (G4UniformRand() <= static_cast<G4double>(result.GetZ()-result.GetNumberOfCharged())/
201                  std::max(static_cast<G4double>(result.GetA()-Nexcitons),1.)))
202    {
203      result.SetNumberOfCharged(result.GetNumberOfCharged()+deltaN/2);
204    }
205 
206  // Number of charged can not be greater that number of particles
207  if ( result.GetNumberOfParticles() < result.GetNumberOfCharged() ) 
208    {
209      result.SetNumberOfCharged(result.GetNumberOfParticles());
210    }
211 
212  // moved from above to make code more readable
213  //  result.SetNumberOfParticles(result.GetNumberOfParticles()+deltaN/2);
214  //  result.SetNumberOfHoles(result.GetNumberOfHoles()+deltaN/2);
215
216  return result;
217}
218
Note: See TracBrowser for help on using the repository browser.