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

Last change on this file since 1340 was 962, checked in by garnier, 15 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.