Geant4 Cross Reference |
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&®isterCount==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