00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include "G4IonisParamElm.hh"
00045 #include "G4NistManager.hh"
00046 #include "G4Pow.hh"
00047 #include "G4PhysicalConstants.hh"
00048 #include "G4SystemOfUnits.hh"
00049
00050
00051
00052 G4IonisParamElm::G4IonisParamElm(G4double AtomNumber)
00053 {
00054 G4int Z = G4int(AtomNumber + 0.5);
00055 if (Z < 1) {
00056 G4Exception("G4IonisParamElm::G4IonisParamElm()", "mat501", FatalException,
00057 "It is not allowed to create an Element with Z<1");
00058 }
00059 G4Pow* g4pow = G4Pow::GetInstance();
00060
00061
00062 fZ = Z;
00063 fZ3 = g4pow->Z13(Z);
00064 fZZ3 = fZ3*g4pow->Z13(Z+1);
00065 flogZ3 = g4pow->logZ(Z)/3.;
00066
00067 fMeanExcitationEnergy =
00068 G4NistManager::Instance()->GetMeanIonisationEnergy(Z);
00069
00070
00071
00072
00073
00074
00075
00076
00077 G4int iz = Z - 1;
00078 if(91 < iz) { iz = 91; }
00079
00080 static G4double vFermi[92] = {
00081 1.0309, 0.15976, 0.59782, 1.0781, 1.0486, 1.0, 1.058, 0.93942, 0.74562, 0.3424,
00082 0.45259, 0.71074, 0.90519, 0.97411, 0.97184, 0.89852, 0.70827, 0.39816, 0.36552, 0.62712,
00083 0.81707, 0.9943, 1.1423, 1.2381, 1.1222, 0.92705, 1.0047, 1.2, 1.0661, 0.97411,
00084 0.84912, 0.95, 1.0903, 1.0429, 0.49715, 0.37755, 0.35211, 0.57801, 0.77773, 1.0207,
00085 1.029, 1.2542, 1.122, 1.1241, 1.0882, 1.2709, 1.2542, 0.90094, 0.74093, 0.86054,
00086 0.93155, 1.0047, 0.55379, 0.43289, 0.32636, 0.5131, 0.695, 0.72591, 0.71202, 0.67413,
00087 0.71418, 0.71453, 0.5911, 0.70263, 0.68049, 0.68203, 0.68121, 0.68532, 0.68715, 0.61884,
00088 0.71801, 0.83048, 1.1222, 1.2381, 1.045, 1.0733, 1.0953, 1.2381, 1.2879, 0.78654,
00089 0.66401, 0.84912, 0.88433, 0.80746, 0.43357, 0.41923, 0.43638, 0.51464, 0.73087, 0.81065,
00090 1.9578, 1.0257} ;
00091
00092 static G4double lFactor[92] = {
00093 1.0, 1.0, 1.1, 1.06, 1.01, 1.03, 1.04, 0.99, 0.95, 0.9,
00094 0.82, 0.81, 0.83, 0.88, 1.0, 0.95, 0.97, 0.99, 0.98, 0.97,
00095 0.98, 0.97, 0.96, 0.93, 0.91, 0.9, 0.88, 0.9, 0.9, 0.9,
00096 0.9, 0.85, 0.9, 0.9, 0.91, 0.92, 0.9, 0.9, 0.9, 0.9,
00097 0.9, 0.88, 0.9, 0.88, 0.88, 0.9, 0.9, 0.88, 0.9, 0.9,
00098 0.9, 0.9, 0.96, 1.2, 0.9, 0.88, 0.88, 0.85, 0.9, 0.9,
00099 0.92, 0.95, 0.99, 1.03, 1.05, 1.07, 1.08, 1.1, 1.08, 1.08,
00100 1.08, 1.08, 1.09, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15,
00101 1.17, 1.2, 1.18, 1.17, 1.17, 1.16, 1.16, 1.16, 1.16, 1.16,
00102 1.16, 1.16} ;
00103
00104 fVFermi = vFermi[iz];
00105 fLFactor = lFactor[iz];
00106
00107
00108 fTau0 = 0.1*fZ3*MeV/proton_mass_c2;
00109 fTaul = 2.*MeV/proton_mass_c2;
00110
00111
00112 G4double rate = fMeanExcitationEnergy/electron_mass_c2 ;
00113 G4double w = fTaul*(fTaul+2.) ;
00114 fBetheBlochLow = (fTaul+1.)*(fTaul+1.)*std::log(2.*w/rate)/w - 1. ;
00115 fBetheBlochLow = 2.*fZ*twopi_mc2_rcl2*fBetheBlochLow ;
00116
00117 fClow = std::sqrt(fTaul)*fBetheBlochLow;
00118 fAlow = 6.458040 * fClow/fTau0;
00119 G4double Taum = 0.035*fZ3*MeV/proton_mass_c2;
00120 fBlow =-3.229020*fClow/(fTau0*std::sqrt(Taum));
00121
00122
00123 fShellCorrectionVector = new G4double[3];
00124 rate = 0.001*fMeanExcitationEnergy/eV;
00125 G4double rate2 = rate*rate;
00126
00127
00128
00129
00130
00131 fShellCorrectionVector[0] = ( 0.422377 + 3.858019*rate)*rate2 ;
00132 fShellCorrectionVector[1] = ( 0.0304043 - 0.1667989*rate)*rate2 ;
00133 fShellCorrectionVector[2] = (-0.00038106 + 0.00157955*rate)*rate2 ;
00134 }
00135
00136
00137
00138
00139
00140
00141 G4IonisParamElm::G4IonisParamElm(__void__&)
00142 : fShellCorrectionVector(0)
00143 {
00144 fZ=fZ3=fZZ3=flogZ3=fTau0=fTaul=fBetheBlochLow=fAlow=fBlow=fClow
00145 =fMeanExcitationEnergy=fVFermi=fLFactor=0.0;
00146 }
00147
00148
00149
00150 G4IonisParamElm::~G4IonisParamElm()
00151 {
00152 if (fShellCorrectionVector) { delete [] fShellCorrectionVector; }
00153 }
00154
00155
00156
00157 G4IonisParamElm::G4IonisParamElm(G4IonisParamElm& right)
00158 {
00159 fShellCorrectionVector = 0;
00160 *this = right;
00161 }
00162
00163
00164
00165 G4IonisParamElm& G4IonisParamElm::operator=(const G4IonisParamElm& right)
00166 {
00167 if (this != &right)
00168 {
00169 fZ = right.fZ;
00170 fZ3 = right.fZ3;
00171 fZZ3 = right.fZZ3;
00172 flogZ3 = right.flogZ3;
00173 fTau0 = right.fTau0;
00174 fTaul = right.fTaul;
00175 fBetheBlochLow = right.fBetheBlochLow;
00176 fAlow = right.fAlow;
00177 fBlow = right.fBlow;
00178 fClow = right.fClow;
00179 fMeanExcitationEnergy = right.fMeanExcitationEnergy;
00180 fVFermi = right.fVFermi;
00181 fLFactor = right.fLFactor;
00182 if (fShellCorrectionVector) { delete [] fShellCorrectionVector; }
00183 fShellCorrectionVector = new G4double[3];
00184 fShellCorrectionVector[0] = right.fShellCorrectionVector[0];
00185 fShellCorrectionVector[1] = right.fShellCorrectionVector[1];
00186 fShellCorrectionVector[2] = right.fShellCorrectionVector[2];
00187 }
00188 return *this;
00189 }
00190
00191
00192
00193 G4int G4IonisParamElm::operator==(const G4IonisParamElm& right) const
00194 {
00195 return (this == (G4IonisParamElm *) &right);
00196 }
00197
00198
00199
00200 G4int G4IonisParamElm::operator!=(const G4IonisParamElm& right) const
00201 {
00202 return (this != (G4IonisParamElm *) &right);
00203 }
00204
00205