Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // this code implementation is the intellectua 27 // neutron_hp -- source file 28 // J.P. Wellisch, Nov-1996 29 // A prototype of the low energy neutron trans 30 // 31 // By copying, distributing or modifying the P 32 // based on the Program) you indicate your acc 33 // and all its terms. 34 // 35 // 36 // 070523 bug fix for G4FPE_DEBUG on by A. How 37 // 081203 limit maximum trial for creating fin 38 // 39 // P. Arce, June-2014 Conversion neutron_hp to 40 // V. Ivanchenko, July-2023 Basic revision of 41 // 42 #include "G4ParticleHPInelastic.hh" 43 44 #include "G4HadronicParameters.hh" 45 #include "G4ParticleHP2AInelasticFS.hh" 46 #include "G4ParticleHP2N2AInelasticFS.hh" 47 #include "G4ParticleHP2NAInelasticFS.hh" 48 #include "G4ParticleHP2NDInelasticFS.hh" 49 #include "G4ParticleHP2NInelasticFS.hh" 50 #include "G4ParticleHP2NPInelasticFS.hh" 51 #include "G4ParticleHP2PInelasticFS.hh" 52 #include "G4ParticleHP3AInelasticFS.hh" 53 #include "G4ParticleHP3NAInelasticFS.hh" 54 #include "G4ParticleHP3NInelasticFS.hh" 55 #include "G4ParticleHP3NPInelasticFS.hh" 56 #include "G4ParticleHP4NInelasticFS.hh" 57 #include "G4ParticleHPAInelasticFS.hh" 58 #include "G4ParticleHPD2AInelasticFS.hh" 59 #include "G4ParticleHPDAInelasticFS.hh" 60 #include "G4ParticleHPDInelasticFS.hh" 61 #include "G4ParticleHPHe3InelasticFS.hh" 62 #include "G4ParticleHPManager.hh" 63 #include "G4ParticleHPN2AInelasticFS.hh" 64 #include "G4ParticleHPN2PInelasticFS.hh" 65 #include "G4ParticleHPN3AInelasticFS.hh" 66 #include "G4ParticleHPNAInelasticFS.hh" 67 #include "G4ParticleHPND2AInelasticFS.hh" 68 #include "G4ParticleHPNDInelasticFS.hh" 69 #include "G4ParticleHPNHe3InelasticFS.hh" 70 #include "G4ParticleHPNInelasticFS.hh" 71 #include "G4ParticleHPNPAInelasticFS.hh" 72 #include "G4ParticleHPNPInelasticFS.hh" 73 #include "G4ParticleHPNT2AInelasticFS.hh" 74 #include "G4ParticleHPNTInelasticFS.hh" 75 #include "G4ParticleHPNXInelasticFS.hh" 76 #include "G4ParticleHPPAInelasticFS.hh" 77 #include "G4ParticleHPPDInelasticFS.hh" 78 #include "G4ParticleHPPInelasticFS.hh" 79 #include "G4ParticleHPPTInelasticFS.hh" 80 #include "G4ParticleHPT2AInelasticFS.hh" 81 #include "G4ParticleHPTInelasticFS.hh" 82 #include "G4ParticleHPThermalBoost.hh" 83 #include "G4SystemOfUnits.hh" 84 #include "G4AutoLock.hh" 85 86 G4bool G4ParticleHPInelastic::fLock[] = {true, 87 std::vector<G4ParticleHPChannelList*>* 88 G4ParticleHPInelastic::theInelastic[] = {nullp 89 90 namespace 91 { 92 G4Mutex theHPInelastic = G4MUTEX_INITIALIZER 93 } 94 95 G4ParticleHPInelastic::G4ParticleHPInelastic(G 96 : G4HadronicInteraction(name), theProjectile 97 { 98 fManager = G4ParticleHPManager::GetInstance( 99 dirName = fManager->GetParticleHPPath(thePro 100 indexP = fManager->GetPHPIndex(theProjectile 101 102 #ifdef G4VERBOSE 103 if (fManager->GetVerboseLevel() > 1) 104 G4cout << "@@@ G4ParticleHPInelastic insta 105 << p->GetParticleName() << " indexP 106 << "/n data directory " << dirName << 107 #endif 108 } 109 110 G4ParticleHPInelastic::~G4ParticleHPInelastic( 111 { 112 // Vector is shared, only one delete 113 if (isFirst) { 114 ClearData(); 115 } 116 } 117 118 void G4ParticleHPInelastic::ClearData() 119 { 120 if (theInelastic[indexP] != nullptr) { 121 for (auto const& p : *(theInelastic[indexP 122 delete p; 123 } 124 delete theInelastic[indexP]; 125 theInelastic[indexP] = nullptr; 126 } 127 } 128 129 G4HadFinalState* G4ParticleHPInelastic::ApplyY 130 131 { 132 G4ParticleHPManager::GetInstance()->OpenReac 133 const G4Material* theMaterial = aTrack.GetMa 134 auto n = (G4int)theMaterial->GetNumberOfElem 135 auto elm = theMaterial->GetElement(0); 136 std::size_t index = elm->GetIndex(); 137 G4int it = 0; 138 /* 139 G4cout << "G4ParticleHPInelastic::ApplyYours 140 << " indexP=" << indexP << " " 141 << aTrack.GetDefinition()->GetParticl 142 */ 143 if (n != 1) { 144 auto xSec = new G4double[n]; 145 G4double sum = 0; 146 G4int i; 147 const G4double* NumAtomsPerVolume = theMat 148 G4double rWeight; 149 G4double xs; 150 G4ParticleHPThermalBoost aThermalE; 151 for (i = 0; i < n; ++i) { 152 elm = theMaterial->GetElement(i); 153 index = elm->GetIndex(); 154 /* 155 G4cout << "i=" << i << " index=" << ind 156 << " " << (*(theInelastic[indexP]))[in 157 */ 158 rWeight = NumAtomsPerVolume[i]; 159 if (aTrack.GetDefinition() == G4Neutron: 160 xs = (*(theInelastic[indexP]))[index]- 161 theMaterial->GetTemperature 162 } 163 else { 164 xs = (*(theInelastic[indexP]))[index]- 165 } 166 xs *= rWeight; 167 sum += xs; 168 xSec[i] = sum; 169 #ifdef G4VERBOSE 170 if (fManager->GetDEBUG()) 171 G4cout << " G4ParticleHPInelastic XSEC 172 #endif 173 } 174 sum *= G4UniformRand(); 175 for (it = 0; it < n; ++it) { 176 elm = theMaterial->GetElement(it); 177 index = elm->GetIndex(); 178 if (sum <= xSec[it]) break; 179 } 180 delete[] xSec; 181 } 182 183 #ifdef G4VERBOSE 184 if (fManager->GetDEBUG()) 185 G4cout << " G4ParticleHPInelastic: Elem it 186 << elm->GetName() << " index=" << i 187 << " from material " << theMaterial->GetN 188 << G4endl; 189 #endif 190 191 G4HadFinalState* result = 192 (*(theInelastic[indexP]))[index]->ApplyYou 193 194 aNucleus.SetParameters(fManager->GetReaction 195 fManager->GetReaction 196 197 const G4Element* target_element = (*G4Elemen 198 const G4Isotope* target_isotope = nullptr; 199 auto iele = (G4int)target_element->GetNumber 200 for (G4int j = 0; j != iele; ++j) { 201 target_isotope = target_element->GetIsotop 202 if (target_isotope->GetN() == fManager->Ge 203 break; 204 } 205 aNucleus.SetIsotope(target_isotope); 206 207 G4ParticleHPManager::GetInstance()->CloseRea 208 209 return result; 210 } 211 212 const std::pair<G4double, G4double> G4Particle 213 { 214 // max energy non-conservation is mass of he 215 return std::pair<G4double, G4double>(10.0 * 216 } 217 218 void G4ParticleHPInelastic::BuildPhysicsTable( 219 { 220 if (fLock[indexP]) { 221 G4AutoLock l(&theHPInelastic); 222 if (fLock[indexP]) { 223 isFirst = true; 224 fLock[indexP] = false; 225 } 226 l.unlock(); 227 } 228 229 G4int nelm = (G4int)G4Element::GetNumberOfEl 230 G4int n0 = numEle; 231 numEle = nelm; 232 if (!isFirst || nelm == n0) { return; } 233 234 // extra elements should be initialized 235 G4AutoLock l(&theHPInelastic); 236 237 if (nullptr == theInelastic[indexP]) { 238 theInelastic[indexP] = new std::vector<G4P 239 } 240 241 if (fManager->GetVerboseLevel() > 0 && isFir 242 fManager->DumpSetting(); 243 G4cout << "@@@ G4ParticleHPInelastic insta 244 << theProjectile->GetParticleName() << "/ 245 << dirName << G4endl; 246 } 247 248 auto table = G4Element::GetElementTable(); 249 for (G4int i = n0; i < nelm; ++i) { 250 auto clist = new G4ParticleHPChannelList(3 251 theInelastic[indexP]->push_back(clist); 252 clist->Init((*table)[i], dirName, theProje 253 clist->Register(new G4ParticleHPNInelastic 254 clist->Register(new G4ParticleHPNXInelasti 255 clist->Register(new G4ParticleHP2NDInelast 256 clist->Register(new G4ParticleHP2NInelasti 257 clist->Register(new G4ParticleHP3NInelasti 258 clist->Register(new G4ParticleHPNAInelasti 259 clist->Register(new G4ParticleHPN3AInelast 260 clist->Register(new G4ParticleHP2NAInelast 261 clist->Register(new G4ParticleHP3NAInelast 262 clist->Register(new G4ParticleHPNPInelasti 263 clist->Register(new G4ParticleHPN2AInelast 264 clist->Register(new G4ParticleHP2N2AInelas 265 clist->Register(new G4ParticleHPNDInelasti 266 clist->Register(new G4ParticleHPNTInelasti 267 clist->Register(new G4ParticleHPNHe3Inelas 268 clist->Register(new G4ParticleHPND2AInelas 269 clist->Register(new G4ParticleHPNT2AInelas 270 clist->Register(new G4ParticleHP4NInelasti 271 clist->Register(new G4ParticleHP2NPInelast 272 clist->Register(new G4ParticleHP3NPInelast 273 clist->Register(new G4ParticleHPN2PInelast 274 clist->Register(new G4ParticleHPNPAInelast 275 clist->Register(new G4ParticleHPPInelastic 276 clist->Register(new G4ParticleHPDInelastic 277 clist->Register(new G4ParticleHPTInelastic 278 clist->Register(new G4ParticleHPHe3Inelast 279 clist->Register(new G4ParticleHPAInelastic 280 clist->Register(new G4ParticleHP2AInelasti 281 clist->Register(new G4ParticleHP3AInelasti 282 clist->Register(new G4ParticleHP2PInelasti 283 clist->Register(new G4ParticleHPPAInelasti 284 clist->Register(new G4ParticleHPD2AInelast 285 clist->Register(new G4ParticleHPT2AInelast 286 clist->Register(new G4ParticleHPPDInelasti 287 clist->Register(new G4ParticleHPPTInelasti 288 clist->Register(new G4ParticleHPDAInelasti 289 #ifdef G4VERBOSE 290 if (fManager->GetVerboseLevel() > 1) { 291 G4cout << "ParticleHP::Inelastic for " 292 << theProjectile->GetParticleName() << 293 << (*table)[i]->GetName() << G4endl; 294 } 295 #endif 296 } 297 fManager->RegisterInelasticFinalStates( &pro 298 l.unlock(); 299 } 300 301 void G4ParticleHPInelastic::ModelDescription(s 302 { 303 outFile << "High Precision (HP) model for in 304 << theProjectile->GetParticleName() << " b 305 } 306