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 // INCL++ intra-nuclear cascade model 27 // Alain Boudard, CEA-Saclay, France 28 // Joseph Cugnon, University of Liege, Belgium 29 // Jean-Christophe David, CEA-Saclay, France 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H 31 // Sylvie Leray, CEA-Saclay, France 32 // Davide Mancusi, CEA-Saclay, France 33 // 34 #define INCLXX_IN_GEANT4_MODE 1 35 36 #include "globals.hh" 37 38 /** \file G4INCLXXInterfaceStore.cc 39 * \brief The G4INCLXXInterfaceStore class imp 40 * 41 * \date 24 May 2012 42 * \author Davide Mancusi 43 */ 44 45 #include "G4INCLXXInterfaceStore.hh" 46 #include "G4INCLXXInterfaceMessenger.hh" 47 #include "G4INCLConfigEnums.hh" 48 #include "G4SystemOfUnits.hh" 49 #include "G4HadronicInteraction.hh" 50 #include "G4HadronicInteractionRegistry.hh" 51 #include "G4INCLXXInterface.hh" 52 #include "G4INCLConfig.hh" 53 #include "G4AblaInterface.hh" 54 #include "G4HadronicParameters.hh" 55 #include <vector> 56 57 G4ThreadLocal G4INCLXXInterfaceStore *G4INCLXX 58 59 G4INCLXXInterfaceStore::G4INCLXXInterfaceStore 60 accurateProjectile(true), 61 theMaxProjMassINCL(18), 62 cascadeMinEnergyPerNucleon(1.*MeV), 63 conservationTolerance(5*MeV), 64 theINCLModel(NULL), 65 theTally(NULL), 66 nWarnings(0), 67 maxWarnings(50) 68 { 69 constructINCLXXVersionName(); 70 theINCLXXInterfaceMessenger = new G4INCLXXIn 71 } 72 73 G4INCLXXInterfaceStore::~G4INCLXXInterfaceStor 74 delete theINCLXXInterfaceMessenger; 75 delete theINCLModel; 76 } 77 78 void G4INCLXXInterfaceStore::DeleteModel() { 79 delete theINCLModel; theINCLModel=NULL; 80 } 81 82 G4INCLXXInterfaceStore *G4INCLXXInterfaceStore 83 if(!theInstance) 84 theInstance = new G4INCLXXInterfaceStore; 85 return theInstance; 86 } 87 88 void G4INCLXXInterfaceStore::DeleteInstance() 89 delete theInstance; 90 theInstance = NULL; 91 } 92 93 G4INCL::INCL *G4INCLXXInterfaceStore::GetINCLM 94 if(!theINCLModel) { 95 G4INCL::Config *aConfig = new G4INCL::Conf 96 theINCLModel = new G4INCL::INCL(aConfig); 97 // ownership of the aConfig object is take 98 } 99 return theINCLModel; 100 } 101 102 void G4INCLXXInterfaceStore::constructINCLXXVe 103 const std::string versionID = G4INCL_VERSION 104 const size_t lastDash = versionID.find_last_ 105 versionName = "INCL++ " + versionID.substr(0 106 } 107 108 const std::string &G4INCLXXInterfaceStore::get 109 return versionName; 110 } 111 112 113 114 void G4INCLXXInterfaceStore::SetAccurateProjec 115 if(accurateProjectile!=b) { 116 // Parameter is changed, emit a big warnin 117 std::stringstream ss; 118 ss << "Switching from " 119 << (accurateProjectile ? "\"accurate pro 120 << " mode." 121 << G4endl 122 << "Do this ONLY if you fully understand 123 EmitBigWarning(ss.str()); 124 } 125 126 // No need to delete the model for this para 127 128 accurateProjectile=b; 129 } 130 131 void G4INCLXXInterfaceStore::SetMaxClusterMass 132 const G4int theMaxClusterMass = theConfig.ge 133 if(theMaxClusterMass!=aMass) { 134 // Parameter is changed, emit a big warnin 135 std::stringstream ss; 136 ss << "Changing maximum cluster mass from 137 << theMaxClusterMass 138 << " to " 139 << aMass 140 << "." 141 << G4endl 142 << "Do this ONLY if you fully understand 143 EmitBigWarning(ss.str()); 144 145 // We must delete the model object to make 146 // parameter 147 DeleteModel(); 148 149 theConfig.setClusterMaxMass(aMass); 150 } 151 } 152 153 154 155 156 G4bool G4INCLXXInterfaceStore::GetAccurateProj 157 158 G4double G4INCLXXInterfaceStore::GetCascadeMin 159 160 G4INCL::Config &G4INCLXXInterfaceStore::GetINC 161 DeleteModel(); // in case the Config is modi 162 return theConfig; 163 } 164 165 G4double G4INCLXXInterfaceStore::GetConservati 166 167 168 169 170 G4int G4INCLXXInterfaceStore::GetMaxProjMassIN 171 172 void G4INCLXXInterfaceStore::EmitWarning(const 173 if(++nWarnings<=maxWarnings) { 174 G4cout << "[INCL++] Warning: " << message 175 if(nWarnings==maxWarnings) { 176 G4cout << "[INCL++] INCL++ has already e 177 } 178 } 179 } 180 181 void G4INCLXXInterfaceStore::EmitBigWarning(co 182 // Disable the printing when global hadronic 183 // (which can be issued via the UI command " 184 if ( G4HadronicParameters::Instance()->GetVe 185 G4cout 186 << G4endl 187 << "====================================== 188 << G4endl 189 << " INCL+ 190 << G4endl 191 << message 192 << G4endl 193 << "====================================== 194 << G4endl 195 << G4endl; 196 } 197 198 void G4INCLXXInterfaceStore::SetCascadeMinEner 199 if(cascadeMinEnergyPerNucleon!=anEnergy) { 200 // Parameter is changed, emit a big warnin 201 std::stringstream ss; 202 ss << "Changing minimim cascade energy fro 203 << cascadeMinEnergyPerNucleon / MeV 204 << " to " 205 << anEnergy / MeV 206 << " MeV." 207 << G4endl 208 << "Do this ONLY if you fully understand 209 EmitBigWarning(ss.str()); 210 } 211 212 // No need to delete the model object 213 214 cascadeMinEnergyPerNucleon=anEnergy; 215 } 216 217 void G4INCLXXInterfaceStore::SetConservationTo 218 conservationTolerance = aTolerance; 219 } 220 221 G4INCLXXVInterfaceTally *G4INCLXXInterfaceStor 222 223 void G4INCLXXInterfaceStore::SetTally(G4INCLXX 224 225 void G4INCLXXInterfaceStore::SetINCLPhysics(co 226 if(option == "default") { 227 theConfig.init(); 228 } else if(option == "incl42") { 229 const G4String message = "Changing INCL++ 230 EmitBigWarning(message); 231 232 theConfig.setPotentialType(G4INCL::Constan 233 theConfig.setPionPotential(false); 234 theConfig.setLocalEnergyBBType(G4INCL::Nev 235 theConfig.setLocalEnergyPiType(G4INCL::Nev 236 theConfig.setBackToSpectator(false); 237 theConfig.setClusterAlgorithm(G4INCL::NoCl 238 theConfig.setCoulombType(G4INCL::NoCoulomb 239 // UseRealMasses intentionally left out be 240 // energy conservation 241 // theConfig.setUseRealMasses(false); 242 theConfig.setCrossSectionsType(G4INCL::INC 243 } else { 244 G4Exception("G4INCLXXInterfaceStore::SetIN 245 "SetINCLPhysics argument must 246 ); 247 } 248 } 249 250 void G4INCLXXInterfaceStore::UseAblaDeExcitati 251 // Get hold of pointers to the INCL++ model 252 std::vector<G4HadronicInteraction *> const & 253 ->FindAllModels(G4INCLXXInterfaceStore::Ge 254 for(std::vector<G4HadronicInteraction *>::co 255 iInter!=e; ++iInter) { 256 G4INCLXXInterface *theINCLInterface = dyna 257 if(theINCLInterface) { 258 // Instantiate the ABLA model 259 G4HadronicInteraction *interaction = G4H 260 G4AblaInterface *theAblaInterface = dyna 261 if(!theAblaInterface) 262 theAblaInterface = new G4AblaInterface 263 // Couple INCL++ to ABLA 264 G4cout << "Coupling INCLXX to ABLA" << G 265 theINCLInterface->SetDeExcitation(theAbl 266 } 267 } 268 } 269