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 #include "G4ParticleHPMessenger.hh" 27 28 #include "G4HadronicParameters.hh" 29 #include "G4ParticleHPManager.hh" 30 #include "G4SystemOfUnits.hh" 31 #include "G4UIcmdWithABool.hh" 32 #include "G4UIcmdWithADouble.hh" 33 #include "G4UIcmdWithADoubleAndUnit.hh" 34 #include "G4UIcmdWithAString.hh" 35 #include "G4UIcmdWithAnInteger.hh" 36 #include "G4UIcommand.hh" 37 #include "G4UIdirectory.hh" 38 #include "G4UIparameter.hh" 39 #include "G4UnitsTable.hh" 40 41 G4ParticleHPMessenger::G4ParticleHPMessenger(G4ParticleHPManager* man) : manager(man) 42 { 43 ParticleHPDir = new G4UIdirectory("/process/had/particle_hp/"); 44 ParticleHPDir->SetGuidance("UI commands of ParticleHP"); 45 46 PhotoEvaCmd = new G4UIcmdWithAString("/process/had/particle_hp/use_photo_evaporation", this); 47 PhotoEvaCmd->SetGuidance( 48 " Force the use of the Photon Evaporation model, instead of the neutron capture final state " 49 "data."); 50 PhotoEvaCmd->SetParameterName("choice", false); 51 PhotoEvaCmd->SetCandidates("true false"); 52 PhotoEvaCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 53 54 SkipMissingCmd = new G4UIcmdWithAString("/process/had/particle_hp/skip_missing_isotopes", this); 55 SkipMissingCmd->SetGuidance( 56 "Use only exact isotope data files, instead of allowing nearby isotope files to be used."); 57 SkipMissingCmd->SetGuidance( 58 "In this case if the exact file is not available, the cross section will be set to zero."); 59 SkipMissingCmd->SetParameterName("choice", false); 60 SkipMissingCmd->SetCandidates("true false"); 61 SkipMissingCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 62 63 NeglectDopplerCmd = 64 new G4UIcmdWithAString("/process/had/particle_hp/neglect_Doppler_broadening", this); 65 NeglectDopplerCmd->SetGuidance( 66 "Switch off the Doppler broadening due to the thermal motion of the target nucleus."); 67 NeglectDopplerCmd->SetGuidance("This option provides a significant CPU performance advantage."); 68 NeglectDopplerCmd->SetParameterName("choice", false); 69 NeglectDopplerCmd->SetCandidates("true false"); 70 NeglectDopplerCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 71 72 DoNotAdjustFSCmd = 73 new G4UIcmdWithAString("/process/had/particle_hp/do_not_adjust_final_state", this); 74 DoNotAdjustFSCmd->SetGuidance("Disable to adjust final state for getting better conservation."); 75 DoNotAdjustFSCmd->SetParameterName("choice", false); 76 DoNotAdjustFSCmd->SetCandidates("true false"); 77 DoNotAdjustFSCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 78 79 ProduceFissionFragementCmd = 80 new G4UIcmdWithAString("/process/had/particle_hp/produce_fission_fragment", this); 81 ProduceFissionFragementCmd->SetGuidance("Enable to generate fission fragments."); 82 ProduceFissionFragementCmd->SetParameterName("choice", false); 83 ProduceFissionFragementCmd->SetCandidates("true false"); 84 ProduceFissionFragementCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 85 86 WendtFissionModelCmd = 87 new G4UIcmdWithAString("/process/had/particle_hp/use_Wendt_fission_model", this); 88 WendtFissionModelCmd->SetGuidance("Enable use of Wendt fission model."); 89 WendtFissionModelCmd->SetParameterName("choice", false); 90 WendtFissionModelCmd->SetCandidates("true false"); 91 WendtFissionModelCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 92 93 NRESP71Cmd = new G4UIcmdWithAString("/process/had/particle_hp/use_NRESP71_model", this); 94 NRESP71Cmd->SetGuidance("Enable to use NRESP71 model for n on C reaction"); 95 NRESP71Cmd->SetParameterName("choice", false); 96 NRESP71Cmd->SetCandidates("true false"); 97 NRESP71Cmd->AvailableForStates(G4State_PreInit, G4State_Idle); 98 99 VerboseCmd = new G4UIcmdWithAnInteger("/process/had/particle_hp/verbose", this); 100 VerboseCmd->SetGuidance("Set Verbose level of ParticleHP package"); 101 VerboseCmd->SetParameterName("verbose_level", true); 102 VerboseCmd->SetDefaultValue(1); 103 VerboseCmd->SetRange("verbose_level >=0"); 104 VerboseCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 105 106 UseDBRCCmd = new G4UIcmdWithABool("/process/had/particle_hp/use_DBRC", this); 107 UseDBRCCmd->SetGuidance("Enable use of Doppler Broadening Rejection Correction algorithm."); 108 UseDBRCCmd->SetDefaultValue(false); 109 UseDBRCCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 110 111 MaxEnergySVTCmd = new G4UIcmdWithADoubleAndUnit("/process/had/particle_hp/SVT_E_max", this); 112 MaxEnergySVTCmd->SetGuidance("Energy threshold under which the SVT method is applied."); 113 MaxEnergySVTCmd->SetGuidance("The default is 400. kT."); 114 MaxEnergySVTCmd->SetParameterName("MaxEnergySVT", false); 115 MaxEnergySVTCmd->SetRange("MaxEnergySVT>=0."); 116 MaxEnergySVTCmd->SetUnitCategory("Energy"); 117 MaxEnergySVTCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 118 119 MinADBRCCmd = new G4UIcmdWithADouble("/process/had/particle_hp/DBRC_A_min", this); 120 MinADBRCCmd->SetGuidance("Atomic mass in neutron mass above which the DBRC is applied."); 121 MinADBRCCmd->SetGuidance("The default is A=200."); 122 MinADBRCCmd->SetParameterName("MinASVT", false); 123 MinADBRCCmd->SetRange("MinASVT>=0."); 124 MinADBRCCmd->SetDefaultValue(200); 125 MinADBRCCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 126 127 MinEnergyDBRCCmd = new G4UIcmdWithADoubleAndUnit("/process/had/particle_hp/DBRC_E_min", this); 128 MinEnergyDBRCCmd->SetGuidance( 129 "Energy threshold under which the DBRC method is not applied and only the SVT is used."); 130 MinEnergyDBRCCmd->SetGuidance("The default value is 0.1 eV."); 131 MinEnergyDBRCCmd->SetParameterName("MinEnergyDBRC", false); 132 MinEnergyDBRCCmd->SetRange("MinEnergyDBRC>0."); 133 MinEnergyDBRCCmd->SetUnitCategory("Energy"); 134 MinEnergyDBRCCmd->SetDefaultValue(0.1 * CLHEP::eV); 135 MinEnergyDBRCCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 136 137 MaxEnergyDBRCCmd = new G4UIcmdWithADoubleAndUnit("/process/had/particle_hp/DBRC_E_max", this); 138 MaxEnergyDBRCCmd->SetGuidance("Energy threshold under which the DBRC method is applied."); 139 MaxEnergyDBRCCmd->SetGuidance("The default value is 210. eV."); 140 MaxEnergyDBRCCmd->SetParameterName("MaxEnergyDBRC", false); 141 MaxEnergyDBRCCmd->SetRange("MaxEnergyDBRC>0."); 142 MaxEnergyDBRCCmd->SetUnitCategory("Energy"); 143 MaxEnergyDBRCCmd->SetDefaultValue(210. * CLHEP::eV); 144 MaxEnergyDBRCCmd->AvailableForStates(G4State_PreInit, G4State_Idle); 145 } 146 147 G4ParticleHPMessenger::~G4ParticleHPMessenger() 148 { 149 delete ParticleHPDir; 150 delete PhotoEvaCmd; 151 delete SkipMissingCmd; 152 delete NeglectDopplerCmd; 153 delete DoNotAdjustFSCmd; 154 delete ProduceFissionFragementCmd; 155 delete WendtFissionModelCmd; 156 delete NRESP71Cmd; 157 delete VerboseCmd; 158 delete UseDBRCCmd; 159 delete MaxEnergySVTCmd; 160 delete MinADBRCCmd; 161 delete MinEnergyDBRCCmd; 162 delete MaxEnergyDBRCCmd; 163 } 164 165 void G4ParticleHPMessenger::SetNewValue(G4UIcommand* command, G4String newValue) 166 { 167 G4bool bValue = false; 168 if (newValue == "true") bValue = true; 169 170 if (command == PhotoEvaCmd) { 171 if (manager->GetUseOnlyPhotoEvaporation() != bValue) { 172 manager->SetUseOnlyPhotoEvaporation(bValue); 173 #ifdef G4VERBOSE 174 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 175 G4cout << G4endl 176 << "=== G4ParticleHPMessenger CHANGED PARAMETER UseOnlyPhotoEvaporation TO " 177 << bValue << " ===" << G4endl; 178 } 179 if (bValue) { 180 G4cout << " -> Forced the use of the Photon Evaporation model (instead of the neutron " 181 "capture final state data)" 182 << G4endl; 183 } 184 else { 185 G4cout << " -> Go back to use the default neutron capture final state data !" << G4endl; 186 } 187 #endif 188 } 189 } 190 191 if (command == SkipMissingCmd) { 192 if (manager->GetSkipMissingIsotopes() != bValue) { 193 manager->SetSkipMissingIsotopes(bValue); 194 #ifdef G4VERBOSE 195 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 196 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER SkipMissingIsotopes TO " 197 << bValue << " ===" << G4endl; 198 } 199 if (bValue) { 200 G4cout 201 << " -> Use only exact isotope data files, instead of allowing nearby isotope files " 202 "to be used: \n" 203 << " if the exact file is not available, the cross section will be set to zero !" 204 << G4endl; 205 } 206 else { 207 G4cout << " -> Go back to the default, i.e. use nearby isotope files when the exact " 208 "isotope data files are not found !" 209 << G4endl; 210 } 211 #endif 212 } 213 } 214 215 if (command == NeglectDopplerCmd) { 216 if (manager->GetNeglectDoppler() != bValue) { 217 manager->SetNeglectDoppler(bValue); 218 #ifdef G4VERBOSE 219 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 220 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER NeglectDoppler TO " 221 << bValue << " ===" << G4endl; 222 } 223 if (bValue) { 224 G4cout << " -> Switched off the Doppler broadening due to the thermal motion of the " 225 "target nucleus: \n" 226 << " on-the-fly Doppler broadening will be neglected in the cross section " 227 "calculations of \n" 228 << " capture, elastic, fission and inelastic reactions/scatterings of " 229 "neutrons below 20 MeV.\n" 230 << " This option provides a significant CPU performance advantage !" << G4endl; 231 } 232 else { 233 G4cout 234 << " -> Go back to the default, i.e. switch on the Doppler broadening on-the-fly !" 235 << G4endl; 236 } 237 #endif 238 } 239 } 240 241 if (command == DoNotAdjustFSCmd) { 242 if (manager->GetDoNotAdjustFinalState() != bValue) { 243 manager->SetDoNotAdjustFinalState(bValue); 244 #ifdef G4VERBOSE 245 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 246 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER DoNotAdjustFinalState TO " 247 << bValue << " ===" << G4endl; 248 } 249 if (bValue) { 250 G4cout 251 << " -> Disabled the adjustment of the final state for getting better conservation !" 252 << G4endl; 253 } 254 else { 255 G4cout << " -> Go back to the default, i.e. adjust the final state to get better " 256 "conservation !" 257 << G4endl; 258 } 259 #endif 260 } 261 } 262 263 if (command == ProduceFissionFragementCmd) { 264 if (manager->GetProduceFissionFragments() != bValue) { 265 manager->SetProduceFissionFragments(bValue); 266 #ifdef G4VERBOSE 267 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 268 G4cout << G4endl 269 << "=== G4ParticleHPMessenger CHANGED PARAMETER ProduceFissionFragments TO " 270 << bValue << " ===" << G4endl; 271 } 272 if (bValue) { 273 G4cout << " -> Enabled the generation of fission fragments !" << G4endl; 274 } 275 else { 276 G4cout << " -> Go back to the default, i.e. do not generate fission fragments !" 277 << G4endl; 278 } 279 #endif 280 } 281 } 282 283 if (command == WendtFissionModelCmd) { 284 if (manager->GetUseWendtFissionModel() != bValue) { 285 manager->SetUseWendtFissionModel(bValue); 286 // Make sure both fission fragment models are not active at same time 287 if (bValue) manager->SetProduceFissionFragments(false); 288 #ifdef G4VERBOSE 289 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 290 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER UseWendtFissionModel TO " 291 << bValue << " ===" << G4endl; 292 } 293 if (bValue) { 294 G4cout << " -> Enabled the use of Wendt fission model !" << G4endl; 295 } 296 else { 297 G4cout << " -> Go back to the default, i.e. do not use the Wendt fission model !" 298 << G4endl; 299 } 300 #endif 301 } 302 } 303 304 if (command == NRESP71Cmd) { 305 if (manager->GetUseNRESP71Model() != bValue) { 306 manager->SetUseNRESP71Model(bValue); 307 #ifdef G4VERBOSE 308 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 309 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER UseNRESP71Model TO " 310 << bValue << " ===" << G4endl; 311 } 312 if (bValue) { 313 G4cout << " -> Enabled the use of NRESP71 model for n on C reaction !" << G4endl; 314 } 315 else { 316 G4cout << " -> Go back to the default, i.e. do not use the NRESP71 model !" << G4endl; 317 } 318 #endif 319 } 320 } 321 322 if (command == VerboseCmd) { 323 G4int verboseLevel = VerboseCmd->ConvertToInt(newValue); 324 if (manager->GetVerboseLevel() != verboseLevel) { 325 manager->SetVerboseLevel(verboseLevel); 326 #ifdef G4VERBOSE 327 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 328 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER VerboseLevel TO " 329 << verboseLevel << " ===" << G4endl; 330 } 331 #endif 332 } 333 } 334 335 if (command == UseDBRCCmd) { 336 bValue = UseDBRCCmd->GetNewBoolValue(newValue); 337 if (manager->GetUseDBRC() != bValue) { 338 manager->SetUseDBRC(bValue); 339 #ifdef G4VERBOSE 340 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 341 G4cout << G4endl << "=== G4ParticleHPMessenger CHANGED PARAMETER UseDBRC TO " << bValue 342 << " ===" << G4endl; 343 } 344 if (bValue) { 345 G4cout << " -> Using the DBRC algorithm!" << G4endl; 346 } 347 else { 348 G4cout << " -> Do not use the DBRC algorithm!" << G4endl; 349 } 350 #endif 351 } 352 } 353 354 if (command == MaxEnergySVTCmd) { 355 G4double energymax = MaxEnergySVTCmd->GetNewDoubleValue(newValue); 356 if (G4HadronicParameters::Instance()->GetNeutronKineticEnergyThresholdForSVT() != energymax) { 357 G4HadronicParameters::Instance()->SetNeutronKineticEnergyThresholdForSVT(energymax); 358 #ifdef G4VERBOSE 359 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 360 G4cout << G4endl 361 << "=== G4ParticleHPMessenger CHANGED PARAMETER for SVT algorithm ===" << G4endl; 362 G4cout << "max energy: " << G4BestUnit(energymax, "Energy") << G4endl; 363 } 364 #endif 365 } 366 } 367 368 if (command == MinADBRCCmd) { 369 G4double Amin = MinADBRCCmd->GetNewDoubleValue(newValue); 370 if (manager->GetMinADBRC() != Amin) { 371 manager->SetMinADBRC(Amin); 372 #ifdef G4VERBOSE 373 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 374 G4cout << G4endl 375 << "=== G4ParticleHPMessenger CHANGED PARAMETER for DBRC algorithm ===" << G4endl; 376 G4cout << "min A: " << Amin << G4endl; 377 } 378 #endif 379 } 380 } 381 382 if (command == MinEnergyDBRCCmd) { 383 G4double energymin = MinEnergyDBRCCmd->GetNewDoubleValue(newValue); 384 if (manager->GetMinEnergyDBRC() != energymin) { 385 manager->SetMinEnergyDBRC(energymin); 386 #ifdef G4VERBOSE 387 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 388 G4cout << G4endl 389 << "=== G4ParticleHPMessenger CHANGED PARAMETER for DBRC algorithm ===" << G4endl; 390 G4cout << "min energy: " << G4BestUnit(energymin, "Energy") << G4endl; 391 } 392 #endif 393 } 394 } 395 396 if (command == MaxEnergyDBRCCmd) { 397 G4double energymax = MaxEnergyDBRCCmd->GetNewDoubleValue(newValue); 398 if (manager->GetMaxEnergyDBRC() != energymax) { 399 manager->SetMaxEnergyDBRC(energymax); 400 #ifdef G4VERBOSE 401 if (G4HadronicParameters::Instance()->GetVerboseLevel() > 0) { 402 G4cout << G4endl 403 << "=== G4ParticleHPMessenger CHANGED PARAMETER for SVT algorithm ===" << G4endl; 404 G4cout << "max energy: " << G4BestUnit(energymax, "Energy") << G4endl; 405 } 406 #endif 407 } 408 } 409 410 } 411