Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4LENDModel.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// Class Description
27// Final state production model for a LEND (Low Energy Nuclear Data)
28// LEND is Geant4 interface for GIDI (General Interaction Data Interface)
29// which gives a discription of nuclear and atomic reactions, such as
30// Binary collision cross sections
31// Particle number multiplicity distributions of reaction products
32// Energy and angular distributions of reaction products
33// Derived calculational constants
34// GIDI is developped at Lawrence Livermore National Laboratory
35// Class Description - End
36
37// 071025 First implementation done by T. Koi (SLAC/SCCS)
38// 101118 Name modifications for release T. Koi (SLAC/PPA)
39
40#include "G4LENDModel.hh"
42#include "G4SystemOfUnits.hh"
43#include "G4NistManager.hh"
45
46double MyRNG(void*) { return G4Random::getTheEngine()->flat(); }
47
49 :G4HadronicInteraction( name ), secID(-1)
50{
51
52 proj = NULL; //will be set in an inherited class
53
54 SetMinEnergy( 0.*eV );
55 SetMaxEnergy( 20.*MeV );
56
57 //default_evaluation = "endl99";
58 //default_evaluation = "ENDF.B-VII.0";
59 default_evaluation = "ENDF/BVII.1";
60
61 allow_nat = false;
62 allow_any = false;
63
65
67}
68
70{
71 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
72 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
73 {
74 delete it->second;
75 }
76}
77
78
80{
81
82 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
83 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
84 {
85 delete it->second;
86 }
87 usedTarget_map.clear();
88
90
91}
92
93
94
96{
97
99
100 std::size_t numberOfElements = G4Element::GetNumberOfElements();
101 static const G4ElementTable* theElementTable = G4Element::GetElementTable();
102
103 for ( std::size_t i = 0 ; i < numberOfElements ; ++i )
104 {
105
106 const G4Element* anElement = (*theElementTable)[i];
107 G4int numberOfIsotope = (G4int)anElement->GetNumberOfIsotopes();
108
109 if ( numberOfIsotope > 0 )
110 {
111 // User Defined Abundances
112 for ( G4int i_iso = 0 ; i_iso < numberOfIsotope ; ++i_iso )
113 {
114 G4int iZ = anElement->GetIsotope( i_iso )->GetZ();
115 G4int iA = anElement->GetIsotope( i_iso )->GetN();
116 G4int iIsomer = anElement->GetIsotope( i_iso )->Getm();
117
118 G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( proj , default_evaluation , iZ , iA , iIsomer );
119 if ( allow_nat == true ) aTarget->AllowNat();
120 if ( allow_any == true ) aTarget->AllowAny();
121 usedTarget_map.insert( std::pair< G4int , G4LENDUsedTarget* > ( lend_manager->GetNucleusEncoding( iZ , iA , iIsomer ) , aTarget ) );
122 }
123 }
124 else
125 {
126 // Natural Abundances
128 G4int iZ = int ( anElement->GetZ() );
129 //G4cout << nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) ) << G4endl;
130 G4int numberOfNistIso = nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) );
131
132 for ( G4int ii = 0 ; ii < numberOfNistIso ; ii++ )
133 {
134 //G4cout << nistElementBuild->GetIsotopeAbundance( iZ , nistElementBuild->GetNistFirstIsotopeN( iZ ) + i ) << G4endl;
135 if ( nistElementBuild->GetIsotopeAbundance( iZ , nistElementBuild->GetNistFirstIsotopeN( iZ ) + ii ) > 0 )
136 {
137 G4int iMass = nistElementBuild->GetNistFirstIsotopeN( iZ ) + ii;
138 //G4cout << iZ << " " << nistElementBuild->GetNistFirstIsotopeN( iZ ) + i << " " << nistElementBuild->GetIsotopeAbundance ( iZ , iMass ) << G4endl;
139 G4int iIsomer = 0;
140
141 G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( proj , default_evaluation , iZ , iMass );
142 if ( allow_nat == true ) aTarget->AllowNat();
143 if ( allow_any == true ) aTarget->AllowAny();
144 usedTarget_map.insert( std::pair< G4int , G4LENDUsedTarget* > ( lend_manager->GetNucleusEncoding( iZ , iMass , iIsomer ) , aTarget ) );
145
146 }
147
148 }
149
150 }
151 }
152
154}
155
156
157
158#include "G4IonTable.hh"
159
161{
162
163 G4double temp = aTrack.GetMaterial()->GetTemperature();
164
165 //G4int iZ = int ( aTarg.GetZ() );
166 //G4int iA = int ( aTarg.GetN() );
167 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this)
168 G4int iZ = aTarg.GetZ_asInt();
169 G4int iA = aTarg.GetA_asInt();
170 G4int iM = 0;
171 if ( aTarg.GetIsotope() != NULL ) {
172 iM = aTarg.GetIsotope()->Getm();
173 }
174
175 G4double ke = aTrack.GetKineticEnergy();
176
177 G4HadFinalState* theResult = new G4HadFinalState();
178
179 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA , iM ) )->second->GetTarget();
180
181 G4double aMu = aTarget->getElasticFinalState( ke*MeV, temp, NULL, NULL );
182
183 G4double phi = twopi*G4UniformRand();
184 G4double theta = std::acos( aMu );
185 //G4double sinth = std::sin( theta );
186
187 G4ReactionProduct theNeutron( aTrack.GetDefinition() );
188 theNeutron.SetMomentum( aTrack.Get4Momentum().vect() );
189 theNeutron.SetKineticEnergy( ke );
190
191 G4ParticleDefinition* pd = G4IonTable::GetIonTable()->GetIon( iZ , iA , iM );
192 G4ReactionProduct theTarget( pd );
193
194 G4double mass = pd->GetPDGMass();
195
196// add Thermal motion
197 G4double kT = k_Boltzmann*temp;
198 G4ThreeVector v ( G4RandGauss::shoot() * std::sqrt( kT*mass )
199 , G4RandGauss::shoot() * std::sqrt( kT*mass )
200 , G4RandGauss::shoot() * std::sqrt( kT*mass ) );
201
202 theTarget.SetMomentum( v );
203
204
205 G4ThreeVector the3Neutron = theNeutron.GetMomentum();
206 G4double nEnergy = theNeutron.GetTotalEnergy();
207 G4ThreeVector the3Target = theTarget.GetMomentum();
208 G4double tEnergy = theTarget.GetTotalEnergy();
209 G4ReactionProduct theCMS;
210 G4double totE = nEnergy+tEnergy;
211 G4ThreeVector the3CMS = the3Target+the3Neutron;
212 theCMS.SetMomentum(the3CMS);
213 G4double cmsMom = std::sqrt(the3CMS*the3CMS);
214 G4double sqrts = std::sqrt((totE-cmsMom)*(totE+cmsMom));
215 theCMS.SetMass(sqrts);
216 theCMS.SetTotalEnergy(totE);
217
218 theNeutron.Lorentz(theNeutron, theCMS);
219 theTarget.Lorentz(theTarget, theCMS);
220 G4double en = theNeutron.GetTotalMomentum(); // already in CMS.
221 G4ThreeVector cms3Mom=theNeutron.GetMomentum(); // for neutron direction in CMS
222 G4double cms_theta=cms3Mom.theta();
223 G4double cms_phi=cms3Mom.phi();
224 G4ThreeVector tempVector;
225 tempVector.setX(std::cos(theta)*std::sin(cms_theta)*std::cos(cms_phi)
226 +std::sin(theta)*std::cos(phi)*std::cos(cms_theta)*std::cos(cms_phi)
227 -std::sin(theta)*std::sin(phi)*std::sin(cms_phi) );
228 tempVector.setY(std::cos(theta)*std::sin(cms_theta)*std::sin(cms_phi)
229 +std::sin(theta)*std::cos(phi)*std::cos(cms_theta)*std::sin(cms_phi)
230 +std::sin(theta)*std::sin(phi)*std::cos(cms_phi) );
231 tempVector.setZ(std::cos(theta)*std::cos(cms_theta)
232 -std::sin(theta)*std::cos(phi)*std::sin(cms_theta) );
233 tempVector *= en;
234 theNeutron.SetMomentum(tempVector);
235 theTarget.SetMomentum(-tempVector);
236 G4double tP = theTarget.GetTotalMomentum();
237 G4double tM = theTarget.GetMass();
238 theTarget.SetTotalEnergy(std::sqrt((tP+tM)*(tP+tM)-2.*tP*tM));
239 theNeutron.Lorentz(theNeutron, -1.*theCMS);
240 theTarget.Lorentz(theTarget, -1.*theCMS);
241
242 theResult->SetEnergyChange(theNeutron.GetKineticEnergy());
243 theResult->SetMomentumChange(theNeutron.GetMomentum().unit());
244 G4DynamicParticle* theRecoil = new G4DynamicParticle;
245
246 theRecoil->SetDefinition( G4IonTable::GetIonTable()->GetIon( iZ , iA , iM , iZ ) );
247 theRecoil->SetMomentum( theTarget.GetMomentum() );
248
249 theResult->AddSecondary( theRecoil );
250
251 return theResult;
252
253}
254
256 if ( lend_manager->GetVerboseLevel() >= 1 ) {
257 G4String message;
258 message = "Produce unchanged final state is requested in ";
259 message += this->GetModelName();
260 message += ". Cross section and model likely have an inconsistency.";
261 G4Exception( "G4LENDModel::returnUnchanged(,)" , "LENDModel-01" , JustWarning ,
262 message );
263 }
264 theResult->SetEnergyChange( aTrack.GetKineticEnergy() );
265 theResult->SetMomentumChange( aTrack.Get4Momentum().getV().unit() );
266 return theResult;
267}
268
270 G4GIDI_target* target = NULL;
271 if ( usedTarget_map.find( nuclear_code ) != usedTarget_map.end() ) {
272 target = usedTarget_map.find( nuclear_code )->second->GetTarget();
273 }
274 return target;
275}
276
278
279 if ( lend_manager->GetVerboseLevel() >= 1 || force ) {
280 if ( usedTarget_map.size() == 0 ) create_used_target_map();
281 G4cout << "Dumping UsedTarget of " << GetModelName() << " for " << proj->GetParticleName() << G4endl;
282 G4cout << "Requested Evaluation, Z , A -> Actual Evaluation, Z , A(0=Nat) " << G4endl;
283 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
284 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ ) {
285 G4cout
286 << " " << it->second->GetWantedEvaluation()
287 << ", " << it->second->GetWantedZ()
288 << ", " << it->second->GetWantedA()
289 << " -> " << it->second->GetActualEvaluation()
290 << ", " << it->second->GetActualZ()
291 << ", " << it->second->GetActualA()
292 << G4endl;
293 }
294 }
295}
std::vector< G4Element * > G4ElementTable
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
double MyRNG(void *)
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector unit() const
double phi() const
double theta() const
void setY(double)
void setZ(double)
void setX(double)
Hep3Vector getV() const
Hep3Vector vect() const
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetMomentum(const G4ThreeVector &momentum)
static G4ElementTable * GetElementTable()
Definition G4Element.cc:389
G4double GetZ() const
Definition G4Element.hh:119
static size_t GetNumberOfElements()
Definition G4Element.cc:393
const G4Isotope * GetIsotope(G4int iso) const
Definition G4Element.hh:151
size_t GetNumberOfIsotopes() const
Definition G4Element.hh:143
double getElasticFinalState(double e_in, double temperature, double(*rng)(void *), void *rngState)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
void SetEnergyChange(G4double anEnergy)
void SetMomentumChange(const G4ThreeVector &aV)
const G4Material * GetMaterial() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
void SetMinEnergy(G4double anEnergy)
const G4String & GetModelName() const
void SetMaxEnergy(const G4double anEnergy)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4IonTable * GetIonTable()
G4int GetZ() const
Definition G4Isotope.hh:80
G4int Getm() const
Definition G4Isotope.hh:89
G4int GetN() const
Definition G4Isotope.hh:83
G4bool RequestChangeOfVerboseLevel(G4int)
G4int GetNucleusEncoding(G4int iZ, G4int iA, G4int iM)
G4NistElementBuilder * GetNistElementBuilder()
static G4LENDManager * GetInstance()
G4int GetVerboseLevel()
std::map< G4int, G4LENDUsedTarget * > usedTarget_map
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &aTargetNucleus)
G4LENDManager * lend_manager
void DumpLENDTargetInfo(G4bool force=false)
G4LENDModel(G4String name="LENDModel")
void recreate_used_target_map()
void create_used_target_map()
G4HadFinalState * returnUnchanged(const G4HadProjectile &aTrack, G4HadFinalState *theResult)
G4ParticleDefinition * proj
G4GIDI_target * get_target_from_map(G4int nuclear_code)
G4double GetTemperature() const
G4int GetNumberOfNistIsotopes(G4int Z) const
G4double GetIsotopeAbundance(G4int Z, G4int N) const
G4int GetNistFirstIsotopeN(G4int Z) const
G4int GetA_asInt() const
Definition G4Nucleus.hh:99
G4int GetZ_asInt() const
Definition G4Nucleus.hh:105
const G4Isotope * GetIsotope()
Definition G4Nucleus.hh:111
const G4String & GetParticleName() const
static G4int GetModelID(const G4int modelIndex)
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
G4double GetTotalMomentum() const
G4double GetKineticEnergy() const
G4double GetTotalEnergy() const
G4ThreeVector GetMomentum() const
void Lorentz(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
void SetKineticEnergy(const G4double en)
G4double GetMass() const
void SetMass(const G4double mas)