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 // 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::the 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::GetInstanc 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::ApplyYo 73 74 { 75 G4HadFinalState* finalState = nullptr; 76 G4int Z = aNucleus.GetZ_asInt(); 77 if ( Z >= ZMAXHPE || Z < 1 ) { return finalS 78 79 G4int A = aNucleus.GetA_asInt(); 80 fManagerHP->OpenReactionWhiteBoard(); 81 fManagerHP->GetReactionWhiteBoard()->SetTarg 82 fManagerHP->GetReactionWhiteBoard()->SetTarg 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, spe 91 // that it is an elastic channel: this is ne 92 finalState = mod->ApplyYourself(aTrack, -1, 93 94 fManagerHP->CloseReactionWhiteBoard(); 95 return finalState; 96 } 97 98 const std::pair<G4double, G4double> G4NeutronH 99 { 100 // max energy non-conservation is mass of he 101 return std::pair<G4double, G4double>(10.0 * 102 } 103 104 void G4NeutronHPElasticVI::BuildPhysicsTable(c 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::GetElem 121 G4int Z = elm->GetZasInt(); 122 if ( 0 < Z && Z < ZMAXHPE && nullptr == th 123 theElastic[Z] = new G4ParticleHPChannel( 124 if ( nullptr == theFS ) { 125 theFS = new G4ParticleHPElasticFS(); 126 dirName = fManagerHP->GetNeutronHPPath 127 } 128 theElastic[Z]->Init(elm, dirName); 129 theElastic[Z]->Register(theFS); 130 } 131 } 132 delete theFS; 133 } 134 135 void G4NeutronHPElasticVI::ModelDescription(st 136 { 137 outFile << "High Precision model based on Ev 138 << " (ENDF) for elastic scattering o 139 } 140