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 // 070523 bug fix for G4FPE_DEBUG on by A. How 30 // 070523 bug fix for G4FPE_DEBUG on by A. Howard ( and T. Koi) 31 // 08-08-06 delete unnecessary and harmed decl 31 // 08-08-06 delete unnecessary and harmed declaration; Bug Report[857] 32 // 32 // 33 // P. Arce, June-2014 Conversion neutron_hp to 33 // P. Arce, June-2014 Conversion neutron_hp to particle_hp 34 // 34 // 35 #include "G4ParticleHPFission.hh" 35 #include "G4ParticleHPFission.hh" 36 36 37 #include "G4ParticleHPFissionFS.hh" 37 #include "G4ParticleHPFissionFS.hh" 38 #include "G4ParticleHPManager.hh" 38 #include "G4ParticleHPManager.hh" 39 #include "G4ParticleHPThermalBoost.hh" 39 #include "G4ParticleHPThermalBoost.hh" 40 #include "G4SystemOfUnits.hh" 40 #include "G4SystemOfUnits.hh" 41 #include "G4Threading.hh" 41 #include "G4Threading.hh" 42 42 43 G4ParticleHPFission::G4ParticleHPFission() : G 43 G4ParticleHPFission::G4ParticleHPFission() : G4HadronicInteraction("NeutronHPFission") 44 { 44 { 45 SetMinEnergy(0.0); 45 SetMinEnergy(0.0); 46 SetMaxEnergy(20. * MeV); 46 SetMaxEnergy(20. * MeV); 47 } 47 } 48 48 49 G4ParticleHPFission::~G4ParticleHPFission() 49 G4ParticleHPFission::~G4ParticleHPFission() 50 { 50 { 51 // Vector is shared, only master deletes it 51 // Vector is shared, only master deletes it 52 // delete [] theFission; 52 // delete [] theFission; 53 if (!G4Threading::IsMasterThread()) { 53 if (!G4Threading::IsMasterThread()) { 54 if (theFission != nullptr) { 54 if (theFission != nullptr) { 55 for (auto it = theFission->cbegin(); it 55 for (auto it = theFission->cbegin(); it != theFission->cend(); ++it) { 56 delete *it; 56 delete *it; 57 } 57 } 58 theFission->clear(); 58 theFission->clear(); 59 } 59 } 60 } 60 } 61 } 61 } 62 62 63 G4HadFinalState* G4ParticleHPFission::ApplyYou 63 G4HadFinalState* G4ParticleHPFission::ApplyYourself(const G4HadProjectile& aTrack, 64 64 G4Nucleus& aNucleus) 65 { 65 { 66 G4ParticleHPManager::GetInstance()->OpenReac 66 G4ParticleHPManager::GetInstance()->OpenReactionWhiteBoard(); 67 const G4Material* theMaterial = aTrack.GetMa 67 const G4Material* theMaterial = aTrack.GetMaterial(); 68 auto n = (G4int)theMaterial->GetNumberOfElem 68 auto n = (G4int)theMaterial->GetNumberOfElements(); 69 std::size_t index = theMaterial->GetElement( 69 std::size_t index = theMaterial->GetElement(0)->GetIndex(); 70 if (n != 1) { 70 if (n != 1) { 71 auto xSec = new G4double[n]; 71 auto xSec = new G4double[n]; 72 G4double sum = 0; 72 G4double sum = 0; 73 G4int i; 73 G4int i; 74 const G4double* NumAtomsPerVolume = theMat 74 const G4double* NumAtomsPerVolume = theMaterial->GetVecNbOfAtomsPerVolume(); 75 G4double rWeight; 75 G4double rWeight; 76 G4ParticleHPThermalBoost aThermalE; 76 G4ParticleHPThermalBoost aThermalE; 77 for (i = 0; i < n; ++i) { 77 for (i = 0; i < n; ++i) { 78 index = theMaterial->GetElement(i)->GetI 78 index = theMaterial->GetElement(i)->GetIndex(); 79 rWeight = NumAtomsPerVolume[i]; 79 rWeight = NumAtomsPerVolume[i]; 80 xSec[i] = ((*theFission)[index]) 80 xSec[i] = ((*theFission)[index]) 81 ->GetXsec(aThermalE.GetTherm 81 ->GetXsec(aThermalE.GetThermalEnergy(aTrack, theMaterial->GetElement(i), 82 82 theMaterial->GetTemperature())); 83 xSec[i] *= rWeight; 83 xSec[i] *= rWeight; 84 sum += xSec[i]; 84 sum += xSec[i]; 85 } 85 } 86 G4double random = G4UniformRand(); 86 G4double random = G4UniformRand(); 87 G4double running = 0; 87 G4double running = 0; 88 for (i = 0; i < n; ++i) { 88 for (i = 0; i < n; ++i) { 89 running += xSec[i]; 89 running += xSec[i]; 90 index = theMaterial->GetElement(i)->GetI 90 index = theMaterial->GetElement(i)->GetIndex(); 91 // if(random<=running/sum) break; 91 // if(random<=running/sum) break; 92 if (sum == 0 || random <= running / sum) 92 if (sum == 0 || random <= running / sum) break; 93 } 93 } 94 delete[] xSec; 94 delete[] xSec; 95 } 95 } 96 // return theFission[index].ApplyYourself(aT 96 // return theFission[index].ApplyYourself(aTrack); //-2:Marker for Fission 97 G4HadFinalState* result = ((*theFission)[ind 97 G4HadFinalState* result = ((*theFission)[index])->ApplyYourself(aTrack, -2); 98 98 99 // Overwrite target parameters 99 // Overwrite target parameters 100 aNucleus.SetParameters(G4ParticleHPManager:: 100 aNucleus.SetParameters(G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA(), 101 G4ParticleHPManager:: 101 G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargZ()); 102 const G4Element* target_element = (*G4Elemen 102 const G4Element* target_element = (*G4Element::GetElementTable())[index]; 103 const G4Isotope* target_isotope = nullptr; 103 const G4Isotope* target_isotope = nullptr; 104 auto iele = (G4int)target_element->GetNumber 104 auto iele = (G4int)target_element->GetNumberOfIsotopes(); 105 for (G4int j = 0; j != iele; ++j) { 105 for (G4int j = 0; j != iele; ++j) { 106 target_isotope = target_element->GetIsotop 106 target_isotope = target_element->GetIsotope(j); 107 if (target_isotope->GetN() 107 if (target_isotope->GetN() 108 == G4ParticleHPManager::GetInstance()- 108 == G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA()) 109 break; 109 break; 110 } 110 } 111 aNucleus.SetIsotope(target_isotope); 111 aNucleus.SetIsotope(target_isotope); 112 112 113 G4ParticleHPManager::GetInstance()->CloseRea 113 G4ParticleHPManager::GetInstance()->CloseReactionWhiteBoard(); 114 return result; 114 return result; 115 } 115 } 116 116 117 const std::pair<G4double, G4double> G4Particle 117 const std::pair<G4double, G4double> G4ParticleHPFission::GetFatalEnergyCheckLevels() const 118 { 118 { 119 // max energy non-conservation is mass of he 119 // max energy non-conservation is mass of heavy nucleus 120 return std::pair<G4double, G4double>(10.0 * 120 return std::pair<G4double, G4double>(10.0 * perCent, 350.0 * CLHEP::GeV); 121 } 121 } 122 122 123 G4int G4ParticleHPFission::GetVerboseLevel() c 123 G4int G4ParticleHPFission::GetVerboseLevel() const 124 { 124 { 125 return G4ParticleHPManager::GetInstance()->G 125 return G4ParticleHPManager::GetInstance()->GetVerboseLevel(); 126 } 126 } 127 127 128 void G4ParticleHPFission::SetVerboseLevel(G4in 128 void G4ParticleHPFission::SetVerboseLevel(G4int newValue) 129 { 129 { 130 G4ParticleHPManager::GetInstance()->SetVerbo 130 G4ParticleHPManager::GetInstance()->SetVerboseLevel(newValue); 131 } 131 } 132 132 133 void G4ParticleHPFission::BuildPhysicsTable(co 133 void G4ParticleHPFission::BuildPhysicsTable(const G4ParticleDefinition&) 134 { 134 { 135 G4ParticleHPManager* hpmanager = G4ParticleH 135 G4ParticleHPManager* hpmanager = G4ParticleHPManager::GetInstance(); 136 136 137 theFission = hpmanager->GetFissionFinalState 137 theFission = hpmanager->GetFissionFinalStates(); 138 138 139 if (G4Threading::IsMasterThread()) { 139 if (G4Threading::IsMasterThread()) { 140 if (theFission == nullptr) theFission = ne 140 if (theFission == nullptr) theFission = new std::vector<G4ParticleHPChannel*>; 141 141 142 if (numEle == (G4int)G4Element::GetNumberO 142 if (numEle == (G4int)G4Element::GetNumberOfElements()) return; 143 143 144 if (theFission->size() == G4Element::GetNu 144 if (theFission->size() == G4Element::GetNumberOfElements()) { 145 numEle = (G4int)G4Element::GetNumberOfEl 145 numEle = (G4int)G4Element::GetNumberOfElements(); 146 return; 146 return; 147 } 147 } 148 148 149 if (G4FindDataDir("G4NEUTRONHPDATA") == nu 149 if (G4FindDataDir("G4NEUTRONHPDATA") == nullptr) 150 throw G4HadronicException( 150 throw G4HadronicException( 151 __FILE__, __LINE__, 151 __FILE__, __LINE__, 152 "Please setenv G4NEUTRONHPDATA to poin 152 "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files."); 153 dirName = G4FindDataDir("G4NEUTRONHPDATA") 153 dirName = G4FindDataDir("G4NEUTRONHPDATA"); 154 G4String tString = "/Fission"; 154 G4String tString = "/Fission"; 155 dirName = dirName + tString; 155 dirName = dirName + tString; 156 156 157 for (G4int i = numEle; i < (G4int)G4Elemen 157 for (G4int i = numEle; i < (G4int)G4Element::GetNumberOfElements(); ++i) { 158 theFission->push_back(new G4ParticleHPCh 158 theFission->push_back(new G4ParticleHPChannel); 159 if ((*(G4Element::GetElementTable()))[i] 159 if ((*(G4Element::GetElementTable()))[i]->GetZ() > 87) { // TK modified for ENDF-VII 160 ((*theFission)[i])->Init((*(G4Element: 160 ((*theFission)[i])->Init((*(G4Element::GetElementTable()))[i], dirName); 161 ((*theFission)[i])->Register(new G4Par 161 ((*theFission)[i])->Register(new G4ParticleHPFissionFS); 162 } 162 } 163 } 163 } 164 hpmanager->RegisterFissionFinalStates(theF 164 hpmanager->RegisterFissionFinalStates(theFission); 165 } 165 } 166 numEle = (G4int)G4Element::GetNumberOfElemen 166 numEle = (G4int)G4Element::GetNumberOfElements(); 167 } 167 } 168 168 169 void G4ParticleHPFission::ModelDescription(std 169 void G4ParticleHPFission::ModelDescription(std::ostream& outFile) const 170 { 170 { 171 outFile << "High Precision model based on Ev 171 outFile << "High Precision model based on Evaluated Nuclear Data Files (ENDF)\n" 172 << "for induced fission reaction of 172 << "for induced fission reaction of neutrons below 20MeV\n"; 173 } 173 } 174 174