Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // Geant4 header : G4NeutronHPElasticVI 27 // Created: 15 October 2023 28 // 29 // Author V.Ivanchenko 30 // 31 32 #include "G4NeutronHPElasticVI.hh" 33 #include "G4ParticleHPChannel.hh" 34 #include "G4ParticleHPElasticFS.hh" 35 #include "G4ParticleHPManager.hh" 36 #include "G4Element.hh" 37 #include "G4Nucleus.hh" 38 #include "G4SystemOfUnits.hh" 39 #include "G4AutoLock.hh" 40 41 G4bool G4NeutronHPElasticVI::fLock = false; 42 G4ParticleHPChannel* G4NeutronHPElasticVI::theElastic[] = {nullptr}; 43 44 namespace 45 { 46 G4Mutex theHPElastic = G4MUTEX_INITIALIZER; 47 } 48 49 G4NeutronHPElasticVI::G4NeutronHPElasticVI() 50 : G4HadronicInteraction("NeutronHPElastic") 51 { 52 SetMaxEnergy(20*CLHEP::MeV); 53 fManagerHP = G4ParticleHPManager::GetInstance(); 54 if ( !fLock ) { 55 fLock = true; 56 fInitializer = true; 57 for ( G4int i=0; i<ZMAXHPE; ++i ) { 58 theElastic[i] = nullptr; 59 } 60 } 61 } 62 63 G4NeutronHPElasticVI::~G4NeutronHPElasticVI() 64 { 65 if ( fInitializer ) { 66 for ( G4int i=0; i<ZMAXHPE; ++i) { 67 delete theElastic[i]; 68 } 69 } 70 } 71 72 G4HadFinalState* G4NeutronHPElasticVI::ApplyYourself(const G4HadProjectile& aTrack, 73 G4Nucleus& aNucleus) 74 { 75 G4HadFinalState* finalState = nullptr; 76 G4int Z = aNucleus.GetZ_asInt(); 77 if ( Z >= ZMAXHPE || Z < 1 ) { return finalState; } 78 79 G4int A = aNucleus.GetA_asInt(); 80 fManagerHP->OpenReactionWhiteBoard(); 81 fManagerHP->GetReactionWhiteBoard()->SetTargZ(Z); 82 fManagerHP->GetReactionWhiteBoard()->SetTargA(A); 83 84 G4ParticleHPChannel* mod = theElastic[Z]; 85 if ( nullptr == mod ) { 86 InitialiseOnFly(); 87 if ( nullptr == mod ) { return finalState; } 88 } 89 90 // The boolean "true", as last argument, specifies to G4ParticleHPChannel::ApplyYourself 91 // that it is an elastic channel: this is needed for the special DBRC treatment. 92 finalState = mod->ApplyYourself(aTrack, -1, true); 93 94 fManagerHP->CloseReactionWhiteBoard(); 95 return finalState; 96 } 97 98 const std::pair<G4double, G4double> G4NeutronHPElasticVI::GetFatalEnergyCheckLevels() const 99 { 100 // max energy non-conservation is mass of heavy nucleus 101 return std::pair<G4double, G4double>(10.0 * perCent, 350.0 * CLHEP::GeV); 102 } 103 104 void G4NeutronHPElasticVI::BuildPhysicsTable(const G4ParticleDefinition&) 105 { 106 if ( fInitializer ) { Initialise(); } 107 } 108 109 void G4NeutronHPElasticVI::InitialiseOnFly() 110 { 111 G4AutoLock l(&theHPElastic); 112 Initialise(); 113 l.unlock(); 114 } 115 116 void G4NeutronHPElasticVI::Initialise() 117 { 118 G4ParticleHPElasticFS* theFS = nullptr; 119 G4String dirName; 120 for (auto const & elm : *(G4Element::GetElementTable())) { 121 G4int Z = elm->GetZasInt(); 122 if ( 0 < Z && Z < ZMAXHPE && nullptr == theElastic[Z] ) { 123 theElastic[Z] = new G4ParticleHPChannel(); 124 if ( nullptr == theFS ) { 125 theFS = new G4ParticleHPElasticFS(); 126 dirName = fManagerHP->GetNeutronHPPath() + "/Elastic"; 127 } 128 theElastic[Z]->Init(elm, dirName); 129 theElastic[Z]->Register(theFS); 130 } 131 } 132 delete theFS; 133 } 134 135 void G4NeutronHPElasticVI::ModelDescription(std::ostream& outFile) const 136 { 137 outFile << "High Precision model based on Evaluated Nuclear Data Files" 138 << " (ENDF) for elastic scattering of neutrons below 20MeV\n"; 139 } 140