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 #include "G4NucleiPropertiesTheoreticalTable.hh"
00037 #include "G4PhysicalConstants.hh"
00038 #include "G4SystemOfUnits.hh"
00039
00040
00041 G4int G4NucleiPropertiesTheoreticalTable::GetIndex(G4int Z, G4int A)
00042 {
00043
00044 if(A>339) {
00045 G4Exception("G4NucleiPropertiesTheoreticalTable::GetIndex",
00046 "PART202",
00047 EventMustBeAborted,"Nucleon number larger than 339");
00048 } else if(A<16) {
00049 G4Exception("G4NucleiPropertiesTheoreticalTable::GetIndex",
00050 "PART202",
00051 EventMustBeAborted," Nucleon number smaller than 16");
00052 } else if(Z>136) {
00053 G4Exception("G4NucleiPropertiesTheoreticalTable::GetIndex",
00054 "PART202",
00055 EventMustBeAborted, "Proton number larger than 136");
00056 } else if(Z<8) {
00057 G4Exception("G4NucleiPropertiesTheoreticalTable::GetIndex",
00058 "PART202",
00059 EventMustBeAborted, "Proton number smaller than 8");
00060 } else if(Z>A) {
00061 G4Exception("G4NucleiPropertiesTheoreticalTable::GetIndex",
00062 "PART202",
00063 EventMustBeAborted, "Nucleon number smaller than Z");
00064 }
00065
00066 G4int i = shortTable[Z-8];
00067 while ( i < shortTable[Z-8+1] ) {
00068 if (indexArray[1][i] != A ) i++;
00069 else return i;
00070 }
00071
00072 return -1;
00073 }
00074
00075
00076
00077 G4double G4NucleiPropertiesTheoreticalTable::GetMassExcess(G4int Z, G4int A)
00078 {
00079 G4int i=GetIndex(Z, A);
00080 if (i >= 0) {
00081 return AtomicMassExcess[i]*MeV;
00082 } else {
00083 return 0.0;
00084 }
00085 }
00086
00087 G4double G4NucleiPropertiesTheoreticalTable::GetBindingEnergy(G4int Z, G4int A)
00088 {
00089 G4int i=GetIndex(Z, A);
00090 if (i >= 0){
00091 const G4double Mh = 7.289034*MeV;
00092 const G4double Mn = 8.071431*MeV;
00093 return G4double(Z)*Mh + G4double(A-Z)*Mn - AtomicMassExcess[i]*MeV;
00094 } else {
00095 return 0.0;
00096 }
00097 }
00098
00099
00100
00101 G4double G4NucleiPropertiesTheoreticalTable::GetAtomicMass(G4int Z, G4int A)
00102 {
00103 G4int i=GetIndex(Z, A);
00104 if (i >= 0) {
00105 return AtomicMassExcess[i]*MeV + A*amu_c2;
00106 } else {
00107 return 0.0;
00108 }
00109 }
00110
00111
00112
00113 G4double G4NucleiPropertiesTheoreticalTable::GetNuclearMass(G4int Z, G4int A)
00114 {
00115 G4int i=GetIndex(Z, A);
00116 if (i >= 0) {
00117 return GetAtomicMass(Z,A) - G4double(Z)*electron_mass_c2 + ElectronicBindingEnergy(Z);
00118 } else {
00119 return 0.0;
00120 }
00121 }
00122
00123 G4double G4NucleiPropertiesTheoreticalTable::ElectronicBindingEnergy(G4int Z) {
00124 const G4double ael = 1.433e-5*MeV;
00125 return ael*std::pow(G4double(Z),2.39);
00126 }
00127
00128 G4bool G4NucleiPropertiesTheoreticalTable::IsInTable(G4int Z, G4int A)
00129 {
00130 return (Z <= A && A >= 16 && A <= 339 && Z <= 136 && Z >= 8 && GetIndex(Z, A) >= 0);
00131 }
00132
00133
00134
00135
00136
00137
00138
00139