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 // INCL++ intra-nuclear cascade model 26 // INCL++ intra-nuclear cascade model 27 // Alain Boudard, CEA-Saclay, France << 27 // Pekka Kaitaniemi, CEA and Helsinki Institute of Physics 28 // Joseph Cugnon, University of Liege, Belgium << 28 // Davide Mancusi, CEA 29 // Jean-Christophe David, CEA-Saclay, France << 29 // Alain Boudard, CEA 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H << 30 // Sylvie Leray, CEA 31 // Sylvie Leray, CEA-Saclay, France << 31 // Joseph Cugnon, University of Liege 32 // Davide Mancusi, CEA-Saclay, France << 33 // 32 // 34 #define INCLXX_IN_GEANT4_MODE 1 33 #define INCLXX_IN_GEANT4_MODE 1 35 34 36 #include "globals.hh" 35 #include "globals.hh" 37 36 38 /** \file G4INCLXXInterfaceStore.cc 37 /** \file G4INCLXXInterfaceStore.cc 39 * \brief The G4INCLXXInterfaceStore class imp 38 * \brief The G4INCLXXInterfaceStore class implementation 40 * 39 * 41 * \date 24 May 2012 40 * \date 24 May 2012 42 * \author Davide Mancusi 41 * \author Davide Mancusi 43 */ 42 */ 44 43 45 #include "G4INCLXXInterfaceStore.hh" << 46 #include "G4INCLXXInterfaceMessenger.hh" 44 #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 45 57 G4ThreadLocal G4INCLXXInterfaceStore *G4INCLXX << 46 G4INCLXXInterfaceStore *G4INCLXXInterfaceStore::theInstance = NULL; 58 47 59 G4INCLXXInterfaceStore::G4INCLXXInterfaceStore 48 G4INCLXXInterfaceStore::G4INCLXXInterfaceStore() : >> 49 dumpInput(false), 60 accurateProjectile(true), 50 accurateProjectile(true), >> 51 theMaxClusterMassDefault(8), >> 52 theMaxClusterMass(theMaxClusterMassDefault), 61 theMaxProjMassINCL(18), 53 theMaxProjMassINCL(18), 62 cascadeMinEnergyPerNucleon(1.*MeV), << 63 conservationTolerance(5*MeV), << 64 theINCLModel(NULL), 54 theINCLModel(NULL), 65 theTally(NULL), << 66 nWarnings(0), 55 nWarnings(0), 67 maxWarnings(50) 56 maxWarnings(50) 68 { 57 { 69 constructINCLXXVersionName(); << 70 theINCLXXInterfaceMessenger = new G4INCLXXIn 58 theINCLXXInterfaceMessenger = new G4INCLXXInterfaceMessenger(this); 71 } 59 } 72 60 73 G4INCLXXInterfaceStore::~G4INCLXXInterfaceStor 61 G4INCLXXInterfaceStore::~G4INCLXXInterfaceStore() { 74 delete theINCLXXInterfaceMessenger; 62 delete theINCLXXInterfaceMessenger; 75 delete theINCLModel; 63 delete theINCLModel; 76 } 64 } 77 65 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 66 void G4INCLXXInterfaceStore::EmitWarning(const G4String &message) { 173 if(++nWarnings<=maxWarnings) { 67 if(++nWarnings<=maxWarnings) { 174 G4cout << "[INCL++] Warning: " << message 68 G4cout << "[INCL++] Warning: " << message << G4endl; 175 if(nWarnings==maxWarnings) { 69 if(nWarnings==maxWarnings) { 176 G4cout << "[INCL++] INCL++ has already e 70 G4cout << "[INCL++] INCL++ has already emitted " << maxWarnings << " warnings and will emit no more." << G4endl; 177 } 71 } 178 } 72 } 179 } 73 } 180 74 181 void G4INCLXXInterfaceStore::EmitBigWarning(co 75 void G4INCLXXInterfaceStore::EmitBigWarning(const G4String &message) const { 182 // Disable the printing when global hadronic << 183 // (which can be issued via the UI command " << 184 if ( G4HadronicParameters::Instance()->GetVe << 185 G4cout 76 G4cout 186 << G4endl 77 << G4endl 187 << "====================================== 78 << "================================================================================" 188 << G4endl 79 << G4endl 189 << " INCL+ 80 << " INCL++ WARNING " 190 << G4endl 81 << G4endl 191 << message 82 << message 192 << G4endl 83 << G4endl 193 << "====================================== 84 << "================================================================================" 194 << G4endl 85 << G4endl 195 << G4endl; 86 << G4endl; 196 } 87 } 197 88 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 89