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 // neutron_hp -- source file 26 // neutron_hp -- source file 27 // J.P. Wellisch, Nov-1996 27 // J.P. Wellisch, Nov-1996 28 // A prototype of the low energy neutron trans 28 // A prototype of the low energy neutron transport model. 29 // 29 // 30 // 080801 Protect div0 error, when theCompundF 30 // 080801 Protect div0 error, when theCompundFraction is 1 by T. Koi 31 // 31 // 32 // P. Arce, June-2014 Conversion neutron_hp to 32 // P. Arce, June-2014 Conversion neutron_hp to particle_hp 33 // 33 // 34 // June-2019 - E. Mendoza --> perform some cor << 34 #include "G4ParticleHPKallbachMannSyst.hh" 35 << 36 #include "G4ParticleHPKallbachMannSyst.hh" << 37 << 38 #include "G4Exp.hh" << 39 #include "G4HadronicException.hh" << 40 #include "G4Log.hh" << 41 #include "G4Pow.hh" << 42 #include "G4SystemOfUnits.hh" 35 #include "G4SystemOfUnits.hh" 43 #include "Randomize.hh" << 36 #include "Randomize.hh" >> 37 #include "G4HadronicException.hh" 44 38 45 G4double G4ParticleHPKallbachMannSyst::Sample( 39 G4double G4ParticleHPKallbachMannSyst::Sample(G4double anEnergy) 46 { 40 { 47 G4double result = 0.; << 41 G4double result; 48 << 42 49 G4double zero = GetKallbachZero(anEnergy); 43 G4double zero = GetKallbachZero(anEnergy); 50 if (zero > 1) zero = 1.; << 44 if(zero>1) zero=1.; 51 if (zero < -1) zero = -1.; << 45 if(zero<-1)zero=-1.; 52 G4double max = Kallbach(zero, anEnergy); 46 G4double max = Kallbach(zero, anEnergy); 53 G4double upper = Kallbach(1., anEnergy); << 47 double upper = Kallbach(1., anEnergy); 54 G4double lower = Kallbach(-1., anEnergy); << 48 double lower = Kallbach(-1., anEnergy); 55 if (upper > max) max = upper; << 49 if(upper>max) max=upper; 56 if (lower > max) max = lower; << 50 if(lower>max) max=lower; 57 G4double value, random; 51 G4double value, random; 58 << 52 do 59 G4int icounter = 0; << 53 { 60 G4int icounter_max = 1024; << 54 result = 2.*G4UniformRand()-1; 61 do { << 55 value = Kallbach(result, anEnergy)/max; 62 icounter++; << 63 if (icounter > icounter_max) { << 64 G4cout << "Loop-counter exceeded the thr << 65 << __FILE__ << "." << G4endl; << 66 break; << 67 } << 68 result = 2. * G4UniformRand() - 1; << 69 value = Kallbach(result, anEnergy) / max; << 70 random = G4UniformRand(); 56 random = G4UniformRand(); 71 } while (random > value); // Loop checking, << 57 } 72 << 58 while(random>value); >> 59 73 return result; 60 return result; 74 } 61 } 75 62 76 G4double G4ParticleHPKallbachMannSyst::Kallbac 63 G4double G4ParticleHPKallbachMannSyst::Kallbach(G4double cosTh, G4double anEnergy) 77 { 64 { 78 // Kallbach-Mann systematics without normali 65 // Kallbach-Mann systematics without normalization. 79 G4double result; 66 G4double result; 80 G4double theX = A(anEnergy) * cosTh; << 67 G4double theX = A(anEnergy)*cosTh; 81 result = << 68 result = 0.5*(std::exp( theX)*(1+theCompoundFraction) 82 0.5 * (G4Exp(theX) * (1 + theCompoundFract << 69 +std::exp(-theX)*(1-theCompoundFraction)); 83 return result; 70 return result; 84 } 71 } 85 72 86 G4double G4ParticleHPKallbachMannSyst::GetKall 73 G4double G4ParticleHPKallbachMannSyst::GetKallbachZero(G4double anEnergy) 87 { 74 { 88 G4double result; 75 G4double result; 89 // delta 2.0e-16 in not good. << 76 if ( theCompoundFraction == 1 ) 90 // delta 4.0e-16 is OK << 77 { 91 // safety factor of 2 << 78 //G4cout << "080730b Adjust theCompoundFraction " << G4endl; 92 G4double delta = 8.0e-16; << 79 theCompoundFraction *= (1-1.0e-15); 93 if (std::abs(theCompoundFraction - 1) < delt << 80 } 94 theCompoundFraction = 1.0 - delta; << 81 result = 0.5 * (1./A(anEnergy)) * std::log((1-theCompoundFraction)/(1+theCompoundFraction)); 95 } << 96 result = 0.5 * (1. / A(anEnergy)) * G4Log((1 << 97 return result; 82 return result; 98 } 83 } 99 84 100 G4double G4ParticleHPKallbachMannSyst::A(G4dou 85 G4double G4ParticleHPKallbachMannSyst::A(G4double anEnergy) 101 { << 86 { 102 G4double result; 87 G4double result; 103 G4double C1 = 0.04 / MeV; << 88 G4double C1 = 0.04/MeV; 104 G4double C2 = 1.8E-6 / (MeV * MeV * MeV); << 89 G4double C2 = 1.8E-6/(MeV*MeV*MeV); 105 G4double C3 = 6.7E-7 / (MeV * MeV * MeV * Me << 90 G4double C3 = 6.7E-7/(MeV*MeV*MeV*MeV); 106 << 91 107 G4double epsa = anEnergy * theTargetMass / ( << 92 G4double epsa = anEnergy*theTargetMass/(theTargetMass+theIncidentMass); 108 G4int Ac = theTargetA + theProjectileA; << 93 G4int Ac = theTargetA+1; 109 G4int Nc = Ac - theTargetZ - theProjectileZ; << 94 G4int Nc = Ac - theTargetZ; 110 G4int AA = theTargetA; << 95 G4int AA = theTargetA; 111 G4int ZA = theTargetZ; << 96 G4int ZA = theTargetZ; 112 G4double ea = epsa + SeparationEnergy(Ac, Nc << 97 G4double ea = epsa+SeparationEnergy(Ac, Nc, AA, ZA); 113 G4double Et1 = 130 * MeV; << 98 G4double Et1 = 130*MeV; 114 G4double R1 = std::min(ea, Et1); << 99 G4double R1 = std::min(ea, Et1); 115 // theProductEnergy is still in CMS!!! << 100 // theProductEnergy is still in CMS!!! 116 G4double epsb = theProductEnergy * (theProdu << 101 G4double epsb = theProductEnergy*(theProductMass+theResidualMass)/theResidualMass; 117 G4int AB = theResidualA; << 102 G4int AB = theResidualA; 118 G4int ZB = theResidualZ; << 103 G4int ZB = theResidualZ; 119 G4double eb = epsb + SeparationEnergy(Ac, Nc << 104 G4double eb = epsb+SeparationEnergy(Ac, Nc, AB, ZB ); 120 G4double X1 = R1 * eb / ea; << 105 G4double X1 = R1*eb/ea; 121 G4double Et3 = 41 * MeV; << 106 G4double Et3 = 41*MeV; 122 G4double R3 = std::min(ea, Et3); << 107 G4double R3 = std::min(ea, Et3); 123 G4double X3 = R3 * eb / ea; << 108 G4double X3 = R3*eb/ea; 124 << 125 G4double Ma = 1; 109 G4double Ma = 1; 126 G4double mb = 1; << 110 G4double mb(0); 127 if (theProjectileA == 1 || (theProjectileZ = << 111 G4int productA = theTargetA+1-theResidualA; 128 Ma = 1; << 112 G4int productZ = theTargetZ-theResidualZ; 129 } // neutron,proton,deuteron << 113 if(productZ==0) 130 else if (theProjectileA == 4 && theProjectil << 114 { 131 Ma = 0; << 115 mb = 0.5; 132 } // alpha << 133 else if (theProjectileA == 3 && (theProjecti << 134 Ma = 0.5; << 135 } // tritum,He3 : set intermediate value << 136 else { << 137 throw G4HadronicException(__FILE__, __LINE << 138 "Severe error in << 139 } 116 } 140 if (theProductA == 1 && theProductZ == 0) { << 117 else if(productZ==1) 141 mb = 1. / 2.; << 118 { 142 } // neutron << 143 else if (theProductA == 4 && theProductZ == << 144 mb = 2; << 145 } // alpha << 146 else { << 147 mb = 1; 119 mb = 1; 148 } 120 } 149 << 121 else if(productZ==2) 150 result = C1 * X1 + C2 * G4Pow::GetInstance() << 122 { 151 + C3 * Ma * mb * G4Pow::GetInstance << 123 mb = 2; >> 124 if(productA==3) mb=1; >> 125 } >> 126 else >> 127 { >> 128 throw G4HadronicException(__FILE__, __LINE__, "Severe error in the sampling of Kallbach-Mann Systematics"); >> 129 } >> 130 >> 131 result = C1*X1 + C2*std::pow(X1, 3.) + C3*Ma*mb*std::pow(X3, 4.); 152 return result; 132 return result; 153 } 133 } 154 134 155 G4double G4ParticleHPKallbachMannSyst::Separat << 135 G4double G4ParticleHPKallbachMannSyst::SeparationEnergy(G4int Ac, G4int Nc, G4int AA, G4int ZA) 156 << 157 { 136 { 158 G4double result; 137 G4double result; 159 G4int NA = AA - ZA; << 138 G4int NA = AA-ZA; 160 G4int Zc = Ac - Nc; << 139 G4int Zc = Ac-Nc; 161 result = 15.68 * (Ac - AA); << 140 result = 15.68*(Ac-AA); 162 result += -28.07 * ((Nc - Zc) * (Nc - Zc) / << 141 result += -28.07*((Nc-Zc)*(Nc-Zc)/Ac - (NA-ZA)*(NA-ZA)/AA); 163 result += << 142 result += -18.56*(std::pow(G4double(Ac), 2./3.) - std::pow(G4double(AA), 2./3.)); 164 -18.56 * (G4Pow::GetInstance()->A23(G4doub << 143 result += 33.22*((Nc-Zc)*(Nc-Zc)/std::pow(G4double(Ac), 4./3.) - (NA-ZA)*(NA-ZA)/std::pow(G4double(AA), 4./3.)); 165 result += 33.22 << 144 result += -0.717*(Zc*Zc/std::pow(G4double(Ac),1./3.)-ZA*ZA/std::pow(G4double(AA),1./3.)); 166 * ((Nc - Zc) * (Nc - Zc) / G4Pow:: << 145 result += 1.211*(Zc*Zc/Ac-ZA*ZA/AA); 167 - (NA - ZA) * (NA - ZA) / G4Pow << 168 result += -0.717 << 169 * (Zc * Zc / G4Pow::GetInstance()- << 170 - ZA * ZA / G4Pow::GetInstance( << 171 result += 1.211 * (Zc * Zc / (G4double)Ac - << 172 G4double totalBinding(0); 146 G4double totalBinding(0); 173 if (Zbinding == 0 && Abinding == 1) totalBin << 147 G4int productA = theTargetA+1-theResidualA; 174 if (Zbinding == 1 && Abinding == 1) totalBin << 148 G4int productZ = theTargetZ-theResidualZ; 175 if (Zbinding == 1 && Abinding == 2) totalBin << 149 if(productZ==0&&productA==1) totalBinding=0; 176 if (Zbinding == 1 && Abinding == 3) totalBin << 150 if(productZ==1&&productA==1) totalBinding=0; 177 if (Zbinding == 2 && Abinding == 3) totalBin << 151 if(productZ==1&&productA==2) totalBinding=2.22; 178 if (Zbinding == 2 && Abinding == 4) totalBin << 152 if(productZ==1&&productA==3) totalBinding=8.48; >> 153 if(productZ==2&&productA==3) totalBinding=7.72; >> 154 if(productZ==2&&productA==4) totalBinding=28.3; 179 result += -totalBinding; 155 result += -totalBinding; 180 result *= MeV; 156 result *= MeV; 181 return result; 157 return result; 182 } 158 } 183 159