Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/src/G4ionEffectiveCharge.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 ]

Diff markup

Differences between /processes/electromagnetic/utils/src/G4ionEffectiveCharge.cc (Version 11.3.0) and /processes/electromagnetic/utils/src/G4ionEffectiveCharge.cc (Version 8.2.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 // $Id: G4ionEffectiveCharge.cc,v 1.14 2006/08/15 16:21:39 vnivanch Exp $
                                                   >>  27 // GEANT4 tag $Name: geant4-08-01-patch-02 $
 26 //                                                 28 //
 27 // -------------------------------------------     29 // -------------------------------------------------------------------
 28 //                                                 30 //
 29 // GEANT4 Class file                               31 // GEANT4 Class file
 30 //                                                 32 //
 31 //                                                 33 //
 32 // File name:     G4ionEffectiveCharge             34 // File name:     G4ionEffectiveCharge
 33 //                                                 35 //
 34 // Author:        Vladimir Ivanchenko              36 // Author:        Vladimir Ivanchenko
 35 //                                                 37 //
 36 // Creation date: 07.05.2002                       38 // Creation date: 07.05.2002
 37 //                                                 39 //
 38 // Modifications:                                  40 // Modifications:
 39 // 12.09.2004 Set low energy limit to 1 keV (V     41 // 12.09.2004 Set low energy limit to 1 keV (V.Ivanchenko) 
 40 // 25.01.2005 Add protection - min Charge 0.1      42 // 25.01.2005 Add protection - min Charge 0.1 eplus (V.Ivanchenko) 
 41 // 28.04.2006 Set upper energy limit to 50 MeV     43 // 28.04.2006 Set upper energy limit to 50 MeV (V.Ivanchenko) 
 42 // 23.05.2006 Set upper energy limit to Z*10 M     44 // 23.05.2006 Set upper energy limit to Z*10 MeV (V.Ivanchenko) 
 43 // 15.08.2006 Add protection for not defined m     45 // 15.08.2006 Add protection for not defined material (V.Ivanchenko) 
 44 // 27-09-2007 Use Fermi energy from material,  << 
 45 //                                                 46 //
 46                                                    47 
 47 // -------------------------------------------     48 // -------------------------------------------------------------------
 48 //                                                 49 //
 49 //....oooOO0OOooo........oooOO0OOooo........oo     50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 50 //....oooOO0OOooo........oooOO0OOooo........oo     51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 51                                                    52 
 52 #include "G4ionEffectiveCharge.hh"                 53 #include "G4ionEffectiveCharge.hh"
 53 #include "G4PhysicalConstants.hh"              << 
 54 #include "G4SystemOfUnits.hh"                  << 
 55 #include "G4UnitsTable.hh"                         54 #include "G4UnitsTable.hh"
                                                   >>  55 #include "G4ParticleDefinition.hh"
 56 #include "G4Material.hh"                           56 #include "G4Material.hh"
 57 #include "G4NistManager.hh"                    << 
 58 #include "G4Log.hh"                            << 
 59 #include "G4Exp.hh"                            << 
 60 #include "G4Pow.hh"                            << 
 61                                                    57 
 62 //....oooOO0OOooo........oooOO0OOooo........oo     58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 63                                                    59 
 64 G4ionEffectiveCharge::G4ionEffectiveCharge()       60 G4ionEffectiveCharge::G4ionEffectiveCharge()
 65 {                                                  61 {
 66   chargeCorrection = 1.0;                          62   chargeCorrection = 1.0;
 67   energyHighLimit  = 20.0*CLHEP::MeV;          <<  63   energyHighLimit  = 10.0*MeV;
 68   energyLowLimit   = 1.0*CLHEP::keV;           <<  64   energyLowLimit   = 1.0*keV;
 69   energyBohr       = 25.*CLHEP::keV;           <<  65   energyBohr       = 25.*keV;
 70   massFactor       = CLHEP::amu_c2/(CLHEP::pro <<  66   massFactor       = amu_c2/(proton_mass_c2*keV);
 71   minCharge        = 1.0;                      <<  67   minCharge        = 0.1;
 72   lastKinEnergy    = 0.0;                      << 
 73   effCharge        = CLHEP::eplus;             << 
 74   inveplus         = 1.0/CLHEP::eplus;         << 
 75   g4calc = G4Pow::GetInstance();               << 
 76 }                                                  68 }
 77                                                    69 
 78 //....oooOO0OOooo........oooOO0OOooo........oo     70 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 79                                                    71 
                                                   >>  72 G4ionEffectiveCharge::~G4ionEffectiveCharge()
                                                   >>  73 {}
                                                   >>  74 
                                                   >>  75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >>  76 
 80 G4double G4ionEffectiveCharge::EffectiveCharge     77 G4double G4ionEffectiveCharge::EffectiveCharge(const G4ParticleDefinition* p,
 81                                                    78                                                const G4Material* material,
 82                                                <<  79                                    G4double kineticEnergy)
 83 {                                                  80 {
 84   if(p == lastPart && material == lastMat && k <<  81   G4double mass   = p->GetPDGMass();
 85     return effCharge;                          <<  82   G4double charge = p->GetPDGCharge();
                                                   >>  83   G4double Zi     = charge/eplus;
 86                                                    84 
 87   lastPart      = p;                           << 
 88   lastMat       = material;                    << 
 89   lastKinEnergy = kineticEnergy;               << 
 90                                                << 
 91   G4double mass = p->GetPDGMass();             << 
 92   effCharge = p->GetPDGCharge();               << 
 93   G4int Zi = G4lrint(effCharge*inveplus);      << 
 94   chargeCorrection = 1.0;                          85   chargeCorrection = 1.0;
 95   if(Zi <= 1) { return effCharge; }            << 
 96                                                    86 
 97   // The aproximation of ion effective charge      87   // The aproximation of ion effective charge from:
 98   // J.F.Ziegler, J.P. Biersack, U. Littmark       88   // J.F.Ziegler, J.P. Biersack, U. Littmark
 99   // The Stopping and Range of Ions in Matter,     89   // The Stopping and Range of Ions in Matter,
100   // Vol.1, Pergamon Press, 1985                   90   // Vol.1, Pergamon Press, 1985
101   // Fast ions or hadrons                          91   // Fast ions or hadrons
102   G4double reducedEnergy = kineticEnergy * CLH <<  92   G4double reducedEnergy = kineticEnergy * proton_mass_c2/mass ;
                                                   >>  93   if( reducedEnergy > Zi*energyHighLimit || Zi < 1.5 || !material) return charge;
103                                                    94 
104   //G4cout << "e= " << reducedEnergy << " Zi=  <<  95   static G4double vFermi[92] = {
105   //<< material->GetName() << G4endl;          <<  96     1.0309,  0.15976, 0.59782, 1.0781,  1.0486,  1.0,     1.058,   0.93942, 0.74562, 0.3424,
                                                   >>  97     0.45259, 0.71074, 0.90519, 0.97411, 0.97184, 0.89852, 0.70827, 0.39816, 0.36552, 0.62712,
                                                   >>  98     0.81707, 0.9943,  1.1423,  1.2381,  1.1222,  0.92705, 1.0047,  1.2,     1.0661,  0.97411,
                                                   >>  99     0.84912, 0.95,    1.0903,  1.0429,  0.49715, 0.37755, 0.35211, 0.57801, 0.77773, 1.0207,
                                                   >> 100     1.029,   1.2542,  1.122,   1.1241,  1.0882,  1.2709,  1.2542,  0.90094, 0.74093, 0.86054,
                                                   >> 101     0.93155, 1.0047,  0.55379, 0.43289, 0.32636, 0.5131,  0.695,   0.72591, 0.71202, 0.67413,
                                                   >> 102     0.71418, 0.71453, 0.5911,  0.70263, 0.68049, 0.68203, 0.68121, 0.68532, 0.68715, 0.61884,
                                                   >> 103     0.71801, 0.83048, 1.1222,  1.2381,  1.045,   1.0733,  1.0953,  1.2381,  1.2879,  0.78654,
                                                   >> 104     0.66401, 0.84912, 0.88433, 0.80746, 0.43357, 0.41923, 0.43638, 0.51464, 0.73087, 0.81065,
                                                   >> 105     1.9578,  1.0257} ;
                                                   >> 106 
                                                   >> 107   static G4double lFactor[92] = {
                                                   >> 108     1.0,  1.0,  1.1,  1.06, 1.01, 1.03, 1.04, 0.99, 0.95, 0.9,
                                                   >> 109     0.82, 0.81, 0.83, 0.88, 1.0,  0.95, 0.97, 0.99, 0.98, 0.97,
                                                   >> 110     0.98, 0.97, 0.96, 0.93, 0.91, 0.9,  0.88, 0.9,  0.9,  0.9,
                                                   >> 111     0.9,  0.85, 0.9,  0.9,  0.91, 0.92, 0.9,  0.9,  0.9,  0.9,
                                                   >> 112     0.9,  0.88, 0.9,  0.88, 0.88, 0.9,  0.9,  0.88, 0.9,  0.9,
                                                   >> 113     0.9,  0.9,  0.96, 1.2,  0.9,  0.88, 0.88, 0.85, 0.9,  0.9,
                                                   >> 114     0.92, 0.95, 0.99, 1.03, 1.05, 1.07, 1.08, 1.1,  1.08, 1.08,
                                                   >> 115     1.08, 1.08, 1.09, 1.09, 1.1,  1.11, 1.12, 1.13, 1.14, 1.15,
                                                   >> 116     1.17, 1.2,  1.18, 1.17, 1.17, 1.16, 1.16, 1.16, 1.16, 1.16,
                                                   >> 117     1.16, 1.16} ;
                                                   >> 118 
                                                   >> 119   static G4double c[6] = {0.2865,  0.1266, -0.001429,
                                                   >> 120                           0.02402,-0.01135, 0.001475} ;
                                                   >> 121 
                                                   >> 122   // get elements in the actual material,
                                                   >> 123   const G4ElementVector* theElementVector = material->GetElementVector() ;
                                                   >> 124   const G4double* theAtomicNumDensityVector =
                                                   >> 125                          material->GetAtomicNumDensityVector() ;
                                                   >> 126   const G4int NumberOfElements = material->GetNumberOfElements() ;
                                                   >> 127 
                                                   >> 128   //  loop for the elements in the material
                                                   >> 129   //  to find out average values Z, vF, lF
                                                   >> 130   G4double z = 0.0, vF = 0.0, lF = 0.0, norm = 0.0 ;
                                                   >> 131 
                                                   >> 132   if( 1 == NumberOfElements ) {
                                                   >> 133     z = material->GetZ() ;
                                                   >> 134     G4int iz = G4int(z) - 1 ;
                                                   >> 135     if(iz < 0) iz = 0 ;
                                                   >> 136     else if(iz > 91) iz = 91 ;
                                                   >> 137     vF   = vFermi[iz] ;
                                                   >> 138     lF   = lFactor[iz] ;
                                                   >> 139 
                                                   >> 140   } else {
                                                   >> 141     for (G4int iel=0; iel<NumberOfElements; iel++)
                                                   >> 142       {
                                                   >> 143         const G4Element* element = (*theElementVector)[iel] ;
                                                   >> 144         G4double z2 = element->GetZ() ;
                                                   >> 145         const G4double weight = theAtomicNumDensityVector[iel] ;
                                                   >> 146         norm += weight ;
                                                   >> 147         z    += z2 * weight ;
                                                   >> 148         G4int iz = G4int(z2) - 1 ;
                                                   >> 149         if(iz < 0) iz = 0 ;
                                                   >> 150         else if(iz > 91) iz =91 ;
                                                   >> 151         vF   += vFermi[iz] * weight ;
                                                   >> 152         lF   += lFactor[iz] * weight ;
                                                   >> 153       }
                                                   >> 154     z  /= norm ;
                                                   >> 155     vF /= norm ;
                                                   >> 156     lF /= norm ;
                                                   >> 157   }  
106                                                   158 
107   if(reducedEnergy > effCharge*energyHighLimit << 
108     return effCharge;                          << 
109   }                                            << 
110   G4double z = material->GetIonisation()->GetZ << 
111   reducedEnergy = std::max(reducedEnergy,energ    159   reducedEnergy = std::max(reducedEnergy,energyLowLimit);
                                                   >> 160   G4double q;
112                                                   161 
113   // Helium ion case                              162   // Helium ion case
114   if( Zi <= 2 ) {                              << 163   if( Zi < 2.5 ) {
115                                                << 
116     static const G4double c[6] =               << 
117       {0.2865,0.1266,-0.001429,0.02402,-0.0113 << 
118                                                   164 
119     G4double Q = std::max(0.0,G4Log(reducedEne << 165     G4double Q = std::max(0.0,std::log(reducedEnergy*massFactor));
120     G4double x = c[0];                            166     G4double x = c[0];
121     G4double y = 1.0;                             167     G4double y = 1.0;
122     for (G4int i=1; i<6; ++i) {                << 168     for (G4int i=1; i<6; i++) {
123       y *= Q;                                     169       y *= Q;
124       x += y * c[i] ;                             170       x += y * c[i] ;
125     }                                             171     }
126     G4double ex = (x < 0.2) ? x * (1 - 0.5*x)  << 
127                                                << 
128     G4double tq = 7.6 - Q;                        172     G4double tq = 7.6 - Q;
129     G4double tq2= tq*tq;                       << 173     q = (1.0 + ( 0.007 + 0.00005 * z ) * std::exp( -tq*tq )) * std::sqrt(1.0 - std::exp(-x)) ;
130     G4double tt = ( 0.007 + 0.00005 * z );     << 
131     if(tq2 < 0.2) { tt *= (1.0 - tq2 + 0.5*tq2 << 
132     else          { tt *= G4Exp(-tq2); }       << 
133                                                << 
134     effCharge *= (1.0 + tt) * std::sqrt(ex);   << 
135                                                   174 
136     // Heavy ion case                             175     // Heavy ion case
137   } else {                                        176   } else {
138                                                   177     
139     G4double zi13 = g4calc->Z13(Zi);           << 178     G4double z23  = std::pow(z, 0.666667);
                                                   >> 179     G4double zi13 = std::pow(Zi, 0.33333);
140     G4double zi23 = zi13*zi13;                    180     G4double zi23 = zi13*zi13;
141                                                << 181     G4double e = std::max(reducedEnergy,energyBohr/z23);
                                                   >> 182    
142     // v1 is ion velocity in vF unit              183     // v1 is ion velocity in vF unit
143     G4double eF   = material->GetIonisation()- << 184     G4double v1 = std::sqrt( e / energyBohr )/ vF ;
144     G4double v1sq = reducedEnergy/eF;          << 185     G4double y ;
145     G4double vFsq = eF/energyBohr;             << 186 
146     G4double vF = std::sqrt(vFsq);             << 187     // Faster than Fermi velocity
147                                                << 188     if ( v1 > 1.0 ) {
148     G4double y = ( v1sq > 1.0 )                << 189       y = vF * v1 * ( 1.0 + 0.2 / (v1*v1) ) / zi23 ;
149       // Faster than Fermi velocity            << 190 
150       ? vF * std::sqrt(v1sq) * ( 1.0 + 0.2/v1s << 
151       // Slower than Fermi velocity               191       // Slower than Fermi velocity
152       : 0.692308 * vF * (1.0 + 0.666666*v1sq + << 192     } else {
                                                   >> 193       y = 0.6923 * vF * (1.0 + 2.0*v1*v1/3.0 + v1*v1*v1*v1/15.0) / zi23 ;
                                                   >> 194     }
                                                   >> 195 
                                                   >> 196     G4double y3 = std::pow(y, 0.3) ;
                                                   >> 197     //    G4cout << "y= " << y << " y3= " << y3 << " v1= " << v1 << " vF= " << vF << G4endl; 
                                                   >> 198     q = 1.0 - std::exp( 0.803*y3 - 1.3167*y3*y3 - 0.38157*y - 0.008983*y*y ) ;
                                                   >> 199 
                                                   >> 200     //    q = 1.0 - std::exp(-0.95*std::sqrt(reducedEnergy/energyBohr)/zi23);
153                                                   201 
154     G4double y3 = G4Exp(0.3*G4Log(y));         << 202     G4double qmin = minCharge/Zi;
155     // G4cout<<"y= "<<y<<" y3= "<<y3<<" v1= "< << 203 
156     G4double q = std::max(1.0 - G4Exp( 0.803*y << 204     if(q < qmin) q = qmin;
157                                      - 0.00898 << 
158                                                   205     
159     // compute charge correction               << 206     G4double tq = 7.6 - std::log(reducedEnergy/keV);
160     G4double tq = 7.6 - G4Log(reducedEnergy/CL << 207     G4double sq = 1.0 + ( 0.18 + 0.0015 * z ) * std::exp( -tq*tq )/ (Zi*Zi);
161     G4double tq2= tq*tq;                       << 
162     G4double sq = 1.0 + ( 0.18 + 0.0015 * z )* << 
163     //    G4cout << "sq= " << sq << G4endl;       208     //    G4cout << "sq= " << sq << G4endl;
164                                                   209 
165     // Screen length according to                 210     // Screen length according to
166     // J.F.Ziegler and J.M.Manoyan, The stoppi    211     // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
167     // Nucl. Inst. & Meth. in Phys. Res. B35 (    212     // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
168                                                   213 
169     G4double lambda = 10.0 * vF *g4calc->A23(1 << 214     G4double lambda = 10.0 * vF * std::pow(1.0-q, 0.6667) / (zi13 * (6.0 + q)) ;
170     G4double lambda2 = lambda*lambda;          << 215     chargeCorrection = sq * (1.0 + (0.5/q - 0.5)*std::log(1.0 + lambda*lambda)/(vF*vF) );
171     G4double xx = (0.5/q - 0.5)*G4Log(1.0 + la << 216     
172                                                << 
173     effCharge *= q;                            << 
174     chargeCorrection = sq * (1.0 + xx);        << 
175   }                                               217   }
176   //  G4cout << "G4ionEffectiveCharge: charge=    218   //  G4cout << "G4ionEffectiveCharge: charge= " << charge << " q= " << q 
177   //         << " chargeCor= " << chargeCorrec    219   //         << " chargeCor= " << chargeCorrection 
178   //           << " e(MeV)= " << kineticEnergy << 220   //     << " e(MeV)= " << kineticEnergy/MeV << G4endl;
179   return effCharge;                            << 221   return q*charge;
180 }                                                 222 }
181                                                   223 
182 //....oooOO0OOooo........oooOO0OOooo........oo    224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 225 
                                                   >> 226 
183                                                   227