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.0.p1)


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