Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/particle_hp/src/G4ParticleHPChannel.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/G4ParticleHPChannel.cc (Version 11.3.0) and /processes/hadronic/models/particle_hp/src/G4ParticleHPChannel.cc (Version 10.2.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 // 071031 bug fix T. Koi on behalf of A. Howar <<  31 // 071031 bug fix T. Koi on behalf of A. Howard 
 32 // 081203 bug fix in Register method by T. Koi     32 // 081203 bug fix in Register method by T. Koi
 33 //                                                 33 //
 34 // P. Arce, June-2014 Conversion neutron_hp to     34 // P. Arce, June-2014 Conversion neutron_hp to particle_hp
 35 //                                                 35 //
 36 // June-2019 - E. Mendoza --> Modification to  <<  36 #include <stdlib.h>
 37 //   data library if the G4NEUTRONHP_SKIP_MISS << 
 38 //   flag is defined. The missing XS are set t << 
 39                                                    37 
 40 #include "G4ParticleHPChannel.hh"                  38 #include "G4ParticleHPChannel.hh"
 41                                                << 
 42 #include "G4HadTmpUtil.hh"                     << 
 43 #include "G4ParticleHPElasticFS.hh"            << 
 44 #include "G4ParticleHPFinalState.hh"           << 
 45 #include "G4ParticleHPReactionWhiteBoard.hh"   << 
 46 #include "G4ParticleHPThermalBoost.hh"         << 
 47 #include "G4SystemOfUnits.hh"                  << 
 48 #include "globals.hh"                              39 #include "globals.hh"
                                                   >>  40 #include "G4SystemOfUnits.hh"
                                                   >>  41 #include "G4ParticleHPFinalState.hh"
                                                   >>  42 #include "G4HadTmpUtil.hh"
 49                                                    43 
 50 #include <cstdlib>                             <<  44 #include "G4ParticleHPManager.hh"
                                                   >>  45 #include "G4ParticleHPReactionWhiteBoard.hh"
 51                                                    46 
 52 G4ParticleHPChannel::G4ParticleHPChannel(G4Par <<  47   G4double G4ParticleHPChannel::GetXsec(G4double energy)
 53 {                                              <<  48   {
 54   fManager = G4ParticleHPManager::GetInstance( <<  49     return std::max(0., theChannelData->GetXsec(energy));
 55   if (fManager->GetUseWendtFissionModel()) {   << 
 56     wendtFissionGenerator = G4WendtFissionFrag << 
 57     // Make sure both fission fragment models  << 
 58     fManager->SetProduceFissionFragments(false << 
 59   }                                                50   }
 60   theProjectile = (nullptr == p) ? G4Neutron:: <<  51   
 61   theChannelData = new G4ParticleHPVector;     <<  52   G4double G4ParticleHPChannel::GetWeightedXsec(G4double energy, G4int isoNumber)
 62 }                                              <<  53   {
 63                                                <<  54     return theIsotopeWiseData[isoNumber].GetXsec(energy);
 64 G4ParticleHPChannel::~G4ParticleHPChannel()    << 
 65 {                                              << 
 66   delete theChannelData;                       << 
 67   // Following statement disabled to avoid SEG << 
 68   // theBuffer is also deleted as "theChannelD << 
 69   delete[] theIsotopeWiseData;                 << 
 70   if (theFinalStates != nullptr) {             << 
 71     for (G4int i = 0; i < niso; i++) {         << 
 72       delete theFinalStates[i];                << 
 73     }                                          << 
 74     delete[] theFinalStates;                   << 
 75   }                                                55   }
 76   delete[] active;                             <<  56   
 77 }                                              <<  57   G4double G4ParticleHPChannel::GetFSCrossSection(G4double energy, G4int isoNumber)
 78                                                <<  58   {
 79 G4double G4ParticleHPChannel::GetXsec(G4double <<  59     return theFinalStates[isoNumber]->GetXsec(energy);
 80 {                                              << 
 81   return std::max(0., theChannelData->GetXsec( << 
 82 }                                              << 
 83                                                << 
 84 G4double G4ParticleHPChannel::GetWeightedXsec( << 
 85                 G4int isoNumber) const         << 
 86 {                                              << 
 87   return theIsotopeWiseData[isoNumber].GetXsec << 
 88 }                                              << 
 89                                                << 
 90 G4double G4ParticleHPChannel::GetFSCrossSectio << 
 91             G4int isoNumber) const             << 
 92 {                                              << 
 93   return theFinalStates[isoNumber]->GetXsec(en << 
 94 }                                              << 
 95                                                << 
 96 void G4ParticleHPChannel::Init(G4Element* anEl << 
 97              const G4String& dirName, const G4 << 
 98 {                                              << 
 99   theFSType = aFSType;                         << 
100   Init(anElement, dirName);                    << 
101 }                                              << 
102                                                << 
103 void G4ParticleHPChannel::Init(G4Element* anEl << 
104 {                                              << 
105   theDir = dirName;                            << 
106   theElement = anElement;                      << 
107 }                                              << 
108                                                << 
109 G4bool G4ParticleHPChannel::Register(G4Particl << 
110 {                                              << 
111   ++registerCount;                             << 
112   G4int Z = theElement->GetZasInt();           << 
113                                                << 
114   niso = (G4int)theElement->GetNumberOfIsotope << 
115   const std::size_t nsize = niso > 0 ? niso :  << 
116                                                << 
117   delete[] theIsotopeWiseData;                 << 
118   theIsotopeWiseData = new G4ParticleHPIsoData << 
119   delete[] active;                             << 
120   active = new G4bool[nsize];                  << 
121                                                << 
122   delete[] theFinalStates;                     << 
123   theFinalStates = new G4ParticleHPFinalState* << 
124   delete theChannelData;                       << 
125   theChannelData = new G4ParticleHPVector;     << 
126   for (G4int i = 0; i < niso; ++i) {           << 
127     theFinalStates[i] = theFS->New();          << 
128     theFinalStates[i]->SetProjectile(theProjec << 
129   }                                            << 
130   if (niso != 0 && registerCount == 0) {       << 
131     for (G4int i1 = 0; i1 < niso; ++i1) {      << 
132       G4int A = theElement->GetIsotope(i1)->Ge << 
133       G4int M = theElement->GetIsotope(i1)->Ge << 
134       //G4cout <<" Init: normal case i=" << i1 << 
135       //     << " Z=" << Z << " A=" << A << G4 << 
136       G4double frac = theElement->GetRelativeA << 
137       theFinalStates[i1]->SetA_Z(A, Z, M);     << 
138       UpdateData(A, Z, M, i1, frac, theProject << 
139     }                                          << 
140   }                                                60   }
141   G4bool result = HasDataInAnyFinalState();    <<  61   
142                                                <<  62   void G4ParticleHPChannel::
143   // To avoid issuing hash by worker threads   <<  63   Init(G4Element * anElement, const G4String dirName, const G4String aFSType) 
144   if (result) theChannelData->Hash();          <<  64   {
145                                                <<  65     theFSType = aFSType;
146   return result;                               <<  66     Init(anElement, dirName);
147 }                                              << 
148                                                << 
149 void G4ParticleHPChannel::UpdateData(G4int A,  << 
150                                      G4double  << 
151                                      G4Particl << 
152 {                                              << 
153   // Initialze the G4FissionFragment generator << 
154   if (wendtFissionGenerator != nullptr) {      << 
155     wendtFissionGenerator->InitializeANucleus( << 
156   }                                            << 
157                                                << 
158   theFinalStates[index]->Init(A, Z, M, theDir, << 
159   if (!theFinalStates[index]->HasAnyData()) re << 
160   // nothing there for exactly this isotope.   << 
161                                                << 
162   // the above has put the X-sec into the FS   << 
163   theBuffer = nullptr;                         << 
164   if (theFinalStates[index]->HasXsec()) {      << 
165     theBuffer = theFinalStates[index]->GetXsec << 
166     theBuffer->Times(abundance / 100.);        << 
167     theIsotopeWiseData[index].FillChannelData( << 
168   }                                                67   }
169   else  // get data from CrossSection director <<  68    
                                                   >>  69   void G4ParticleHPChannel::Init(G4Element * anElement, const G4String dirName)  
170   {                                                70   {
171     const G4String& tString = "/CrossSection"; <<  71     theDir = dirName;
172     active[index] = theIsotopeWiseData[index]. <<  72     theElement = anElement;
173                                                << 
174     if (active[index]) theBuffer = theIsotopeW << 
175   }                                                73   }
176   if (theBuffer != nullptr) Harmonise(theChann <<  74   
177 }                                              <<  75   G4bool G4ParticleHPChannel::Register(G4ParticleHPFinalState *theFS)
178                                                << 
179 void G4ParticleHPChannel::Harmonise(G4Particle << 
180                                     G4Particle << 
181 {                                              << 
182   G4int s_tmp = 0, n = 0, m_tmp = 0;           << 
183   auto theMerge = new G4ParticleHPVector;      << 
184   G4ParticleHPVector* anActive = theStore;     << 
185   G4ParticleHPVector* aPassive = theNew;       << 
186   G4ParticleHPVector* tmp;                     << 
187   G4int a = s_tmp, p = n, t;                   << 
188   while (a < anActive->GetVectorLength() && p  << 
189     // Loop checking, 11.05.2015, T. Koi       << 
190   {                                                76   {
191     if (anActive->GetEnergy(a) <= aPassive->Ge <<  77   registerCount++;
192       G4double xa = anActive->GetEnergy(a);    <<  78     G4int Z = G4lrint(theElement->GetZ());
193       theMerge->SetData(m_tmp, xa, anActive->G <<  79 
194       m_tmp++;                                 <<  80     Z = Z-registerCount;
195       a++;                                     <<  81     if ( registerCount > 5 ) throw G4HadronicException(__FILE__, __LINE__, "Channel: Do not know what to do with this material"); // for Elastic, Capture, Fission case 
196       G4double xp = aPassive->GetEnergy(p);    <<  82     if ( Z < 1 ) return false; 
197       if (std::abs(std::abs(xp - xa) / xa) < 0 <<  83 /*
198         ++p;                                   <<  84     if(registerCount<5)
199       }                                        <<  85     {
                                                   >>  86       Z = Z-registerCount;
                                                   >>  87     }
                                                   >>  88 */
                                                   >>  89     //if(Z=theElement->GetZ()-5) throw G4HadronicException(__FILE__, __LINE__, "Channel: Do not know what to do with this material");
                                                   >>  90     // Bug fix by TK on behalf of AH
                                                   >>  91     if ( Z <=theElement->GetZ()-5 ) throw G4HadronicException(__FILE__, __LINE__, "Channel: Do not know what to do with this material");
                                                   >>  92     G4int count = 0;
                                                   >>  93     if(registerCount==0) count = theElement->GetNumberOfIsotopes();
                                                   >>  94     if(count == 0||registerCount!=0) count +=
                                                   >>  95          theStableOnes.GetNumberOfIsotopes(Z);
                                                   >>  96     niso = count;
                                                   >>  97     delete [] theIsotopeWiseData;
                                                   >>  98     theIsotopeWiseData = new G4ParticleHPIsoData [niso];
                                                   >>  99     delete [] active;
                                                   >> 100     active = new G4bool[niso];
                                                   >> 101 
                                                   >> 102     delete [] theFinalStates;
                                                   >> 103     theFinalStates = new G4ParticleHPFinalState * [niso];
                                                   >> 104     delete theChannelData;
                                                   >> 105     theChannelData = new G4ParticleHPVector; 
                                                   >> 106     for(G4int i=0; i<niso; i++)
                                                   >> 107     {
                                                   >> 108       theFinalStates[i] = theFS->New();
                                                   >> 109       theFinalStates[i]->SetProjectile(theProjectile);
200     }                                             110     }
201     else {                                     << 111     count = 0;
202       tmp = anActive;                          << 112     G4int nIsos = niso;
203       t = a;                                   << 113     if(theElement->GetNumberOfIsotopes()!=0&&registerCount==0)
204       anActive = aPassive;                     << 114     {
205       a = p;                                   << 115       for (G4int i1=0; i1<nIsos; i1++)
206       aPassive = tmp;                          << 116       {
207       p = t;                                   << 117         // G4cout <<" Init: normal case"<<G4endl;
                                                   >> 118         G4int A = theElement->GetIsotope(i1)->GetN();
                                                   >> 119         G4int M = theElement->GetIsotope(i1)->Getm();
                                                   >> 120         G4double frac = theElement->GetRelativeAbundanceVector()[i1]/perCent;
                                                   >> 121         //theFinalStates[i1]->SetA_Z(A, Z);
                                                   >> 122   //UpdateData(A, Z, count++, frac);
                                                   >> 123         theFinalStates[i1]->SetA_Z(A, Z, M);
                                                   >> 124   UpdateData(A, Z, M, count++, frac, theProjectile);
                                                   >> 125       }
                                                   >> 126     } else {
                                                   >> 127       //G4cout <<" Init: mean case: "
                                                   >> 128       //       <<theStableOnes.GetNumberOfIsotopes(Z)<<" "
                                                   >> 129   //     <<Z<<" "<<theElement
                                                   >> 130   //     << G4endl;
                                                   >> 131       G4int first = theStableOnes.GetFirstIsotope(Z);
                                                   >> 132       for(G4int i1=0; 
                                                   >> 133         i1<theStableOnes.GetNumberOfIsotopes(Z);
                                                   >> 134         i1++)
                                                   >> 135       {
                                                   >> 136         G4int A = theStableOnes.GetIsotopeNucleonCount(first+i1);
                                                   >> 137         G4double frac = theStableOnes.GetAbundance(first+i1);
                                                   >> 138         theFinalStates[i1]->SetA_Z(A, Z);
                                                   >> 139         UpdateData(A, Z, count++, frac, theProjectile);
                                                   >> 140       }
208     }                                             141     }
                                                   >> 142     G4bool result = HasDataInAnyFinalState();
                                                   >> 143 
                                                   >> 144     //To avoid issuing hash by worker threads
                                                   >> 145     if ( result ) theChannelData->Hash();
                                                   >> 146 
                                                   >> 147     return result;
209   }                                               148   }
210   while (a != anActive->GetVectorLength())  // << 149   
                                                   >> 150   //void G4ParticleHPChannel::UpdateData(G4int A, G4int Z, G4int index, G4double abundance)
                                                   >> 151   void G4ParticleHPChannel::UpdateData(G4int A, G4int Z, G4int M, G4int index, G4double abundance, G4ParticleDefinition* projectile)
211   {                                               152   {
212     theMerge->SetData(m_tmp++, anActive->GetEn << 153     // Initialze the G4FissionFragment generator for this isomer if needed
213     ++a;                                       << 154   if(wendtFissionGenerator)
                                                   >> 155   {
                                                   >> 156     wendtFissionGenerator->InitializeANucleus(A, Z, M, theDir);
                                                   >> 157   }
                                                   >> 158 
                                                   >> 159   theFinalStates[index]->Init(A, Z, M, theDir, theFSType, projectile);
                                                   >> 160     if(!theFinalStates[index]->HasAnyData()) return; // nothing there for exactly this isotope.
                                                   >> 161 
                                                   >> 162     // the above has put the X-sec into the FS
                                                   >> 163     theBuffer = 0;
                                                   >> 164     if(theFinalStates[index]->HasXsec())
                                                   >> 165     {
                                                   >> 166       theBuffer = theFinalStates[index]->GetXsec();
                                                   >> 167       theBuffer->Times(abundance/100.);
                                                   >> 168       theIsotopeWiseData[index].FillChannelData(theBuffer);
                                                   >> 169     }
                                                   >> 170     else // get data from CrossSection directory
                                                   >> 171     {
                                                   >> 172       G4String tString = "/CrossSection";
                                                   >> 173       //active[index] = theIsotopeWiseData[index].Init(A, Z, abundance, theDir, tString);
                                                   >> 174       active[index] = theIsotopeWiseData[index].Init(A, Z, M, abundance, theDir, tString);
                                                   >> 175       if(active[index]) theBuffer = theIsotopeWiseData[index].MakeChannelData();
                                                   >> 176     }
                                                   >> 177     if(theBuffer != 0) Harmonise(theChannelData, theBuffer);
214   }                                               178   }
215   while (p != aPassive->GetVectorLength())  // << 179   
                                                   >> 180   void G4ParticleHPChannel::Harmonise(G4ParticleHPVector *& theStore, G4ParticleHPVector * theNew)
216   {                                               181   {
217     if (std::abs(theMerge->GetEnergy(std::max( << 182     G4int s_tmp = 0, n=0, m_tmp=0;
218      aPassive->GetEnergy(p)) / aPassive->GetEn << 183     G4ParticleHPVector * theMerge = new G4ParticleHPVector;
219       theMerge->SetData(m_tmp++, aPassive->Get << 184     G4ParticleHPVector * anActive = theStore;
220     ++p;                                       << 185     G4ParticleHPVector * aPassive = theNew;
                                                   >> 186     G4ParticleHPVector * tmp;
                                                   >> 187     G4int a = s_tmp, p = n, t;
                                                   >> 188     while (a<anActive->GetVectorLength()&&p<aPassive->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi
                                                   >> 189     {
                                                   >> 190       if(anActive->GetEnergy(a) <= aPassive->GetEnergy(p))
                                                   >> 191       {
                                                   >> 192         G4double xa  = anActive->GetEnergy(a);
                                                   >> 193         theMerge->SetData(m_tmp, xa, anActive->GetXsec(a)+std::max(0., aPassive->GetXsec(xa)) );
                                                   >> 194         m_tmp++;
                                                   >> 195         a++;
                                                   >> 196         G4double xp = aPassive->GetEnergy(p);
                                                   >> 197         if( std::abs(std::abs(xp-xa)/xa)<0.001 )
                                                   >> 198         {
                                                   >> 199           p++;
                                                   >> 200         }
                                                   >> 201       } else {
                                                   >> 202         tmp = anActive; t=a;
                                                   >> 203         anActive = aPassive; a=p;
                                                   >> 204         aPassive = tmp; p=t;
                                                   >> 205       }
                                                   >> 206     }
                                                   >> 207     while (a!=anActive->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi
                                                   >> 208     {
                                                   >> 209       theMerge->SetData(m_tmp++, anActive->GetEnergy(a), anActive->GetXsec(a));
                                                   >> 210       a++;
                                                   >> 211     }
                                                   >> 212     while (p!=aPassive->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi
                                                   >> 213     {
                                                   >> 214       if(std::abs(theMerge->GetEnergy(std::max(0,m_tmp-1))-aPassive->GetEnergy(p))/aPassive->GetEnergy(p)>0.001)
                                                   >> 215         theMerge->SetData(m_tmp++, aPassive->GetEnergy(p), aPassive->GetXsec(p));
                                                   >> 216       p++;
                                                   >> 217     }
                                                   >> 218     delete theStore;
                                                   >> 219     theStore = theMerge;
221   }                                               220   }
222   delete theStore;                             << 
223   theStore = theMerge;                         << 
224 }                                              << 
225                                                   221 
226 G4WendtFissionFragmentGenerator* G4ParticleHPC << 222 #include "G4ParticleHPThermalBoost.hh"
227   if ( wendtFissionGenerator ) return wendtFis << 
228   else                         return nullptr; << 
229 }                                              << 
230                                                   223 
231 G4HadFinalState*                               << 224   G4HadFinalState * G4ParticleHPChannel::
232 G4ParticleHPChannel::ApplyYourself(const G4Had << 225   ApplyYourself(const G4HadProjectile & theTrack, G4int anIsotope)
233            G4int anIsotope, G4bool isElastic)  << 226   {
234 {                                              << 227 //    G4cout << "G4ParticleHPChannel::ApplyYourself+"<<niso<<G4endl;
235   //G4cout << "G4ParticleHPChannel::ApplyYours << 228     if ( anIsotope != -1 && anIsotope != -2 ) 
236   //   << " ni=" << anIsotope << " isElastic=" << 229     {
237   if (anIsotope != -1 && anIsotope != -2) {    << 230        //Inelastic Case
238     // Inelastic Case                          << 231        //G4cout << "G4ParticleHPChannel Inelastic Case" 
239     //G4cout << "G4ParticleHPChannel Inelastic << 232        //<< " Z= " << this->GetZ(it) << " A = " << this->GetN(it) << G4endl;
240     //<< " Z= " << GetZ(anIsotope) << " A = "  << 233        G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargA( (G4int)this->GetN(anIsotope) ); 
241     fManager->GetReactionWhiteBoard()->SetTarg << 234        G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargZ( (G4int)this->GetZ(anIsotope) ); 
242     fManager->GetReactionWhiteBoard()->SetTarg << 235        return theFinalStates[anIsotope]->ApplyYourself(theTrack);
243     return theFinalStates[anIsotope]->ApplyYou << 
244   }                                            << 
245   G4double sum = 0;                            << 
246   G4int it = 0;                                << 
247   auto xsec = new G4double[niso];              << 
248   G4ParticleHPThermalBoost aThermalE;          << 
249   for (G4int i = 0; i < niso; i++) {           << 
250     if (theFinalStates[i]->HasAnyData()) {     << 
251       /*                                       << 
252       G4cout << "FS: " << i << theTrack.GetDef << 
253        << " Z=" << theFinalStates[i]->GetZ()   << 
254        << " A=" << theFinalStates[i]->GetN()   << 
255        << G4endl;                              << 
256       */                                       << 
257       xsec[i] = theIsotopeWiseData[i].GetXsec( << 
258         aThermalE.GetThermalEnergy(theTrack, t << 
259                                    theFinalSta << 
260                                    theTrack.Ge << 
261       sum += xsec[i];                          << 
262     }                                          << 
263     else {                                     << 
264       xsec[i] = 0;                             << 
265     }                                          << 
266   }                                            << 
267   if (sum == 0) {                              << 
268     it = G4lrint(niso * G4UniformRand());      << 
269   }                                            << 
270   else {                                       << 
271     G4double random = G4UniformRand();         << 
272     G4double running = 0;                      << 
273     for (G4int ix = 0; ix < niso; ix++) {      << 
274       running += xsec[ix];                     << 
275       if (sum == 0 || random <= running / sum) << 
276         it = ix;                               << 
277         break;                                 << 
278       }                                        << 
279     }                                             236     }
280     if (it == niso) it--;                      << 237     G4double sum=0;
281   }                                            << 238     G4int it=0;
282   delete[] xsec;                               << 239     G4double * xsec = new G4double[niso];
283   G4HadFinalState* theFinalState = nullptr;    << 240     G4ParticleHPThermalBoost aThermalE;
284   const auto A = (G4int)this->GetN(it);        << 241     for (G4int i=0; i<niso; i++)
285   const auto Z = (G4int)this->GetZ(it);        << 242     {
286   const auto M = (G4int)this->GetM(it);        << 243       if(theFinalStates[i]->HasAnyData())
287                                                << 244       {
288   //-2:Marker for Fission                      << 245         xsec[i] = theIsotopeWiseData[i].GetXsec(aThermalE.GetThermalEnergy(theTrack,
289   if ((wendtFissionGenerator != nullptr) && an << 246                                                                theFinalStates[i]->GetN(),
290     theFinalState = wendtFissionGenerator->App << 247                      theFinalStates[i]->GetZ(),
291   }                                            << 248                              theTrack.GetMaterial()->GetTemperature()));
292                                                << 249         sum += xsec[i];
293   // Use the standard procedure if the G4Fissi << 
294   if (theFinalState == nullptr) {              << 
295     G4int icounter = 0;                        << 
296     G4int icounter_max = 1024;                 << 
297     while (theFinalState == nullptr)  // Loop  << 
298     {                                          << 
299       icounter++;                              << 
300       if (icounter > icounter_max) {           << 
301         G4cout << "Loop-counter exceeded the t << 
302                << __LINE__ << "th line of " << << 
303         break;                                 << 
304       }                                           250       }
305       if (isElastic) {                         << 251       else
306         // Register 0 K cross-section for DBRC << 252       {
307         G4ParticleHPVector* xsforFS = theIsoto << 253         xsec[i]=0;
308         // Only G4ParticleHPElasticFS has the  << 
309         static_cast<G4ParticleHPElasticFS*>(th << 
310       }                                           254       }
311       theFinalState = theFinalStates[it]->Appl << 255     } 
                                                   >> 256     if(sum == 0) 
                                                   >> 257     {
                                                   >> 258 //      G4cout << "G4ParticleHPChannel::ApplyYourself theFinalState->Initialize+"<<G4endl;
                                                   >> 259 //      G4cout << "G4ParticleHPChannel::ApplyYourself theFinalState->Initialize-"<<G4endl;
                                                   >> 260       it = static_cast<G4int>(niso*G4UniformRand());
312     }                                             261     }
313   }                                            << 262     else
                                                   >> 263     {
                                                   >> 264 //      G4cout << "Are we still here? "<<sum<<G4endl;
                                                   >> 265 //      G4cout << "TESTHP 23 NISO="<<niso<<G4endl;
                                                   >> 266       G4double random = G4UniformRand();
                                                   >> 267       G4double running=0;
                                                   >> 268 //      G4cout << "G4ParticleHPChannel::ApplyYourself Done the sum"<<niso<<G4endl;
                                                   >> 269 //      G4cout << "TESTHP 24 NISO="<<niso<<G4endl;
                                                   >> 270       for (G4int ix=0; ix<niso; ix++)
                                                   >> 271       {
                                                   >> 272         running += xsec[ix];
                                                   >> 273         //if(random<=running/sum) 
                                                   >> 274         if( sum == 0 || random <= running/sum ) 
                                                   >> 275         { 
                                                   >> 276           it = ix;
                                                   >> 277     break;
                                                   >> 278         }
                                                   >> 279       }
                                                   >> 280       if(it==niso) it--;
                                                   >> 281     }
                                                   >> 282     delete [] xsec;
                                                   >> 283     G4HadFinalState * theFinalState=0;
                                                   >> 284     const G4int A = (G4int)this->GetN(it);
                                                   >> 285     const G4int Z = (G4int)this->GetZ(it);
                                                   >> 286     const G4int M = (G4int)this->GetM(it);
314                                                   287 
315   // G4cout <<"THE IMPORTANT RETURN"<<G4endl;  << 288                                        //-2:Marker for Fission
316   // G4cout << "TK G4ParticleHPChannel Elastic << 289     if(wendtFissionGenerator&&anIsotope==-2)
317   //<< " Z= " << this->GetZ(it) << " A = " <<  << 290     {
318   fManager->GetReactionWhiteBoard()->SetTargA( << 291       theFinalState = wendtFissionGenerator->ApplyYourself(theTrack, Z, A);
319   fManager->GetReactionWhiteBoard()->SetTargZ( << 292     }
320   fManager->GetReactionWhiteBoard()->SetTargM( << 293 
                                                   >> 294     // Use the standard procedure if the G4FissionFragmentGenerator model fails
                                                   >> 295     if (!theFinalState)
                                                   >> 296     {
                                                   >> 297 
                                                   >> 298        G4int icounter=0;
                                                   >> 299        G4int icounter_max=1024;
                                                   >> 300        while(theFinalState==0) // Loop checking, 11.05.2015, T. Koi
                                                   >> 301        {
                                                   >> 302           icounter++;
                                                   >> 303           if ( icounter > icounter_max ) {
                                                   >> 304        G4cout << "Loop-counter exceeded the threshold value at " << __LINE__ << "th line of " << __FILE__ << "." << G4endl;
                                                   >> 305              break;
                                                   >> 306           }
                                                   >> 307 //        G4cout << "TESTHP 24 it="<<it<<G4endl;
                                                   >> 308           theFinalState = theFinalStates[it]->ApplyYourself(theTrack);
                                                   >> 309        }
                                                   >> 310     }
                                                   >> 311 
                                                   >> 312     //G4cout <<"THE IMPORTANT RETURN"<<G4endl;
                                                   >> 313     //G4cout << "TK G4ParticleHPChannel Elastic, Capture and Fission Cases "
                                                   >> 314     //<< " Z= " << this->GetZ(it) << " A = " << this->GetN(it) << G4endl;
                                                   >> 315     G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargA( A );
                                                   >> 316     G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargZ( Z );
                                                   >> 317     G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargM( M );
                                                   >> 318 
                                                   >> 319     return theFinalState;
                                                   >> 320   }
321                                                   321 
322   return theFinalState;                        << 
323 }                                              << 
324                                                   322 
325 void G4ParticleHPChannel::DumpInfo() const     << 323 void G4ParticleHPChannel::DumpInfo(){
326 {                                              << 324 
327   G4cout << " Element: " << theElement->GetNam << 325   G4cout<<" Element: "<<theElement->GetName()<<G4endl;
328   G4cout << " Directory name: " << theDir << G << 326   G4cout<<" Directory name: "<<theDir<<G4endl;
329   G4cout << " FS name: " << theFSType << G4end << 327   G4cout<<" FS name: "<<theFSType<<G4endl;
330   G4cout << " Number of Isotopes: " << niso << << 328   G4cout<<" Number of Isotopes: "<<niso<<G4endl;
331   G4cout << " Have cross sections: " << G4endl << 329   G4cout<<" Have cross sections: "<<G4endl;
332   for (int i = 0; i < niso; i++) {             << 330   for(int i=0;i<niso;i++){
333     G4cout << theFinalStates[i]->HasXsec() <<  << 331     G4cout<<theFinalStates[i]->HasXsec()<<"  ";
334   }                                            << 332   }
335   G4cout << G4endl;                            << 333   G4cout<<G4endl;
336   if (theChannelData != nullptr) {             << 334   if(theChannelData){
337     G4cout << " Cross Section (total for this  << 335     G4cout<<" Cross Section (total for this channel):"<<G4endl;
338     int np = theChannelData->GetVectorLength() << 336     int np=theChannelData->GetVectorLength();
339     G4cout << np << G4endl;                    << 337     G4cout<<np<<G4endl;
340     for (int i = 0; i < np; i++) {             << 338     for(int i=0;i<np;i++){
341       G4cout << theChannelData->GetEnergy(i) / << 339       G4cout<<theChannelData->GetEnergy(i)/eV<<"  "<<theChannelData->GetXsec(i)<<G4endl;
342     }                                             340     }
343   }                                               341   }
                                                   >> 342 
344 }                                                 343 }
                                                   >> 344  
                                                   >> 345 
                                                   >> 346 
345                                                   347