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; 200 } 87 } 201 else { << 88 */ 202 tmp = anActive; << 89 //if(Z=theElement->GetZ()-5) throw G4HadronicException(__FILE__, __LINE__, "Channel: Do not know what to do with this material"); 203 t = a; << 90 // Bug fix by TK on behalf of AH 204 anActive = aPassive; << 91 if ( Z <=theElement->GetZ()-5 ) throw G4HadronicException(__FILE__, __LINE__, "Channel: Do not know what to do with this material"); 205 a = p; << 92 G4int count = 0; 206 aPassive = tmp; << 93 if(registerCount==0) count = theElement->GetNumberOfIsotopes(); 207 p = t; << 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); 208 } 110 } >> 111 count = 0; >> 112 G4int nIsos = niso; >> 113 if(theElement->GetNumberOfIsotopes()!=0&®isterCount==0) >> 114 { >> 115 for (G4int i1=0; i1<nIsos; i1++) >> 116 { >> 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 } >> 141 } >> 142 G4bool result = HasDataInAnyFinalState(); >> 143 return result; 209 } 144 } 210 while (a != anActive->GetVectorLength()) // << 145 >> 146 //void G4ParticleHPChannel::UpdateData(G4int A, G4int Z, G4int index, G4double abundance) >> 147 void G4ParticleHPChannel::UpdateData(G4int A, G4int Z, G4int M, G4int index, G4double abundance, G4ParticleDefinition* projectile) 211 { 148 { 212 theMerge->SetData(m_tmp++, anActive->GetEn << 149 // Initialze the G4FissionFragment generator for this isomer if needed 213 ++a; << 150 if(wendtFissionGenerator) >> 151 { >> 152 wendtFissionGenerator->InitializeANucleus(A, Z, M, theDir); >> 153 } >> 154 >> 155 theFinalStates[index]->Init(A, Z, M, theDir, theFSType, projectile); >> 156 if(!theFinalStates[index]->HasAnyData()) return; // nothing there for exactly this isotope. >> 157 >> 158 // the above has put the X-sec into the FS >> 159 theBuffer = 0; >> 160 if(theFinalStates[index]->HasXsec()) >> 161 { >> 162 theBuffer = theFinalStates[index]->GetXsec(); >> 163 theBuffer->Times(abundance/100.); >> 164 theIsotopeWiseData[index].FillChannelData(theBuffer); >> 165 } >> 166 else // get data from CrossSection directory >> 167 { >> 168 G4String tString = "/CrossSection"; >> 169 //active[index] = theIsotopeWiseData[index].Init(A, Z, abundance, theDir, tString); >> 170 active[index] = theIsotopeWiseData[index].Init(A, Z, M, abundance, theDir, tString); >> 171 if(active[index]) theBuffer = theIsotopeWiseData[index].MakeChannelData(); >> 172 } >> 173 if(theBuffer != 0) Harmonise(theChannelData, theBuffer); 214 } 174 } 215 while (p != aPassive->GetVectorLength()) // << 175 >> 176 void G4ParticleHPChannel::Harmonise(G4ParticleHPVector *& theStore, G4ParticleHPVector * theNew) 216 { 177 { 217 if (std::abs(theMerge->GetEnergy(std::max( << 178 G4int s_tmp = 0, n=0, m_tmp=0; 218 aPassive->GetEnergy(p)) / aPassive->GetEn << 179 G4ParticleHPVector * theMerge = new G4ParticleHPVector; 219 theMerge->SetData(m_tmp++, aPassive->Get << 180 G4ParticleHPVector * anActive = theStore; 220 ++p; << 181 G4ParticleHPVector * aPassive = theNew; >> 182 G4ParticleHPVector * tmp; >> 183 G4int a = s_tmp, p = n, t; >> 184 while (a<anActive->GetVectorLength()&&p<aPassive->GetVectorLength()) >> 185 { >> 186 if(anActive->GetEnergy(a) <= aPassive->GetEnergy(p)) >> 187 { >> 188 G4double xa = anActive->GetEnergy(a); >> 189 theMerge->SetData(m_tmp, xa, anActive->GetXsec(a)+std::max(0., aPassive->GetXsec(xa)) ); >> 190 m_tmp++; >> 191 a++; >> 192 G4double xp = aPassive->GetEnergy(p); >> 193 if( std::abs(std::abs(xp-xa)/xa)<0.001 ) >> 194 { >> 195 p++; >> 196 } >> 197 } else { >> 198 tmp = anActive; t=a; >> 199 anActive = aPassive; a=p; >> 200 aPassive = tmp; p=t; >> 201 } >> 202 } >> 203 while (a!=anActive->GetVectorLength()) >> 204 { >> 205 theMerge->SetData(m_tmp++, anActive->GetEnergy(a), anActive->GetXsec(a)); >> 206 a++; >> 207 } >> 208 while (p!=aPassive->GetVectorLength()) >> 209 { >> 210 if(std::abs(theMerge->GetEnergy(std::max(0,m_tmp-1))-aPassive->GetEnergy(p))/aPassive->GetEnergy(p)>0.001) >> 211 theMerge->SetData(m_tmp++, aPassive->GetEnergy(p), aPassive->GetXsec(p)); >> 212 p++; >> 213 } >> 214 delete theStore; >> 215 theStore = theMerge; 221 } 216 } 222 delete theStore; << 223 theStore = theMerge; << 224 } << 225 217 226 G4WendtFissionFragmentGenerator* G4ParticleHPC << 218 #include "G4ParticleHPThermalBoost.hh" 227 if ( wendtFissionGenerator ) return wendtFis << 228 else return nullptr; << 229 } << 230 219 231 G4HadFinalState* << 220 G4HadFinalState * G4ParticleHPChannel:: 232 G4ParticleHPChannel::ApplyYourself(const G4Had << 221 ApplyYourself(const G4HadProjectile & theTrack, G4int anIsotope) 233 G4int anIsotope, G4bool isElastic) << 222 { 234 { << 223 // G4cout << "G4ParticleHPChannel::ApplyYourself+"<<niso<<G4endl; 235 //G4cout << "G4ParticleHPChannel::ApplyYours << 224 if ( anIsotope != -1 && anIsotope != -2 ) 236 // << " ni=" << anIsotope << " isElastic=" << 225 { 237 if (anIsotope != -1 && anIsotope != -2) { << 226 //Inelastic Case 238 // Inelastic Case << 227 //G4cout << "G4ParticleHPChannel Inelastic Case" 239 //G4cout << "G4ParticleHPChannel Inelastic << 228 //<< " Z= " << this->GetZ(it) << " A = " << this->GetN(it) << G4endl; 240 //<< " Z= " << GetZ(anIsotope) << " A = " << 229 G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargA( (G4int)this->GetN(anIsotope) ); 241 fManager->GetReactionWhiteBoard()->SetTarg << 230 G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargZ( (G4int)this->GetZ(anIsotope) ); 242 fManager->GetReactionWhiteBoard()->SetTarg << 231 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 } 232 } 280 if (it == niso) it--; << 233 G4double sum=0; 281 } << 234 G4int it=0; 282 delete[] xsec; << 235 G4double * xsec = new G4double[niso]; 283 G4HadFinalState* theFinalState = nullptr; << 236 G4ParticleHPThermalBoost aThermalE; 284 const auto A = (G4int)this->GetN(it); << 237 for (G4int i=0; i<niso; i++) 285 const auto Z = (G4int)this->GetZ(it); << 238 { 286 const auto M = (G4int)this->GetM(it); << 239 if(theFinalStates[i]->HasAnyData()) 287 << 240 { 288 //-2:Marker for Fission << 241 xsec[i] = theIsotopeWiseData[i].GetXsec(aThermalE.GetThermalEnergy(theTrack, 289 if ((wendtFissionGenerator != nullptr) && an << 242 theFinalStates[i]->GetN(), 290 theFinalState = wendtFissionGenerator->App << 243 theFinalStates[i]->GetZ(), 291 } << 244 theTrack.GetMaterial()->GetTemperature())); 292 << 245 sum += xsec[i]; 293 // Use the standard procedure if the G4Fissi << 246 } 294 if (theFinalState == nullptr) { << 247 else 295 G4int icounter = 0; << 248 { 296 G4int icounter_max = 1024; << 249 xsec[i]=0; 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 } 306 // Register 0 K cross-section for DBRC << 252 if(sum == 0) 307 G4ParticleHPVector* xsforFS = theIsoto << 253 { 308 // Only G4ParticleHPElasticFS has the << 254 // G4cout << "G4ParticleHPChannel::ApplyYourself theFinalState->Initialize+"<<G4endl; 309 static_cast<G4ParticleHPElasticFS*>(th << 255 // G4cout << "G4ParticleHPChannel::ApplyYourself theFinalState->Initialize-"<<G4endl; >> 256 it = static_cast<G4int>(niso*G4UniformRand()); >> 257 } >> 258 else >> 259 { >> 260 // G4cout << "Are we still here? "<<sum<<G4endl; >> 261 // G4cout << "TESTHP 23 NISO="<<niso<<G4endl; >> 262 G4double random = G4UniformRand(); >> 263 G4double running=0; >> 264 // G4cout << "G4ParticleHPChannel::ApplyYourself Done the sum"<<niso<<G4endl; >> 265 // G4cout << "TESTHP 24 NISO="<<niso<<G4endl; >> 266 for (G4int ix=0; ix<niso; ix++) >> 267 { >> 268 running += xsec[ix]; >> 269 //if(random<=running/sum) >> 270 if( sum == 0 || random <= running/sum ) >> 271 { >> 272 it = ix; >> 273 break; >> 274 } 310 } 275 } 311 theFinalState = theFinalStates[it]->Appl << 276 if(it==niso) it--; >> 277 } >> 278 delete [] xsec; >> 279 G4HadFinalState * theFinalState=0; >> 280 const G4int A = (G4int)this->GetN(it); >> 281 const G4int Z = (G4int)this->GetZ(it); >> 282 const G4int M = (G4int)this->GetM(it); >> 283 >> 284 //-2:Marker for Fission >> 285 if(wendtFissionGenerator&&anIsotope==-2) >> 286 { >> 287 theFinalState = wendtFissionGenerator->ApplyYourself(theTrack, Z, A); 312 } 288 } 313 } << 314 289 315 // G4cout <<"THE IMPORTANT RETURN"<<G4endl; << 290 // Use the standard procedure if the G4FissionFragmentGenerator model fails 316 // G4cout << "TK G4ParticleHPChannel Elastic << 291 if (!theFinalState) 317 //<< " Z= " << this->GetZ(it) << " A = " << << 292 { 318 fManager->GetReactionWhiteBoard()->SetTargA( << 293 while(theFinalState==0) 319 fManager->GetReactionWhiteBoard()->SetTargZ( << 294 { 320 fManager->GetReactionWhiteBoard()->SetTargM( << 295 // G4cout << "TESTHP 24 it="<<it<<G4endl; >> 296 theFinalState = theFinalStates[it]->ApplyYourself(theTrack); >> 297 } >> 298 } >> 299 >> 300 //G4cout <<"THE IMPORTANT RETURN"<<G4endl; >> 301 //G4cout << "TK G4ParticleHPChannel Elastic, Capture and Fission Cases " >> 302 //<< " Z= " << this->GetZ(it) << " A = " << this->GetN(it) << G4endl; >> 303 G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargA( A ); >> 304 G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargZ( Z ); >> 305 G4ParticleHPManager::GetInstance()->GetReactionWhiteBoard()->SetTargM( M ); >> 306 >> 307 return theFinalState; >> 308 } 321 309 322 return theFinalState; << 323 } << 324 310 325 void G4ParticleHPChannel::DumpInfo() const << 311 void G4ParticleHPChannel::DumpInfo(){ 326 { << 312 327 G4cout << " Element: " << theElement->GetNam << 313 G4cout<<" Element: "<<theElement->GetName()<<G4endl; 328 G4cout << " Directory name: " << theDir << G << 314 G4cout<<" Directory name: "<<theDir<<G4endl; 329 G4cout << " FS name: " << theFSType << G4end << 315 G4cout<<" FS name: "<<theFSType<<G4endl; 330 G4cout << " Number of Isotopes: " << niso << << 316 G4cout<<" Number of Isotopes: "<<niso<<G4endl; 331 G4cout << " Have cross sections: " << G4endl << 317 G4cout<<" Have cross sections: "<<G4endl; 332 for (int i = 0; i < niso; i++) { << 318 for(int i=0;i<niso;i++){ 333 G4cout << theFinalStates[i]->HasXsec() << << 319 G4cout<<theFinalStates[i]->HasXsec()<<" "; 334 } << 320 } 335 G4cout << G4endl; << 321 G4cout<<G4endl; 336 if (theChannelData != nullptr) { << 322 if(theChannelData){ 337 G4cout << " Cross Section (total for this << 323 G4cout<<" Cross Section (total for this channel):"<<G4endl; 338 int np = theChannelData->GetVectorLength() << 324 int np=theChannelData->GetVectorLength(); 339 G4cout << np << G4endl; << 325 G4cout<<np<<G4endl; 340 for (int i = 0; i < np; i++) { << 326 for(int i=0;i<np;i++){ 341 G4cout << theChannelData->GetEnergy(i) / << 327 G4cout<<theChannelData->GetEnergy(i)/eV<<" "<<theChannelData->GetXsec(i)<<G4endl; 342 } 328 } 343 } 329 } >> 330 344 } 331 } >> 332 >> 333 >> 334 345 335