Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc (Version 11.3.0) and /processes/hadronic/models/particle_hp/src/G4ParticleHPElastic.cc (Version 10.4.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // neutron_hp -- source file                       26 // neutron_hp -- source file
 27 // J.P. Wellisch, Nov-1996                         27 // J.P. Wellisch, Nov-1996
 28 // A prototype of the low energy neutron trans     28 // A prototype of the low energy neutron transport model.
 29 //                                                 29 //
 30 // 070523 bug fix for G4FPE_DEBUG on by A. How     30 // 070523 bug fix for G4FPE_DEBUG on by A. Howard ( and T. Koi)
 31 // 080319 Compilation warnings - gcc-4.3.0 fix     31 // 080319 Compilation warnings - gcc-4.3.0 fix by T. Koi
 32 //                                                 32 //
 33 // P. Arce, June-2014 Conversion neutron_hp to     33 // P. Arce, June-2014 Conversion neutron_hp to particle_hp
 34 //                                                 34 //
 35 #include "G4ParticleHPElastic.hh"                  35 #include "G4ParticleHPElastic.hh"
 36                                                <<  36 #include "G4SystemOfUnits.hh"
 37 #include "G4ParticleHPElasticFS.hh"                37 #include "G4ParticleHPElasticFS.hh"
 38 #include "G4ParticleHPManager.hh"                  38 #include "G4ParticleHPManager.hh"
 39 #include "G4ParticleHPThermalBoost.hh"         << 
 40 #include "G4SystemOfUnits.hh"                  << 
 41 #include "G4Threading.hh"                          39 #include "G4Threading.hh"
 42                                                    40 
 43 G4ParticleHPElastic::G4ParticleHPElastic() : G <<  41   G4ParticleHPElastic::G4ParticleHPElastic()
 44 {                                              <<  42     :G4HadronicInteraction("NeutronHPElastic")
 45   overrideSuspension = false;                  <<  43   ,theElastic(NULL)
 46   SetMinEnergy(0. * eV);                       <<  44   ,numEle(0)
 47   SetMaxEnergy(20. * MeV);                     <<  45   {
 48 }                                              <<  46     overrideSuspension = false;
 49                                                <<  47 /*
 50 G4ParticleHPElastic::~G4ParticleHPElastic()    <<  48     G4ParticleHPElasticFS * theFS = new G4ParticleHPElasticFS;
 51 {                                              <<  49     if(!getenv("G4NEUTRONHPDATA")) 
 52   // the vectror is shared among threads, only <<  50        throw G4HadronicException(__FILE__, __LINE__, "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files.");
 53   if (!G4Threading::IsWorkerThread()) {        <<  51     dirName = getenv("G4NEUTRONHPDATA");
 54     if (theElastic != nullptr) {               <<  52     G4String tString = "/Elastic";
 55       for (auto it = theElastic->cbegin(); it  <<  53     dirName = dirName + tString;
 56         delete *it;                            <<  54 //    G4cout <<"G4ParticleHPElastic::G4ParticleHPElastic testit "<<dirName<<G4endl;
 57       }                                        <<  55     numEle = G4Element::GetNumberOfElements();
 58       theElastic->clear();                     <<  56     //theElastic = new G4ParticleHPChannel[numEle];
                                                   >>  57     //for (G4int i=0; i<numEle; i++)
                                                   >>  58     //{
                                                   >>  59     //  theElastic[i].Init((*(G4Element::GetElementTable()))[i], dirName);
                                                   >>  60     //  while(!theElastic[i].Register(theFS)) ;
                                                   >>  61     //}
                                                   >>  62     for ( G4int i = 0 ; i < numEle ; i++ ) 
                                                   >>  63     {
                                                   >>  64        theElastic.push_back( new G4ParticleHPChannel );
                                                   >>  65        (*theElastic[i]).Init((*(G4Element::GetElementTable()))[i], dirName);
                                                   >>  66        while(!(*theElastic[i]).Register(theFS)) ;
 59     }                                              67     }
                                                   >>  68     delete theFS;
                                                   >>  69 */
                                                   >>  70     SetMinEnergy(0.*eV);
                                                   >>  71     SetMaxEnergy(20.*MeV);
 60   }                                                72   }
 61 }                                              <<  73   
 62                                                <<  74   G4ParticleHPElastic::~G4ParticleHPElastic()
 63 G4HadFinalState* G4ParticleHPElastic::ApplyYou <<  75   {
 64                                                <<  76     //the vectror is shared among threads, only master deletes
 65 {                                              <<  77     if ( ! G4Threading::IsWorkerThread() ) {
 66   return this->ApplyYourself(aTrack, aNucleus, <<  78         //delete [] theElastic;
 67 }                                              <<  79         if ( theElastic != NULL ) {
 68                                                <<  80             for ( std::vector<G4ParticleHPChannel*>::iterator
 69 //-------------------------------------------- <<  81                 it = theElastic->begin() ; it != theElastic->end() ; it++ ) {
 70 // New method added by L. Thulliez (CEA-Saclay <<  82                 delete *it;
 71 //-------------------------------------------- <<  83             }
 72 G4HadFinalState* G4ParticleHPElastic::ApplyYou <<  84             theElastic->clear();
 73                                                <<  85         }
 74 {                                              <<  86     }
 75   G4ParticleHPManager::GetInstance()->OpenReac <<  87   }
 76   const G4Material* theMaterial = aTrack.GetMa <<  88   
 77   auto n = (G4int)theMaterial->GetNumberOfElem <<  89   #include "G4ParticleHPThermalBoost.hh"
 78   std::size_t index = theMaterial->GetElement( <<  90   
 79                                                <<  91   G4HadFinalState * G4ParticleHPElastic::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aNucleus )
 80   if (!isFromTSL) {                            <<  92   {
 81     if (n != 1) {                              <<  93 
                                                   >>  94    //if ( numEle < (G4int)G4Element::GetNumberOfElements() ) addChannelForNewElement();
                                                   >>  95 
                                                   >>  96     G4ParticleHPManager::GetInstance()->OpenReactionWhiteBoard();
                                                   >>  97     const G4Material * theMaterial = aTrack.GetMaterial();
                                                   >>  98     G4int n = theMaterial->GetNumberOfElements();
                                                   >>  99     G4int index = theMaterial->GetElement(0)->GetIndex();
                                                   >> 100     if(n!=1)
                                                   >> 101     {
 82       G4int i;                                    102       G4int i;
 83       auto xSec = new G4double[n];             << 103       G4double* xSec = new G4double[n];
 84       G4double sum = 0;                        << 104       G4double sum=0;
 85       const G4double* NumAtomsPerVolume = theM << 105       const G4double * NumAtomsPerVolume = theMaterial->GetVecNbOfAtomsPerVolume();
 86       G4double rWeight;                        << 106       G4double rWeight;    
 87       G4ParticleHPThermalBoost aThermalE;         107       G4ParticleHPThermalBoost aThermalE;
 88       for (i = 0; i < n; ++i) {                << 108       for (i=0; i<n; i++)
                                                   >> 109       {
 89         index = theMaterial->GetElement(i)->Ge    110         index = theMaterial->GetElement(i)->GetIndex();
 90         rWeight = NumAtomsPerVolume[i];           111         rWeight = NumAtomsPerVolume[i];
 91         xSec[i] = ((*theElastic)[index])       << 112         //xSec[i] = theElastic[index].GetXsec(aThermalE.GetThermalEnergy(aTrack,
 92                     ->GetXsec(aThermalE.GetThe << 113         xSec[i] = ((*theElastic)[index])->GetXsec(aThermalE.GetThermalEnergy(aTrack,
 93                                                << 114                                                            theMaterial->GetElement(i),
                                                   >> 115                        theMaterial->GetTemperature()));
 94         xSec[i] *= rWeight;                       116         xSec[i] *= rWeight;
 95         sum += xSec[i];                        << 117         sum+=xSec[i];
 96       }                                           118       }
 97       G4double random = G4UniformRand();          119       G4double random = G4UniformRand();
 98       G4double running = 0;                       120       G4double running = 0;
 99       for (i = 0; i < n; ++i) {                << 121       for (i=0; i<n; i++)
                                                   >> 122       {
100         running += xSec[i];                       123         running += xSec[i];
101         index = theMaterial->GetElement(i)->Ge    124         index = theMaterial->GetElement(i)->GetIndex();
102         if (sum == 0 || random <= running / su << 125         //if(random<=running/sum) break;
                                                   >> 126         if( sum == 0 || random <= running/sum ) break;
103       }                                           127       }
104       delete[] xSec;                           << 128       delete [] xSec;
                                                   >> 129       // it is element-wise initialised.
105     }                                             130     }
106   }                                            << 131     //G4HadFinalState* finalState = theElastic[index].ApplyYourself(aTrack);
107   else {                                       << 132     G4HadFinalState* finalState = ((*theElastic)[index])->ApplyYourself(aTrack);
108     G4int i;                                   << 133     if (overrideSuspension) finalState->SetStatusChange(isAlive);
109     if (n != 1) {                              << 134 
110       for (i = 0; i < n; ++i) {                << 135     //Overwrite target parameters
111         if (aNucleus.GetZ_asInt() == (G4int)(t << 136     aNucleus.SetParameters(G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA(),G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargZ());
112           index = theMaterial->GetElement(i)-> << 137     const G4Element* target_element = (*G4Element::GetElementTable())[index];
113         }                                      << 138     const G4Isotope* target_isotope=NULL;
114       }                                        << 139     G4int iele = target_element->GetNumberOfIsotopes();
                                                   >> 140     for ( G4int j = 0 ; j != iele ; j++ ) { 
                                                   >> 141        target_isotope=target_element->GetIsotope( j );
                                                   >> 142        if ( target_isotope->GetN() == G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->GetTargA() ) break; 
115     }                                             143     }
                                                   >> 144     //G4cout << "Target Material of this reaction is " << theMaterial->GetName() << G4endl;
                                                   >> 145     //G4cout << "Target Element of this reaction is " << target_element->GetName() << G4endl;
                                                   >> 146     //G4cout << "Target Isotope of this reaction is " << target_isotope->GetName() << G4endl;
                                                   >> 147     aNucleus.SetIsotope( target_isotope );
                                                   >> 148     
                                                   >> 149     G4ParticleHPManager::GetInstance()->CloseReactionWhiteBoard();
                                                   >> 150     return finalState; 
116   }                                               151   }
117                                                   152 
118   // The boolean "true", as last argument, spe << 
119   // that it is an elastic channel: this is ne << 
120   G4HadFinalState* finalState = ((*theElastic) << 
121                                                << 
122   if (overrideSuspension) finalState->SetStatu << 
123                                                << 
124   // Overwrite target parameters               << 
125   aNucleus.SetParameters(G4ParticleHPManager:: << 
126                          G4ParticleHPManager:: << 
127   const G4Element* target_element = (*G4Elemen << 
128   const G4Isotope* target_isotope = nullptr;   << 
129   auto iele = (G4int)target_element->GetNumber << 
130   for (G4int j = 0; j != iele; ++j) {          << 
131     target_isotope = target_element->GetIsotop << 
132     if (target_isotope->GetN()                 << 
133         == G4ParticleHPManager::GetInstance()- << 
134       break;                                   << 
135   }                                            << 
136   aNucleus.SetIsotope(target_isotope);         << 
137                                                << 
138   G4ParticleHPManager::GetInstance()->CloseRea << 
139   return finalState;                           << 
140 }                                              << 
141                                                << 
142 const std::pair<G4double, G4double> G4Particle    153 const std::pair<G4double, G4double> G4ParticleHPElastic::GetFatalEnergyCheckLevels() const
143 {                                                 154 {
144   // max energy non-conservation is mass of he << 155    //return std::pair<G4double, G4double>(10*perCent,10*GeV);
145   return std::pair<G4double, G4double>(10.0 *  << 156    return std::pair<G4double, G4double>(10*perCent,DBL_MAX);
146 }                                                 157 }
147                                                   158 
148 G4int G4ParticleHPElastic::GetVerboseLevel() c << 159 /*
                                                   >> 160 void G4ParticleHPElastic::addChannelForNewElement()
149 {                                                 161 {
150   return G4ParticleHPManager::GetInstance()->G << 162    G4ParticleHPElasticFS* theFS = new G4ParticleHPElasticFS;
                                                   >> 163    for ( G4int i = numEle ; i < (G4int)G4Element::GetNumberOfElements() ; i++ ) 
                                                   >> 164    {
                                                   >> 165       G4cout << "G4ParticleHPElastic Prepairing Data for the new element of " << (*(G4Element::GetElementTable()))[i]->GetName() << G4endl;
                                                   >> 166       theElastic.push_back( new G4ParticleHPChannel );
                                                   >> 167       (*theElastic[i]).Init((*(G4Element::GetElementTable()))[i], dirName);
                                                   >> 168       while(!(*theElastic[i]).Register(theFS)) ;
                                                   >> 169    }
                                                   >> 170    delete theFS;
                                                   >> 171    numEle = (G4int)G4Element::GetNumberOfElements();
151 }                                                 172 }
                                                   >> 173 */
152                                                   174 
153 void G4ParticleHPElastic::SetVerboseLevel(G4in << 175 G4int G4ParticleHPElastic::GetVerboseLevel() const 
154 {                                                 176 {
155   G4ParticleHPManager::GetInstance()->SetVerbo << 177    return G4ParticleHPManager::GetInstance()->GetVerboseLevel();
                                                   >> 178 }
                                                   >> 179 void G4ParticleHPElastic::SetVerboseLevel( G4int newValue ) 
                                                   >> 180 {
                                                   >> 181    G4ParticleHPManager::GetInstance()->SetVerboseLevel(newValue);
156 }                                                 182 }
157                                                << 
158 void G4ParticleHPElastic::BuildPhysicsTable(co    183 void G4ParticleHPElastic::BuildPhysicsTable(const G4ParticleDefinition&)
159 {                                                 184 {
160   G4ParticleHPManager* hpmanager = G4ParticleH << 
161                                                   185 
162   theElastic = hpmanager->GetElasticFinalState << 186    G4ParticleHPManager* hpmanager = G4ParticleHPManager::GetInstance();
163                                                   187 
164   if (G4Threading::IsMasterThread()) {         << 188    theElastic = hpmanager->GetElasticFinalStates();
165     if (theElastic == nullptr) theElastic = ne << 
166                                                   189 
167     if (numEle == (G4int)G4Element::GetNumberO << 190    if ( G4Threading::IsMasterThread() ) {
168                                                   191 
169     if (theElastic->size() == G4Element::GetNu << 192       if ( theElastic == NULL ) theElastic = new std::vector<G4ParticleHPChannel*>;
170       numEle = (G4int)G4Element::GetNumberOfEl << 
171       return;                                  << 
172     }                                          << 
173                                                   193 
174     auto theFS = new G4ParticleHPElasticFS;    << 194       if ( numEle == (G4int)G4Element::GetNumberOfElements() ) return;
175     if (G4FindDataDir("G4NEUTRONHPDATA") == nu << 
176       throw G4HadronicException(               << 
177         __FILE__, __LINE__,                    << 
178         "Please setenv G4NEUTRONHPDATA to poin << 
179     dirName = G4FindDataDir("G4NEUTRONHPDATA") << 
180     G4String tString = "/Elastic";             << 
181     dirName = dirName + tString;               << 
182     for (G4int i = numEle; i < (G4int)G4Elemen << 
183       theElastic->push_back(new G4ParticleHPCh << 
184       ((*theElastic)[i])->Init((*(G4Element::G << 
185       // while(!((*theElastic)[i])->Register(t << 
186       ((*theElastic)[i])->Register(theFS);     << 
187     }                                          << 
188     delete theFS;                              << 
189     hpmanager->RegisterElasticFinalStates(theE << 
190   }                                            << 
191   numEle = (G4int)G4Element::GetNumberOfElemen << 
192 }                                              << 
193                                                   195 
                                                   >> 196       if ( theElastic->size() == G4Element::GetNumberOfElements() ) {
                                                   >> 197          numEle = G4Element::GetNumberOfElements();
                                                   >> 198          return;
                                                   >> 199       }
                                                   >> 200 
                                                   >> 201       G4ParticleHPElasticFS * theFS = new G4ParticleHPElasticFS;
                                                   >> 202       if(!getenv("G4NEUTRONHPDATA")) 
                                                   >> 203          throw G4HadronicException(__FILE__, __LINE__, "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files.");
                                                   >> 204       dirName = getenv("G4NEUTRONHPDATA");
                                                   >> 205       G4String tString = "/Elastic";
                                                   >> 206       dirName = dirName + tString;
                                                   >> 207       for ( G4int i = numEle ; i < (G4int)G4Element::GetNumberOfElements() ; i++ ) {
                                                   >> 208          theElastic->push_back( new G4ParticleHPChannel );
                                                   >> 209          ((*theElastic)[i])->Init((*(G4Element::GetElementTable()))[i], dirName);
                                                   >> 210          //while(!((*theElastic)[i])->Register(theFS)) ;
                                                   >> 211          ((*theElastic)[i])->Register(theFS) ;
                                                   >> 212       }
                                                   >> 213       delete theFS;
                                                   >> 214       hpmanager->RegisterElasticFinalStates( theElastic );
                                                   >> 215 
                                                   >> 216    }
                                                   >> 217    numEle = G4Element::GetNumberOfElements();
                                                   >> 218 }
194 void G4ParticleHPElastic::ModelDescription(std    219 void G4ParticleHPElastic::ModelDescription(std::ostream& outFile) const
195 {                                                 220 {
196   outFile << "High Precision model based on Ev << 221    outFile << "High Precision model based on Evaluated Nuclear Data Files (ENDF) for inelastic reaction of neutrons below 20MeV\n";
197              "reaction of neutrons below 20MeV << 
198 }                                                 222 }
199                                                   223