source: trunk/source/processes/hadronic/cross_sections/src/G4NeutronElasticXS.cc@ 1315

Last change on this file since 1315 was 1315, checked in by garnier, 15 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 6.4 KB
Line 
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// $Id: G4NeutronElasticXS.cc,v 1.4 2010/06/03 11:50:21 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
28//
29// -------------------------------------------------------------------
30//
31// GEANT4 Class file
32//
33//
34// File name: G4NeutronElasticXS
35//
36// Author Ivantchenko, Geant4, 3-Aug-09
37//
38// Modifications:
39//
40
41#include "G4NeutronElasticXS.hh"
42#include "G4Neutron.hh"
43#include "G4DynamicParticle.hh"
44#include "G4Element.hh"
45#include "G4ElementTable.hh"
46#include "G4PhysicsLogVector.hh"
47#include "G4PhysicsVector.hh"
48#include "G4GlauberGribovCrossSection.hh"
49#include "G4NistManager.hh"
50
51#include <iostream>
52#include <fstream>
53#include <sstream>
54using namespace std;
55
56G4NeutronElasticXS::G4NeutronElasticXS()
57{
58 verboseLevel = 0;
59 G4cout << "G4NeutronElasticXS::G4NeutronElasticXS: Initialise " << G4endl;
60 for(G4int i=0; i<93; ++i) {
61 data[i] = 0;
62 coeff[i]= 1.0;
63 }
64 ggXsection = new G4GlauberGribovCrossSection();
65 isInitialized = false;
66}
67
68G4NeutronElasticXS::~G4NeutronElasticXS()
69{
70 for(G4int i=0; i<92; ++i) {
71 delete data[i];
72 }
73}
74
75G4bool
76G4NeutronElasticXS::IsApplicable(const G4DynamicParticle*,
77 const G4Element*)
78{
79 return true;
80}
81
82G4bool
83G4NeutronElasticXS::IsZAApplicable(const G4DynamicParticle*,
84 G4double /*ZZ*/, G4double /*AA*/)
85{
86 return false;
87}
88
89
90G4double
91G4NeutronElasticXS::GetCrossSection(const G4DynamicParticle* aParticle,
92 const G4Element* elm,
93 G4double)
94{
95 G4double xs = 0.0;
96 G4double ekin = aParticle->GetKineticEnergy();
97
98 G4int Z = G4int(elm->GetZ());
99 G4PhysicsVector* pv = data[Z];
100 // G4cout << "G4NeutronElasticXS::GetCrossSection e= " << ekin << " Z= " << Z << G4endl;
101
102 // element was not initialised
103 if(!pv) {
104 Initialise(Z);
105 pv = data[Z];
106 if(!pv) return xs;
107 }
108
109 G4double e1 = pv->Energy(0);
110 if(ekin <= e1) return (*pv)[0];
111
112 G4int n = pv->GetVectorLength() - 1;
113 G4double e2 = pv->Energy(n);
114 if(ekin <= e2) {
115 xs = pv->Value(ekin);
116 } else {
117 ggXsection->GetCrossSection(aParticle, elm);
118 xs = coeff[Z]*ggXsection->GetElasticGlauberGribovXsc();
119 }
120
121 if(verboseLevel > 0){
122 G4cout << "ekin= " << ekin << ", XSinel= " << xs << G4endl;
123 }
124 return xs;
125}
126
127
128void
129G4NeutronElasticXS::BuildPhysicsTable(const G4ParticleDefinition& p)
130{
131 G4cout << "G4NeutronElasticXS::BuildPhysicsTable: " << G4endl;
132 G4cout << p.GetParticleName() << G4endl;
133 if(p.GetParticleName() != "neutron") {
134 return;
135 }
136 if(isInitialized) return;
137 isInitialized = true;
138
139
140 // check environment variable
141 // Build the complete string identifying the file with the data set
142 char* path = getenv("G4NEUTRONXSDATA");
143 if (!path){
144 G4cout << "G4NEUTRONXSDATA environment variable not set" << G4endl;
145 }
146
147 G4DynamicParticle* dynParticle =
148 new G4DynamicParticle(G4Neutron::Neutron(),G4ThreeVector(1,0,0),1);
149
150 // Access to elements
151 const G4ElementTable* theElmTable = G4Element::GetElementTable();
152 size_t numOfElm = G4Element::GetNumberOfElements();
153 if(numOfElm > 0) {
154 for(size_t i=0; i<numOfElm; ++i) {
155 G4int Z = G4int(((*theElmTable)[i])->GetZ());
156 if(Z < 1) Z = 1;
157 else if(Z > 92) Z = 92;
158 //G4cout << "Z= " << Z << G4endl;
159 // Initialisation
160 if(!data[Z]) { Initialise(Z, dynParticle, path); }
161 }
162 }
163 delete dynParticle;
164}
165
166void
167G4NeutronElasticXS::DumpPhysicsTable(const G4ParticleDefinition&)
168{
169}
170
171void
172G4NeutronElasticXS::Initialise(G4int Z, G4DynamicParticle* dp,
173 const char* p)
174{
175 if(data[Z]) return;
176 const char* path = p;
177 if(!p) {
178 // check environment variable
179 // Build the complete string identifying the file with the data set
180 path = getenv("G4NEUTRONXSDATA");
181 if (!path) {
182 if(verboseLevel > 1) {
183 G4cout << "G4NEUTRONXSDATA environment variable not set" << G4endl;
184 }
185 return;
186 }
187 }
188 G4DynamicParticle* dynParticle = dp;
189 if(!dp) {
190 dynParticle =
191 new G4DynamicParticle(G4Neutron::Neutron(),G4ThreeVector(1,0,0),1);
192 }
193
194 const G4Element* Elem =
195 G4NistManager::Instance()->FindOrBuildElement(Z, true);
196
197 // upload data from file
198 data[Z] = new G4PhysicsLogVector();
199
200 std::ostringstream ost;
201 ost << path << "/elast" << Z ;
202 std::ifstream filein(ost.str().c_str());
203 if (!(filein)) {
204 G4cout << " file " << ost << " is not opened" << G4endl;
205 }else{
206 if(verboseLevel > 1) {
207 G4cout << ost << " is opened" << G4endl;
208 }
209 // retrieve data from DB
210 data[Z]->Retrieve(filein, true);
211
212 // smooth transition
213 size_t n = data[Z]->GetVectorLength() - 1;
214 G4double emax = data[Z]->Energy(n);
215 G4double sig1 = (*data[Z])[n];
216 dynParticle->SetKineticEnergy(emax);
217 ggXsection->GetCrossSection(dynParticle, Elem);
218 G4double sig2 = ggXsection->GetElasticGlauberGribovXsc();
219 if(sig2 > 0.) { coeff[Z] = sig1/sig2; }
220 }
221 if(!dp) { delete dynParticle; }
222}
Note: See TracBrowser for help on using the repository browser.