Geant4 Cross Reference |
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 // >> 27 // >> 28 // >> 29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... >> 30 // 26 // 09-07-98, data moved from G4Element. M.Mair 31 // 09-07-98, data moved from G4Element. M.Maire 27 // 22-11-00, tabulation of ionisation potentia << 32 // 22-11-00, tabulation of ionisation potential from 28 // the ICRU Report N#37. V.Ivanchenk 33 // the ICRU Report N#37. V.Ivanchenko 29 // 08-03-01, correct handling of fShellCorrect 34 // 08-03-01, correct handling of fShellCorrectionVector. M.Maire 30 // 17-10-02, Fix excitation energy interpolati 35 // 17-10-02, Fix excitation energy interpolation. V.Ivanchenko 31 // 06-09-04, Update calculated values after an << 36 // 06-09-04, Update calculated values after any change of ionisation 32 // potential change. V.Ivanchenko 37 // potential change. V.Ivanchenko 33 // 29-04-10, Using G4Pow and mean ionisation e 38 // 29-04-10, Using G4Pow and mean ionisation energy from NIST V.Ivanchenko 34 // 27.10.11: new scheme for G4Exception (mma) 39 // 27.10.11: new scheme for G4Exception (mma) >> 40 // >> 41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... 35 42 36 #include "G4IonisParamElm.hh" 43 #include "G4IonisParamElm.hh" 37 << 38 #include "G4NistManager.hh" 44 #include "G4NistManager.hh" 39 #include "G4PhysicalConstants.hh" << 40 #include "G4Pow.hh" 45 #include "G4Pow.hh" >> 46 #include "G4PhysicalConstants.hh" 41 #include "G4SystemOfUnits.hh" 47 #include "G4SystemOfUnits.hh" 42 48 43 //....oooOO0OOooo........oooOO0OOooo........oo 49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... 44 50 45 G4IonisParamElm::G4IonisParamElm(G4double Atom 51 G4IonisParamElm::G4IonisParamElm(G4double AtomNumber) 46 { 52 { 47 G4int Z = G4lrint(AtomNumber); 53 G4int Z = G4lrint(AtomNumber); 48 if (Z < 1) { 54 if (Z < 1) { 49 G4Exception("G4IonisParamElm::G4IonisParam << 55 G4Exception("G4IonisParamElm::G4IonisParamElm()", "mat501", FatalException, 50 "It is not allowed to create an Element << 56 "It is not allowed to create an Element with Z<1"); 51 } 57 } 52 G4Pow* g4pow = G4Pow::GetInstance(); 58 G4Pow* g4pow = G4Pow::GetInstance(); 53 59 54 // some basic functions of the atomic number 60 // some basic functions of the atomic number 55 fZ = Z; << 61 fZ = Z; 56 fZ3 = g4pow->Z13(Z); << 62 fZ3 = g4pow->Z13(Z); 57 fZZ3 = fZ3 * g4pow->Z13(Z + 1); << 63 fZZ3 = fZ3*g4pow->Z13(Z+1); 58 flogZ3 = g4pow->logZ(Z) / 3.; << 64 flogZ3 = g4pow->logZ(Z)/3.; 59 << 65 60 fMeanExcitationEnergy = G4NistManager::Insta << 66 fMeanExcitationEnergy = >> 67 G4NistManager::Instance()->GetMeanIonisationEnergy(Z); 61 68 62 // compute parameters for ion transport 69 // compute parameters for ion transport 63 // The aproximation from: 70 // The aproximation from: 64 // J.F.Ziegler, J.P. Biersack, U. Littmark 71 // J.F.Ziegler, J.P. Biersack, U. Littmark 65 // The Stopping and Range of Ions in Matter, 72 // The Stopping and Range of Ions in Matter, 66 // Vol.1, Pergamon Press, 1985 73 // Vol.1, Pergamon Press, 1985 67 // Fast ions or hadrons 74 // Fast ions or hadrons 68 75 69 G4int iz = Z - 1; 76 G4int iz = Z - 1; 70 if (91 < iz) { << 77 if(91 < iz) { iz = 91; } 71 iz = 91; << 72 } << 73 78 74 // clang-format off << 75 static const G4double vFermi[92] = { 79 static const G4double vFermi[92] = { 76 1.0309, 0.15976, 0.59782, 1.0781, 1.0486 80 1.0309, 0.15976, 0.59782, 1.0781, 1.0486, 1.0, 1.058, 0.93942, 0.74562, 0.3424, 77 0.45259, 0.71074, 0.90519, 0.97411, 0.9718 81 0.45259, 0.71074, 0.90519, 0.97411, 0.97184, 0.89852, 0.70827, 0.39816, 0.36552, 0.62712, 78 0.81707, 0.9943, 1.1423, 1.2381, 1.1222 82 0.81707, 0.9943, 1.1423, 1.2381, 1.1222, 0.92705, 1.0047, 1.2, 1.0661, 0.97411, 79 0.84912, 0.95, 1.0903, 1.0429, 0.4971 83 0.84912, 0.95, 1.0903, 1.0429, 0.49715, 0.37755, 0.35211, 0.57801, 0.77773, 1.0207, 80 1.029, 1.2542, 1.122, 1.1241, 1.0882 84 1.029, 1.2542, 1.122, 1.1241, 1.0882, 1.2709, 1.2542, 0.90094, 0.74093, 0.86054, 81 0.93155, 1.0047, 0.55379, 0.43289, 0.3263 85 0.93155, 1.0047, 0.55379, 0.43289, 0.32636, 0.5131, 0.695, 0.72591, 0.71202, 0.67413, 82 0.71418, 0.71453, 0.5911, 0.70263, 0.6804 86 0.71418, 0.71453, 0.5911, 0.70263, 0.68049, 0.68203, 0.68121, 0.68532, 0.68715, 0.61884, 83 0.71801, 0.83048, 1.1222, 1.2381, 1.045, 87 0.71801, 0.83048, 1.1222, 1.2381, 1.045, 1.0733, 1.0953, 1.2381, 1.2879, 0.78654, 84 0.66401, 0.84912, 0.88433, 0.80746, 0.4335 88 0.66401, 0.84912, 0.88433, 0.80746, 0.43357, 0.41923, 0.43638, 0.51464, 0.73087, 0.81065, 85 1.9578, 1.0257} ; 89 1.9578, 1.0257} ; 86 90 87 static const G4double lFactor[92] = { 91 static const G4double lFactor[92] = { 88 1.0, 1.0, 1.1, 1.06, 1.01, 1.03, 1.04, 92 1.0, 1.0, 1.1, 1.06, 1.01, 1.03, 1.04, 0.99, 0.95, 0.9, 89 0.82, 0.81, 0.83, 0.88, 1.0, 0.95, 0.97, 93 0.82, 0.81, 0.83, 0.88, 1.0, 0.95, 0.97, 0.99, 0.98, 0.97, 90 0.98, 0.97, 0.96, 0.93, 0.91, 0.9, 0.88, 94 0.98, 0.97, 0.96, 0.93, 0.91, 0.9, 0.88, 0.9, 0.9, 0.9, 91 0.9, 0.85, 0.9, 0.9, 0.91, 0.92, 0.9, 95 0.9, 0.85, 0.9, 0.9, 0.91, 0.92, 0.9, 0.9, 0.9, 0.9, 92 0.9, 0.88, 0.9, 0.88, 0.88, 0.9, 0.9, 96 0.9, 0.88, 0.9, 0.88, 0.88, 0.9, 0.9, 0.88, 0.9, 0.9, 93 0.9, 0.9, 0.96, 1.2, 0.9, 0.88, 0.88, 97 0.9, 0.9, 0.96, 1.2, 0.9, 0.88, 0.88, 0.85, 0.9, 0.9, 94 0.92, 0.95, 0.99, 1.03, 1.05, 1.07, 1.08, 98 0.92, 0.95, 0.99, 1.03, 1.05, 1.07, 1.08, 1.1, 1.08, 1.08, 95 1.08, 1.08, 1.09, 1.09, 1.1, 1.11, 1.12, 99 1.08, 1.08, 1.09, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 96 1.17, 1.2, 1.18, 1.17, 1.17, 1.16, 1.16, 100 1.17, 1.2, 1.18, 1.17, 1.17, 1.16, 1.16, 1.16, 1.16, 1.16, 97 1.16, 1.16} ; 101 1.16, 1.16} ; 98 // clang-format on << 99 102 100 fVFermi = vFermi[iz]; << 103 fVFermi = vFermi[iz]; 101 fLFactor = lFactor[iz]; 104 fLFactor = lFactor[iz]; 102 105 103 // obsolete parameters for ionisation 106 // obsolete parameters for ionisation 104 fTau0 = 0.1 * fZ3 * MeV / proton_mass_c2; << 107 fTau0 = 0.1*fZ3*MeV/proton_mass_c2; 105 fTaul = 2. * MeV / proton_mass_c2; << 108 fTaul = 2.*MeV/proton_mass_c2; 106 109 107 // compute the Bethe-Bloch formula for energ 110 // compute the Bethe-Bloch formula for energy = fTaul*particle mass 108 G4double rate = fMeanExcitationEnergy / elec << 111 G4double rate = fMeanExcitationEnergy/electron_mass_c2 ; 109 G4double w = fTaul * (fTaul + 2.); << 112 G4double w = fTaul*(fTaul+2.) ; 110 fBetheBlochLow = (fTaul + 1.) * (fTaul + 1.) << 113 fBetheBlochLow = (fTaul+1.)*(fTaul+1.)*std::log(2.*w/rate)/w - 1. ; 111 fBetheBlochLow = 2. * fZ * twopi_mc2_rcl2 * << 114 fBetheBlochLow = 2.*fZ*twopi_mc2_rcl2*fBetheBlochLow ; 112 << 115 113 fClow = std::sqrt(fTaul) * fBetheBlochLow; << 116 fClow = std::sqrt(fTaul)*fBetheBlochLow; 114 fAlow = 6.458040 * fClow / fTau0; << 117 fAlow = 6.458040 * fClow/fTau0; 115 G4double Taum = 0.035 * fZ3 * MeV / proton_m << 118 G4double Taum = 0.035*fZ3*MeV/proton_mass_c2; 116 fBlow = -3.229020 * fClow / (fTau0 * std::sq << 119 fBlow =-3.229020*fClow/(fTau0*std::sqrt(Taum)); 117 120 118 // Shell correction parameterization 121 // Shell correction parameterization 119 fShellCorrectionVector = new G4double[3]; / << 122 fShellCorrectionVector = new G4double[3]; //[3] 120 rate = 0.001 * fMeanExcitationEnergy / eV; << 123 rate = 0.001*fMeanExcitationEnergy/eV; 121 G4double rate2 = rate * rate; << 124 G4double rate2 = rate*rate; 122 fShellCorrectionVector[0] = (0.422377 + 3.85 << 125 /* 123 fShellCorrectionVector[1] = (0.0304043 - 0.1 << 126 fShellCorrectionVector[0] = ( 1.10289e5 + 5.14781e8*rate)*rate2 ; 124 fShellCorrectionVector[2] = (-0.00038106 + 0 << 127 fShellCorrectionVector[1] = ( 7.93805e3 - 2.22565e7*rate)*rate2 ; >> 128 fShellCorrectionVector[2] = (-9.92256e1 + 2.10823e5*rate)*rate2 ; >> 129 */ >> 130 fShellCorrectionVector[0] = ( 0.422377 + 3.858019*rate)*rate2 ; >> 131 fShellCorrectionVector[1] = ( 0.0304043 - 0.1667989*rate)*rate2 ; >> 132 fShellCorrectionVector[2] = (-0.00038106 + 0.00157955*rate)*rate2 ; >> 133 } >> 134 >> 135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... >> 136 >> 137 // Fake default constructor - sets only member data and allocates memory >> 138 // for usage restricted to object persistency >> 139 >> 140 G4IonisParamElm::G4IonisParamElm(__void__&) >> 141 : fShellCorrectionVector(nullptr) >> 142 { >> 143 fZ=fZ3=fZZ3=flogZ3=fTau0=fTaul=fBetheBlochLow=fAlow=fBlow=fClow >> 144 =fMeanExcitationEnergy=fVFermi=fLFactor=0.0; 125 } 145 } 126 146 127 //....oooOO0OOooo........oooOO0OOooo........oo 147 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... 128 148 129 G4IonisParamElm::~G4IonisParamElm() { delete[] << 149 G4IonisParamElm::~G4IonisParamElm() >> 150 { >> 151 if (fShellCorrectionVector) { delete [] fShellCorrectionVector; } >> 152 } >> 153 >> 154 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... 130 155