source: trunk/source/processes/hadronic/models/neutron_hp/src/G4NeutronHPNames.cc@ 1199

Last change on this file since 1199 was 962, checked in by garnier, 17 years ago

update processes

File size: 12.1 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// neutron_hp -- source file
27// J.P. Wellisch, Nov-1996
28// A prototype of the low energy neutron transport model.
29//
30// 24-Jan-07 Enable to use exact data only and add warnig when substitute file is used T. Koi
31// 30-Jan-07 Modified method of searching substitute isotope data by T. Koi
32// 07-06-12 fix memory leaking by T. Koi
33// 07-06-25 Change data selection logic when G4NEUTRONHP_SKIP_MISSING_ISOTOPES is turn on
34// Natural Abundance data are allowed. by T. Koi
35// 07-07-06 Allow _nat_ final state even for isotoped cross sections by T. Koi
36// 08-09-01 Add protection that deuteron data do not selected for hydrogen and so on by T. Koi
37//
38#include "G4NeutronHPNames.hh"
39#include "G4SandiaTable.hh"
40#include "G4HadronicException.hh"
41#include <fstream>
42
43 const G4String G4NeutronHPNames::theString[99] = {"Hydrogen", "Helium",
44 "Lithium", "Berylium", "Boron", "Carbon", "Nitrogen", "Oxygen", "Fluorine",
45 "Neon", "Sodium", "Magnesium", "Aluminum", "Silicon", "Phosphorous",
46 "Sulfur", "Chlorine", "Argon", "Potassium", "Calcium", "Scandium",
47 "Titanium", "Vanadium", "Chromium", "Manganese", "Iron", "Cobalt", "Nickel",
48 "Copper", "Zinc", "Gallium", "Germanium", "Arsenic", "Selenium", "Bromine",
49 "Krypton", "Rubidium", "Strontium", "Yttrium", "Zirconium", "Niobium",
50 "Molybdenum", "Technetium", "Ruthenium", "Rhodium", "Palladium", "Silver",
51 "Cadmium", "Indium", "Tin", "Antimony", "Tellurium", "Iodine", "Xenon",
52 "Cesium", "Barium", "Lanthanum", "Cerium", "Praseodymium", "Neodymium",
53 "Promethium", "Samarium", "Europium", "Gadolinium", "Terbium", "Dysprosium",
54 "Holmium", "Erbium", "Thulium", "Ytterbium", "Lutetium", "Hafnium",
55 "Tantalum", "Tungsten", "Rhenium", "Osmium", "Iridium", "Platinium", "Gold",
56 "Mercury", "Thallium", "Lead", "Bismuth", "Polonium", "Astatine", "Radon",
57 "Francium", "Radium", "Actinium ", "Thorium", "Protactinium", "Uranium",
58 "Neptunium", "Plutonium", "Americium", "Curium", "Berkelium", "Californium",
59 "Einsteinium"};
60
61
62 G4String G4NeutronHPNames::GetName(G4int i) { return theString[i]; }
63
64G4NeutronHPDataUsed G4NeutronHPNames::GetName(G4int A, G4int Z, G4String base, G4String rest, G4bool & aFlag)
65{
66
67 G4NeutronHPDataUsed result;
68 aFlag = true;
69if(getenv("NeutronHPNames")) G4cout << "Names::GetName entered for Z = " << Z << ", A = " << A <<G4endl;
70
71 G4int myA = A;
72 G4int myZ = Z;
73
74 if(Z>92.5&&!getenv("AllowForHeavyElements") )
75 {
76 G4cerr << "Please contact Hans-Peter.Wellisch@cern.ch"<<G4endl;
77 throw G4HadronicException(__FILE__, __LINE__, "G4NeutronHPNames::GetName - data with Z>92 are not provided");
78 }
79
80 G4String * theName = 0;
81 G4String theFileName("");
82
83// G4int inc = 1;
84
85 G4int flip_Z = 1;
86 G4int delta_Z = 0;
87
88 G4int flip_A = 1;
89 G4int delta_A = 0;
90
91 std::ifstream * check = new std::ifstream(".dummy");
92 G4bool first = true;
93if(getenv("NeutronHPNames")) G4cout << "entered GetName!!!"<<G4endl;
94 do
95 {
96 aFlag = true;
97 G4String * biff = new G4String(); // delete here as theName
98 *biff = base+"/"+"CrossSection/"+itoa(myZ)+"_"+itoa(myA)+"_"+theString[myZ-1];
99
100 if(theName!=0) delete theName;
101 theName = biff;
102 result.SetName(*theName);
103 result.SetA(myA);
104 result.SetZ(myZ);
105if(getenv("NeutronHPNames")) G4cout <<"HPWD 1 "<<*theName<<G4endl;
106
107 // T.K. debug for memory leak
108 if ( check != 0 )
109 {
110 check->close();
111 delete check;
112 }
113 check = new std::ifstream(*theName);
114 if ( !(*check) )
115 {
116 check->close();
117 delete check;
118 check = 0;
119 aFlag = false;
120 if ( first )
121 {
122 aFlag = true;
123 first = false;
124 biff = new G4String(); // delete here as theName
125 *biff = base+"/"+"CrossSection/"+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
126 if(theName!=0) delete theName;
127 theName = biff;
128if(getenv("NeutronHPNames")) G4cout <<"HPWD 2 "<<*theName<<G4endl;
129 result.SetName(*theName);
130 G4double natA = myZ/G4SandiaTable::GetZtoA(myZ);
131 result.SetA(natA);
132 result.SetZ(myZ);
133 check = new std::ifstream(*theName);
134 if ( !(*check) )
135 {
136 check->close();
137 delete check;
138 check = 0;
139 aFlag = false;
140 }
141 else
142 {
143 biff = new G4String(); // delete here as theName
144 if(theName!=0) delete theName;
145 *biff = base+"/"+rest+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
146 theName = biff;
147if(getenv("NeutronHPNames")) G4cout <<"HPWD 3 "<<*theName<<G4endl;
148 result.SetName(*theName);
149 G4double natA = myZ/G4SandiaTable::GetZtoA(myZ);
150 result.SetA(natA);
151 result.SetZ(myZ);
152 result.SetNaturalAbundanceFlag();
153 }
154 }
155 }
156 else
157 {
158// 070706 T. Koi Modified
159/*
160 biff = new G4String(); // delete here as theName
161 *biff = base+"/"+rest+itoa(myZ)+"_"+itoa(myA)+"_"+theString[myZ-1];
162 if(theName!=0) delete theName;
163 theName = biff;
164if(getenv("NeutronHPNames")) G4cout <<"HPWD 4 "<<*theName<<G4endl;
165 result.SetName(*theName);
166 result.SetA(myA);
167 result.SetZ(myZ);
168*/
169
170 G4double tmpA = myA;
171 std::ifstream* file = NULL;
172 G4String fileName;
173
174 if ( rest == "/CrossSection/" )
175 {
176
177 fileName = base+"/"+rest+itoa(myZ)+"_"+itoa(myA)+"_"+theString[myZ-1];
178if(getenv("NeutronHPNames")) G4cout <<"HPWD 4a "<<*theName<<G4endl;
179
180 }
181 else
182 {
183
184// For FS
185 fileName = base+"/"+rest+itoa(myZ)+"_"+itoa(myA)+"_"+theString[myZ-1];
186 file = new std::ifstream(fileName);
187
188 if ( *file )
189 {
190
191// isotope FS
192if(getenv("NeutronHPNames")) G4cout <<"HPWD 4b1 "<<*theName<<G4endl;
193 }
194 else
195 {
196
197// _nat_ FS
198 fileName = base+"/"+rest+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
199
200 delete file;
201 file = new std::ifstream(fileName);
202 if ( *file )
203 {
204
205// FS neither isotope nor _nat_
206if(getenv("NeutronHPNames")) G4cout <<"HPWD 4b2a "<<*theName<<G4endl;
207 G4double natA = myZ/G4SandiaTable::GetZtoA(myZ);
208 tmpA = natA;
209 }
210 else
211 {
212if(getenv("NeutronHPNames")) G4cout <<"HPWD 4b2c "<<*theName<<G4endl;
213 }
214 }
215
216 delete file;
217
218 }
219
220 result.SetName(fileName);
221 result.SetA(tmpA);
222 result.SetZ(myZ);
223
224 }
225
226 do
227 {
228// if (std::abs(myZ-Z)>theMaxOffSet||myZ==0||myA==0)
229 if ( delta_Z > theMaxOffSet )
230 {
231 //if ( inc > 0 )
232 //{
233 // inc*= -1;
234 // myZ = Z;
235 // myA = A;
236 //}
237 //else
238 //{
239 G4cout <<"G4NeutronHPNames: Sorry, this material does not come near to any data."<<G4endl;
240 G4cout <<"G4NeutronHPNames: Please make sure G4NEUTRONHPDATA points to the" << G4endl;
241 G4cout <<" directory, the neutron scattering data are located in." << G4endl;
242 G4cout << "G4NeutronHPNames: The material was: A="<<A<<", Z="<<Z<<G4endl;
243 throw G4HadronicException(__FILE__, __LINE__, "In case the data sets are at present not available in the neutron data library, please contact Hans-Peter.Wellisch@cern.ch");
244 delete theName;
245 theFileName = "";
246 return result;
247 //}
248 }
249
250 //if ( std::abs( myA - A ) > theMaxOffSet )
251 if ( delta_A > 2*theMaxOffSet )
252 {
253 delta_A = 0;
254 flip_A = 1;
255
256 first = true;
257
258 if ( flip_Z > 0 )
259 {
260 delta_Z +=1;
261 }
262 myZ = Z + flip_Z * delta_Z;
263 flip_Z *= -1;
264
265 myA = A;
266 if ( myZ > 99 )
267 {
268 myZ = 99;
269 }
270 if ( myZ < 1 )
271 {
272 myZ = 1;
273 }
274
275// myZ += inc;
276 }
277 else
278 {
279 if ( flip_A > 0 )
280 {
281 delta_A += 1;
282 }
283 myA = A + flip_A * delta_A;
284 flip_A *= -1;
285
286 if ( myA < 1 )
287 {
288 myA = 1;
289 }
290
291// myA += inc;
292 }
293
294 }
295 while( myZ == 0 || myA == 0 ); // No meaning
296
297 }
298 while((!check) || (!(*check)));
299
300 if(getenv("NeutronHPNamesLogging") || getenv("NeutronHPNames"))
301 {
302 G4cout << "Names::GetName: last theName proposal = "<< G4endl;
303 G4cout << *theName <<" "<<A<<" "<<Z<<" "<<result.GetName()<<G4endl;
304 }
305
306// administration and anouncement for lacking of exact data in NDL
307 if ( Z != result.GetZ() || A != result.GetA() )
308 {
309 if ( rest == "/CrossSection/" )
310 {
311 G4String reac = base;
312 G4String dir = getenv("G4NEUTRONHPDATA");
313 reac.erase ( 0 , dir.length() );
314 if ( getenv ( "G4NEUTRONHP_SKIP_MISSING_ISOTOPES" ) && !( Z == result.GetZ() && result.IsThisNaturalAbundance() ) )
315 {
316 G4cout << "NeutronHP: " << reac << " file for Z = " << Z << ", A = " << A << " is not found and CrossSection set to 0." << G4endl;
317 G4String new_name = base+"/"+rest+"0_0_Zero";
318 result.SetName( new_name );
319 }
320 else
321 {
322 //080901 Add protection that deuteron data do not selected for hydrogen and so on by T. Koi
323 if ( (reac.find("Inelastic") != reac.size() &&
324 ((Z == 1 && A == 1) || (Z == 2 && A == 4) ) )
325 ||
326 (reac.find("Capture") != reac.size() && (Z == 2 && A == 4) ) )
327 {
328 G4String new_name = base+"/"+rest+"0_0_Zero";
329 result.SetName( new_name );
330 }
331 else
332 {
333 G4cout << "NeutronHP: " << reac << " file for Z = " << Z << ", A = " << A << " is not found and NeutronHP will use " << result.GetName() << G4endl;
334 }
335 }
336 }
337 }
338
339 delete theName;
340 if(aFlag)
341 {
342 check->close();
343 delete check;
344 check = 0;
345 }
346 return result;
347 }
Note: See TracBrowser for help on using the repository browser.