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
G4FissLib.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// This software was developed by Lawrence Livermore National Laboratory.
28//
29// Redistribution and use in source and binary forms, with or without
30// modification, are permitted provided that the following conditions are met:
31//
32// 1. Redistributions of source code must retain the above copyright notice,
33// this list of conditions and the following disclaimer.
34// 2. Redistributions in binary form must reproduce the above copyright notice,
35// this list of conditions and the following disclaimer in the documentation
36// and/or other materials provided with the distribution.
37// 3. The name of the author may not be used to endorse or promote products
38// derived from this software without specific prior written permission.
39//
40// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
41// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
42// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
43// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
45// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
46// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
47// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
49// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50//
51// Copyright (c) 2006 The Regents of the University of California.
52// All rights reserved.
53// UCRL-CODE-224807
54//
55//
56//
57// neutron_hp -- source file
58// J.M. Verbeke, Jan-2007
59// A prototype of the low energy neutron transport model.
60//
61#include "G4FissLib.hh"
62#include "G4SystemOfUnits.hh"
63
65 :xSec(0)
66{
67 SetMinEnergy(0.0);
68 SetMaxEnergy(20.*MeV);
69 if(!G4FindDataDir("G4NEUTRONHPDATA")) {
70 G4cout << "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files." << G4endl;
71 throw G4HadronicException(__FILE__, __LINE__, "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files.");
72 }
73 dirName = G4FindDataDir("G4NEUTRONHPDATA");
74 G4String tString = "/Fission/";
75 dirName = dirName + tString;
77 theFission = new G4ParticleHPChannel[numEle];
78
79 for (G4int i=0; i<numEle; ++i)
80 {
81// G4cout << "G4FissLib::G4FissLib(): element "<< i << " : " << (*(G4Element::GetElementTable()))[i]->GetZ()<< G4endl;
82 if((*(G4Element::GetElementTable()))[i]->GetZ()>89)
83 {
84 theFission[i].Init((*(G4Element::GetElementTable()))[i], dirName);
85 theFission[i].Register(&theLibrary);
86 }
87 }
88}
89
91{
92 delete [] theFission;
93}
94
97{
99
100 const G4Material* theMaterial = aTrack.GetMaterial();
101 std::size_t n = theMaterial->GetNumberOfElements();
102 std::size_t index = theMaterial->GetElement(0)->GetIndex();
103
104 if (n != 1) {
105 xSec = new G4double[n];
106 G4double sum = 0;
107 G4int i;
108 std::size_t imat;
109 const G4double * NumAtomsPerVolume = theMaterial->GetVecNbOfAtomsPerVolume();
110 G4double rWeight;
111 G4ParticleHPThermalBoost aThermalE;
112 for (i = 0; i < (G4int)n; ++i) {
113 imat = theMaterial->GetElement(i)->GetIndex();
114 rWeight = NumAtomsPerVolume[i];
115 xSec[i] = theFission[imat].GetXsec(aThermalE.GetThermalEnergy(aTrack,
116 theMaterial->GetElement(i),
117 theMaterial->GetTemperature()));
118 xSec[i] *= rWeight;
119 sum+=xSec[i];
120 }
121
122 G4double random = G4UniformRand();
123 G4double running = 0;
124 for (i = 0; i < (G4int)n; ++i) {
125 running += xSec[i];
126 index = theMaterial->GetElement(i)->GetIndex();
127 if(random<=running/sum) break;
128 }
129 delete [] xSec;
130 }
131
132 //return theFission[index].ApplyYourself(aTrack);
133 //Overwrite target parameters
134 G4HadFinalState* result = theFission[index].ApplyYourself(aTrack);
136 const G4Element* target_element = (*G4Element::GetElementTable())[index];
137 const G4Isotope* target_isotope=NULL;
138 G4int iele = (G4int)target_element->GetNumberOfIsotopes();
139 for ( G4int j = 0 ; j != iele ; ++j ) {
140 target_isotope=target_element->GetIsotope( j );
141 if ( target_isotope->GetN() == G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA() ) break;
142 }
143 aNucleus.SetIsotope( target_isotope );
145 return result;
146}
147
148const std::pair<G4double, G4double> G4FissLib::GetFatalEnergyCheckLevels() const
149{
150 // max energy non-conservation is mass of heavy nucleus
151 return std::pair<G4double, G4double>(10.0*perCent, 350.0*CLHEP::GeV);
152}
const char * G4FindDataDir(const char *)
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:403
static size_t GetNumberOfElements()
Definition: G4Element.cc:410
const G4Isotope * GetIsotope(G4int iso) const
Definition: G4Element.hh:170
size_t GetIndex() const
Definition: G4Element.hh:182
size_t GetNumberOfIsotopes() const
Definition: G4Element.hh:159
G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &aTargetNucleus)
Definition: G4FissLib.cc:96
~G4FissLib()
Definition: G4FissLib.cc:90
const std::pair< G4double, G4double > GetFatalEnergyCheckLevels() const
Definition: G4FissLib.cc:148
const G4Material * GetMaterial() const
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
G4int GetN() const
Definition: G4Isotope.hh:93
G4double GetTemperature() const
Definition: G4Material.hh:177
const G4Element * GetElement(G4int iel) const
Definition: G4Material.hh:197
size_t GetNumberOfElements() const
Definition: G4Material.hh:181
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:201
void SetParameters(const G4double A, const G4double Z, const G4int numberOfLambdas=0)
Definition: G4Nucleus.cc:307
void SetIsotope(const G4Isotope *iso)
Definition: G4Nucleus.hh:114
G4HadFinalState * ApplyYourself(const G4HadProjectile &theTrack, G4int isoNumber=-1)
void Init(G4Element *theElement, const G4String dirName)
G4bool Register(G4ParticleHPFinalState *theFS)
G4double GetXsec(G4double energy)
static G4ParticleHPManager * GetInstance()
G4ParticleHPReactionWhiteBoard * GetReactionWhiteBoard()
G4double GetThermalEnergy(const G4HadProjectile &aP, const G4Element *anE, G4double aT)