Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4FissionFragmentGenerator.cc
Go to the documentation of this file.
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/*
27 * File: G4FissionFragmentGenerator.cc
28 * Author: B. Wendt (wendbryc@isu.edu)
29 *
30 * Created on May 11, 2011, 12:04 PM
31 */
32
33#include <iostream>
34#include <vector>
35
36#include "G4Ions.hh"
37#include "globals.hh"
38#include "G4HadFinalState.hh"
39#include "G4Neutron.hh"
40
42#include "G4FFGDefaultValues.hh"
43// Use a few select constant of CLHEP namespace
44using CLHEP::eV;
45using CLHEP::keV;
46using CLHEP::MeV;
47using CLHEP::GeV;
48#include "G4FFGEnumerations.hh"
52#include "G4TableTemplate.hh"
53
56{
57 // Set the default verbosity
58 Verbosity_ = G4FFGDefaultValues::Verbosity;
59
60 // Initialize the class
61 Initialize();
62}
63
66{
67 // Set the verbosity
68 Verbosity_ = Verbosity;
69
70 // Initialize the class
71 Initialize();
72}
73
75Initialize( void )
76{
78
79 // Initialize the class descriptor variables to the default values. These
80 // will be used unless the user redefines them.
81 Isotope_ = G4FFGDefaultValues::Isotope;
82 MetaState_ = G4FFGDefaultValues::MetaState;
83 Cause_ = G4FFGDefaultValues::FissionCause;
84 IncidentEnergy_ = G4FFGDefaultValues::ThermalNeutronEnergy;
85 YieldType_ = G4FFGDefaultValues::YieldType;
86 TernaryProbability_ = G4FFGDefaultValues::TernaryProbability;
87 AlphaProduction_ = G4FFGDefaultValues::AlphaProduction;
88 SamplingScheme_ = G4FFGDefaultValues::SamplingScheme;
89
90 // No data class has been created yet
91 YieldData_ = NULL;
93
95}
96
99{
101
103 G4ThreeVector(0, 0, 0),
104 G4FFGDefaultValues::ThermalNeutronEnergy));
105
106 // Call the overloaded function and generate 1 fission
107 std::vector< G4DynamicParticleVector* > FissionEvent = G4GenerateFission(1, Projectile);
108 G4DynamicParticleVector* Container = FissionEvent[0];
109
111 return Container;
112}
113
115G4GenerateFission( const G4HadProjectile& Projectile )
116{
118
119 // Call the overloaded function and generate 1 fission
120 std::vector< G4DynamicParticleVector* > FissionEvent = G4GenerateFission(1, Projectile);
121 G4DynamicParticleVector* const Container = FissionEvent[0];
122
124 return Container;
125}
126
127const std::vector< G4DynamicParticleVector* > G4FissionFragmentGenerator::
128G4GenerateFission( G4long NumberOfFissions,
129 const G4HadProjectile& Projectile )
130{
132
133
134 //TK Modified 131107
135 //std::vector< G4DynamicParticleVector* > FissionEvents(NumberOfFissions);
136 std::vector< G4DynamicParticleVector* > FissionEvents(0);
137
138 if(Projectile.GetDefinition() == G4Neutron::Neutron())
139 {
141 {
142 // TODO Eliminate potential need for restructuring during run phase
143 //InitializeFissionProductYieldClass();
144 }
145
146 for(G4long i = 0; i < NumberOfFissions; i++)
147 {
148 FissionEvents.push_back(YieldData_->G4GetFission());
149 // FIXME Use particle momentum in balance equation
150 // FissionEvents.push_back(YieldData_->G4GetFission(Projectile.Get4Momentum()));
151 }
152 } else
153 {
154 FissionEvents.push_back(NULL);
155 }
156
158 return FissionEvents;
159}
160
163{
165
167 {
168 // TODO Eliminate potential need for restructuring during run phase
169 //InitializeFissionProductYieldClass();
170 }
171
173
175 return Product;
176}
177
180{
182
184 return AlphaProduction_;
185}
186
189{
191
193 return TernaryProbability_;
194}
195
197G4GetCause( void )
198{
200
202 return Cause_;
203}
204
207{
209
211 return IncidentEnergy_;
212}
213
215G4GetIsotope( void )
216{
218
220 return Isotope_;
221}
222
224G4GetMetaState( void )
225{
227
229 return MetaState_;
230}
231
234{
236
238 return SamplingScheme_;
239}
240
243{
245
247 return YieldType_;
248}
249
252{
253 // Sanity check;
254 A %= 1000;
255 Z %= 1000;
256 M %= 10;
257
258 return (A + Z * 1000) * 10 + M;
259}
260
262G4SetAlphaProduction( G4double WhatAlphaProduction )
263{
265
266 AlphaProduction_ = WhatAlphaProduction;
267 if(YieldData_ != NULL)
268 {
270 }
271
273 {
276
277 G4cout << " -- Alpha production set to " << AlphaProduction_ << G4endl;
278 }
279
281}
282
284G4SetTernaryProbability( G4double WhatTernaryProbability )
285{
287
288 TernaryProbability_ = WhatTernaryProbability;
289 if(YieldData_ != NULL)
290 {
292 }
293
295 {
298
299 G4cout << " -- Ternary fission probability set to " << TernaryProbability_ << G4endl;
300 }
301
303}
304
307{
309
310 G4bool IsValidCause = (WhichCause == G4FFGEnumerations::SPONTANEOUS
311 || WhichCause == G4FFGEnumerations::NEUTRON_INDUCED );
312 G4bool IsSameCause = (Cause_ == WhichCause);
313
314 if(!IsSameCause && IsValidCause)
315 {
316 Cause_ = WhichCause;
318 {
319 IncidentEnergy_ = 0;
320 }
322 }
323
325 {
326 G4String CauseString;
327 switch(WhichCause)
328 {
330 CauseString = "SPONTANEOUS";
331 break;
333 CauseString = "NEUTRON_INDUCED";
334 break;
336 CauseString = "PROTON_INDUCED";
337 break;
339 CauseString = "GAMMA_INDUCED";
340 break;
341 }
342
344 {
347
348 if(IsValidCause)
349 {
350 if(IsSameCause && YieldData_ != NULL)
351 {
352 G4cout << " -- Already set to use " << CauseString << " as the fission cause. Yield data class will not be reconstructed." << G4endl;
353 } else if(YieldData_ == NULL)
354 {
355 G4cout << " -- Yield data class not yet constructed. " << CauseString << " will be applied when it is constructed." << G4endl;
356 }
357 } else
358 {
359 G4cout << " -- Invalid cause of fission" << G4endl;
360 }
361 }
362
364 && IsValidCause)
365 {
368
369 G4cout << " -- Fission cause set to " << CauseString << "." << G4endl;
370 }
371 }
372
374}
375
377G4SetIncidentEnergy( G4double WhatIncidentEnergy )
378{
380
382 {
383 IncidentEnergy_ = WhatIncidentEnergy;
384 if(YieldData_ != NULL)
385 {
387 }
388 }
389
391 {
392 std::ostringstream EnergyString;
393 if(IncidentEnergy_ / GeV > 1)
394 {
395 EnergyString << IncidentEnergy_ / GeV << " GeV";
396 } else if(IncidentEnergy_ / MeV > 1)
397 {
398 EnergyString << IncidentEnergy_ / MeV << " MeV";
399 } else if(IncidentEnergy_ / keV > 1)
400 {
401 EnergyString << IncidentEnergy_ / keV << " keV";
402 } else
403 {
404 EnergyString << IncidentEnergy_ / eV << " eV";
405 }
406
409 {
411 {
414
415 G4cout << " -- Cannot set a non-zero energy for spontaneous fission" << G4endl;
416 } else if(YieldData_ == NULL)
417 {
420
421 G4cout << " -- Yield data class not yet constructed. " << EnergyString.str() << " will be applied when it is constructed." << G4endl;
422
423 }
424 }
425
428 {
431
432 G4cout << " -- Incident neutron energy set to " << EnergyString.str() << "." << G4endl;
433 }
434 }
435
437}
438
440G4SetIsotope( G4int WhichIsotope )
441{
443
444 G4bool IsSameIsotope = (Isotope_ == WhichIsotope);
445
446 if(!IsSameIsotope)
447 {
448 Isotope_ = WhichIsotope;
450 }
451
453 {
455 {
456 if(IsSameIsotope && YieldData_ != NULL)
457 {
460
461 G4cout << " -- Isotope " << Isotope_ << " already in use. Yield data class will not be reconstructed." << G4endl;
462 } else if(YieldData_ == NULL)
463 {
466
467 G4cout << " -- Yield data class not yet constructed. The isotope will be set to " << Isotope_ << " when it is constructed." << G4endl;
468 }
469 }
470
472 {
475
476 G4cout << " -- Isotope set to " << Isotope_ << "." << G4endl;
477 }
478 }
479
481}
482
485{
487
488 G4bool IsValidMetaState = (WhichMetaState >= G4FFGEnumerations::MetaStateFirst
489 && WhichMetaState <= G4FFGEnumerations::MetaStateLast);
490 G4bool IsSameMetaState = (MetaState_ == WhichMetaState);
491
492 if(!IsSameMetaState && IsValidMetaState)
493 {
494 MetaState_ = WhichMetaState;
496 }
497
499 {
500 G4String MetaName;
501 switch(MetaState_)
502 {
504 MetaName = "GROUND_STATE";
505 break;
506
508 MetaName = "META_1";
509 break;
510
512 MetaName = "META_2";
513 break;
514 }
515
517 {
520
521 std::ostringstream Temp;
522 if(IsValidMetaState)
523 {
524 if(IsSameMetaState && YieldData_ != NULL)
525 {
526 G4cout << " -- Already set to use " << MetaName << " as the metastable state. Yield data class will not be reconstructed" << G4endl;
527 } else if(YieldData_ == NULL)
528 {
529 G4cout << " -- Yield data class not yet constructed. " << MetaName << " will be applied when it is constructed." << G4endl;
530 }
531 } else
532 {
533 G4cout << " -- Invalid metastable state." << G4endl;
534 }
535 }
536
538 && IsValidMetaState)
539 {
542
543 G4cout << " -- Metastable state set to " << MetaName << "." << G4endl;
544 }
545 }
546
548}
549
550void G4FissionFragmentGenerator
551::G4SetSamplingScheme(G4FFGEnumerations::FissionSamplingScheme NewScheme)
552{
554
555 G4bool IsValidScheme = (NewScheme >= G4FFGEnumerations::FissionSamplingSchemeFirst
556 && NewScheme <= G4FFGEnumerations::FissionSamplingSchemeLast);
557 G4bool IsSameScheme = (NewScheme == SamplingScheme_);
558
559 if(!IsSameScheme && IsValidScheme)
560 {
561 SamplingScheme_ = NewScheme;
562 IsReconstructionNeeded_ = TRUE;
563 }
564
565 if(Verbosity_ != G4FFGEnumerations::SILENT)
566 {
567 G4String SchemeString;
568 switch(SamplingScheme_)
569 {
571 SchemeString = "NORMAL";
572 break;
573
575 SchemeString = "LIGHT_FRAGMENT";
576 break;
577
578 default:
579 SchemeString = "UNSUPPORTED";
580 break;
581 }
582
583 if(Verbosity_ & G4FFGEnumerations::WARNING)
584 {
587
588 if(IsValidScheme)
589 {
590 if(IsSameScheme && YieldData_ != NULL)
591 {
592 G4cout << " -- Already set to use " << SchemeString << " as the sampling scheme. Yield data class will not be reconstructed." << G4endl;
593 } else if(YieldData_ == NULL)
594 {
595 G4cout << " -- Yield data class not yet constructed. " << SchemeString << " will be applied when it is constructed." << G4endl;
596 }
597 } else
598 {
599 G4cout << " -- Invalid sampling scheme." << G4endl;
600 }
601 }
602
603 if((Verbosity_ & G4FFGEnumerations::UPDATES)
604 && IsValidScheme)
605 {
608
609 G4cout << " -- Sampling scheme set to " << SchemeString << "." << G4endl;
610 }
611 }
612
614}
615
618{
620
621 G4bool IsValidYieldType = (WhichYieldType == G4FFGEnumerations::INDEPENDENT
622 ||WhichYieldType == G4FFGEnumerations::CUMULATIVE);
623 G4bool IsSameYieldType = (YieldType_ == WhichYieldType);
624
625 if(!IsSameYieldType && IsValidYieldType)
626 {
627 YieldType_ = WhichYieldType;
629 }
630
632 {
633 G4String YieldString;
634 switch((int)YieldType_)
635 {
637 YieldString = "INDEPENDENT";
638 break;
639
641 YieldString = "SPONTANEOUS";
642 break;
643
644 default:
645 YieldString = "UNSUPPORTED";
646 break;
647 }
648
650 {
653
654 if(IsValidYieldType)
655 {
656
657 if(IsSameYieldType && YieldData_ != NULL)
658 {
659 } else if(YieldData_ == NULL)
660 {
661 G4cout << " -- Yield data class not yet constructed. Yield type " << YieldString << " will be applied when it is constructed." << G4endl;
662 }
663 } else
664 {
665 G4cout << " -- Invalid yield type." << G4endl;
666 }
667 }
668
670 && IsValidYieldType)
671 {
674
675 G4cout << " -- Yield type set to " << YieldString << G4endl;
676 }
677 }
678
680}
681
683G4SetVerbosity(G4int Verbosity)
684{
686
687 Verbosity_ = Verbosity;
688
689 if(YieldData_ != NULL)
690 {
692 }
693
695}
696
698InitializeFissionProductYieldClass( std::istringstream& dataStream )
699{
701
702 if(YieldData_ != NULL)
703 {
704 delete YieldData_;
705
707 {
710
711 G4cout << " -- Old yield data class deleted." << G4endl;
712 }
713 }
714
715 try
716 {
718 {
721 Cause_,
724 dataStream);
725 } else
726 {
729 Cause_,
732 dataStream);
733 }
734
736 {
739 }
740
742 {
745
746 G4cout << " -- Yield data class constructed with defined values." << G4endl;
747 }
748 } catch (std::exception& e)
749 {
750 YieldData_ = NULL;
751 }
752
754
756 return YieldData_;
757}
758
761{
763
764 delete YieldData_;
765
767}
std::vector< G4DynamicParticle * > G4DynamicParticleVector
#define G4FFG_FUNCTIONLEAVE__
#define G4FFG_FUNCTIONENTER__
#define G4FFG_LOCATION__
#define G4FFG_SPACING__
#define M(row, col)
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
long G4long
Definition: G4Types.hh:87
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4FFGEnumerations::MetaState MetaState_
G4FFGEnumerations::YieldType G4GetYieldType(void)
bool InitializeFissionProductYieldClass(std::istringstream &dataFile)
G4FFGEnumerations::MetaState G4GetMetaState(void)
G4FFGEnumerations::YieldType YieldType_
G4FFGEnumerations::FissionSamplingScheme G4GetSamplingScheme(void)
void G4SetYieldType(G4FFGEnumerations::YieldType WhichYieldType)
G4DynamicParticleVector * G4GenerateFission(void)
G4FissionProductYieldDist * YieldData_
G4FFGEnumerations::FissionCause Cause_
void G4SetMetaState(G4FFGEnumerations::MetaState WhichMetaState)
void G4SetAlphaProduction(G4double WhatAlphaProduction)
G4FFGEnumerations::FissionSamplingScheme SamplingScheme_
static G4int G4MakeIsotopeCode(G4int Z, G4int A, G4int M)
G4FFGEnumerations::FissionCause G4GetCause(void)
void G4SetCause(G4FFGEnumerations::FissionCause WhichCause)
void G4SetTernaryProbability(G4double WhatTernaryProbability)
void G4SetIsotope(G4int WhichIsotope)
void G4SetIncidentEnergy(G4double WhatIncidentEnergy)
void G4SetVerbosity(G4int WhatVerbosity)
void G4SetEnergy(G4double WhatIncidentEnergy)
G4DynamicParticleVector * G4GetFission(void)
void G4SetAlphaProduction(G4double WhatAlphaProduction)
void G4SetVerbosity(G4int WhatVerbosity)
void G4SetTernaryProbability(G4double TernaryProbability)
const G4ParticleDefinition * GetDefinition() const
Definition: G4Ions.hh:52
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
#define TRUE
Definition: globals.hh:41
#define FALSE
Definition: globals.hh:38