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 #include "G4LENDFission.hh" 26 #include "G4LENDFission.hh" 27 #include "G4SystemOfUnits.hh" 27 #include "G4SystemOfUnits.hh" 28 #include "G4Nucleus.hh" 28 #include "G4Nucleus.hh" 29 #include "G4IonTable.hh" 29 #include "G4IonTable.hh" 30 30 31 G4HadFinalState * G4LENDFission::ApplyYourself 31 G4HadFinalState * G4LENDFission::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aTarg ) 32 { 32 { 33 33 34 G4double temp = aTrack.GetMaterial()->GetTe 34 G4double temp = aTrack.GetMaterial()->GetTemperature(); 35 35 36 //migrate to integer A and Z (GetN_asInt re 36 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 37 G4int iZ = aTarg.GetZ_asInt(); 37 G4int iZ = aTarg.GetZ_asInt(); 38 G4int iA = aTarg.GetA_asInt(); 38 G4int iA = aTarg.GetA_asInt(); 39 //G4int iM = aTarg.GetM_asInt(); 39 //G4int iM = aTarg.GetM_asInt(); 40 G4int iM = 0; 40 G4int iM = 0; 41 if ( aTarg.GetIsotope() != NULL ) { 41 if ( aTarg.GetIsotope() != NULL ) { 42 iM = aTarg.GetIsotope()->Getm(); 42 iM = aTarg.GetIsotope()->Getm(); 43 } 43 } 44 44 45 G4double ke = aTrack.GetKineticEnergy(); 45 G4double ke = aTrack.GetKineticEnergy(); 46 46 47 G4HadFinalState* theResult = &theParticleCh 47 G4HadFinalState* theResult = &theParticleChange; 48 theResult->Clear(); 48 theResult->Clear(); 49 49 50 G4GIDI_target* aTarget = get_target_from_ma 50 G4GIDI_target* aTarget = get_target_from_map( lend_manager->GetNucleusEncoding( iZ , iA , iM ) ); 51 if ( aTarget == NULL ) return returnUnchang 51 if ( aTarget == NULL ) return returnUnchanged( aTrack , theResult ); 52 std::vector<G4GIDI_Product>* products = aTa 52 std::vector<G4GIDI_Product>* products = aTarget->getFissionFinalState( ke*MeV, temp, MyRNG, NULL ); 53 if ( products != NULL ) 53 if ( products != NULL ) 54 { 54 { 55 for ( G4int j = 0; j < int( products->si 55 for ( G4int j = 0; j < int( products->size() ); j++ ) 56 { 56 { 57 G4int jZ = (*products)[j].Z; 57 G4int jZ = (*products)[j].Z; 58 G4int jA = (*products)[j].A; 58 G4int jA = (*products)[j].A; 59 G4int jM = (*products)[j].m; 59 G4int jM = (*products)[j].m; 60 60 61 //G4cout << "Z = " << (*products)[ 61 //G4cout << "Z = " << (*products)[j].Z 62 // << ", A = " << (*products)[ 62 // << ", A = " << (*products)[j].A 63 // << ", EK = " << (*products)[ 63 // << ", EK = " << (*products)[j].kineticEnergy << " [MeV]" 64 // << ", px = " << (*products)[ 64 // << ", px = " << (*products)[j].px 65 // << ", py = " << (*products)[ 65 // << ", py = " << (*products)[j].py 66 // << ", pz = " << (*products)[ 66 // << ", pz = " << (*products)[j].pz 67 // << ", birthTimeSec = " << (* 67 // << ", birthTimeSec = " << (*products)[j].birthTimeSec << " [second]" 68 // << G4endl; 68 // << G4endl; 69 69 70 G4DynamicParticle* theSec = new G4Dyn 70 G4DynamicParticle* theSec = new G4DynamicParticle; 71 71 72 if ( jZ > 0 ) 72 if ( jZ > 0 ) 73 { 73 { 74 theSec->SetDefinition( G4IonTable: 74 theSec->SetDefinition( G4IonTable::GetIonTable()->GetIon( jZ, jA , jM ) ); 75 } 75 } 76 else if ( jA == 1 && jZ == 0 ) 76 else if ( jA == 1 && jZ == 0 ) 77 { 77 { 78 theSec->SetDefinition( G4Neutron:: 78 theSec->SetDefinition( G4Neutron::Neutron() ); 79 } 79 } 80 else 80 else 81 { 81 { 82 theSec->SetDefinition( G4Gamma::Ga 82 theSec->SetDefinition( G4Gamma::Gamma() ); 83 } 83 } 84 84 85 theSec->SetMomentum( G4ThreeVector( ( 85 theSec->SetMomentum( G4ThreeVector( (*products)[j].px*MeV , (*products)[j].py*MeV , (*products)[j].pz*MeV ) ); 86 //G4cout << theSec->GetDefinition()-> 86 //G4cout << theSec->GetDefinition()->GetParticleName() << G4endl; 87 theResult->AddSecondary( theSec, secI 87 theResult->AddSecondary( theSec, secID ); 88 //Set time for delayed neutrons 88 //Set time for delayed neutrons 89 //Current implementation is a little 89 //Current implementation is a little tricky, 90 if ( (*products)[j].birthTimeSec != 0 90 if ( (*products)[j].birthTimeSec != 0 ) { 91 G4double time = (*products)[j].bir 91 G4double time = (*products)[j].birthTimeSec*second + aTrack.GetGlobalTime(); 92 theResult->GetSecondary(theResult- 92 theResult->GetSecondary(theResult->GetNumberOfSecondaries()-1)->SetTime(time); 93 } 93 } 94 } 94 } 95 } 95 } 96 delete products; 96 delete products; 97 97 98 theResult->SetStatusChange( stopAndKill ); 98 theResult->SetStatusChange( stopAndKill ); 99 99 100 return theResult; 100 return theResult; 101 101 102 } 102 } 103 const std::pair<G4double, G4double> G4LENDFiss 103 const std::pair<G4double, G4double> G4LENDFission::GetFatalEnergyCheckLevels() const 104 { 104 { 105 // max energy non-conservation is mass 105 // max energy non-conservation is mass of heavy nucleus 106 //return std::pair<G4double, G4double> 106 //return std::pair<G4double, G4double>(5*perCent,250*GeV); 107 return std::pair<G4double, G4double>(5 107 return std::pair<G4double, G4double>(5*perCent,DBL_MAX); 108 } 108 } 109 109