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
G4ParticleHPFissionFS.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// neutron_hp -- source file
27// J.P. Wellisch, Nov-1996
28// A prototype of the low energy neutron transport model.
29//
30// 12-Apr-06 fix in delayed neutron and photon emission without FS data by T. Koi
31// 07-Sep-11 M. Kelsey -- Follow change to G4HadFinalState interface
32// P. Arce, June-2014 Conversion neutron_hp to particle_hp
33//
34
35#include "G4Exp.hh"
38#include "G4Nucleus.hh"
41#include "G4IonTable.hh"
43
44
46 {
47 secID = G4PhysicsModelCatalog::GetModelID( "model_NeutronHPFission" );
48 hasXsec = false;
49 produceFissionFragments = false;
50 }
51
53 G4String& dirName, G4String& aFSType,
54 G4ParticleDefinition* projectile )
55 {
56 theFS.Init(A, Z, M, dirName, aFSType, projectile);
57 theFC.Init(A, Z, M, dirName, aFSType, projectile);
58 theSC.Init(A, Z, M, dirName, aFSType, projectile);
59 theTC.Init(A, Z, M, dirName, aFSType, projectile);
60 theLC.Init(A, Z, M, dirName, aFSType, projectile);
61
62 theFF.Init(A, Z, M, dirName, aFSType, projectile);
63 if ( G4ParticleHPManager::GetInstance()->GetProduceFissionFragments()
64 && theFF.HasFSData() )
65 {
66 G4cout << "Fission fragment production is now activated in HP package for "
67 << "Z = " << (G4int)Z
68 << ", A = " << (G4int)A
69 << G4endl;
70 G4cout << "As currently modeled this option precludes production of delayed neutrons from fission fragments." << G4endl;
71 produceFissionFragments = true;
72 }
73 }
74
76 {
77 // Because it may change by UI command
79
80 // prepare neutron
81 if ( theResult.Get() == NULL ) theResult.Put( new G4HadFinalState );
82 theResult.Get()->Clear();
83 G4double eKinetic = theTrack.GetKineticEnergy();
84 const G4HadProjectile *incidentParticle = &theTrack;
85 G4ReactionProduct theNeutron( const_cast<G4ParticleDefinition *>(incidentParticle->GetDefinition()) );
86 theNeutron.SetMomentum( incidentParticle->Get4Momentum().vect() );
87 theNeutron.SetKineticEnergy( eKinetic );
88
89 // prepare target
90 G4Nucleus aNucleus;
91 G4ReactionProduct theTarget;
92 G4double targetMass = theFS.GetMass();
93 G4ThreeVector neuVelo = (1./incidentParticle->GetDefinition()->GetPDGMass())*theNeutron.GetMomentum();
94 theTarget = aNucleus.GetBiasedThermalNucleus( targetMass, neuVelo, theTrack.GetMaterial()->GetTemperature());
95 theTarget.SetDefinition( G4IonTable::GetIonTable()->GetIon( G4int(theBaseZ), G4int(theBaseA) , 0.0 ) ); //TESTPHP
96
97 // set neutron and target in the FS classes
98 theFS.SetNeutronRP(theNeutron);
99 theFS.SetTarget(theTarget);
100 theFC.SetNeutronRP(theNeutron);
101 theFC.SetTarget(theTarget);
102 theSC.SetNeutronRP(theNeutron);
103 theSC.SetTarget(theTarget);
104 theTC.SetNeutronRP(theNeutron);
105 theTC.SetTarget(theTarget);
106 theLC.SetNeutronRP(theNeutron);
107 theLC.SetTarget(theTarget);
108 theFF.SetNeutronRP(theNeutron);
109 theFF.SetTarget(theTarget);
110
111 // boost to target rest system and decide on channel.
112 theNeutron.Lorentz(theNeutron, -1*theTarget);
113
114 // dice the photons
115
116 G4DynamicParticleVector * thePhotons;
117 thePhotons = theFS.GetPhotons();
118
119 // select the FS in charge
120
121 eKinetic = theNeutron.GetKineticEnergy();
122 G4double xSec[4];
123 xSec[0] = theFC.GetXsec(eKinetic);
124 xSec[1] = xSec[0]+theSC.GetXsec(eKinetic);
125 xSec[2] = xSec[1]+theTC.GetXsec(eKinetic);
126 xSec[3] = xSec[2]+theLC.GetXsec(eKinetic);
127 G4int it;
128 unsigned int i=0;
129 G4double random = G4UniformRand();
130 if(xSec[3]==0)
131 {
132 it=-1;
133 }
134 else
135 {
136 for(i=0; i<4; i++)
137 {
138 it =i;
139 if(random<xSec[i]/xSec[3]) break;
140 }
141 }
142
143 // dice neutron multiplicities, energies and momenta in Lab. @@
144 // no energy conservation on an event-to-event basis. we rely on the data to be ok. @@
145 // also for mean, we rely on the consistancy of the data. @@
146
147 G4int Prompt=0, delayed=0, all=0;
148 G4DynamicParticleVector * theNeutrons = 0;
149 switch(it) // check logic, and ask, if partials can be assumed to correspond to individual particles @@@
150 {
151 case 0:
152 theFS.SampleNeutronMult(all, Prompt, delayed, eKinetic, 0);
153 if(Prompt==0&&delayed==0) Prompt=all;
154 theNeutrons = theFC.ApplyYourself(Prompt); // delayed always in FS
155 // take 'U' into account explicitly (see 5.4) in the sampling of energy @@@@
156 break;
157 case 1:
158 theFS.SampleNeutronMult(all, Prompt, delayed, eKinetic, 1);
159 if(Prompt==0&&delayed==0) Prompt=all;
160 theNeutrons = theSC.ApplyYourself(Prompt); // delayed always in FS, off done in FSFissionFS
161 break;
162 case 2:
163 theFS.SampleNeutronMult(all, Prompt, delayed, eKinetic, 2);
164 if(Prompt==0&&delayed==0) Prompt=all;
165 theNeutrons = theTC.ApplyYourself(Prompt); // delayed always in FS
166 break;
167 case 3:
168 theFS.SampleNeutronMult(all, Prompt, delayed, eKinetic, 3);
169 if(Prompt==0&&delayed==0) Prompt=all;
170 theNeutrons = theLC.ApplyYourself(Prompt); // delayed always in FS
171 break;
172 default:
173 break;
174 }
175
176 // dice delayed neutrons and photons, and fallback
177 // for Prompt in case channel had no FS data; add all paricles to FS.
178
179 if ( produceFissionFragments ) delayed=0;
180
181 G4double * theDecayConstants;
182
183 if( theNeutrons != 0)
184 {
185 theDecayConstants = new G4double[delayed];
186 for(i=0; i<theNeutrons->size(); ++i)
187 {
188 theResult.Get()->AddSecondary(theNeutrons->operator[](i), secID);
189 }
190 delete theNeutrons;
191
192 G4DynamicParticleVector * theDelayed = 0;
193 theDelayed = theFS.ApplyYourself(0, delayed, theDecayConstants);
194 for(i=0; i<theDelayed->size(); i++)
195 {
196 G4double time = -G4Log(G4UniformRand())/theDecayConstants[i];
197 time += theTrack.GetGlobalTime();
198 theResult.Get()->AddSecondary(theDelayed->operator[](i), secID);
200 }
201 delete theDelayed;
202 }
203 else
204 {
205 theFS.SampleNeutronMult(all, Prompt, delayed, eKinetic, 0);
206 theDecayConstants = new G4double[delayed];
207 if(Prompt==0&&delayed==0) Prompt=all;
208 theNeutrons = theFS.ApplyYourself(Prompt, delayed, theDecayConstants);
209 G4int i0;
210 for(i0=0; i0<Prompt; ++i0)
211 {
212 theResult.Get()->AddSecondary(theNeutrons->operator[](i0), secID);
213 }
214
215 for(i0=Prompt; i0<Prompt+delayed; ++i0)
216 {
217 // Protect against the very rare case of division by zero
218 G4double time = 0.0;
219 if ( theDecayConstants[i0-Prompt] > 1.0e-30 ) {
220 time = -G4Log(G4UniformRand())/theDecayConstants[i0-Prompt];
221 } else {
223 ed << " theDecayConstants[i0-Prompt]=" << theDecayConstants[i0-Prompt]
224 << " -> cannot sample the time : set it to 0.0 !" << G4endl;
225 G4Exception( "G4ParticleHPFissionFS::ApplyYourself ", "HAD_FISSIONHP_001", JustWarning, ed );
226 }
227
228 time += theTrack.GetGlobalTime();
229 theResult.Get()->AddSecondary(theNeutrons->operator[](i0), secID);
231 }
232 delete theNeutrons;
233 }
234 delete [] theDecayConstants;
235
236 std::size_t nPhotons = 0;
237 if(thePhotons!=0)
238 {
239 nPhotons = thePhotons->size();
240 for(i=0; i<nPhotons; ++i)
241 {
242 theResult.Get()->AddSecondary(thePhotons->operator[](i), secID);
243 }
244 delete thePhotons;
245 }
246
247 // finally deal with local energy depositions.
248
249 G4ParticleHPFissionERelease * theERelease = theFS.GetEnergyRelease();
250 G4double eDepByFragments = theERelease->GetFragmentKinetic();
251 //theResult.SetLocalEnergyDeposit(eDepByFragments);
252 if ( !produceFissionFragments ) theResult.Get()->SetLocalEnergyDeposit(eDepByFragments);
253 // clean up the primary neutron
255
256 if ( produceFissionFragments )
257 {
258 G4int fragA_Z=0;
259 G4int fragA_A=0;
260 G4int fragA_M=0;
261 // System is traget rest!
262 theFF.GetAFissionFragment(eKinetic,fragA_Z,fragA_A,fragA_M);
263 G4int fragB_Z=(G4int)theBaseZ-fragA_Z;
264 G4int fragB_A=(G4int)theBaseA-fragA_A-Prompt;
265
267 //Excitation energy is not taken into account
268 G4ParticleDefinition* pdA = pt->GetIon( fragA_Z , fragA_A , 0.0 );
269 G4ParticleDefinition* pdB = pt->GetIon( fragB_Z , fragB_A , 0.0 );
270
271 //Isotropic Distribution
272 G4double phi = twopi*G4UniformRand();
273 // Bug #1745 DHW G4double theta = pi*G4UniformRand();
274 G4double costheta = 2.*G4UniformRand()-1.;
275 G4double theta = std::acos(costheta);
276 G4double sinth = std::sin(theta);
277 G4ThreeVector direction(sinth*std::cos(phi), sinth*std::sin(phi), costheta);
278
279 // Just use ENDF value for this
280 G4double ER = eDepByFragments;
281 G4double ma = pdA->GetPDGMass();
282 G4double mb = pdB->GetPDGMass();
283 G4double EA = ER / ( 1 + ma/mb);
284 G4double EB = ER - EA;
285 G4DynamicParticle* dpA = new G4DynamicParticle( pdA , direction , EA);
286 G4DynamicParticle* dpB = new G4DynamicParticle( pdB , -direction , EB);
289 }
290
291 return theResult.Get();
292 }
std::vector< G4DynamicParticle * > G4DynamicParticleVector
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
@ stopAndKill
G4double G4Log(G4double x)
Definition: G4Log.hh:227
#define M(row, col)
double G4double
Definition: G4Types.hh:83
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
#define G4UniformRand()
Definition: Randomize.hh:52
Hep3Vector vect() const
value_type & Get() const
Definition: G4Cache.hh:315
void Put(const value_type &val) const
Definition: G4Cache.hh:321
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
std::size_t GetNumberOfSecondaries() const
G4HadSecondary * GetSecondary(size_t i)
void SetLocalEnergyDeposit(G4double aE)
const G4Material * GetMaterial() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetGlobalTime() const
void SetTime(G4double aT)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
Definition: G4IonTable.cc:522
static G4IonTable * GetIonTable()
Definition: G4IonTable.cc:170
G4double GetTemperature() const
Definition: G4Material.hh:177
G4ReactionProduct GetBiasedThermalNucleus(G4double aMass, G4ThreeVector aVelocity, G4double temp=-1) const
Definition: G4Nucleus.cc:118
G4DynamicParticleVector * ApplyYourself(G4int nNeutrons)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *projectile)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *)
void GetAFissionFragment(G4double, G4int &, G4int &, G4int &)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *)
G4DynamicParticleVector * ApplyYourself(G4int Prompt, G4int delayed, G4double *decayconst)
void SampleNeutronMult(G4int &all, G4int &Prompt, G4int &delayed, G4double energy, G4int off)
G4ParticleHPFissionERelease * GetEnergyRelease()
void SetNeutronRP(const G4ReactionProduct &aNeutron)
void SetTarget(const G4ReactionProduct &aTarget)
G4DynamicParticleVector * GetPhotons()
G4Cache< G4HadFinalState * > theResult
virtual G4double GetXsec(G4double anEnergy)
void SetTarget(const G4ReactionProduct &aTarget)
void SetNeutronRP(const G4ReactionProduct &aNeutron)
G4HadFinalState * ApplyYourself(const G4HadProjectile &theTrack)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *projectile)
G4DynamicParticleVector * ApplyYourself(G4int NNeutrons)
static G4ParticleHPManager * GetInstance()
G4DynamicParticleVector * ApplyYourself(G4int NNeutrons)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *projectile)
G4DynamicParticleVector * ApplyYourself(G4int NNeutrons)
void Init(G4double A, G4double Z, G4int M, G4String &dirName, G4String &aFSType, G4ParticleDefinition *projectile)
static G4int GetModelID(const G4int modelIndex)
void SetMomentum(const G4double x, const G4double y, const G4double z)
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
void Lorentz(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetKineticEnergy(const G4double en)