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