Import Geant4 3.0.0 source tree
This commit is contained in:
@@ -5,13 +5,18 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4CrossSectionDataStore.hh,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4CrossSectionDataStore.hh,v 1.3 2000/12/14 08:33:02 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4CrossSectionDataStore -- header file
|
||||
// F.W. Jones, TRIUMF, 19-NOV-97
|
||||
//
|
||||
// Class Description
|
||||
// This is the class to which to register data-sets. You can get the instance
|
||||
// from energy hadronic process, and use its 'AddDataSet(...)' method to tailor
|
||||
// the cross-sectinos for your application.
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4CrossSectionDataStore_h
|
||||
#define G4CrossSectionDataStore_h 1
|
||||
|
||||
@@ -5,13 +5,19 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronCaptureDataSet.hh,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronCaptureDataSet.hh,v 1.3 2000/12/14 08:33:03 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4HadronCaptureDataSet -- header file
|
||||
// F.W. Jones, TRIUMF, 19-MAY-98
|
||||
//
|
||||
// Class Description
|
||||
// Baseline data-set for the cross-section of capture of neutroal hadrons on
|
||||
// nuclei. This does not need to be registered, but provides part of the
|
||||
// general cross-section baseline.
|
||||
// Class Description - End
|
||||
|
||||
|
||||
#ifndef G4HadronCaptureDataSet_h
|
||||
#define G4HadronCaptureDataSet_h 1
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronCrossSections.hh,v 1.3 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronCrossSections.hh,v 1.4 2000/12/14 08:33:03 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 Hadron physics class -- header file
|
||||
|
||||
@@ -5,13 +5,18 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronElasticDataSet.hh,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronElasticDataSet.hh,v 1.3 2000/12/14 08:33:04 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4HadronElasticDataSet -- header file
|
||||
// F.W. Jones, TRIUMF, 28-JAN-97
|
||||
//
|
||||
// Class Description
|
||||
// Baseline data-set for hadron nucleaus elastic cross-section. This does not
|
||||
// need to be registered, but provides part of the general cross-section
|
||||
// baseline
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4HadronElasticDataSet_h
|
||||
#define G4HadronElasticDataSet_h 1
|
||||
|
||||
@@ -5,13 +5,17 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronFissionDataSet.hh,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronFissionDataSet.hh,v 1.3 2000/12/14 08:33:04 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4HadronFissionDataSet -- header file
|
||||
// F.W. Jones, TRIUMF, 19-MAY-98
|
||||
//
|
||||
// Class Description
|
||||
// Baseline data-set for induced fission cross-section. This does not need to
|
||||
// be registered, but provides part of the general cross-section baseline
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4HadronFissionDataSet_h
|
||||
#define G4HadronFissionDataSet_h 1
|
||||
|
||||
@@ -5,13 +5,17 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronInelasticDataSet.hh,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronInelasticDataSet.hh,v 1.3 2000/12/14 08:33:04 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4HadronInelasticDataSet -- header file
|
||||
// F.W. Jones, TRIUMF, 19-MAY-98
|
||||
//
|
||||
// Class Description
|
||||
// Baseline data-set for hadron inelastic cross-section. This does not need to
|
||||
// be registered, but provides part of the general cross-section baseline
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4HadronInelasticDataSet_h
|
||||
#define G4HadronInelasticDataSet_h 1
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
|
||||
#include "globals.hh"
|
||||
#include "G4Proton.hh"
|
||||
// Class Description
|
||||
// Cross-sections for ion proton scattering up to 20 GeV, getting the low
|
||||
// energy threshold behaviour right.
|
||||
// H.P. Wellisch (TRIUMF), D. Axen (British Columbia U.). 1996.
|
||||
// Published in Phys.Rev.C54:1329-1332,1996
|
||||
// Class Description - End
|
||||
|
||||
#include "G4VCrossSectionDataSet.hh"
|
||||
#include "G4ProtonInelasticCrossSection.hh"
|
||||
|
||||
@@ -6,6 +6,12 @@
|
||||
#include "globals.hh"
|
||||
#include "G4Neutron.hh"
|
||||
|
||||
// Class Description
|
||||
// Cross-sections for neutron nuclear scattering from 14 MeV up to 20 GeV, getting the
|
||||
// low energy threshold behaviour right.
|
||||
// H.P. Wellisch (TRIUMF), M. Laidlaw (British Columbia U.). 1996.
|
||||
// Class Description - End
|
||||
|
||||
#include "G4VCrossSectionDataSet.hh"
|
||||
|
||||
class G4NeutronInelasticCrossSection : public G4VCrossSectionDataSet
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
#ifndef G4ProtonInelasticCrossSection_h
|
||||
#define G4ProtonInelasticCrossSection_h
|
||||
|
||||
// Class Description
|
||||
// Cross-sections for proton nuclear scattering up to 20 GeV, getting the low
|
||||
// energy threshold behaviour right.
|
||||
// H.P. Wellisch (TRIUMF), D. Axen (British Columbia U.). 1996.
|
||||
// Published in Phys.Rev.C54:1329-1332,1996
|
||||
// Class Description - End
|
||||
#include "globals.hh"
|
||||
#include "G4Proton.hh"
|
||||
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
#ifndef G4TripathiCrossSection_h
|
||||
#define G4TripathiCrossSection_h
|
||||
// Class Description
|
||||
// Implementation of formulas in analogy to NASA technical paper 3621 by
|
||||
// Tripathi, et al.; Cross-sections for ion ion scattering.
|
||||
|
||||
// Class Description - End
|
||||
|
||||
#include "globals.hh"
|
||||
#include "G4Proton.hh"
|
||||
|
||||
@@ -5,13 +5,18 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VCrossSectionDataSet.hh,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4VCrossSectionDataSet.hh,v 1.4 2000/12/14 11:25:57 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics abstract class: G4VCrossSectionData -- header file
|
||||
// F.W. Jones, TRIUMF, 20-JAN-97
|
||||
//
|
||||
// Class Description
|
||||
// This class serves as base class for cross-section data sets in geant4
|
||||
// hadronic physics. Users can derive their specialized classes, and register with
|
||||
// the system, or use provided data sets.
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4VCrossSectionDataSet_h
|
||||
#define G4VCrossSectionDataSet_h 1
|
||||
@@ -33,6 +38,9 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
public: //with description
|
||||
|
||||
// the following methods need to be implemented for a new data-set.
|
||||
virtual
|
||||
G4bool IsApplicable(const G4DynamicParticle*, const G4Element*) = 0;
|
||||
|
||||
@@ -45,6 +53,8 @@ public:
|
||||
virtual
|
||||
void DumpPhysicsTable(const G4ParticleDefinition&) = 0;
|
||||
|
||||
public: // Without Description
|
||||
|
||||
void SetVerboseLevel(G4int value)
|
||||
{
|
||||
verboseLevel = value;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4CrossSectionDataStore.cc,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics class: G4CrossSectionDataStore
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronCaptureDataSet.cc,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// G4 Physics class: HadronCaptureDataSet for cross sections
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronCrossSections.cc,v 1.2 1999/12/15 14:52:06 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// G4 Hadron Physics class G4HadronCrossSections
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronElasticDataSet.cc,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// G4 Physics class: HadronElasticDataSet for cross sections
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronFissionDataSet.cc,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// G4 Physics class: HadronFissionDataSet for cross sections
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronInelasticDataSet.cc,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// G4 Physics class: HadronInelasticDataSet for cross sections
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VCrossSectionDataSet.cc,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 physics abstract class: G4VCrossSectionDataSet
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4EnergyRangeManager.hh,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Energy Range Manager
|
||||
// original by H.P. Wellisch
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronInelasticProcess.hh,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronInelasticProcess.hh,v 1.4 2000/09/20 16:52:36 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Inelastic Process class
|
||||
// The specific particle inelastic processes derive from this class
|
||||
@@ -43,6 +43,7 @@
|
||||
{
|
||||
theCrossSectionDataStore->AddDataSet(new G4HadronInelasticDataSet);
|
||||
theParticle = aParticle;
|
||||
aScaleFactor = 1;
|
||||
// BuildThePhysicsTable();
|
||||
}
|
||||
|
||||
@@ -56,6 +57,8 @@
|
||||
|
||||
void BuildThePhysicsTable();
|
||||
|
||||
void BiasCrossSectionByFactor(G4double aScale) {aScaleFactor = aScale;}
|
||||
|
||||
G4double GetMicroscopicCrossSection(
|
||||
const G4DynamicParticle *aParticle,
|
||||
const G4Element *anElement);
|
||||
@@ -83,6 +86,9 @@
|
||||
G4CrossSectionDataStore* theCrossSectionDataStore;
|
||||
|
||||
G4ParticleDefinition *theParticle;
|
||||
|
||||
private:
|
||||
G4double aScaleFactor;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronicInteraction.hh,v 1.3 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4HadronicInteraction.hh,v 1.4 2000/12/14 08:40:43 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Interaction abstract base class
|
||||
// This class is the base class for the model classes.
|
||||
@@ -19,6 +19,12 @@
|
||||
// Modified by J.L.Chuma, 05-May-97 to Initialize theBlockedCounter
|
||||
// Modified by J.L.Chuma, 08-Jul-97 to implement the Nucleus changes
|
||||
// Adding a registry for memory management of hadronic models, HPW 22-Mar-99
|
||||
|
||||
// Class Description
|
||||
// This is the base class for all hadronic interaction models in geant4.
|
||||
// If you want to implement a new way of producing a final state, please inherit
|
||||
// from here.
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4HadronicInteraction_h
|
||||
#define G4HadronicInteraction_h 1
|
||||
@@ -109,8 +115,12 @@
|
||||
inline void SetVerboseLevel( G4int value )
|
||||
{ verboseLevel = value; }
|
||||
|
||||
public: // With description
|
||||
// This is the interface to implement for final state production code.
|
||||
|
||||
virtual G4VParticleChange *ApplyYourself(
|
||||
const G4Track &aTrack, G4Nucleus & targetNucleus ) = 0;
|
||||
public: // Without description
|
||||
|
||||
void DeActivateFor( G4Material *aMaterial );
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronicProcess.hh,v 1.5 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// This is the top level Hadronic Process class
|
||||
// The inelastic, elastic, capture, and fission processes
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4InelasticInteraction.hh,v 1.2 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Inelastic Interaction
|
||||
// This class is an abstract base class, since the pure virtual
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
#define G4IsoParticleChange_h
|
||||
|
||||
#include "G4Nucleus.hh"
|
||||
// Class Description
|
||||
// THis is the class you can retrieve from the hadronic process, that contains
|
||||
// the isotope production information/
|
||||
// Class Description - End
|
||||
|
||||
class G4IsoParticleChange
|
||||
{
|
||||
@@ -14,6 +18,9 @@ public:
|
||||
void SetMotherNucleus(const G4Nucleus & aTarget) {theTarget = aTarget; }
|
||||
void SetProducer(const G4String & aProducer) { theProducer = aProducer; }
|
||||
|
||||
public:// With description
|
||||
// This is the information you can retrieve.
|
||||
|
||||
G4String GetIsotope() {return theIsotope;}
|
||||
G4ThreeVector GetProductionPosition() {return thePosition;}
|
||||
G4double GetProductionTime() {return theProductionTime;}
|
||||
|
||||
@@ -5,12 +5,21 @@
|
||||
#include "G4Track.hh"
|
||||
#include "G4Nucleus.hh"
|
||||
|
||||
// Class Description
|
||||
// This is the class you inherit from, if you want to implement your special
|
||||
// isotope production model, based on your production cross-sections.
|
||||
// Registering it with the corresponding process, the particle flux from the
|
||||
// transport models will be fed into the production model, to retrieve improved
|
||||
// isotope production information.
|
||||
// Class Description - End
|
||||
class G4VIsotopeProduction
|
||||
{
|
||||
public:
|
||||
public:// With Description
|
||||
|
||||
// This is the interface to implement for isotope production models.
|
||||
virtual G4IsoResult * GetIsotope(const G4Track & aTrack, const G4Nucleus & aNucleus) = 0;
|
||||
|
||||
public:// Without Description
|
||||
G4bool operator == (const G4VIsotopeProduction & aProd)
|
||||
{
|
||||
G4bool result = false;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4EnergyRangeManager.cc,v 1.3 1999/12/15 14:52:07 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Energy Range Manager
|
||||
// original by H.P. Wellisch
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
GetMicroscopicCrossSection( aParticle, (*theElementVector)[i] );
|
||||
sigma += theAtomicNumDensityVector[i] * xSection;
|
||||
}
|
||||
sigma *= aScaleFactor;
|
||||
if( sigma > 0.0 )
|
||||
return 1.0/sigma;
|
||||
else
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronicInteraction.cc,v 1.2 1999/12/15 14:52:08 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Interaction base class
|
||||
// original by H.P. Wellisch
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4HadronicProcess.cc,v 1.8 1999/12/15 14:52:08 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// HPW to implement the choosing of an element for scattering.
|
||||
#include "g4std/fstream"
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4AlphaCoulombBarrier.hh,v 1.1 2000/06/09 11:36:49 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4CoulombBarrier.hh,v 1.1 2000/06/09 11:36:52 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4DeuteronCoulombBarrier.hh,v 1.1 2000/06/09 11:36:52 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4ExcitationHandler.hh,v 1.4 1999/12/15 14:52:15 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (May 1998)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4FissionBarrier.hh,v 1.3 2000/06/09 11:36:52 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Oct 1998)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4He3CoulombBarrier.hh,v 1.1 2000/06/09 11:36:53 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4NeutronCoulombBarrier.hh,v 1.1 2000/06/09 11:36:53 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
#ifndef G4ParaFissionModel_h
|
||||
#define G4ParaFissionModel_h
|
||||
|
||||
#include "G4CompetitiveFission.hh"
|
||||
#include "G4ExcitationHandler.hh"
|
||||
#include "G4HadronicInteraction.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
|
||||
// Class Description
|
||||
// Final state production model for (based on evaluated data
|
||||
// libraries) description of neutron induced fission below 60 MeV;
|
||||
// In case you need the fission fragments, use this model.
|
||||
// To be used in your physics list in case you need this physics.
|
||||
// In this case you want to register an object of this class with
|
||||
// the corresponding process.
|
||||
// Class Description - End
|
||||
|
||||
class G4ParaFissionModel : public G4HadronicInteraction
|
||||
{
|
||||
public:
|
||||
G4ParaFissionModel()
|
||||
{
|
||||
SetMinEnergy( 0.0 );
|
||||
SetMaxEnergy( 60.*MeV );
|
||||
}
|
||||
|
||||
virtual G4VParticleChange* ApplyYourself(const G4Track& aTrack,
|
||||
G4Nucleus& theNucleus)
|
||||
{
|
||||
theParticleChange.Initialize(aTrack);
|
||||
theParticleChange.SetStatusChange( fStopAndKill );
|
||||
theParticleChange.SetEnergyChange( 0.0 );
|
||||
|
||||
// prepare the fragment
|
||||
G4Fragment anInitialState;
|
||||
G4int anA=theNucleus.GetN();
|
||||
G4int aZ=theNucleus.GetZ();
|
||||
G4double nucMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(aZ ,anA);
|
||||
|
||||
anA += aTrack.GetDynamicParticle()->GetDefinition()->GetBaryonNumber();
|
||||
aZ += aTrack.GetDynamicParticle()->GetDefinition()->GetPDGCharge();
|
||||
|
||||
G4int numberOfEx = aTrack.GetDynamicParticle()->GetDefinition()->GetBaryonNumber();
|
||||
G4int numberOfCh = abs(aTrack.GetDynamicParticle()->GetDefinition()->GetPDGCharge());
|
||||
G4int numberOfHoles = 0;
|
||||
G4double exEnergy = 0;
|
||||
|
||||
G4ThreeVector exciton3Momentum = aTrack.GetMomentum();
|
||||
G4double compoundMass = aTrack.GetTotalEnergy();
|
||||
compoundMass += nucMass;
|
||||
compoundMass = sqrt(compoundMass*compoundMass - exciton3Momentum*exciton3Momentum);
|
||||
G4LorentzVector fragment4Momentum(exciton3Momentum,
|
||||
sqrt(exciton3Momentum.mag2()+compoundMass*compoundMass));
|
||||
|
||||
anInitialState.SetA(anA);
|
||||
anInitialState.SetZ(aZ);
|
||||
anInitialState.SetNumberOfCharged(numberOfCh);
|
||||
anInitialState.SetNumberOfHoles(numberOfHoles);
|
||||
anInitialState.SetNumberOfExcitons(numberOfEx);
|
||||
anInitialState.SetMomentum(fragment4Momentum);
|
||||
|
||||
// do the fission
|
||||
G4FragmentVector * theFissionResult = theFission.BreakUp(anInitialState);
|
||||
|
||||
// deexcite the fission fragments and fill result
|
||||
vector<G4DynamicParticle *> theResult;
|
||||
G4int ll = theFissionResult->length();
|
||||
for(G4int i=0; i<ll; i++)
|
||||
{
|
||||
G4ReactionProductVector * theExcitationResult = 0;
|
||||
if(theFissionResult->at(i)->GetExcitationEnergy()>1.*eV)
|
||||
{
|
||||
G4Fragment * aFragment = theFissionResult->at(i);
|
||||
G4double exenergy = aFragment->GetExcitationEnergy();
|
||||
theExcitationResult = theHandler.BreakItUp(*(theFissionResult->at(i)));
|
||||
// add secondaries
|
||||
for(G4int j=0; j<theExcitationResult->length(); j++)
|
||||
{
|
||||
G4DynamicParticle* p0 = new G4DynamicParticle;
|
||||
p0->SetDefinition( theExcitationResult->at(j)->GetDefinition() );
|
||||
p0->SetMomentum( theExcitationResult->at(j)->GetMomentum() );
|
||||
theResult.push_back(p0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// add secondary
|
||||
G4DynamicParticle* p0 = new G4DynamicParticle;
|
||||
p0->SetDefinition(theFissionResult->at(i)->GetParticleDefinition());
|
||||
p0->SetMomentum(theFissionResult->at(i)->GetMomentum().vect());
|
||||
theResult.push_back(p0);
|
||||
}
|
||||
}
|
||||
|
||||
// fill particle change
|
||||
for(G4int k=0; k<theResult.size(); k++)
|
||||
{
|
||||
theParticleChange.AddSecondary(theResult[k]);
|
||||
}
|
||||
|
||||
// return
|
||||
return &theParticleChange;
|
||||
}
|
||||
private:
|
||||
|
||||
G4CompetitiveFission theFission;
|
||||
G4ExcitationHandler theHandler;
|
||||
|
||||
G4ParticleChange theParticleChange;
|
||||
};
|
||||
#endif
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4ProtonCoulombBarrier.hh,v 1.1 2000/06/09 11:36:53 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4TritonCoulombBarrier.hh,v 1.1 2000/06/09 11:36:53 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VCoulombBarrier.hh,v 1.1 2000/06/09 11:36:54 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Nov 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VFissionBarrier.hh,v 1.3 2000/06/09 11:36:54 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Oct 1998)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4AlphaCoulombBarrier.cc,v 1.1 2000/06/09 11:43:34 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the RD44 GEANT4 collaboration.
|
||||
// the GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -318,7 +318,7 @@ G4int G4CompetitiveFission::FissionCharge(const G4double A,
|
||||
|
||||
G4double theZ;
|
||||
do {
|
||||
theZ = RandGauss::shoot(Zmean,sigma);
|
||||
theZ = G4RandGauss::shoot(Zmean,sigma);
|
||||
} while (theZ < 1.0 || theZ > (Z-1.0) || theZ > Af);
|
||||
// return static_cast<G4int>(theZ+0.5);
|
||||
return G4int(theZ+0.5);
|
||||
@@ -404,7 +404,7 @@ G4double G4CompetitiveFission::FissionKineticEnergy(const G4double A, const G4do
|
||||
G4double KineticEnergy;
|
||||
G4int i = 0;
|
||||
do {
|
||||
KineticEnergy = RandGauss::shoot(TaverageAfMax,ESigma);
|
||||
KineticEnergy = G4RandGauss::shoot(TaverageAfMax,ESigma);
|
||||
if (i++ > 100) return Eaverage;
|
||||
} while (KineticEnergy < Eaverage-3.72*ESigma ||
|
||||
KineticEnergy > Eaverage+3.72*ESigma ||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4CoulombBarrier.cc,v 1.1 2000/06/09 11:43:35 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4DeuteronCoulombBarrier.cc,v 1.1 2000/06/09 11:43:35 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4ExcitationHandler.cc,v 1.6 2000/06/21 14:26:24 stesting Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (May 1998)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4FissionBarrier.cc,v 1.3 2000/06/09 11:43:36 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Oct 1998)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4He3CoulombBarrier.cc,v 1.1 2000/06/09 11:43:36 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4NeutronCoulombBarrier.cc,v 1.1 2000/06/09 11:43:36 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4ProtonCoulombBarrier.cc,v 1.1 2000/06/09 11:43:36 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
+12
-2
@@ -1,4 +1,14 @@
|
||||
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4StatMFMacroCanonical.cc,v 1.6 2000/08/03 08:47:47 gcosmo Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
#include "G4StatMFMacroCanonical.hh"
|
||||
|
||||
@@ -239,7 +249,7 @@ G4StatMFChannel * G4StatMFMacroCanonical::ChooseZ(const G4int & Z,
|
||||
G4double ZDispersion = sqrt(FragmentsA(i)*__MeanTemperature/CC);
|
||||
G4int z;
|
||||
do {
|
||||
RandZ = RandGauss::shoot(ZMean,ZDispersion);
|
||||
RandZ = G4RandGauss::shoot(ZMean,ZDispersion);
|
||||
z = G4int(RandZ+0.5);
|
||||
} while (z < 0 || z > A);
|
||||
FragmentsZ(i) = z;
|
||||
|
||||
+13
-1
@@ -1,3 +1,15 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4StatMFMicroPartition.cc,v 1.8 2000/08/03 08:47:48 gcosmo Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
#include "G4StatMFMicroPartition.hh"
|
||||
|
||||
|
||||
@@ -281,7 +293,7 @@ G4StatMFChannel * G4StatMFMicroPartition::ChooseZ(const G4double A0, const G4dou
|
||||
G4double ZDispersion = sqrt(Af * MeanT/CC);
|
||||
G4int Zf;
|
||||
do {
|
||||
Zf = G4int(RandGauss::shoot(ZMean,ZDispersion));
|
||||
Zf = G4int(G4RandGauss::shoot(ZMean,ZDispersion));
|
||||
} while (Zf < 0 || Zf > Af);
|
||||
FragmentsZ.insert(Zf);
|
||||
SumZ += Zf;
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4TritonCoulombBarrier.cc,v 1.1 2000/06/09 11:43:36 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VCoulombBarrier.cc,v 1.1 2000/06/09 11:43:37 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Dec 1999)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VFissionBarrier.cc,v 1.3 2000/06/09 11:43:37 larazb Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Hadronic Process: Nuclear De-excitations
|
||||
// by V. Lara (Oct 1998)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4DiffractiveSplitableHadron.hh,v 1.3 1999/12/15 14:52:22 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
#ifndef G4DiffractiveSplitableHadron_h
|
||||
|
||||
+10
-2
@@ -5,9 +5,17 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4FTFModel.hh,v 1.3 1999/12/15 14:52:22 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4FTFModel.hh,v 1.4 2000/12/14 09:25:54 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// Class Description
|
||||
// Final state production code for hadron inelastic scattering above 20 GeV
|
||||
// based on the modeling ansatz used in FRITIOF.
|
||||
// To be used in your physics list in case you need this physics.
|
||||
// In this case you want to register an object of this class with an object
|
||||
// of G4TheoFSGenerator.
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4FTFModel_h
|
||||
#define G4FTFModel_h 1
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4FTFParticipants.hh,v 1.3 1999/12/15 14:52:23 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
#ifndef G4FTFParticipants_h
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4DiffractiveSplitableHadron.cc,v 1.2 1999/12/15 14:52:23 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
// ------------------------------------------------------------
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4FTFModel.cc,v 1.4 1999/12/15 14:52:23 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
// ------------------------------------------------------------
|
||||
|
||||
+7
-11
@@ -5,8 +5,8 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4FTFParticipants.cc,v 1.2 1999/12/15 14:52:24 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4FTFParticipants.cc,v 1.3 2000/08/19 16:23:48 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// ------------------------------------------------------------
|
||||
// GEANT 4 class implementation file
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "G4VSplitableHadron.hh"
|
||||
#include "G4PomeronCrossSection.hh"
|
||||
#include "Randomize.hh"
|
||||
#include "G4Pair.hh"
|
||||
|
||||
|
||||
// Class G4FTFParticipants
|
||||
@@ -88,15 +89,10 @@ void G4FTFParticipants::BuildInteractions(const G4ReactionProduct &thePrimary)
|
||||
|
||||
while ( theInteractions.entries() == 0 )
|
||||
{
|
||||
G4double x,y;
|
||||
do
|
||||
{
|
||||
x=2*G4UniformRand()-1;
|
||||
y=2*G4UniformRand()-1;
|
||||
} while ( (sqr(x) + sqr(y)) > 1 );
|
||||
|
||||
G4double impactX=x*xyradius;
|
||||
G4double impactY=y*xyradius;
|
||||
G4Pair<G4double, G4double> theImpactParameter;
|
||||
theImpactParameter = theNucleus->ChooseImpactXandY(xyradius);
|
||||
G4double impactX = theImpactParameter.first;
|
||||
G4double impactY = theImpactParameter.second;
|
||||
|
||||
// G4cout << " impctX, impctY " << impactX/fermi << " "<<impactY/fermi << " fm" << G4endl;
|
||||
|
||||
|
||||
+14
-2
@@ -5,9 +5,21 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4TheoFSGenerator.hh,v 1.2 1999/04/12 15:45:28 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4TheoFSGenerator.hh,v 1.3 2000/12/14 09:28:53 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
// Class Description
|
||||
// Final state production model for theoretical models of hadron inelastic
|
||||
// scattering in geant4;
|
||||
// To be used in your physics list in case you need this physics.
|
||||
// In this case you want to register an object of this class with
|
||||
// the corresponding process.
|
||||
// Note: This class is part of an implementation framework. You need to
|
||||
// register corresponding high energy generators and transport codes to
|
||||
// fill it with life.
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4TheoFSGenerator_h
|
||||
#define G4TheoFSGenerator_h 1
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4TheoFSGenerator.cc,v 1.3 1999/04/18 11:30:49 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// G4TheoFSGenerator
|
||||
#include "G4DynamicParticle.hh"
|
||||
|
||||
+6
@@ -12,6 +12,12 @@
|
||||
#include "G4ReactionProductVector.hh"
|
||||
#include "G4ReactionProduct.hh"
|
||||
|
||||
// Class Description
|
||||
// Trivial implementation of an intra-nuclear transport. It pworvides coupling
|
||||
// of high energy generators with pre equilibrium decay models.
|
||||
// To be used in your physics list in case you need this physics.
|
||||
// Class Description - End
|
||||
|
||||
class G4GeneratorPrecompoundInterface : public G4VIntraNuclearTransportModel
|
||||
{
|
||||
public:
|
||||
|
||||
+18
-7
@@ -53,6 +53,7 @@
|
||||
delete result1;
|
||||
|
||||
|
||||
|
||||
// prepare the fragment
|
||||
G4Fragment anInitialState;
|
||||
G4int anA=theNucleus->GetMassNumber();
|
||||
@@ -133,15 +134,25 @@
|
||||
|
||||
// call pre-compound
|
||||
const G4Fragment aFragment(anInitialState);
|
||||
G4ReactionProductVector * aPreResult = theDeExcitation->DeExcite(aFragment);
|
||||
|
||||
// fill pre-compound part into the result, and return
|
||||
for(G4int ll=0; ll<aPreResult->entries(); ll++)
|
||||
if(theDeExcitation)
|
||||
{
|
||||
theTotalResult->insert(aPreResult->at(ll));
|
||||
}
|
||||
delete aPreResult;
|
||||
G4ReactionProductVector * aPreResult = theDeExcitation->DeExcite(aFragment);
|
||||
|
||||
// fill pre-compound part into the result, and return
|
||||
for(G4int ll=0; ll<aPreResult->entries(); ll++)
|
||||
{
|
||||
theTotalResult->insert(aPreResult->at(ll));
|
||||
}
|
||||
delete aPreResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
// G4Exception("Please register an evaporation phase with G4GeneratorPrecompoundInterface.");
|
||||
}
|
||||
// now return
|
||||
|
||||
|
||||
result->clearAndDestroy();
|
||||
delete result;
|
||||
return theTotalResult;
|
||||
}
|
||||
|
||||
@@ -5,14 +5,16 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4V3DNucleus.hh,v 1.3 1999/12/15 14:52:37 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4V3DNucleus.hh,v 1.4 2000/08/19 16:24:03 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
#ifndef G4V3DNucleus_h
|
||||
#define G4V3DNucleus_h 1
|
||||
|
||||
class G4Nucleon;
|
||||
#include "G4DynamicParticle.hh"
|
||||
#include "G4Pair.hh"
|
||||
#include "Randomize.hh"
|
||||
|
||||
class G4V3DNucleus
|
||||
{
|
||||
@@ -42,11 +44,36 @@ class G4V3DNucleus
|
||||
virtual void DoLorentzContraction(const G4LorentzVector & theBoost) = 0;
|
||||
virtual void DoLorentzContraction(const G4ThreeVector & theBeta) = 0;
|
||||
virtual void DoTranslation(const G4ThreeVector & theShift) = 0;
|
||||
|
||||
public:
|
||||
G4Pair<G4double, G4double> ChooseImpactXandY(G4double maxImpact);
|
||||
G4Pair<G4double, G4double> RefetchImpactXandY(){return theImpactParameter;}
|
||||
|
||||
private:
|
||||
|
||||
G4Pair<G4double, G4double> theImpactParameter;
|
||||
|
||||
};
|
||||
|
||||
inline
|
||||
G4Pair<G4double, G4double> G4V3DNucleus::
|
||||
ChooseImpactXandY(G4double maxImpact)
|
||||
{
|
||||
G4double x,y;
|
||||
do
|
||||
{
|
||||
x = 2*G4UniformRand() - 1;
|
||||
y = 2*G4UniformRand() - 1;
|
||||
}
|
||||
while(x*x + y*y > 1);
|
||||
G4double impactX = x*(maxImpact);
|
||||
G4double impactY = y*(maxImpact);
|
||||
theImpactParameter.first = impactX;
|
||||
theImpactParameter.second = impactY;
|
||||
return theImpactParameter;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+9
-2
@@ -5,12 +5,19 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VHighEnergyGenerator.hh,v 1.3 1999/12/15 14:52:37 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4VHighEnergyGenerator.hh,v 1.4 2000/12/14 09:36:03 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
#ifndef G4VHighEnergyGenerator_h
|
||||
#define G4VHighEnergyGenerator_h 1
|
||||
|
||||
// Class Description
|
||||
// Base class for high energy interaction models in geant4. By merit of inheriting
|
||||
// from this class a high energy interaction model can be used in conjunction with
|
||||
// any cascade, precompound model and evaporation phase in the
|
||||
// generation of complete final states for inelastic scattering.
|
||||
// Class Description - End
|
||||
|
||||
#include "G4Nucleus.hh"
|
||||
#include "G4Track.hh"
|
||||
class G4KineticTrackVector;
|
||||
|
||||
+9
-2
@@ -5,8 +5,8 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VIntraNuclearTransportModel.hh,v 1.4 1999/12/15 14:52:37 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4VIntraNuclearTransportModel.hh,v 1.6 2000/12/14 09:36:03 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// $Id: G4IntraNuclearTransportMode.hh,v 1.0 1998/06/30
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -23,6 +23,13 @@
|
||||
#ifndef G4VIntraNuclearTransportModel_h
|
||||
#define G4VIntraNuclearTransportModel_h 1
|
||||
|
||||
// Class Description
|
||||
// Base class for intra-nuclear transport models in geant4. By merit of inheriting
|
||||
// from this class a intra-nuclear transport model can be used in conjunction with
|
||||
// any precompound, string parton model or other high energy generator in the
|
||||
// generation of final states for inelastic scattering.
|
||||
// Class Description - End
|
||||
|
||||
#include "G4V3DNucleus.hh"
|
||||
#include "G4VPreCompoundModel.hh"
|
||||
#include "G4HadronicInteraction.hh"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VKineticNucleon.hh,v 1.2 1999/12/15 14:52:37 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
#ifndef G4VKineticNucleon_h
|
||||
#define G4VKineticNucleon_h 1
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VNuclearDensity.hh,v 1.3 2000/05/23 13:41:56 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
#ifndef G4VNuclearDensity_h
|
||||
#define G4VNuclearDensity_h 1
|
||||
|
||||
+9
-2
@@ -5,13 +5,20 @@
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VPreCompoundModel.hh,v 1.3 1999/12/15 14:52:37 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// $Id: G4VPreCompoundModel.hh,v 1.4 2000/12/14 09:36:03 hpw Exp $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
#ifndef G4VPreCompoundModel_h
|
||||
#define G4VPreCompoundModel_h 1
|
||||
|
||||
// Class Description
|
||||
// Base class for pre-equilibrium decay models in geant4. By merit of inheriting
|
||||
// from this class a pre-equilibrium decay model can be used in conjunction with
|
||||
// any cascade, string parton model or other high energy generator in the
|
||||
// generation of final states for inelastic scattering.
|
||||
// Class Description - End
|
||||
|
||||
#include "G4HadronicInteraction.hh"
|
||||
#include "G4ReactionProductVector.hh"
|
||||
#include "G4ReactionProduct.hh"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4V3DNucleus.cc,v 1.2 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
#include "G4V3DNucleus.hh"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VHighEnergyGenerator.cc,v 1.2 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// G4VHighEnergyGenerator
|
||||
#include "G4VHighEnergyGenerator.hh"
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VIntraNuclearTransportModel.cc,v 1.3 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
// $Id: G4VIntraNuclearTransportModel.cc,v 1.0 1998/06/30
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VKineticNucleon.cc,v 1.2 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
#include "G4VKineticNucleon.hh"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VNuclearDensity.cc,v 1.2 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
#include "G4VNuclearDensity.hh"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VPreCompoundModel.cc,v 1.2 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
// GEANT4 tag $Name: geant4-03-00 $
|
||||
//
|
||||
|
||||
#include "G4VPreCompoundModel.hh"
|
||||
|
||||
+72
-42
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -18,62 +18,92 @@
|
||||
class G4PreCompoundAlpha : public G4VPreCompoundIon
|
||||
{
|
||||
public:
|
||||
// default constructor
|
||||
G4PreCompoundAlpha():G4VPreCompoundIon(4,2) {};
|
||||
// default constructor
|
||||
G4PreCompoundAlpha():G4VPreCompoundIon(4,2) {}
|
||||
|
||||
// copy constructor
|
||||
G4PreCompoundAlpha(const G4PreCompoundAlpha &right):
|
||||
G4VPreCompoundIon(right) {};
|
||||
// copy constructor
|
||||
G4PreCompoundAlpha(const G4PreCompoundAlpha &right): G4VPreCompoundIon(right) {}
|
||||
|
||||
~G4PreCompoundAlpha() {};
|
||||
// destructor
|
||||
~G4PreCompoundAlpha() {}
|
||||
|
||||
// operators
|
||||
const G4PreCompoundAlpha & operator=(const G4PreCompoundAlpha &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
// operators
|
||||
const G4PreCompoundAlpha & operator=(const G4PreCompoundAlpha &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
G4bool operator==(const G4PreCompoundAlpha &right) const
|
||||
{return G4VPreCompoundIon::operator==(right);};
|
||||
G4bool operator==(const G4PreCompoundAlpha &right) const
|
||||
{ return G4VPreCompoundIon::operator==(right);}
|
||||
|
||||
G4bool operator!=(const G4PreCompoundAlpha &right) const
|
||||
{return G4VPreCompoundIon::operator!=(right);};
|
||||
G4bool operator!=(const G4PreCompoundAlpha &right) const
|
||||
{ return G4VPreCompoundIon::operator!=(right);}
|
||||
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Alpha::AlphaDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
const G4DynamicParticle GetDynamicParticle() const {
|
||||
G4DynamicParticle theDynamicParticle(G4Alpha::AlphaDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
|
||||
public:
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for alphas (Af = 4)
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for alphas (Af = 4)
|
||||
|
||||
SetExcitonLevelDensityRatio((Particles*(Excitons-1.0))*
|
||||
((Particles-1.0)*(Excitons-2.0)/2.0)*
|
||||
((Particles-2.0)*(Excitons-3.0)/6.0)*
|
||||
((Particles-3.0)*(Excitons-4.0)/12.0));
|
||||
}
|
||||
SetExcitonLevelDensityRatio(((Particles*(Excitons-1.0))*
|
||||
((Particles-1.0)*(Excitons-2.0)/2.0)*
|
||||
((Particles-2.0)*(Excitons-3.0)/3.0)*
|
||||
((Particles-3.0)*(Excitons-4.0)/4.0))/6.0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 4 (alpha)
|
||||
{
|
||||
SetCondensationProbability(4096.0/(A*A*A));
|
||||
}
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 4 (alpha)
|
||||
{
|
||||
SetCondensationProbability(4096.0/(A*A*A));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
virtual G4double GetBarrierPenetrationFactor(const G4double aZ) const;
|
||||
virtual G4double GetCCoef(const G4double aZ) const;
|
||||
|
||||
};
|
||||
|
||||
inline G4double G4PreCompoundAlpha::GetBarrierPenetrationFactor(const G4double aZ) const
|
||||
{
|
||||
G4double K = 1.0;
|
||||
if (aZ>=70.0) {
|
||||
K = 0.98;
|
||||
} else {
|
||||
K = (((0.23684e-5*aZ) - 0.42143e-3)*aZ + 0.25222e-1)*aZ + 0.46699;
|
||||
}
|
||||
return K;
|
||||
}
|
||||
|
||||
inline G4double G4PreCompoundAlpha::GetCCoef(const G4double aZ) const
|
||||
{
|
||||
G4double C = 0.0;
|
||||
|
||||
if (aZ <= 30) {
|
||||
C = 0.10;
|
||||
} else if (aZ <= 50) {
|
||||
C = 0.1 + -((aZ-50.)/20.)*0.02;
|
||||
} else if (aZ < 70) {
|
||||
C = 0.08 + -((aZ-70.)/20.)*0.02;
|
||||
} else {
|
||||
C = 0.06;
|
||||
}
|
||||
return C;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+59
-31
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -17,38 +17,38 @@
|
||||
class G4PreCompoundDeuteron : public G4VPreCompoundIon
|
||||
{
|
||||
public:
|
||||
// default constructor
|
||||
G4PreCompoundDeuteron():G4VPreCompoundIon(2,1) {};
|
||||
// default constructor
|
||||
G4PreCompoundDeuteron():G4VPreCompoundIon(2,1) {};
|
||||
// copy constructor
|
||||
G4PreCompoundDeuteron(const G4PreCompoundDeuteron &right):
|
||||
G4VPreCompoundIon(right) {}
|
||||
|
||||
// destructor
|
||||
~G4PreCompoundDeuteron() {}
|
||||
|
||||
// copy constructor
|
||||
G4PreCompoundDeuteron(const G4PreCompoundDeuteron &right):
|
||||
G4VPreCompoundIon(right) {};
|
||||
// operators
|
||||
const G4PreCompoundDeuteron & operator=(const G4PreCompoundDeuteron &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
~G4PreCompoundDeuteron() {};
|
||||
|
||||
// operators
|
||||
const G4PreCompoundDeuteron & operator=(const G4PreCompoundDeuteron &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
|
||||
G4bool operator==(const G4PreCompoundDeuteron &right) const
|
||||
{return G4VPreCompoundIon::operator==(right);};
|
||||
G4bool operator==(const G4PreCompoundDeuteron &right) const
|
||||
{ return G4VPreCompoundIon::operator==(right);}
|
||||
|
||||
G4bool operator!=(const G4PreCompoundDeuteron &right) const
|
||||
{return G4VPreCompoundIon::operator!=(right);};
|
||||
G4bool operator!=(const G4PreCompoundDeuteron &right) const
|
||||
{ return G4VPreCompoundIon::operator!=(right);}
|
||||
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Deuteron::DeuteronDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Deuteron::DeuteronDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
@@ -56,21 +56,49 @@ public:
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for deuterons (Af = 2)
|
||||
|
||||
SetExcitonLevelDensityRatio(Particles*(Excitons-1.0)*
|
||||
SetExcitonLevelDensityRatio(Particles*(Excitons-1.0)*
|
||||
(Particles-1.0)*(Excitons-2.0)/2.0);
|
||||
}
|
||||
|
||||
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 2 (deuteron)
|
||||
{
|
||||
SetCondensationProbability(16.0/A);
|
||||
}
|
||||
{
|
||||
SetCondensationProbability(16.0/A);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
virtual G4double GetBarrierPenetrationFactor(const G4double aZ) const;
|
||||
virtual G4double GetCCoef(const G4double aZ) const;
|
||||
|
||||
};
|
||||
|
||||
inline G4double G4PreCompoundDeuteron::GetBarrierPenetrationFactor(const G4double aZ) const
|
||||
{
|
||||
G4double K = 1.0;
|
||||
if (aZ>=70.0) {
|
||||
K = 0.80;
|
||||
} else {
|
||||
K = (((0.2357e-5*aZ) - 0.42679e-3)*aZ + 0.27035e-1)*aZ + 0.19025;
|
||||
}
|
||||
return K+0.06;
|
||||
}
|
||||
|
||||
inline G4double G4PreCompoundDeuteron::GetCCoef(const G4double aZ) const
|
||||
{
|
||||
G4double C = 0.0;
|
||||
|
||||
if (aZ >= 70) {
|
||||
C = 0.10;
|
||||
} else {
|
||||
C = ((((0.15417e-06*aZ) - 0.29875e-04)*aZ + 0.21071e-02)*aZ - 0.66612e-01)*aZ + 0.98375;
|
||||
}
|
||||
return C/2.0;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
|
||||
#ifndef G4PreCompoundEmission_h
|
||||
#define G4PreCompoundEmission_h 1
|
||||
|
||||
#include "G4VPreCompoundFragment.hh"
|
||||
#include "G4PreCompoundFragmentVector.hh"
|
||||
#include "G4ReactionProduct.hh"
|
||||
#include "G4Fragment.hh"
|
||||
#include "Randomize.hh"
|
||||
|
||||
class G4PreCompoundEmission
|
||||
{
|
||||
public:
|
||||
G4PreCompoundEmission() {};
|
||||
~G4PreCompoundEmission() {};
|
||||
|
||||
private:
|
||||
G4PreCompoundEmission(const G4PreCompoundEmission &right);
|
||||
const G4PreCompoundEmission& operator=(const G4PreCompoundEmission &right);
|
||||
G4bool operator==(const G4PreCompoundEmission &right) const;
|
||||
G4bool operator!=(const G4PreCompoundEmission &right) const;
|
||||
|
||||
public:
|
||||
|
||||
void Initialize(const G4Fragment & aFragment)
|
||||
{
|
||||
theFragmentsVector.Initialize(aFragment);
|
||||
return;
|
||||
}
|
||||
|
||||
G4double GetTotalProbability(const G4Fragment & aFragment)
|
||||
{
|
||||
return theFragmentsVector.CalculateProbabilities(aFragment);
|
||||
}
|
||||
|
||||
G4ReactionProduct * PerformEmission(G4Fragment & aFragment);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
G4ThreeVector IsotropicRandom3Vector(G4double Magnitude = 1.0) const;
|
||||
|
||||
G4ParticleMomentum RotateMomentum(G4ParticleMomentum Pa, G4ParticleMomentum V,
|
||||
G4ParticleMomentum P) const;
|
||||
|
||||
|
||||
// A vector with the allowed emission fragments
|
||||
G4PreCompoundFragmentVector theFragmentsVector;
|
||||
|
||||
};
|
||||
#endif
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
#ifndef G4PreCompoundFragmentVector_h
|
||||
#define G4PreCompoundFragmentVector_h 1
|
||||
|
||||
|
||||
#include "G4VPreCompoundFragment.hh"
|
||||
#include "g4rw/tpordvec.h"
|
||||
|
||||
class G4PreCompoundFragmentVector
|
||||
{
|
||||
public:
|
||||
G4PreCompoundFragmentVector();
|
||||
~G4PreCompoundFragmentVector();
|
||||
|
||||
private:
|
||||
G4PreCompoundFragmentVector(const G4PreCompoundFragmentVector &right);
|
||||
const G4PreCompoundFragmentVector& operator=(const G4PreCompoundFragmentVector &right);
|
||||
G4bool operator==(const G4PreCompoundFragmentVector &right) const;
|
||||
G4bool operator!=(const G4PreCompoundFragmentVector &right) const;
|
||||
|
||||
public:
|
||||
|
||||
void Initialize(const G4Fragment & aFragment)
|
||||
{
|
||||
TotalEmissionProbability = 0.0;
|
||||
for (G4int i=0; i < theChannels.entries(); i++) theChannels(i)->Init(aFragment);
|
||||
return;
|
||||
}
|
||||
|
||||
G4double CalculateProbabilities(const G4Fragment & aFragment);
|
||||
|
||||
G4VPreCompoundFragment * ChooseFragment(void);
|
||||
|
||||
private:
|
||||
|
||||
G4RWTPtrOrderedVector<G4VPreCompoundFragment> theChannels;
|
||||
|
||||
G4double TotalEmissionProbability;
|
||||
|
||||
};
|
||||
#endif
|
||||
+73
-41
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -18,64 +18,96 @@
|
||||
class G4PreCompoundHe3 : public G4VPreCompoundIon
|
||||
{
|
||||
public:
|
||||
// default constructor
|
||||
G4PreCompoundHe3():G4VPreCompoundIon(3,2) {};
|
||||
// default constructor
|
||||
G4PreCompoundHe3():G4VPreCompoundIon(3,2) {}
|
||||
|
||||
// copy constructor
|
||||
G4PreCompoundHe3(const G4PreCompoundHe3 &right):
|
||||
G4VPreCompoundIon(right) {};
|
||||
// copy constructor
|
||||
G4PreCompoundHe3(const G4PreCompoundHe3 &right): G4VPreCompoundIon(right) {}
|
||||
|
||||
~G4PreCompoundHe3() {};
|
||||
// DEstructor
|
||||
~G4PreCompoundHe3() {}
|
||||
|
||||
// operators
|
||||
const G4PreCompoundHe3 & operator=(const G4PreCompoundHe3 &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
// operators
|
||||
const G4PreCompoundHe3 & operator=(const G4PreCompoundHe3 &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
G4bool operator==(const G4PreCompoundHe3 &right) const
|
||||
{return G4VPreCompoundIon::operator==(right);};
|
||||
G4bool operator==(const G4PreCompoundHe3 &right) const
|
||||
{ return G4VPreCompoundIon::operator==(right);}
|
||||
|
||||
G4bool operator!=(const G4PreCompoundHe3 &right) const
|
||||
{return G4VPreCompoundIon::operator!=(right);};
|
||||
G4bool operator!=(const G4PreCompoundHe3 &right) const
|
||||
{ return G4VPreCompoundIon::operator!=(right);}
|
||||
|
||||
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4He3::He3Definition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
const G4DynamicParticle GetDynamicParticle() const {
|
||||
G4DynamicParticle theDynamicParticle(G4He3::He3Definition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public:
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for He3 (Af = 3)
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for He3 (Af = 3)
|
||||
|
||||
SetExcitonLevelDensityRatio((Particles*(Excitons-1.0))*
|
||||
((Particles-1.0)*(Excitons-2.0)/2.0)*
|
||||
((Particles-2.0)*(Excitons-3.0)/6.0));
|
||||
}
|
||||
SetExcitonLevelDensityRatio(((Particles*(Excitons-1.0))*
|
||||
((Particles-1.0)*(Excitons-2.0)/2.0)*
|
||||
((Particles-2.0)*(Excitons-3.0)/3.0))/2.0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 3 (He3)
|
||||
{
|
||||
SetCondensationProbability(243.0/(A*A));
|
||||
}
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 3 (He3)
|
||||
{
|
||||
SetCondensationProbability(243.0/(A*A));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
virtual G4double GetBarrierPenetrationFactor(const G4double aZ) const;
|
||||
virtual G4double GetCCoef(const G4double aZ) const;
|
||||
|
||||
|
||||
};
|
||||
|
||||
inline G4double G4PreCompoundHe3::GetBarrierPenetrationFactor(const G4double aZ) const
|
||||
{
|
||||
G4double K = 1.0;
|
||||
if (aZ>=70.0) {
|
||||
K = 0.98;
|
||||
} else {
|
||||
K = (((0.23684e-5*aZ) - 0.42143e-3)*aZ + 0.25222e-1)*aZ + 0.46699;
|
||||
}
|
||||
return K+0.12;
|
||||
}
|
||||
|
||||
|
||||
inline G4double G4PreCompoundHe3::GetCCoef(const G4double aZ) const
|
||||
{
|
||||
G4double C = 0.0;
|
||||
|
||||
if (aZ <= 30) {
|
||||
C = 0.10;
|
||||
} else if (aZ <= 50) {
|
||||
C = 0.1 + -((aZ-50.)/20.)*0.02;
|
||||
} else if (aZ < 70) {
|
||||
C = 0.08 + -((aZ-70.)/20.)*0.02;
|
||||
} else {
|
||||
C = 0.06;
|
||||
}
|
||||
return C*(4.0/3.0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+19
-43
@@ -1,26 +1,26 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4PreCompoundModel.hh,v 1.6 1999/12/15 14:52:38 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
//
|
||||
// by V. Lara
|
||||
|
||||
// Class Description
|
||||
// Model implementation for pre-equilibrium decay models in geant4.
|
||||
// To be used in your physics list, in case you neeed this kind of physics.
|
||||
// Can be used as a stand-allone model, but also in conjunction with an intra-nuclear
|
||||
// transport, or any of the string-parton models.
|
||||
// Class Description - End
|
||||
|
||||
#ifndef G4PreCompoundModel_h
|
||||
#define G4PreCompoundModel_h 1
|
||||
|
||||
#include "G4VPreCompoundModel.hh"
|
||||
#include "G4PreCompoundNeutron.hh"
|
||||
#include "G4PreCompoundProton.hh"
|
||||
#include "G4PreCompoundDeuteron.hh"
|
||||
#include "G4PreCompoundTriton.hh"
|
||||
#include "G4PreCompoundHe3.hh"
|
||||
#include "G4PreCompoundAlpha.hh"
|
||||
#include "G4PreCompoundTransitions.hh"
|
||||
#include "G4PreCompoundEmission.hh"
|
||||
#include "G4LorentzVector.hh"
|
||||
|
||||
#include "G4NucleiProperties.hh"
|
||||
@@ -32,29 +32,23 @@
|
||||
#include "Randomize.hh"
|
||||
|
||||
|
||||
|
||||
class G4Fragment;
|
||||
|
||||
|
||||
|
||||
class G4PreCompoundModel : public G4VPreCompoundModel
|
||||
{
|
||||
public:
|
||||
|
||||
G4PreCompoundModel(G4ExcitationHandler * const value);
|
||||
G4PreCompoundModel(G4ExcitationHandler * const value) :
|
||||
G4VPreCompoundModel(value) {};
|
||||
|
||||
~G4PreCompoundModel();
|
||||
~G4PreCompoundModel() {};
|
||||
|
||||
private:
|
||||
G4PreCompoundModel() {};
|
||||
G4PreCompoundModel() {};
|
||||
|
||||
G4PreCompoundModel(const G4PreCompoundModel &right) {};
|
||||
G4PreCompoundModel(const G4PreCompoundModel &right) {};
|
||||
|
||||
const G4PreCompoundModel& operator=(const G4PreCompoundModel &right);
|
||||
|
||||
G4bool operator==(const G4PreCompoundModel &right) const;
|
||||
|
||||
G4bool operator!=(const G4PreCompoundModel &right) const;
|
||||
const G4PreCompoundModel& operator=(const G4PreCompoundModel &right);
|
||||
G4bool operator==(const G4PreCompoundModel &right) const;
|
||||
G4bool operator!=(const G4PreCompoundModel &right) const;
|
||||
|
||||
public:
|
||||
G4VParticleChange * ApplyYourself(const G4Track & thePrimary, G4Nucleus & theNucleus);
|
||||
@@ -63,28 +57,10 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
|
||||
G4ParticleChange theResult;
|
||||
|
||||
|
||||
|
||||
// static const G4int NumberOfPossibleFragments = 6;
|
||||
enum {NumberOfPossibleFragments = 6};
|
||||
|
||||
// The possible emitted fragments
|
||||
G4RWTPtrOrderedVector<G4VPreCompoundFragment> theChannels;
|
||||
|
||||
|
||||
|
||||
G4ThreeVector IsotropicRandom3Vector(G4double Magnitude = 1.0) const;
|
||||
|
||||
|
||||
void PerformEquilibriumEmission(const G4Fragment & aFragment,
|
||||
G4ReactionProductVector * theResult) const;
|
||||
|
||||
G4ParticleMomentum RotateMomentum(G4ParticleMomentum Pa, G4ParticleMomentum V,
|
||||
G4ParticleMomentum P) const;
|
||||
|
||||
|
||||
G4ParticleChange theResult;
|
||||
};
|
||||
|
||||
|
||||
|
||||
+25
-25
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -23,41 +23,41 @@
|
||||
class G4PreCompoundNeutron : public G4VPreCompoundNucleon
|
||||
{
|
||||
public:
|
||||
// default constructor
|
||||
G4PreCompoundNeutron() : G4VPreCompoundNucleon(1,0) {};
|
||||
// default constructor
|
||||
G4PreCompoundNeutron() : G4VPreCompoundNucleon(1,0) {}
|
||||
|
||||
// copy constructor
|
||||
G4PreCompoundNeutron(const G4PreCompoundNeutron &right):
|
||||
G4VPreCompoundNucleon(right) {};
|
||||
// copy constructor
|
||||
G4PreCompoundNeutron(const G4PreCompoundNeutron &right): G4VPreCompoundNucleon(right) {}
|
||||
|
||||
~G4PreCompoundNeutron() {};
|
||||
// destructor
|
||||
~G4PreCompoundNeutron() {}
|
||||
|
||||
// operators
|
||||
const G4PreCompoundNeutron & operator=(const G4PreCompoundNeutron &right) {
|
||||
if (&right != this) this->G4VPreCompoundNucleon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
// operators
|
||||
const G4PreCompoundNeutron & operator=(const G4PreCompoundNeutron &right) {
|
||||
if (&right != this) this->G4VPreCompoundNucleon::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
G4bool operator==(const G4PreCompoundNeutron &right) const
|
||||
{return G4VPreCompoundNucleon::operator==(right);};
|
||||
G4bool operator==(const G4PreCompoundNeutron &right) const
|
||||
{ return G4VPreCompoundNucleon::operator==(right);}
|
||||
|
||||
G4bool operator!=(const G4PreCompoundNeutron &right) const
|
||||
{return G4VPreCompoundNucleon::operator!=(right);};
|
||||
G4bool operator!=(const G4PreCompoundNeutron &right) const
|
||||
{ return G4VPreCompoundNucleon::operator!=(right);}
|
||||
|
||||
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Neutron::NeutronDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Neutron::NeutronDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public:
|
||||
G4double ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment);
|
||||
// Gives the kinetic energy for fragments in pre-equilibrium decay
|
||||
G4double GetKineticEnergy(const G4Fragment & aFragment);
|
||||
G4double ProbabilityDistributionFunction(const G4double & eKin, const G4Fragment & aFragment);
|
||||
|
||||
// Gives the kinetic energy for fragments in pre-equilibrium decay
|
||||
G4double GetKineticEnergy(const G4Fragment & aFragment);
|
||||
|
||||
};
|
||||
|
||||
|
||||
+2
-3
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -24,8 +24,7 @@ private:
|
||||
|
||||
|
||||
// default constructor
|
||||
G4PreCompoundParameters() : theLevelDensity(0.125) {}
|
||||
// G4PreCompoundParameters(G4int Dummy) {G4int i = Dummy;}
|
||||
G4PreCompoundParameters() : theLevelDensity(0.125/MeV) {}
|
||||
|
||||
public:
|
||||
|
||||
|
||||
+26
-24
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -21,42 +21,44 @@
|
||||
class G4PreCompoundProton : public G4VPreCompoundNucleon
|
||||
{
|
||||
public:
|
||||
// default constructor
|
||||
G4PreCompoundProton():G4VPreCompoundNucleon(1,1) {};
|
||||
// default constructor
|
||||
G4PreCompoundProton():G4VPreCompoundNucleon(1,1) {}
|
||||
|
||||
// copy constructor
|
||||
G4PreCompoundProton(const G4PreCompoundProton &right):
|
||||
G4VPreCompoundNucleon(right) {};
|
||||
// copy constructor
|
||||
G4PreCompoundProton(const G4PreCompoundProton &right): G4VPreCompoundNucleon(right) {}
|
||||
|
||||
~G4PreCompoundProton() {};
|
||||
// destructor
|
||||
~G4PreCompoundProton() {};
|
||||
|
||||
// operators
|
||||
const G4PreCompoundProton & operator=(const G4PreCompoundProton &right) {
|
||||
if (&right != this) this->G4VPreCompoundNucleon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
// operators
|
||||
const G4PreCompoundProton & operator=(const G4PreCompoundProton &right) {
|
||||
if (&right != this) this->G4VPreCompoundNucleon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
|
||||
G4bool operator==(const G4PreCompoundProton &right) const
|
||||
{return G4VPreCompoundNucleon::operator==(right);};
|
||||
G4bool operator==(const G4PreCompoundProton &right) const
|
||||
{ return G4VPreCompoundNucleon::operator==(right);}
|
||||
|
||||
|
||||
G4bool operator!=(const G4PreCompoundProton &right) const
|
||||
{return G4VPreCompoundNucleon::operator!=(right);};
|
||||
G4bool operator!=(const G4PreCompoundProton &right) const
|
||||
{ return G4VPreCompoundNucleon::operator!=(right);}
|
||||
|
||||
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Proton::ProtonDefinition(),GetMomentum());
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Proton::ProtonDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
G4double ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment);
|
||||
G4double ProbabilityDistributionFunction(const G4double & eKin, const G4Fragment & aFragment);
|
||||
|
||||
// Gives the kinetic energy for fragments in pre-equilibrium decay
|
||||
G4double GetKineticEnergy(const G4Fragment & aFragment);
|
||||
// Gives the kinetic energy for fragments in pre-equilibrium decay
|
||||
G4double GetKineticEnergy(const G4Fragment & aFragment);
|
||||
|
||||
private:
|
||||
|
||||
virtual G4double GetBarrierPenetrationFactor(const G4double aZ) const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -47,10 +47,10 @@ private:
|
||||
|
||||
|
||||
public:
|
||||
G4double GetTotalProbability()
|
||||
G4double GetTotalProbability(void)
|
||||
{ return TransitionProb1+TransitionProb2+TransitionProb3; }
|
||||
|
||||
G4int GetDeltaNExciton();
|
||||
G4Fragment PerformTransition(const G4Fragment & aFragment);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
+72
-41
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -17,64 +17,95 @@
|
||||
class G4PreCompoundTriton : public G4VPreCompoundIon
|
||||
{
|
||||
public:
|
||||
// default constructor
|
||||
G4PreCompoundTriton():G4VPreCompoundIon(3,1) {};
|
||||
// default constructor
|
||||
G4PreCompoundTriton():G4VPreCompoundIon(3,1) {}
|
||||
|
||||
// copy constructor
|
||||
G4PreCompoundTriton(const G4PreCompoundTriton &right):
|
||||
G4VPreCompoundIon(right) {};
|
||||
// copy constructor
|
||||
G4PreCompoundTriton(const G4PreCompoundTriton &right): G4VPreCompoundIon(right) {}
|
||||
|
||||
// destructor
|
||||
~G4PreCompoundTriton() {}
|
||||
|
||||
~G4PreCompoundTriton() {};
|
||||
// operators
|
||||
const G4PreCompoundTriton & operator=(const G4PreCompoundTriton &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// operators
|
||||
const G4PreCompoundTriton & operator=(const G4PreCompoundTriton &right) {
|
||||
if (&right != this) this->G4VPreCompoundIon::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
|
||||
G4bool operator==(const G4PreCompoundTriton &right) const
|
||||
{return G4VPreCompoundIon::operator==(right);};
|
||||
G4bool operator==(const G4PreCompoundTriton &right) const
|
||||
{ return G4VPreCompoundIon::operator==(right);}
|
||||
|
||||
|
||||
G4bool operator!=(const G4PreCompoundTriton &right) const
|
||||
{return G4VPreCompoundIon::operator!=(right);};
|
||||
G4bool operator!=(const G4PreCompoundTriton &right) const
|
||||
{ return G4VPreCompoundIon::operator!=(right);}
|
||||
|
||||
const G4DynamicParticle GetDynamicParticle() const
|
||||
{
|
||||
G4DynamicParticle theDynamicParticle(G4Triton::TritonDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
const G4DynamicParticle GetDynamicParticle() const {
|
||||
G4DynamicParticle theDynamicParticle(G4Triton::TritonDefinition(),GetMomentum());
|
||||
return theDynamicParticle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public:
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for tritons (Af = 3)
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af! (Af-1)!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for tritons (Af = 3)
|
||||
|
||||
SetExcitonLevelDensityRatio((Particles*(Excitons-1.0))*
|
||||
((Particles-1.0)*(Excitons-2.0)/2.0)*
|
||||
((Particles-2.0)*(Excitons-3.0)/6.0));
|
||||
SetExcitonLevelDensityRatio(((Particles*(Excitons-1.0))*
|
||||
((Particles-1.0)*(Excitons-2.0)/2.0)*
|
||||
((Particles-2.0)*(Excitons-3.0)/3.0)/2.0));
|
||||
}
|
||||
|
||||
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 3 (triton)
|
||||
{
|
||||
SetCondensationProbability(243.0/(A*A));
|
||||
}
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 3 (triton)
|
||||
{
|
||||
SetCondensationProbability(243.0/(A*A));
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
virtual G4double GetBarrierPenetrationFactor(const G4double aZ) const;
|
||||
virtual G4double GetCCoef(const G4double aZ) const;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
inline G4double G4PreCompoundTriton::GetBarrierPenetrationFactor(const G4double aZ) const
|
||||
{
|
||||
G4double K = 1.0;
|
||||
if (aZ>=70.0) {
|
||||
K = 0.80;
|
||||
} else {
|
||||
K = (((0.2357e-5*aZ) - 0.42679e-3)*aZ + 0.27035e-1)*aZ + 0.19025;
|
||||
}
|
||||
return K+0.12;
|
||||
}
|
||||
|
||||
inline G4double G4PreCompoundTriton::GetCCoef(const G4double aZ) const
|
||||
{
|
||||
G4double C = 0.0;
|
||||
|
||||
if (aZ >= 70) {
|
||||
C = 0.10;
|
||||
} else {
|
||||
C = ((((0.15417e-06*aZ) - 0.29875e-04)*aZ + 0.21071e-02)*aZ - 0.66612e-01)*aZ + 0.98375;
|
||||
}
|
||||
|
||||
return C/3.0;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+124
-216
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -13,111 +13,148 @@
|
||||
|
||||
#include "G4ios.hh"
|
||||
#include "g4std/iomanip"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
#include "G4IonTable.hh"
|
||||
//#include "G4DynamicParticle.hh"
|
||||
|
||||
#include "G4Fragment.hh"
|
||||
|
||||
class G4DynamicParticle;
|
||||
|
||||
class G4VPreCompoundFragment
|
||||
{
|
||||
// ============================
|
||||
// Constructors and destructor
|
||||
// ============================
|
||||
|
||||
protected:
|
||||
// default constructor
|
||||
G4VPreCompoundFragment() {};
|
||||
// default constructor
|
||||
G4VPreCompoundFragment() {};
|
||||
|
||||
public:
|
||||
// copy constructor
|
||||
G4VPreCompoundFragment(const G4VPreCompoundFragment &right);
|
||||
// copy constructor
|
||||
G4VPreCompoundFragment(const G4VPreCompoundFragment &right);
|
||||
|
||||
// constructor
|
||||
G4VPreCompoundFragment(const G4double anA, const G4double aZ);
|
||||
// constructor
|
||||
G4VPreCompoundFragment(const G4double anA, const G4double aZ);
|
||||
|
||||
virtual ~G4VPreCompoundFragment();
|
||||
virtual ~G4VPreCompoundFragment();
|
||||
|
||||
// operators
|
||||
const G4VPreCompoundFragment& operator=(const G4VPreCompoundFragment &right);
|
||||
// ==========
|
||||
// operators
|
||||
// ==========
|
||||
|
||||
const G4VPreCompoundFragment& operator=(const G4VPreCompoundFragment &right);
|
||||
|
||||
G4int operator==(const G4VPreCompoundFragment &right) const;
|
||||
G4int operator==(const G4VPreCompoundFragment &right) const;
|
||||
|
||||
G4int operator!=(const G4VPreCompoundFragment &right) const;
|
||||
G4int operator!=(const G4VPreCompoundFragment &right) const;
|
||||
|
||||
friend G4std::ostream& operator<<(G4std::ostream&, const G4VPreCompoundFragment*);
|
||||
friend G4std::ostream& operator<<(G4std::ostream&, const G4VPreCompoundFragment&);
|
||||
friend G4std::ostream& operator<<(G4std::ostream&, const G4VPreCompoundFragment*);
|
||||
friend G4std::ostream& operator<<(G4std::ostream&, const G4VPreCompoundFragment&);
|
||||
|
||||
|
||||
// methods
|
||||
|
||||
void Init(const G4Fragment & aFragment);
|
||||
// =====================
|
||||
// Pure Virtual methods
|
||||
// =====================
|
||||
virtual void CalcExcitonLevelDensityRatios(const G4double Excitons, const G4double Particles) = 0;
|
||||
|
||||
virtual void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles) = 0;
|
||||
|
||||
virtual G4double GetKineticEnergy(const G4Fragment & aFragment) = 0;
|
||||
virtual G4double GetKineticEnergy(const G4Fragment & aFragment) = 0;
|
||||
|
||||
// Calculates condensation probabilities to create fragment consisting from Nf nucleons
|
||||
// inside a nucleus with A nucleons
|
||||
virtual void CalcCondensationProbability(const G4double A) = 0;
|
||||
|
||||
// Calculates the total (integrated over kinetic energy) emission
|
||||
// probability of a fragment
|
||||
G4double CalcEmissionProbability(const G4Fragment & aFragment);
|
||||
|
||||
void SetA(const G4double value);
|
||||
const G4double GetA() const;
|
||||
|
||||
void SetZ(const G4double value);
|
||||
const G4double GetZ() const;
|
||||
|
||||
|
||||
void SetRestA(const G4double value);
|
||||
const G4double GetRestA() const;
|
||||
|
||||
void SetRestZ(const G4double value);
|
||||
const G4double GetRestZ() const;
|
||||
|
||||
|
||||
void SetCoulombBarrier(const G4double value);
|
||||
const G4double GetCoulombBarrier() const;
|
||||
|
||||
void SetBindingEnergy(const G4double value);
|
||||
const G4double GetBindingEnergy() const;
|
||||
|
||||
void SetMaximalKineticEnergy(const G4double value);
|
||||
const G4double GetMaximalKineticEnergy() const;
|
||||
|
||||
void SetExcitonLevelDensityRatio(const G4double value);
|
||||
const G4double GetExcitonLevelDensityRatio() const;
|
||||
|
||||
void SetEmissionProbability(const G4double value);
|
||||
const G4double GetEmissionProbability() const;
|
||||
|
||||
void SetCondensationProbability(const G4double value);
|
||||
const G4double GetCondensationProbability() const;
|
||||
|
||||
|
||||
const G4double GetNuclearMass() const;
|
||||
const G4double GetRestNuclearMass() const;
|
||||
// Calculates condensation probabilities to create clusters
|
||||
// consisting of N nucleons inside a nucleus with A nucleons
|
||||
virtual void CalcCondensationProbability(const G4double A) = 0;
|
||||
|
||||
virtual const G4DynamicParticle GetDynamicParticle() const = 0;
|
||||
|
||||
protected:
|
||||
virtual G4double ProbabilityDistributionFunction(const G4double & K,
|
||||
const G4Fragment & aFragment) = 0;
|
||||
private:
|
||||
G4double CalcCoulombBarrier(const G4double & NucRad);
|
||||
|
||||
// This method performs integration for probability function over
|
||||
// fragment kinetic energy
|
||||
G4double IntegrateEmissionProbability(const G4double & Low, const G4double & Up,
|
||||
const G4Fragment & aFragment);
|
||||
virtual G4double ProbabilityDistributionFunction(const G4double & K, const G4Fragment & aFragment) = 0;
|
||||
|
||||
public:
|
||||
void SetMomentum(const G4LorentzVector value);
|
||||
const G4LorentzVector GetMomentum() const;
|
||||
|
||||
virtual const G4DynamicParticle GetDynamicParticle() const = 0;
|
||||
// =====================
|
||||
// Initialization method
|
||||
// =====================
|
||||
void Init(const G4Fragment & aFragment);
|
||||
|
||||
// ================================================
|
||||
// Methods for calculating the emission probability
|
||||
// ================================================
|
||||
|
||||
// Calculates the total (integrated over kinetic energy) emission
|
||||
// probability of a fragment
|
||||
G4double CalcEmissionProbability(const G4Fragment & aFragment);
|
||||
|
||||
// See above (in virtual methods) the method ProbabilityDistributionFunction
|
||||
private:
|
||||
// This method performs integration for probability function over
|
||||
// fragment kinetic energy
|
||||
G4double IntegrateEmissionProbability(const G4double & Low, const G4double & Up,
|
||||
const G4Fragment & aFragment);
|
||||
|
||||
// ========================================
|
||||
// Method for calculate the Coulomb barrier
|
||||
// ========================================
|
||||
private:
|
||||
G4double CalcCoulombBarrier(const G4double NucRad, const G4double aZ);
|
||||
|
||||
// ============================
|
||||
// Data members access methods
|
||||
// ============================
|
||||
|
||||
public:
|
||||
const G4double GetA() const { return theA;}
|
||||
|
||||
const G4double GetZ() const { return theZ;}
|
||||
|
||||
const G4double GetRestA() const { return theRestNucleusA;}
|
||||
|
||||
const G4double GetRestZ() const { return theRestNucleusZ;}
|
||||
|
||||
const G4double GetCoulombBarrier() const {return theCoulombBarrier;}
|
||||
|
||||
const G4double GetBindingEnergy() const { return theBindingEnergy;}
|
||||
|
||||
const G4double GetMaximalKineticEnergy() const { return theMaximalKineticEnergy;}
|
||||
|
||||
const G4double GetExcitonLevelDensityRatio() const { return theExcitonLevelDensityRatio;}
|
||||
void SetExcitonLevelDensityRatio(const G4double value) { theExcitonLevelDensityRatio = value;}
|
||||
|
||||
void SetEmissionProbability(const G4double value) { theEmissionProbability = value;}
|
||||
|
||||
const G4double GetEmissionProbability() const { return theEmissionProbability;}
|
||||
|
||||
const G4double GetCondensationProbability() const { return theCondensationProbability;}
|
||||
void SetCondensationProbability(const G4double value) { theCondensationProbability = value;}
|
||||
|
||||
const G4double GetNuclearMass() const {
|
||||
return G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(theZ,theA);
|
||||
}
|
||||
|
||||
const G4double GetRestNuclearMass() const {
|
||||
return G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(theRestNucleusZ,theRestNucleusA);
|
||||
}
|
||||
|
||||
|
||||
|
||||
const G4double GetReducedMass() const {
|
||||
return GetRestNuclearMass()*GetNuclearMass()/(GetNuclearMass()+GetRestNuclearMass());
|
||||
}
|
||||
|
||||
const G4LorentzVector GetMomentum() const { return theMomentum;}
|
||||
|
||||
void SetMomentum(const G4LorentzVector & value) { theMomentum = value;}
|
||||
|
||||
protected:
|
||||
|
||||
virtual G4double GetBarrierPenetrationFactor(const G4double aZ) const
|
||||
{return 1.0;}
|
||||
|
||||
// virtual G4double Get
|
||||
|
||||
|
||||
|
||||
// =============
|
||||
// Data members
|
||||
// =============
|
||||
|
||||
private:
|
||||
|
||||
G4double theA;
|
||||
@@ -128,149 +165,20 @@ private:
|
||||
|
||||
G4double theRestNucleusZ;
|
||||
|
||||
G4double CoulombBarrier;
|
||||
G4double theCoulombBarrier;
|
||||
|
||||
G4double BindingEnergy;
|
||||
G4double theBindingEnergy;
|
||||
|
||||
G4double MaximalKineticEnergy;
|
||||
G4double theMaximalKineticEnergy;
|
||||
|
||||
G4double ExcitonLevelDensityRatio;
|
||||
G4double theExcitonLevelDensityRatio;
|
||||
|
||||
G4double EmissionProbability;
|
||||
G4double theEmissionProbability;
|
||||
|
||||
G4double CondensationProbability;
|
||||
G4double theCondensationProbability;
|
||||
|
||||
G4LorentzVector Momentum;
|
||||
G4LorentzVector theMomentum;
|
||||
|
||||
};
|
||||
|
||||
|
||||
inline void G4VPreCompoundFragment::SetA(const G4double value)
|
||||
{
|
||||
theA = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetA() const
|
||||
{
|
||||
return theA;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetZ(const G4double value)
|
||||
{
|
||||
theZ = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetZ() const
|
||||
{
|
||||
return theZ;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetRestA(const G4double value)
|
||||
{
|
||||
theRestNucleusA = value - theA;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetRestA() const
|
||||
{
|
||||
return theRestNucleusA;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetRestZ(const G4double value)
|
||||
{
|
||||
theRestNucleusZ = value - theZ;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetRestZ() const
|
||||
{
|
||||
return theRestNucleusZ;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetCoulombBarrier(const G4double value)
|
||||
{
|
||||
CoulombBarrier = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetCoulombBarrier() const
|
||||
{
|
||||
return CoulombBarrier;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetBindingEnergy(const G4double value)
|
||||
{
|
||||
BindingEnergy = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetBindingEnergy() const
|
||||
{
|
||||
return BindingEnergy;
|
||||
}
|
||||
|
||||
|
||||
inline void G4VPreCompoundFragment::SetMaximalKineticEnergy(const G4double value)
|
||||
{
|
||||
MaximalKineticEnergy = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetMaximalKineticEnergy() const
|
||||
{
|
||||
return MaximalKineticEnergy;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetExcitonLevelDensityRatio(const G4double value)
|
||||
{
|
||||
ExcitonLevelDensityRatio = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetExcitonLevelDensityRatio() const
|
||||
{
|
||||
return ExcitonLevelDensityRatio;
|
||||
}
|
||||
|
||||
|
||||
inline void G4VPreCompoundFragment::SetEmissionProbability(const G4double value)
|
||||
{
|
||||
EmissionProbability = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetEmissionProbability() const
|
||||
{
|
||||
return EmissionProbability;
|
||||
}
|
||||
|
||||
inline void G4VPreCompoundFragment::SetCondensationProbability(const G4double value)
|
||||
{
|
||||
CondensationProbability = value;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetCondensationProbability() const
|
||||
{
|
||||
return CondensationProbability;
|
||||
}
|
||||
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetNuclearMass() const
|
||||
// Calculate nucleus atomic mass (MeV)
|
||||
{
|
||||
return G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(theZ,theA)/MeV;
|
||||
}
|
||||
|
||||
inline const G4double G4VPreCompoundFragment::GetRestNuclearMass() const
|
||||
// Calculate nucleus atomic mass (MeV)
|
||||
{
|
||||
return G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(theRestNucleusZ,theRestNucleusA)/MeV;
|
||||
}
|
||||
|
||||
|
||||
inline void G4VPreCompoundFragment::SetMomentum(const G4LorentzVector value)
|
||||
{
|
||||
Momentum = value;
|
||||
}
|
||||
|
||||
inline const G4LorentzVector G4VPreCompoundFragment::GetMomentum() const
|
||||
{
|
||||
return Momentum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
+24
-24
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -21,44 +21,44 @@
|
||||
class G4VPreCompoundIon : public G4VPreCompoundFragment
|
||||
{
|
||||
protected:
|
||||
// default constructor
|
||||
G4VPreCompoundIon() {};
|
||||
// default constructor
|
||||
G4VPreCompoundIon() {}
|
||||
|
||||
public:
|
||||
|
||||
// copy constructor
|
||||
G4VPreCompoundIon(const G4VPreCompoundIon &right):
|
||||
G4VPreCompoundFragment(right) {};
|
||||
// copy constructor
|
||||
G4VPreCompoundIon(const G4VPreCompoundIon &right): G4VPreCompoundFragment(right) {}
|
||||
|
||||
// constructor
|
||||
G4VPreCompoundIon(const G4double anA, const G4double aZ):
|
||||
G4VPreCompoundFragment(anA,aZ) {};
|
||||
// constructor
|
||||
G4VPreCompoundIon(const G4double anA, const G4double aZ): G4VPreCompoundFragment(anA,aZ) {}
|
||||
|
||||
// destructor
|
||||
virtual ~G4VPreCompoundIon() {}
|
||||
|
||||
virtual ~G4VPreCompoundIon() {};
|
||||
|
||||
// operators
|
||||
const G4VPreCompoundIon & operator=(const G4VPreCompoundIon &right) {
|
||||
if (&right != this) this->G4VPreCompoundFragment::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
// operators
|
||||
const G4VPreCompoundIon & operator=(const G4VPreCompoundIon &right) {
|
||||
if (&right != this) this->G4VPreCompoundFragment::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
G4bool operator==(const G4VPreCompoundIon &right) const
|
||||
{return G4VPreCompoundFragment::operator==(right);};
|
||||
G4bool operator==(const G4VPreCompoundIon &right) const
|
||||
{ return G4VPreCompoundFragment::operator==(right);}
|
||||
|
||||
G4bool operator!=(const G4VPreCompoundIon &right) const
|
||||
{return G4VPreCompoundFragment::operator!=(right);};
|
||||
G4bool operator!=(const G4VPreCompoundIon &right) const
|
||||
{ return G4VPreCompoundFragment::operator!=(right);}
|
||||
|
||||
|
||||
|
||||
public:
|
||||
G4double ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment);
|
||||
G4double ProbabilityDistributionFunction(const G4double & eKin, const G4Fragment & aFragment);
|
||||
|
||||
// Gives the kinetic energy for fragments in pre-equilibrium decay
|
||||
G4double GetKineticEnergy(const G4Fragment & aFragment);
|
||||
// Gives the kinetic energy for fragments in pre-equilibrium decay
|
||||
G4double GetKineticEnergy(const G4Fragment & aFragment);
|
||||
|
||||
protected:
|
||||
|
||||
virtual G4double GetCCoef(const G4double aZ) const {return 1.0;}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+34
-37
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -17,54 +17,51 @@
|
||||
class G4VPreCompoundNucleon : public G4VPreCompoundFragment
|
||||
{
|
||||
protected:
|
||||
// copy constructor
|
||||
G4VPreCompoundNucleon() {};
|
||||
// copy constructor
|
||||
G4VPreCompoundNucleon() {};
|
||||
|
||||
public:
|
||||
|
||||
// copy constructor
|
||||
G4VPreCompoundNucleon(const G4VPreCompoundNucleon &right):
|
||||
G4VPreCompoundFragment(right) {};
|
||||
// copy constructor
|
||||
G4VPreCompoundNucleon(const G4VPreCompoundNucleon &right): G4VPreCompoundFragment(right) {}
|
||||
|
||||
// constructor
|
||||
G4VPreCompoundNucleon(const G4double anA, const G4double aZ):
|
||||
G4VPreCompoundFragment(anA,aZ) {};
|
||||
// constructor
|
||||
G4VPreCompoundNucleon(const G4double anA, const G4double aZ): G4VPreCompoundFragment(anA,aZ) {}
|
||||
|
||||
virtual ~G4VPreCompoundNucleon() {};
|
||||
virtual ~G4VPreCompoundNucleon() {}
|
||||
|
||||
// operators
|
||||
const G4VPreCompoundNucleon & operator=(const G4VPreCompoundNucleon &right) {
|
||||
if (&right != this) this->G4VPreCompoundFragment::operator=(right);
|
||||
return *this;
|
||||
};
|
||||
// operators
|
||||
const G4VPreCompoundNucleon & operator=(const G4VPreCompoundNucleon &right) {
|
||||
if (&right != this) this->G4VPreCompoundFragment::operator=(right);
|
||||
return *this;
|
||||
}
|
||||
|
||||
G4bool operator==(const G4VPreCompoundNucleon &right) const
|
||||
{return G4VPreCompoundFragment::operator==(right); };
|
||||
G4bool operator==(const G4VPreCompoundNucleon &right) const
|
||||
{ return G4VPreCompoundFragment::operator==(right);}
|
||||
|
||||
G4bool operator!=(const G4VPreCompoundNucleon &right) const
|
||||
{return G4VPreCompoundFragment::operator!=(right); };
|
||||
G4bool operator!=(const G4VPreCompoundNucleon &right) const
|
||||
{ return G4VPreCompoundFragment::operator!=(right);}
|
||||
|
||||
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,
|
||||
const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for nucleons (Af = 1)
|
||||
void CalcExcitonLevelDensityRatios(const G4double Excitons,const G4double Particles)
|
||||
{
|
||||
// Level density ratios are calculated according to the formula
|
||||
// (P!*(N-1)!)/((P-Af)!*(N-1-Af)!*Af!)
|
||||
// where P is number of particles
|
||||
// N is number of excitons
|
||||
// Af atomic number of emitting fragment
|
||||
// the next is a simplification for nucleons (Af = 1)
|
||||
|
||||
SetExcitonLevelDensityRatio(Particles*(Excitons-1.0));
|
||||
}
|
||||
SetExcitonLevelDensityRatio(Particles*(Excitons-1.0));
|
||||
}
|
||||
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a fragment
|
||||
// consisting from N nucleons inside a nucleus with A nucleons
|
||||
// This value comes from the formula N^3 (N/A)^(N-1) with N = 1 (nucleon)
|
||||
{
|
||||
SetCondensationProbability(1.0);
|
||||
}
|
||||
void CalcCondensationProbability(const G4double A)
|
||||
// This method computes condensation probability to create a cluster
|
||||
// consisting of N nucleons inside a nucleus with A nucleons.
|
||||
// For Nucleons this probability is, of course, equal to 1
|
||||
{
|
||||
SetCondensationProbability(1.0);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
#include "G4PreCompoundEmission.hh"
|
||||
|
||||
const G4PreCompoundEmission & G4PreCompoundEmission::operator=(const G4PreCompoundEmission &right)
|
||||
{
|
||||
G4Exception("G4PreCompoundEmission::operator= meant to not be accessable");
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
G4bool G4PreCompoundEmission::operator==(const G4PreCompoundEmission &right) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
G4bool G4PreCompoundEmission::operator!=(const G4PreCompoundEmission &right) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
G4ReactionProduct * G4PreCompoundEmission::PerformEmission(G4Fragment & aFragment)
|
||||
{
|
||||
// Choose a Fragment for emission
|
||||
G4VPreCompoundFragment * theFragment = theFragmentsVector.ChooseFragment();
|
||||
|
||||
// Kinetic Energy of emitted fragment
|
||||
G4double KineticEnergyOfEmittedFragment = theFragment->GetKineticEnergy(aFragment);
|
||||
|
||||
// Sample the Fermi momentum of emitted fragment
|
||||
static const G4double FermiMaxMom = 250.0*MeV;
|
||||
G4ThreeVector FermiMomentum(IsotropicRandom3Vector(FermiMaxMom*pow(G4UniformRand(),1./3.)));
|
||||
|
||||
// Get the fragment momentum
|
||||
G4ThreeVector P12(aFragment.GetMomentum().vect());
|
||||
// Share the fragment momentum between the particles system
|
||||
P12 *= 1.0/G4double(aFragment.GetNumberOfParticles());
|
||||
// Add the Fermi momentum
|
||||
P12 += FermiMomentum;
|
||||
|
||||
// Calculate the momentum magnitude of emitted fragment
|
||||
G4double EmittedMass = theFragment->GetNuclearMass();
|
||||
G4double p = sqrt(KineticEnergyOfEmittedFragment*(KineticEnergyOfEmittedFragment+2.0*EmittedMass));
|
||||
// And sample a direction for it
|
||||
G4ParticleMomentum momentum;
|
||||
if (aFragment.GetMomentum().boostVector().mag2() > 1.e-7) {
|
||||
// sample a non-isotropic random vector
|
||||
G4double CosTheta = sqrt(G4UniformRand());
|
||||
G4double SinTheta = sqrt(1.0 - CosTheta*CosTheta);
|
||||
G4double Phi = twopi*G4UniformRand();
|
||||
momentum = G4ParticleMomentum(p*cos(Phi)*SinTheta,
|
||||
p*sin(Phi)*SinTheta,
|
||||
p*CosTheta);
|
||||
momentum = RotateMomentum(P12,aFragment.GetMomentum().boostVector(),momentum);
|
||||
} else {
|
||||
momentum = IsotropicRandom3Vector(p);
|
||||
}
|
||||
|
||||
// Now we can calculate the four momentum
|
||||
G4LorentzVector EmittedMomentum(momentum,sqrt(momentum.mag2()+EmittedMass*EmittedMass));
|
||||
|
||||
|
||||
// Excitation energy
|
||||
G4double anU = theFragment->GetMaximalKineticEnergy() - KineticEnergyOfEmittedFragment +
|
||||
theFragment->GetCoulombBarrier();
|
||||
|
||||
// check that Excitation energy is > 0
|
||||
if (anU < 0.0) G4Exception("G4PreCompoundModel::DeExcite: Excitation energy less than 0!");
|
||||
|
||||
// Update nucleus parameters
|
||||
// Number of excitons
|
||||
aFragment.SetNumberOfExcitons(aFragment.GetNumberOfExcitons()-
|
||||
G4int(theFragment->GetA()));
|
||||
// Number of charges
|
||||
aFragment.SetNumberOfCharged(aFragment.GetNumberOfCharged()-
|
||||
G4int(theFragment->GetZ()));
|
||||
|
||||
// Atomic number
|
||||
aFragment.SetA(theFragment->GetRestA());
|
||||
|
||||
// Charge
|
||||
aFragment.SetZ(theFragment->GetRestZ());
|
||||
|
||||
|
||||
// Calculate the residual Fragment momentum
|
||||
G4double ResidualMass = theFragment->GetRestNuclearMass()+anU;
|
||||
G4LorentzVector RestMomentum(-momentum,sqrt(momentum.mag2()+ ResidualMass*ResidualMass));
|
||||
|
||||
// Perform Lorentz boosts
|
||||
EmittedMomentum.boost(aFragment.GetMomentum().boostVector());
|
||||
RestMomentum.boost(aFragment.GetMomentum().boostVector());
|
||||
|
||||
|
||||
// Update nucleus momentum
|
||||
aFragment.SetMomentum(RestMomentum);
|
||||
|
||||
// Set emitted fragment momentum
|
||||
theFragment->SetMomentum(EmittedMomentum);
|
||||
|
||||
G4DynamicParticle MyDP = theFragment->GetDynamicParticle();
|
||||
G4ReactionProduct * theNew = new G4ReactionProduct(MyDP.GetDefinition());
|
||||
theNew->SetMomentum(MyDP.GetMomentum());
|
||||
theNew->SetTotalEnergy(MyDP.Get4Momentum().e());
|
||||
|
||||
return theNew;
|
||||
}
|
||||
|
||||
|
||||
G4ThreeVector G4PreCompoundEmission::IsotropicRandom3Vector(G4double Magnitude) const
|
||||
// Create a unit vector with a random direction isotropically distributed
|
||||
{
|
||||
|
||||
G4double CosTheta = 1.0 - 2.0*G4UniformRand();
|
||||
G4double SinTheta = sqrt(1.0 - CosTheta*CosTheta);
|
||||
G4double Phi = twopi*G4UniformRand();
|
||||
G4ThreeVector Vector(Magnitude*cos(Phi)*SinTheta,
|
||||
Magnitude*sin(Phi)*SinTheta,
|
||||
Magnitude*CosTheta);
|
||||
|
||||
return Vector;
|
||||
|
||||
}
|
||||
|
||||
|
||||
G4ParticleMomentum G4PreCompoundEmission::RotateMomentum(G4ParticleMomentum Pa,
|
||||
G4ParticleMomentum V,
|
||||
G4ParticleMomentum P) const
|
||||
{
|
||||
G4ParticleMomentum U = Pa.unit();
|
||||
|
||||
G4double Alpha1 = U * V;
|
||||
|
||||
G4double Alpha2 = sqrt(V.mag2() - Alpha1*Alpha1);
|
||||
|
||||
G4ThreeVector N = (1./Alpha2)*U.cross(V);
|
||||
|
||||
G4ParticleMomentum RotatedMomentum(
|
||||
( (V.x() - Alpha1*U.x())/Alpha2 ) * P.x() + N.x() * P.y() + U.x() * P.z(),
|
||||
( (V.y() - Alpha1*U.y())/Alpha2 ) * P.x() + N.y() * P.y() + U.y() * P.z(),
|
||||
( (V.z() - Alpha1*U.z())/Alpha2 ) * P.x() + N.z() * P.y() + U.z() * P.z()
|
||||
);
|
||||
return RotatedMomentum;
|
||||
}
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
#include "G4PreCompoundFragmentVector.hh"
|
||||
|
||||
#include "G4PreCompoundNeutron.hh"
|
||||
#include "G4PreCompoundProton.hh"
|
||||
#include "G4PreCompoundDeuteron.hh"
|
||||
#include "G4PreCompoundTriton.hh"
|
||||
#include "G4PreCompoundHe3.hh"
|
||||
#include "G4PreCompoundAlpha.hh"
|
||||
|
||||
G4PreCompoundFragmentVector::G4PreCompoundFragmentVector() :
|
||||
TotalEmissionProbability(0.0)
|
||||
{
|
||||
// neutron
|
||||
theChannels.insert(new G4PreCompoundNeutron());
|
||||
// proton
|
||||
theChannels.insert(new G4PreCompoundProton());
|
||||
// deuterium
|
||||
theChannels.insert(new G4PreCompoundDeuteron());
|
||||
// triton
|
||||
theChannels.insert(new G4PreCompoundTriton());
|
||||
// helium3
|
||||
theChannels.insert(new G4PreCompoundHe3());
|
||||
// alpha
|
||||
theChannels.insert(new G4PreCompoundAlpha());
|
||||
}
|
||||
|
||||
|
||||
G4PreCompoundFragmentVector::~G4PreCompoundFragmentVector()
|
||||
{
|
||||
theChannels.clearAndDestroy();
|
||||
}
|
||||
|
||||
const G4PreCompoundFragmentVector & G4PreCompoundFragmentVector::operator=(const G4PreCompoundFragmentVector &right)
|
||||
{
|
||||
G4Exception("G4PreCompoundFragmentVector::operator= meant to not be accessable");
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
G4bool G4PreCompoundFragmentVector::operator==(const G4PreCompoundFragmentVector &right) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
G4bool G4PreCompoundFragmentVector::operator!=(const G4PreCompoundFragmentVector &right) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
G4double G4PreCompoundFragmentVector::CalculateProbabilities(const G4Fragment & aFragment)
|
||||
{
|
||||
TotalEmissionProbability = 0.0;
|
||||
for (G4int i = 0; i < theChannels.entries(); i++) {
|
||||
theChannels(i)->CalcExcitonLevelDensityRatios(aFragment.GetNumberOfExcitons(),
|
||||
aFragment.GetNumberOfParticles());
|
||||
theChannels(i)->CalcCondensationProbability(aFragment.GetA());
|
||||
// Calculate emission probailities
|
||||
if (aFragment.GetNumberOfParticles() <= theChannels(i)->GetA()-0.01) {
|
||||
// if number of particles less than a fragment atomic number
|
||||
// set probability to emit a fragment 0
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
} else if (aFragment.GetNumberOfExcitons() <= theChannels(i)->GetA()+0.01 &&
|
||||
aFragment.GetNumberOfExcitons() != 1) {
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
} else if (aFragment.GetNumberOfCharged() <= theChannels(i)->GetZ()-0.01) {
|
||||
// if number of charged particles (protons) is less than charge of fragment
|
||||
// set probability to emit a fragment 0
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
} else if (theChannels(i)->GetMaximalKineticEnergy() <= 0.0) {
|
||||
// if the energy threshold for emitted fragment is less or equal 0
|
||||
// set probability to emit a fragment 0
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
} else {
|
||||
// Compute total (integrated over kinetic energy) emission
|
||||
// probability of a fragment and
|
||||
// Summing channel emission probabilities
|
||||
TotalEmissionProbability += theChannels(i)->CalcEmissionProbability(aFragment);
|
||||
}
|
||||
}
|
||||
return TotalEmissionProbability;
|
||||
}
|
||||
|
||||
|
||||
G4VPreCompoundFragment * G4PreCompoundFragmentVector::ChooseFragment(void)
|
||||
{
|
||||
const G4int NumOfFrags = theChannels.entries();
|
||||
G4double * running = new G4double[NumOfFrags];
|
||||
running[0] = theChannels(0)->GetEmissionProbability();
|
||||
G4int i;
|
||||
for (i = 1; i < NumOfFrags; i++) {
|
||||
running[i]=running[i-1]+theChannels(i)->GetEmissionProbability();
|
||||
}
|
||||
|
||||
// Choose an emission channel
|
||||
G4double aChannel = G4UniformRand()*TotalEmissionProbability;
|
||||
G4int ChosenChannel = -1;
|
||||
for (i = 0; i < NumOfFrags; i++) {
|
||||
if (aChannel <= running[i]) {
|
||||
ChosenChannel = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
delete [] running;
|
||||
if (ChosenChannel < 0)
|
||||
G4Exception("G4PreCompoundFragmentVector::ChooseFragment: I can't determine a channel");
|
||||
|
||||
return theChannels(ChosenChannel);
|
||||
}
|
||||
|
||||
|
||||
+61
-273
@@ -1,44 +1,16 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4PreCompoundModel.cc,v 1.8 1999/12/15 14:52:39 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-02-00 $
|
||||
//
|
||||
// by V. Lara
|
||||
|
||||
#include "G4PreCompoundModel.hh"
|
||||
|
||||
|
||||
|
||||
G4PreCompoundModel::G4PreCompoundModel(G4ExcitationHandler * const value):
|
||||
G4VPreCompoundModel(value)
|
||||
{
|
||||
// neutron
|
||||
theChannels.insert(new G4PreCompoundNeutron());
|
||||
// proton
|
||||
theChannels.insert(new G4PreCompoundProton());
|
||||
// deuterium
|
||||
theChannels.insert(new G4PreCompoundDeuteron());
|
||||
// triton
|
||||
theChannels.insert(new G4PreCompoundTriton());
|
||||
// helium3
|
||||
theChannels.insert(new G4PreCompoundHe3());
|
||||
// alpha
|
||||
theChannels.insert(new G4PreCompoundAlpha());
|
||||
}
|
||||
|
||||
|
||||
|
||||
G4PreCompoundModel::~G4PreCompoundModel()
|
||||
{
|
||||
theChannels.clearAndDestroy();
|
||||
}
|
||||
|
||||
|
||||
const G4PreCompoundModel & G4PreCompoundModel::operator=(const G4PreCompoundModel &right)
|
||||
{
|
||||
G4Exception("G4PreCompoundModel::operator= meant to not be accessable");
|
||||
@@ -67,12 +39,12 @@ G4VParticleChange * G4PreCompoundModel::ApplyYourself(const G4Track & thePrimary
|
||||
|
||||
// prepare fragment
|
||||
G4Fragment anInitialState;
|
||||
G4int anA=theNucleus.GetN();
|
||||
G4int anA=G4int(theNucleus.GetN());
|
||||
anA += thePrimary.GetDynamicParticle()->GetDefinition()->GetBaryonNumber();
|
||||
anInitialState.SetA(anA);
|
||||
|
||||
G4int aZ=theNucleus.GetZ();
|
||||
aZ += thePrimary.GetDynamicParticle()->GetDefinition()->GetPDGCharge();
|
||||
G4int aZ=G4int(theNucleus.GetZ());
|
||||
aZ += G4int(thePrimary.GetDynamicParticle()->GetDefinition()->GetPDGCharge());
|
||||
anInitialState.SetZ(aZ);
|
||||
|
||||
|
||||
@@ -129,270 +101,86 @@ G4VParticleChange * G4PreCompoundModel::ApplyYourself(const G4Track & thePrimary
|
||||
G4ReactionProductVector* G4PreCompoundModel::DeExcite(const G4Fragment & theInitialState) const
|
||||
{
|
||||
|
||||
G4ReactionProductVector * Result = new G4ReactionProductVector;
|
||||
// result = GetExcitationHandler()->BreakItUp(aFragment);
|
||||
G4ReactionProductVector * Result = new G4ReactionProductVector;
|
||||
|
||||
G4Fragment aFragment(theInitialState);
|
||||
// Copy of the initial state
|
||||
G4Fragment aFragment(theInitialState);
|
||||
|
||||
|
||||
// Main loop. It is performed until equilibrium deexcitation.
|
||||
for (;;) {
|
||||
|
||||
// Compute atomic numbers and charges for rest nuclei
|
||||
for (G4int i = 0; i < NumberOfPossibleFragments; i++) {
|
||||
theChannels(i)->Init(aFragment);
|
||||
}
|
||||
|
||||
// Equilibrium exciton number
|
||||
G4double EquilibriumExcitonNumber = sqrt(1.19*G4PreCompoundParameters::GetAddress()->GetLevelDensity()*
|
||||
aFragment.GetA()*aFragment.GetExcitationEnergy()/MeV+0.5);
|
||||
|
||||
// Loop for transitions, it is performed while there are preequilibrium transitions.
|
||||
G4bool ThereIsTransition = false;
|
||||
do {
|
||||
if (aFragment.GetNumberOfExcitons() < EquilibriumExcitonNumber) {
|
||||
if (aFragment.GetNumberOfParticles() < 1) {
|
||||
aFragment.SetNumberOfHoles(aFragment.GetNumberOfHoles()+1);
|
||||
aFragment.SetNumberOfExcitons(aFragment.GetNumberOfExcitons()+2);
|
||||
}
|
||||
|
||||
G4double TotalEmissionProbability = 0.0;
|
||||
G4int i;
|
||||
for (i = 0; i < NumberOfPossibleFragments; i++) {
|
||||
theChannels(i)->CalcExcitonLevelDensityRatios(aFragment.GetNumberOfParticles()+
|
||||
aFragment.GetNumberOfHoles(),
|
||||
aFragment.GetNumberOfParticles());
|
||||
theChannels(i)->CalcCondensationProbability(aFragment.GetA());
|
||||
// Calculate emission probailities
|
||||
if (aFragment.GetNumberOfParticles() <= theChannels(i)->GetA()-0.01)
|
||||
// if number of particles less than a fragment atomic number
|
||||
// set probability to emit a fragment 0
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
else if (aFragment.GetNumberOfExcitons() <= theChannels(i)->GetA()+0.01 &&
|
||||
aFragment.GetNumberOfExcitons() != 1)
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
else if (aFragment.GetNumberOfCharged() <= theChannels(i)->GetZ()-0.01)
|
||||
// if number of charged particles (protons) is less than charge of fragment
|
||||
// set probability to emit a fragment 0
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
else if (theChannels(i)->GetMaximalKineticEnergy() <= 0.0)
|
||||
// if the energy threshold for emitted fragment is less or equal 0
|
||||
// set probability to emit a fragment 0
|
||||
theChannels(i)->SetEmissionProbability(0.0);
|
||||
else
|
||||
// Compute total (integrated over kinetic energy) emission
|
||||
// probability of a fragment and
|
||||
// Summing channel emission probabilities
|
||||
TotalEmissionProbability += theChannels(i)->CalcEmissionProbability(aFragment);
|
||||
}
|
||||
// Main loop. It is performed until equilibrium deexcitation.
|
||||
for (;;) {
|
||||
G4PreCompoundEmission aEmission;
|
||||
// Initialize fragment according with the nucleus parameters
|
||||
aEmission.Initialize(aFragment);
|
||||
|
||||
// Equilibrium exciton number
|
||||
G4double EquilibriumExcitonNumber =
|
||||
sqrt(1.19*G4PreCompoundParameters::GetAddress()->GetLevelDensity()*aFragment.GetA()*
|
||||
aFragment.GetExcitationEnergy()+0.5);
|
||||
|
||||
// Loop for transitions, it is performed while there are preequilibrium transitions.
|
||||
G4bool ThereIsTransition = false;
|
||||
do {
|
||||
if (aFragment.GetNumberOfExcitons() < EquilibriumExcitonNumber) {
|
||||
if (aFragment.GetNumberOfParticles() < 1) {
|
||||
aFragment.SetNumberOfHoles(aFragment.GetNumberOfHoles()+1);
|
||||
aFragment.SetNumberOfExcitons(aFragment.GetNumberOfExcitons()+2);
|
||||
}
|
||||
|
||||
G4double TotalEmissionProbability = aEmission.GetTotalProbability(aFragment);
|
||||
|
||||
// Check if number of excitons is greater than 0
|
||||
// else perform equilibrium emission
|
||||
if (aFragment.GetNumberOfExcitons() <= 0) {
|
||||
// Perform Equilibrium Emission
|
||||
PerformEquilibriumEmission(aFragment,Result);
|
||||
return Result;
|
||||
}
|
||||
// Check if number of excitons is greater than 0
|
||||
// else perform equilibrium emission
|
||||
if (aFragment.GetNumberOfExcitons() <= 0) {
|
||||
// Perform Equilibrium Emission
|
||||
PerformEquilibriumEmission(aFragment,Result);
|
||||
return Result;
|
||||
}
|
||||
|
||||
G4PreCompoundTransitions aTransition(aFragment);
|
||||
|
||||
// Sum of transition probabilities
|
||||
G4double TotalTransitionProbability = aTransition.GetTotalProbability();
|
||||
|
||||
G4PreCompoundTransitions aTransition(aFragment);
|
||||
// Sum of all probabilities
|
||||
G4double TotalProbability = TotalEmissionProbability + TotalTransitionProbability;
|
||||
|
||||
// Sum of transition probabilities
|
||||
G4double TotalTransitionProbability = aTransition.GetTotalProbability();
|
||||
|
||||
// Sum of all probabilities
|
||||
G4double TotalProbability = TotalEmissionProbability + TotalTransitionProbability;
|
||||
|
||||
|
||||
// Select subprocess
|
||||
if (G4UniformRand() > TotalEmissionProbability/TotalProbability) {
|
||||
// It will be transition to state with a new number of excitons
|
||||
ThereIsTransition = true;
|
||||
G4int deltaN = aTransition.GetDeltaNExciton();
|
||||
aFragment.SetNumberOfExcitons(aFragment.GetNumberOfExcitons()+deltaN);
|
||||
aFragment.SetNumberOfHoles(aFragment.GetNumberOfHoles()+deltaN/2);
|
||||
// With weight Z/A, number of charged particles is decreased on +1
|
||||
if ((deltaN > 0 || aFragment.GetNumberOfCharged() > 0) &&
|
||||
(G4UniformRand() <= aFragment.GetZ()/aFragment.GetA()))
|
||||
aFragment.SetNumberOfCharged(aFragment.GetNumberOfCharged()+deltaN/2);
|
||||
} else {
|
||||
// It will be fragment emission
|
||||
ThereIsTransition = false;
|
||||
G4double * running = new G4double[NumberOfPossibleFragments];
|
||||
running[0] = theChannels(0)->GetEmissionProbability();
|
||||
for (i = 1; i < NumberOfPossibleFragments; i++)
|
||||
running[i]=running[i-1]+theChannels(i)->GetEmissionProbability();
|
||||
|
||||
// Choose an emission channel
|
||||
G4double ChoosedChannel = G4UniformRand()*TotalEmissionProbability;
|
||||
G4int aChannel = -1;
|
||||
for (i = 0; i < NumberOfPossibleFragments; i++) {
|
||||
if (ChoosedChannel <= running[i]) {
|
||||
aChannel = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
delete [] running;
|
||||
|
||||
// Compute Kinetic Energy of emitted fragment
|
||||
G4double KineticEnergyOfEmittedFragment =
|
||||
theChannels(aChannel)->GetKineticEnergy(aFragment);
|
||||
|
||||
// Select subprocess
|
||||
if (G4UniformRand() > TotalEmissionProbability/TotalProbability) {
|
||||
// It will be transition to state with a new number of excitons
|
||||
ThereIsTransition = true;
|
||||
|
||||
// Perform the transition
|
||||
aFragment = aTransition.PerformTransition(aFragment);
|
||||
} else {
|
||||
// It will be fragment emission
|
||||
ThereIsTransition = false;
|
||||
|
||||
// G4cout << "Kinetic energy of Emitted fragment " << KineticEnergyOfEmittedFragment << G4endl;
|
||||
|
||||
// Sample Fermi momentum of emitted fragment
|
||||
static const G4double FermiMaxMom = 250.0; // MeV
|
||||
G4ThreeVector FermiMomentum(IsotropicRandom3Vector(FermiMaxMom*pow(G4UniformRand(),1./3.)));
|
||||
|
||||
G4ThreeVector P12(FermiMomentum +
|
||||
// (1/#Particles before emission)
|
||||
( 1.0/G4double(aFragment.GetNumberOfParticles()) )*
|
||||
aFragment.GetMomentum().vect()
|
||||
);
|
||||
|
||||
|
||||
|
||||
G4double p = sqrt(KineticEnergyOfEmittedFragment*(KineticEnergyOfEmittedFragment+
|
||||
2.0*theChannels(aChannel)->GetNuclearMass()));
|
||||
G4ParticleMomentum momentum;
|
||||
|
||||
|
||||
if (aFragment.GetMomentum().boostVector().mag2() > 1.e-7) {
|
||||
// sample a non-isotropic random vector
|
||||
G4double CosTheta = sqrt(G4UniformRand());
|
||||
G4double SinTheta = sqrt(1.0 - CosTheta*CosTheta);
|
||||
G4double Phi = twopi*G4UniformRand();
|
||||
momentum = G4ParticleMomentum(p*cos(Phi)*SinTheta,
|
||||
p*sin(Phi)*SinTheta,
|
||||
p*CosTheta);
|
||||
momentum = RotateMomentum(P12,aFragment.GetMomentum().boostVector(),momentum);
|
||||
|
||||
} else {
|
||||
|
||||
momentum = IsotropicRandom3Vector(p);
|
||||
|
||||
}
|
||||
|
||||
|
||||
G4LorentzVector EmittedMomentum(momentum,
|
||||
sqrt(momentum.mag2()+
|
||||
theChannels(aChannel)->GetNuclearMass() *
|
||||
theChannels(aChannel)->GetNuclearMass() )
|
||||
);
|
||||
|
||||
// Excitation energy
|
||||
// check that Excitation energy is > 0
|
||||
G4double CheckU = theChannels(aChannel)->GetMaximalKineticEnergy() -
|
||||
KineticEnergyOfEmittedFragment +
|
||||
theChannels(aChannel)->GetCoulombBarrier();
|
||||
if (CheckU < 0.0)
|
||||
G4Exception("G4PreCompoundModel::DeExcite: Excitation energy less than 0! ");
|
||||
|
||||
|
||||
// Update nucleus parameters
|
||||
// Number of excitons
|
||||
aFragment.SetNumberOfExcitons(aFragment.GetNumberOfExcitons()-
|
||||
G4int(theChannels(aChannel)->GetA()));
|
||||
// Number of charges
|
||||
aFragment.SetNumberOfCharged(aFragment.GetNumberOfCharged()-
|
||||
G4int(theChannels(aChannel)->GetZ()));
|
||||
|
||||
// Atomic number
|
||||
aFragment.SetA(theChannels(aChannel)->GetRestA());
|
||||
|
||||
// Charge
|
||||
aFragment.SetZ(theChannels(aChannel)->GetRestZ());
|
||||
|
||||
// aFragment.SetExcitationEnergy(CheckU);
|
||||
G4LorentzVector RestMomentum(-momentum,
|
||||
sqrt(momentum.mag2()+
|
||||
(theChannels(aChannel)->GetRestNuclearMass()+CheckU)*
|
||||
(theChannels(aChannel)->GetRestNuclearMass()+CheckU)
|
||||
)
|
||||
);
|
||||
|
||||
// Perform Lorentz boosts
|
||||
EmittedMomentum.boost(aFragment.GetMomentum().boostVector());
|
||||
RestMomentum.boost(aFragment.GetMomentum().boostVector());
|
||||
|
||||
// Update nucleus momentum
|
||||
aFragment.SetMomentum(RestMomentum);
|
||||
|
||||
// Set emitted fragment momentum
|
||||
theChannels(aChannel)->SetMomentum(EmittedMomentum);
|
||||
|
||||
|
||||
// Add emitted fragment to Result
|
||||
G4DynamicParticle MyDP = theChannels(aChannel)->GetDynamicParticle();
|
||||
G4ReactionProduct * theNew = new G4ReactionProduct(MyDP.GetDefinition());
|
||||
theNew->SetMomentum(MyDP.GetMomentum());
|
||||
theNew->SetTotalEnergy(MyDP.Get4Momentum().e());
|
||||
// delete MyDP;
|
||||
Result->insert(theNew);
|
||||
}
|
||||
} else {
|
||||
// Perform Equilibrium Emission
|
||||
PerformEquilibriumEmission(aFragment,Result);
|
||||
return Result;
|
||||
}
|
||||
} while (ThereIsTransition); // end of do loop
|
||||
} // end of for (;;) loop
|
||||
// Perform the emission and Add emitted fragment to Result
|
||||
Result->insert(aEmission.PerformEmission(aFragment));
|
||||
}
|
||||
} else {
|
||||
// Perform Equilibrium Emission
|
||||
PerformEquilibriumEmission(aFragment,Result);
|
||||
return Result;
|
||||
}
|
||||
} while (ThereIsTransition); // end of do loop
|
||||
} // end of for (;;) loop
|
||||
}
|
||||
|
||||
|
||||
|
||||
G4ThreeVector G4PreCompoundModel::IsotropicRandom3Vector(G4double Magnitude) const
|
||||
// Create a unit vector with a random direction isotropically distributed
|
||||
{
|
||||
|
||||
G4double CosTheta = 1.0 - 2.0*G4UniformRand();
|
||||
G4double SinTheta = sqrt(1.0 - CosTheta*CosTheta);
|
||||
G4double Phi = twopi*G4UniformRand();
|
||||
G4ThreeVector Vector(Magnitude*cos(Phi)*SinTheta,
|
||||
Magnitude*sin(Phi)*SinTheta,
|
||||
Magnitude*CosTheta);
|
||||
|
||||
return Vector;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void G4PreCompoundModel::PerformEquilibriumEmission(const G4Fragment & aFragment,
|
||||
G4ReactionProductVector * Result) const
|
||||
{
|
||||
|
||||
|
||||
G4ReactionProductVector * theEquilibriumResult;
|
||||
theEquilibriumResult = GetExcitationHandler()->BreakItUp(aFragment);
|
||||
|
||||
while (theEquilibriumResult->entries() > 0)
|
||||
Result->insert(theEquilibriumResult->removeFirst());
|
||||
while (theEquilibriumResult->entries() > 0) Result->insert(theEquilibriumResult->removeFirst());
|
||||
|
||||
delete theEquilibriumResult;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
G4ParticleMomentum G4PreCompoundModel::RotateMomentum(G4ParticleMomentum Pa,
|
||||
G4ParticleMomentum V,
|
||||
G4ParticleMomentum P) const
|
||||
{
|
||||
G4ParticleMomentum U = Pa.unit();
|
||||
|
||||
G4double Alpha1 = U * V;
|
||||
|
||||
G4double Alpha2 = sqrt(V.mag2() - Alpha1*Alpha1);
|
||||
|
||||
G4ThreeVector N = (1./Alpha2)*U.cross(V);
|
||||
|
||||
G4ParticleMomentum RotatedMomentum(
|
||||
( (V.x() - Alpha1*U.x())/Alpha2 ) * P.x() + N.x() * P.y() + U.x() * P.z(),
|
||||
( (V.y() - Alpha1*U.y())/Alpha2 ) * P.x() + N.y() * P.y() + U.y() * P.z(),
|
||||
( (V.z() - Alpha1*U.z())/Alpha2 ) * P.x() + N.z() * P.y() + U.z() * P.z()
|
||||
);
|
||||
return RotatedMomentum;
|
||||
}
|
||||
|
||||
+40
-39
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -7,56 +7,57 @@
|
||||
//
|
||||
//
|
||||
// by V. Lara
|
||||
// Corrections by V. Krylov
|
||||
|
||||
#include "G4PreCompoundNeutron.hh"
|
||||
|
||||
|
||||
|
||||
|
||||
G4double G4PreCompoundNeutron::ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment)
|
||||
const G4Fragment & aFragment)
|
||||
{
|
||||
const G4double r0 = 1.5; // fm
|
||||
const G4double SingleParticleLevelDensity =
|
||||
0.595*G4PreCompoundParameters::GetAddress()->GetLevelDensity();
|
||||
G4double R0J=0.76+2.2/pow(GetRestA(),1.0/3.0);;
|
||||
G4double BN = (2.12/pow(GetRestA(),2.0/3.0)-0.05)/R0J;
|
||||
G4double C1 = eKin + BN;
|
||||
const G4double r0 = 1.5*fermi;
|
||||
// g = 0.595*a*A
|
||||
const G4double g = 0.595*G4PreCompoundParameters::GetAddress()->GetLevelDensity()*GetRestA();
|
||||
G4double Alpha = 0.76+2.2/pow(GetRestA(),1.0/3.0);
|
||||
G4double Beta = (2.12/pow(GetRestA(),2.0/3.0)-0.05)*MeV/Alpha;
|
||||
|
||||
G4double Probability = 2.0/(pi*hbarc*hbarc*hbarc) * GetReducedMass() * Alpha *
|
||||
r0 * r0 * pow(GetRestA(),2.0/3.0) *
|
||||
GetExcitonLevelDensityRatio()/(g*aFragment.GetExcitationEnergy()) *
|
||||
pow((1.0 - (eKin+GetBindingEnergy())/aFragment.GetExcitationEnergy()),
|
||||
(aFragment.GetNumberOfExcitons()-2.0))*(eKin + Beta);
|
||||
|
||||
return 0.000234*r0*r0*pow(GetRestA(),2.0/3.0)*R0J*
|
||||
GetExcitonLevelDensityRatio()/
|
||||
(SingleParticleLevelDensity*(aFragment.GetExcitationEnergy()/MeV)*GetRestA())*
|
||||
pow((1.0 - (eKin+GetBindingEnergy())/(aFragment.GetExcitationEnergy()/MeV)),
|
||||
(aFragment.GetNumberOfExcitons()-2.0))*C1;
|
||||
|
||||
// Corrected some mistakes in return statement by V. Krylov:
|
||||
// - First GetRestA() was GetA()
|
||||
// - The C1 factor was inside of precedent pow( )
|
||||
// G4double Probability = 0.000234*r0*r0*pow(GetRestA(),2.0/3.0)*Alpha*GetExcitonLevelDensityRatio()/
|
||||
// (SingleParticleLevelDensity*aFragment.GetExcitationEnergy())*
|
||||
// pow((1.0 - (eKin+GetBindingEnergy())/aFragment.GetExcitationEnergy()),
|
||||
// (aFragment.GetNumberOfExcitons()-2.0))*(eKin + Beta);
|
||||
|
||||
return Probability;
|
||||
}
|
||||
|
||||
|
||||
G4double G4PreCompoundNeutron::GetKineticEnergy(const G4Fragment & aFragment)
|
||||
{
|
||||
G4double DJ = (2.12/pow(GetRestA(),2.0/3.0)-0.05)/
|
||||
(0.76+2.2/pow(GetRestA(),1.0/3.0));
|
||||
G4double Beta = (2.12/pow(GetRestA(),2.0/3.0)-0.05)*MeV/(0.76+2.2/pow(GetRestA(),1.0/3.0));
|
||||
|
||||
G4double T = aFragment.GetNumberOfParticles() + aFragment.GetNumberOfHoles() - GetA() - 1.0;
|
||||
G4double R2 = GetMaximalKineticEnergy();
|
||||
G4double R1 = R2 + GetCoulombBarrier();
|
||||
|
||||
G4double T = aFragment.GetNumberOfParticles() + aFragment.GetNumberOfHoles() - GetA() - 1.0;
|
||||
G4double R2 = GetMaximalKineticEnergy();
|
||||
G4double R1 = R2 + GetCoulombBarrier();
|
||||
G4double E = 0.0;
|
||||
|
||||
if (T <= -0.1) return R1;
|
||||
else if (T <= 0.1) return -DJ + sqrt(DJ*DJ + (G4UniformRand()*(R2*R2 + 2.0*DJ*R2)));
|
||||
else {
|
||||
G4double E1 = (R1 - DJ*T)/(T + 1.0);
|
||||
G4double E = 0.0;
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
E = GetCoulombBarrier()+G4UniformRand()*R2;
|
||||
G4double T1 = (E + DJ)/(E1 + DJ);
|
||||
G4double T2 = (R1 - E)/(R1 - E1);
|
||||
T3 = T1*pow(T2,T);
|
||||
} while (G4UniformRand() > T3);
|
||||
return E;
|
||||
}
|
||||
if (T <= -0.1) {
|
||||
E = R1;
|
||||
} else if (T <= 0.1) {
|
||||
E = -Beta + sqrt(Beta*Beta + (G4UniformRand()*(R2*R2 + 2.0*Beta*R2)));
|
||||
} else {
|
||||
G4double E1 = (R1 - Beta*T)/(T + 1.0);
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
E = GetCoulombBarrier()+G4UniformRand()*R2;
|
||||
G4double T1 = (E + Beta)/(E1 + Beta);
|
||||
G4double T2 = (R1 - E)/(R1 - E1);
|
||||
T3 = T1*pow(T2,T);
|
||||
} while (G4UniformRand() > T3);
|
||||
}
|
||||
return E;
|
||||
}
|
||||
|
||||
+2
-3
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -11,10 +11,9 @@
|
||||
#include "G4PreCompoundParameters.hh"
|
||||
|
||||
|
||||
const G4double theLevelDensity = 0.125;
|
||||
const G4double theLevelDensity = 0.125/MeV;
|
||||
|
||||
G4PreCompoundParameters G4PreCompoundParameters::thePreCompoundParameters;
|
||||
//G4PreCompoundParameters G4PreCompoundParameters::thePreCompoundParameters(1);
|
||||
|
||||
G4PreCompoundParameters * G4PreCompoundParameters::GetAddress()
|
||||
{ return &thePreCompoundParameters; }
|
||||
|
||||
+64
-35
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -7,30 +7,40 @@
|
||||
//
|
||||
//
|
||||
// by V. Lara
|
||||
// Correction by V. Krylov
|
||||
|
||||
#include "G4PreCompoundProton.hh"
|
||||
|
||||
|
||||
|
||||
G4double G4PreCompoundProton::ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment)
|
||||
const G4Fragment & aFragment)
|
||||
{
|
||||
const G4double r0 = 1.5; // fm
|
||||
const G4double SingleParticleLevelDensity =
|
||||
0.595*G4PreCompoundParameters::GetAddress()->GetLevelDensity(); // AC
|
||||
G4double R0J=1.2;
|
||||
G4double C1 = eKin - GetCoulombBarrier();
|
||||
const G4double r0 = 1.5*fermi;
|
||||
// g = 0.595*a*A;
|
||||
const G4double g = 0.595*G4PreCompoundParameters::GetAddress()->GetLevelDensity()*GetRestA();
|
||||
// G4double R0J=1.2;
|
||||
|
||||
return 0.000234*r0*r0*pow(GetRestA(),2.0/3.0)*R0J*
|
||||
GetExcitonLevelDensityRatio()/
|
||||
(SingleParticleLevelDensity*(aFragment.GetExcitationEnergy()/MeV)*GetRestA())*
|
||||
pow((1.0 - (eKin+GetBindingEnergy())/(aFragment.GetExcitationEnergy()/MeV)),
|
||||
(aFragment.GetNumberOfExcitons()-2.0))*C1;
|
||||
G4double aZ = G4double(GetRestZ());
|
||||
G4double C = 0.0;
|
||||
if (aZ >= 70) {
|
||||
C = 0.10;
|
||||
} else {
|
||||
C = ((((0.15417e-06*aZ) - 0.29875e-04)*aZ + 0.21071e-02)*aZ - 0.66612e-01)*aZ + 0.98375;
|
||||
}
|
||||
|
||||
// Corrected some mistakes in return statement by V. Krylov:
|
||||
// - First GetRestA() was GetA()
|
||||
// - The C1 factor was inside of precedent pow( )
|
||||
|
||||
G4double Probability = 2.0/(pi*hbarc*hbarc*hbarc) * GetReducedMass() *
|
||||
(1.0 + C) * r0 * r0 * pow(GetRestA(),2.0/3.0) *
|
||||
GetExcitonLevelDensityRatio()/(g*aFragment.GetExcitationEnergy()) *
|
||||
pow(1.0 - (eKin+GetBindingEnergy())/aFragment.GetExcitationEnergy(),
|
||||
(aFragment.GetNumberOfExcitons()-2.0))*
|
||||
(eKin - GetCoulombBarrier());
|
||||
|
||||
// G4double Probability = 0.000234*r0*r0*pow(GetRestA(),2.0/3.0)*R0J*GetExcitonLevelDensityRatio()/
|
||||
// (SingleParticleLevelDensity*aFragment.GetExcitationEnergy())*
|
||||
// pow(1.0 - (eKin+GetBindingEnergy())/aFragment.GetExcitationEnergy(),
|
||||
// (aFragment.GetNumberOfExcitons()-2.0))*(eKin - GetCoulombBarrier());
|
||||
|
||||
return Probability;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,25 +48,44 @@ G4double G4PreCompoundProton::ProbabilityDistributionFunction(const G4double & e
|
||||
|
||||
G4double G4PreCompoundProton::GetKineticEnergy(const G4Fragment & aFragment)
|
||||
{
|
||||
G4double DJ = - GetCoulombBarrier();
|
||||
G4double DJ = - GetCoulombBarrier();
|
||||
|
||||
G4double T = aFragment.GetNumberOfParticles() + aFragment.GetNumberOfHoles() - GetA() - 1.0;
|
||||
G4double R2 = GetMaximalKineticEnergy();
|
||||
G4double R1 = R2 + GetCoulombBarrier();
|
||||
G4double T = aFragment.GetNumberOfParticles() + aFragment.GetNumberOfHoles() - GetA() - 1.0;
|
||||
G4double R2 = GetMaximalKineticEnergy();
|
||||
G4double R1 = R2 + GetCoulombBarrier();
|
||||
|
||||
G4double E = 0.0;
|
||||
|
||||
if (T <= -0.1) return R1;
|
||||
else if (T <= 0.1) return sqrt(G4UniformRand())*R2 + GetCoulombBarrier();
|
||||
else {
|
||||
G4double E1 = (R1 - DJ*T)/(T + 1.0);
|
||||
G4double E = 0.0;
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
E = GetCoulombBarrier()+G4UniformRand()*R2;
|
||||
G4double T1 = (E + DJ)/(E1 + DJ);
|
||||
G4double T2 = (R1 - E)/(R1 - E1);
|
||||
T3 = T1*pow(T2,T);
|
||||
} while (G4UniformRand() > T3);
|
||||
return E;
|
||||
}
|
||||
if (T <= -0.1) {
|
||||
E = R1;
|
||||
} else if (T <= 0.1) {
|
||||
E = sqrt(G4UniformRand())*R2 + GetCoulombBarrier();
|
||||
} else {
|
||||
G4double E1 = (R1 - DJ*T)/(T + 1.0);
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
E = GetCoulombBarrier() + G4UniformRand()*R2;
|
||||
G4double T1 = (E + DJ)/(E1 + DJ);
|
||||
G4double T2 = (R1 - E)/(R1 - E1);
|
||||
T3 = T1*pow(T2,T);
|
||||
} while (G4UniformRand() > T3);
|
||||
}
|
||||
return E;
|
||||
}
|
||||
|
||||
|
||||
G4double G4PreCompoundProton::GetBarrierPenetrationFactor(const G4double aZ) const
|
||||
{
|
||||
G4double K = 1.0;
|
||||
if (aZ>=70.0) {
|
||||
K = 0.80;
|
||||
} else {
|
||||
K = (((0.2357e-5*aZ) - 0.42679e-3)*aZ + 0.27035e-1)*aZ + 0.19025;
|
||||
}
|
||||
|
||||
return K;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+66
-35
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -13,55 +13,78 @@
|
||||
G4PreCompoundTransitions::
|
||||
G4PreCompoundTransitions(const G4Fragment & aFragment)
|
||||
{
|
||||
// Fermi energy; method internal units are MeV
|
||||
const G4double FermiEnergy = 45.0;
|
||||
|
||||
// Fermi energy
|
||||
const G4double FermiEnergy = 45.0*MeV;
|
||||
//
|
||||
const G4double r0 = 0.6*fermi;
|
||||
|
||||
|
||||
// Number of holes
|
||||
G4double H = aFragment.GetNumberOfHoles();
|
||||
// Number of Particles
|
||||
G4double P = aFragment.GetNumberOfParticles();
|
||||
// Number of Excitons
|
||||
G4double N = P+H;
|
||||
|
||||
|
||||
// Relative Energy (T_{rel})
|
||||
G4double RelativeEnergy = (8.0/5.0)*FermiEnergy + (aFragment.GetExcitationEnergy()/MeV)/(H+P);
|
||||
// (aFragment.GetExcitationEnergy()/MeV)/aFragment.GetNumberOfExcitons();
|
||||
G4double RelativeEnergy = (8.0/5.0)*FermiEnergy + aFragment.GetExcitationEnergy()/N;
|
||||
|
||||
// Relative Velocity:
|
||||
// <V_{rel}>^2
|
||||
G4double RelativeVelocitySqr = 2.0*RelativeEnergy/(G4Proton::Proton()->GetPDGMass()/MeV);
|
||||
G4double RelativeVelocitySqr = 2.0*RelativeEnergy/proton_mass_c2;
|
||||
// <V_{rel}>
|
||||
G4double RelativeVelocity = sqrt(RelativeVelocitySqr);
|
||||
|
||||
// Proton-Proton Cross Section (in mbarn)
|
||||
G4double ppXSection = 10.63/RelativeVelocitySqr - 29.93/RelativeVelocity + 42.9;
|
||||
// Proton-Neutron Cross Section (in mbarn)
|
||||
G4double npXSection = 34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2;
|
||||
// Proton-Proton Cross Section
|
||||
G4double ppXSection = (10.63/RelativeVelocitySqr - 29.93/RelativeVelocity + 42.9)*millibarn;
|
||||
// Proton-Neutron Cross Section
|
||||
G4double npXSection = (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)*millibarn;
|
||||
|
||||
// Averaged Cross Section: \sigma(V_{rel})
|
||||
G4double AveragedXSection = (ppXSection+npXSection)/2.0;
|
||||
|
||||
// Fermi energy Relative energy ratio
|
||||
// Fermi relative energy ratio
|
||||
G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
|
||||
|
||||
// This factor is introduced to take into account the Pauli principle
|
||||
G4double PauliFactor = 1.0 - (7.0/5.0)*FermiRelRatio;
|
||||
if (FermiRelRatio > 0.5) PauliFactor += (2.0/5.0)*FermiRelRatio*pow(2.0 - (1.0/FermiRelRatio), 5.0/2.0);
|
||||
|
||||
// Transition probability for \Delta n = +2
|
||||
TransitionProb1 = 0.00332*AveragedXSection*PauliFactor*sqrt(RelativeEnergy)/
|
||||
pow(1.2 + 1.0/(4.7*RelativeVelocity), 3.0);
|
||||
// Interaction volume
|
||||
G4double Vint = (4.0/3.0)*pi*pow(2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity) , 3.0);
|
||||
|
||||
// Transition probability for \Delta n = +2
|
||||
// TransitionProb1 = 0.00332*AveragedXSection*PauliFactor*sqrt(RelativeEnergy)/
|
||||
// pow(1.2 + 1.0/(4.7*RelativeVelocity), 3.0);
|
||||
TransitionProb1 = AveragedXSection*PauliFactor*sqrt(2.0*RelativeEnergy/proton_mass_c2)/Vint;
|
||||
if (TransitionProb1 < 0.0) TransitionProb1 = 0.0;
|
||||
|
||||
// g = 0.595aA; GE = g*E where E is Excitation Energy
|
||||
G4double GE = 0.595*G4PreCompoundParameters::GetAddress()->GetLevelDensity()*
|
||||
aFragment.GetA()*aFragment.GetExcitationEnergy();
|
||||
|
||||
|
||||
// F(p,h) = 0.25*(p^2 + h^2 + p - h) - 0.5*h
|
||||
G4double Fph = (P*P+H*H+P-H)/4.0 - H/2.0;
|
||||
// F(p+1,h+1)
|
||||
G4double Fph1 = Fph + N/2.0;
|
||||
// (n+1)/n ((g*E - F(p,h))/(g*E - F(p+1,h+1)))^(n+1)
|
||||
G4double ProbFactor = pow((GE-Fph)/(GE-Fph1),N+1.0);
|
||||
|
||||
|
||||
G4double GE = G4PreCompoundParameters::GetAddress()->GetLevelDensity()*
|
||||
aFragment.GetA()*aFragment.GetExcitationEnergy()/MeV;
|
||||
|
||||
// Transition probability for \Delta n = -2 (at F(p,h) = 0)
|
||||
// TransitionProb2 = G4std::max(0, (TransitionProb1*P*H*(P+H+1.0)*(P+H-2.0))/(GE*GE));
|
||||
TransitionProb2 = (TransitionProb1*P*H*(P+H+1.0)*(P+H-2.0))/(GE*GE);
|
||||
// TransitionProb2 = max(0, (TransitionProb1*P*H*(P+H+1.0)*(P+H-2.0))/(GE*GE));
|
||||
// TransitionProb2 = (TransitionProb1*P*H*(P+H+1.0)*(P+H-2.0))/(GE*GE);
|
||||
TransitionProb2 = TransitionProb1 * ProbFactor * (P*H*(N+1.0)*(N-2.0))/((GE-Fph)*(GE-Fph));
|
||||
if (TransitionProb2 < 0.0) TransitionProb2 = 0.0;
|
||||
|
||||
// Transition probability for \Delta n = 0 (at F(p,h) = 0)
|
||||
TransitionProb3 = TransitionProb1*(P+H+1.0)*(P*(P-1.0)+4.0*P*H+H*(H-1.0))/((P+H)*GE);
|
||||
// TransitionProb3 = TransitionProb1*(P+H+1.0)*(P*(P-1.0)+4.0*P*H+H*(H-1.0))/((P+H)*GE);
|
||||
TransitionProb3 = TransitionProb1 * ProbFactor * ((N+1.0)/N) *(P*(P-1.0) + 4.0*P*H + H*(H-1.0))/(GE-Fph);
|
||||
if (TransitionProb3 < 0.0) TransitionProb3 = 0.0;
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -85,19 +108,27 @@ G4bool G4PreCompoundTransitions::operator!=(const G4PreCompoundTransitions &righ
|
||||
|
||||
|
||||
|
||||
G4int G4PreCompoundTransitions::GetDeltaNExciton()
|
||||
G4Fragment G4PreCompoundTransitions::PerformTransition(const G4Fragment & aFragment)
|
||||
{
|
||||
G4int result = 0;
|
||||
G4double ChosenTransition = G4UniformRand()*GetTotalProbability();
|
||||
if (ChosenTransition <= TransitionProb1)
|
||||
{
|
||||
// Number of excitons is increased on \Delta n = +2
|
||||
result = 2;
|
||||
}
|
||||
else if (ChosenTransition <= TransitionProb1+TransitionProb2)
|
||||
{
|
||||
// Number of excitons is increased on \Delta n = -2
|
||||
result = -2;
|
||||
}
|
||||
return result;
|
||||
G4Fragment result(aFragment);
|
||||
G4double ChosenTransition = G4UniformRand()*this->GetTotalProbability();
|
||||
G4int deltaN = 0;
|
||||
if (ChosenTransition <= TransitionProb1)
|
||||
{
|
||||
// Number of excitons is increased on \Delta n = +2
|
||||
deltaN = 2;
|
||||
}
|
||||
else if (ChosenTransition <= TransitionProb1+TransitionProb2)
|
||||
{
|
||||
// Number of excitons is increased on \Delta n = -2
|
||||
deltaN = -2;
|
||||
}
|
||||
result.SetNumberOfExcitons(result.GetNumberOfExcitons()+deltaN);
|
||||
result.SetNumberOfHoles(result.GetNumberOfHoles()+deltaN/2);
|
||||
// With weight Z/A, number of charged particles is decreased on +1
|
||||
if ((deltaN > 0 || result.GetNumberOfCharged() > 0) &&
|
||||
(G4UniformRand() <= result.GetZ()/result.GetA())){
|
||||
result.SetNumberOfCharged(result.GetNumberOfCharged()+deltaN/2);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+107
-125
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -7,38 +7,30 @@
|
||||
//
|
||||
//
|
||||
// by V. Lara
|
||||
// corrections by V. Krylov
|
||||
|
||||
#include "G4VPreCompoundFragment.hh"
|
||||
|
||||
//G4VPreCompoundFragment::G4VPreCompoundFragment(): theA(0.0),theZ(0.0),
|
||||
// theRestNucleusA(0.0),theRestNucleusZ(0.0),CoulombBarrier(0.0),MaximalKineticEnergy(-1.0),
|
||||
// ExcitonLevelDensityRatio(0.0),EmissionProbability(0.0),CondensationProbability(0.0),
|
||||
// Momentum(0.0,0.0,0.0,0.0)
|
||||
//{
|
||||
//}
|
||||
#include "G4ios.hh"
|
||||
|
||||
|
||||
G4VPreCompoundFragment::G4VPreCompoundFragment
|
||||
(const G4VPreCompoundFragment & right)
|
||||
G4VPreCompoundFragment::G4VPreCompoundFragment(const G4VPreCompoundFragment & right)
|
||||
{
|
||||
theA = right.theA;
|
||||
theZ = right.theZ;
|
||||
theRestNucleusA = right.theRestNucleusA;
|
||||
theRestNucleusZ = right.theRestNucleusZ;
|
||||
CoulombBarrier = right.CoulombBarrier;
|
||||
MaximalKineticEnergy = right.MaximalKineticEnergy;
|
||||
ExcitonLevelDensityRatio = right.ExcitonLevelDensityRatio;
|
||||
EmissionProbability = right.EmissionProbability;
|
||||
CondensationProbability = right.CondensationProbability;
|
||||
Momentum = right.Momentum;
|
||||
theA = right.theA;
|
||||
theZ = right.theZ;
|
||||
theRestNucleusA = right.theRestNucleusA;
|
||||
theRestNucleusZ = right.theRestNucleusZ;
|
||||
theCoulombBarrier = right.theCoulombBarrier;
|
||||
theMaximalKineticEnergy = right.theMaximalKineticEnergy;
|
||||
theExcitonLevelDensityRatio = right.theExcitonLevelDensityRatio;
|
||||
theEmissionProbability = right.theEmissionProbability;
|
||||
theCondensationProbability = right.theCondensationProbability;
|
||||
theMomentum = right.theMomentum;
|
||||
}
|
||||
|
||||
|
||||
G4VPreCompoundFragment::G4VPreCompoundFragment(const G4double anA, const G4double aZ):
|
||||
theA(anA),theZ(aZ),theRestNucleusA(0.0),theRestNucleusZ(0.0),CoulombBarrier(0.0),
|
||||
MaximalKineticEnergy(-1.0),ExcitonLevelDensityRatio(0.0),EmissionProbability(0.0),
|
||||
CondensationProbability(0.0),Momentum(0.0,0.0,0.0,0.0)
|
||||
theA(anA),theZ(aZ),theRestNucleusA(0.0),theRestNucleusZ(0.0),theCoulombBarrier(0.0),
|
||||
theMaximalKineticEnergy(-1.0),theExcitonLevelDensityRatio(0.0),theEmissionProbability(0.0),
|
||||
theCondensationProbability(0.0),theMomentum(0.0,0.0,0.0,0.0)
|
||||
{}
|
||||
|
||||
|
||||
@@ -51,50 +43,50 @@ G4VPreCompoundFragment::~G4VPreCompoundFragment()
|
||||
const G4VPreCompoundFragment & G4VPreCompoundFragment::operator=
|
||||
(const G4VPreCompoundFragment & right)
|
||||
{
|
||||
if (this != &right) {
|
||||
theA = right.theA;
|
||||
theZ = right.theZ;
|
||||
theRestNucleusA = right.theRestNucleusA;
|
||||
theRestNucleusZ = right.theRestNucleusZ;
|
||||
CoulombBarrier = right.CoulombBarrier;
|
||||
MaximalKineticEnergy = right.MaximalKineticEnergy;
|
||||
ExcitonLevelDensityRatio = right.ExcitonLevelDensityRatio;
|
||||
EmissionProbability = right.EmissionProbability;
|
||||
CondensationProbability = right.CondensationProbability;
|
||||
Momentum = right.Momentum;
|
||||
}
|
||||
return *this;
|
||||
if (this != &right) {
|
||||
theA = right.theA;
|
||||
theZ = right.theZ;
|
||||
theRestNucleusA = right.theRestNucleusA;
|
||||
theRestNucleusZ = right.theRestNucleusZ;
|
||||
theCoulombBarrier = right.theCoulombBarrier;
|
||||
theMaximalKineticEnergy = right.theMaximalKineticEnergy;
|
||||
theExcitonLevelDensityRatio = right.theExcitonLevelDensityRatio;
|
||||
theEmissionProbability = right.theEmissionProbability;
|
||||
theCondensationProbability = right.theCondensationProbability;
|
||||
theMomentum = right.theMomentum;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
G4int G4VPreCompoundFragment::operator==(const G4VPreCompoundFragment & right) const
|
||||
{
|
||||
return (this == (G4VPreCompoundFragment *) &right);
|
||||
return (this == (G4VPreCompoundFragment *) &right);
|
||||
}
|
||||
|
||||
G4int G4VPreCompoundFragment::operator!=(const G4VPreCompoundFragment & right) const
|
||||
{
|
||||
return (this != (G4VPreCompoundFragment *) &right);
|
||||
return (this != (G4VPreCompoundFragment *) &right);
|
||||
}
|
||||
|
||||
|
||||
G4std::ostream& operator << (G4std::ostream &out, const G4VPreCompoundFragment &theFragment)
|
||||
{
|
||||
out << &theFragment;
|
||||
return out;
|
||||
out << &theFragment;
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
G4std::ostream& operator << (G4std::ostream &out, const G4VPreCompoundFragment *theFragment)
|
||||
{
|
||||
long old_floatfield = out.setf(0,G4std::ios::floatfield);
|
||||
long old_floatfield = out.setf(0,G4std::ios::floatfield);
|
||||
|
||||
out
|
||||
<< "PreCompound Model Emitted Fragment: A = " << G4std::setprecision(3) << theFragment->theA
|
||||
<< ", Z = " << G4std::setprecision(3) << theFragment->theZ;
|
||||
out.setf(G4std::ios::scientific,G4std::ios::floatfield);
|
||||
out
|
||||
<< "PreCompound Model Emitted Fragment: A = " << G4std::setprecision(3) << theFragment->theA
|
||||
<< ", Z = " << G4std::setprecision(3) << theFragment->theZ;
|
||||
out.setf(G4std::ios::scientific, G4std::ios::floatfield);
|
||||
// out
|
||||
// << ", U = " << theFragment->theExcitationEnergy/MeV
|
||||
// << " MeV" << G4endl
|
||||
// << " MeV" << endl
|
||||
// << " P = ("
|
||||
// << theFragment->theMomentum.x()/MeV << ","
|
||||
// << theFragment->theMomentum.y()/MeV << ","
|
||||
@@ -102,9 +94,9 @@ G4std::ostream& operator << (G4std::ostream &out, const G4VPreCompoundFragment *
|
||||
// << ") MeV E = "
|
||||
// << theFragment->theMomentum.t()/MeV << " MeV";
|
||||
|
||||
out.setf(old_floatfield,G4std::ios::floatfield);
|
||||
out.setf(old_floatfield,G4std::ios::floatfield);
|
||||
|
||||
return out;
|
||||
return out;
|
||||
|
||||
}
|
||||
|
||||
@@ -112,108 +104,98 @@ G4std::ostream& operator << (G4std::ostream &out, const G4VPreCompoundFragment *
|
||||
void G4VPreCompoundFragment::Init(const G4Fragment & aFragment)
|
||||
{
|
||||
|
||||
SetRestA(aFragment.GetA());
|
||||
SetRestZ(aFragment.GetZ());
|
||||
theRestNucleusA = aFragment.GetA() - theA;
|
||||
theRestNucleusZ = aFragment.GetZ() - theZ;
|
||||
|
||||
if ((GetRestA() < GetRestZ()) ||
|
||||
(GetRestA() < GetA()) ||
|
||||
(GetRestZ() < GetZ())) {
|
||||
// for to be sure that emission probability will be 0.
|
||||
SetMaximalKineticEnergy(0.0);
|
||||
return;
|
||||
}
|
||||
// Compute nuclear radius (needed to calculate Coulomb barrier)
|
||||
G4double NuclearRadius = 2.173*
|
||||
(1.0+0.006103*GetZ()*GetRestZ())/
|
||||
(1.0+0.009443*GetZ()*GetRestZ());
|
||||
// Calculate Coulomb barrier
|
||||
SetCoulombBarrier(CalcCoulombBarrier(NuclearRadius));
|
||||
if ((theRestNucleusA < theRestNucleusZ) ||
|
||||
(theRestNucleusA < theA) ||
|
||||
(theRestNucleusZ < theZ)) {
|
||||
// In order to be sure that emission probability will be 0.
|
||||
theMaximalKineticEnergy = 0.0;
|
||||
return;
|
||||
}
|
||||
|
||||
// Compute nuclear radius (needed to calculate Coulomb barrier)
|
||||
G4double NuclearRadius = 2.173*fermi*
|
||||
(1.0+0.006103*theZ*theRestNucleusZ)/(1.0+0.009443*theZ*theRestNucleusZ);
|
||||
// Calculate Coulomb barrier
|
||||
theCoulombBarrier = CalcCoulombBarrier(NuclearRadius,theRestNucleusZ);
|
||||
|
||||
// Compute Binding Energies for fragments (needed to separate a fragment from the nucleus)
|
||||
// Compute Binding Energies for fragments
|
||||
// (needed to separate a fragment from the nucleus)
|
||||
|
||||
SetBindingEnergy(G4NucleiProperties::GetMassExcess(GetA(),GetZ())/MeV+
|
||||
G4NucleiProperties::GetMassExcess(GetRestA(),GetRestZ())/MeV-
|
||||
G4NucleiProperties::GetMassExcess(aFragment.GetA(),aFragment.GetZ())/MeV);
|
||||
theBindingEnergy = G4NucleiProperties::GetMassExcess(theA,theZ) +
|
||||
G4NucleiProperties::GetMassExcess(theRestNucleusA,theRestNucleusZ) -
|
||||
G4NucleiProperties::GetMassExcess(aFragment.GetA(),aFragment.GetZ());
|
||||
|
||||
// Compute Maximal Kinetic Energy which can be carried by fragments after separation
|
||||
SetMaximalKineticEnergy((aFragment.GetExcitationEnergy()/MeV)-
|
||||
(GetBindingEnergy()+
|
||||
GetCoulombBarrier()));
|
||||
|
||||
// Compute Maximal Kinetic Energy which can be carried by fragments after separation
|
||||
theMaximalKineticEnergy = aFragment.GetExcitationEnergy() -
|
||||
(theBindingEnergy + theCoulombBarrier);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
G4double G4VPreCompoundFragment::CalcCoulombBarrier(const G4double & NucRad)
|
||||
// Calculation of Coulomb potential energy (barrier) for outgoing particles (in MeV)
|
||||
G4double G4VPreCompoundFragment::CalcCoulombBarrier(const G4double NucRad, const G4double aZ)
|
||||
// Calculation of Coulomb potential energy (barrier) for outgoing particles
|
||||
{
|
||||
// for neutron
|
||||
G4double Barrier;
|
||||
if (GetZ() == 0)
|
||||
{
|
||||
Barrier = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Barrier = (1.44/NucRad)*
|
||||
((GetZ()*GetRestZ())/
|
||||
(pow(GetA(),1.0/3.0)+pow(GetRestA(),1.0/3.0)));
|
||||
}
|
||||
// return Barrier;
|
||||
return Barrier;
|
||||
// for neutron
|
||||
G4double Barrier;
|
||||
if (GetZ() == 0) {
|
||||
Barrier = 0.0;
|
||||
} else {
|
||||
Barrier = (elm_coupling/NucRad)*((theZ*theRestNucleusZ)/
|
||||
(pow(theA,1.0/3.0)+pow(theRestNucleusA,1.0/3.0)));
|
||||
Barrier *= GetBarrierPenetrationFactor(aZ);
|
||||
}
|
||||
return Barrier;
|
||||
}
|
||||
|
||||
|
||||
G4double G4VPreCompoundFragment::
|
||||
CalcEmissionProbability(const G4Fragment & aFragment)
|
||||
G4double G4VPreCompoundFragment::CalcEmissionProbability(const G4Fragment & aFragment)
|
||||
{
|
||||
if (GetMaximalKineticEnergy() <= 0.0) return 0.0;
|
||||
if (GetMaximalKineticEnergy() <= 0.0) return 0.0;
|
||||
|
||||
// Coulomb barrier for fragment "index" (for nucleon it is 0) is the lower limit
|
||||
// Coulomb barrier is the lower limit
|
||||
// of integration over kinetic energy
|
||||
G4double LowerLimit = GetCoulombBarrier();
|
||||
G4double LowerLimit = theCoulombBarrier;
|
||||
|
||||
// Excitation energy of nucleus after fragment emission is the upper limit
|
||||
// of integration over kinetic energy
|
||||
G4double UpperLimit = aFragment.GetExcitationEnergy()/MeV - GetBindingEnergy();
|
||||
G4double UpperLimit = aFragment.GetExcitationEnergy() - theBindingEnergy;
|
||||
|
||||
return EmissionProbability = IntegrateEmissionProbability(LowerLimit,UpperLimit,aFragment);
|
||||
|
||||
// Correction by V. Krylov:
|
||||
// Emission probability was stored in a local variable but not in
|
||||
// data member EmissionProbability, then the returned probability
|
||||
// by GetEmissionProbability() method was always 0.0
|
||||
|
||||
theEmissionProbability = IntegrateEmissionProbability(LowerLimit,UpperLimit,aFragment);
|
||||
|
||||
return theEmissionProbability;
|
||||
}
|
||||
|
||||
G4double G4VPreCompoundFragment::
|
||||
IntegrateEmissionProbability(const G4double & Low, const G4double & Up,
|
||||
const G4Fragment & aFragment)
|
||||
{
|
||||
static const G4double w[8] = {0.1012285363,
|
||||
0.2223810345,
|
||||
0.3137066459,
|
||||
0.3626837834,
|
||||
0.3626837834,
|
||||
0.3137066459,
|
||||
0.2223810345,
|
||||
0.1012285363};
|
||||
static const G4double w[8] = {0.1012285363,
|
||||
0.2223810345,
|
||||
0.3137066459,
|
||||
0.3626837834,
|
||||
0.3626837834,
|
||||
0.3137066459,
|
||||
0.2223810345,
|
||||
0.1012285363};
|
||||
|
||||
static const G4double FIKS[8] = {0.9602898565,
|
||||
0.7966664774,
|
||||
0.5255324099,
|
||||
0.1834346425,
|
||||
-0.1834346425,
|
||||
-0.5255324099,
|
||||
-0.7966664774,
|
||||
-0.9602898565};
|
||||
static const G4double FIKS[8] = {0.9602898565,
|
||||
0.7966664774,
|
||||
0.5255324099,
|
||||
0.1834346425,
|
||||
-0.1834346425,
|
||||
-0.5255324099,
|
||||
-0.7966664774,
|
||||
-0.9602898565};
|
||||
|
||||
G4double Total = 0.0;
|
||||
for (G4int i = 0; i < 8; i++) {
|
||||
G4double KineticE = ((Up-Low)*FIKS[i]+(Up+Low))/2.0;
|
||||
Total += w[i]*ProbabilityDistributionFunction(KineticE, aFragment)
|
||||
*(Up-Low)/2.0;
|
||||
}
|
||||
return Total;
|
||||
G4double Total = 0.0;
|
||||
for (G4int i = 0; i < 8; i++) {
|
||||
G4double KineticE = ((Up-Low)*FIKS[i]+(Up+Low))/2.0;
|
||||
Total += w[i]*ProbabilityDistributionFunction(KineticE, aFragment)*(Up-Low)/2.0;
|
||||
}
|
||||
return Total;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+79
-74
@@ -1,5 +1,5 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the GEANT4 collaboration.
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
@@ -7,94 +7,99 @@
|
||||
//
|
||||
//
|
||||
// by V. Lara
|
||||
// Corrections by V. Krylov
|
||||
|
||||
#include "G4VPreCompoundIon.hh"
|
||||
|
||||
G4double G4VPreCompoundIon::
|
||||
ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment)
|
||||
G4double G4VPreCompoundIon::ProbabilityDistributionFunction(const G4double & eKin,
|
||||
const G4Fragment & aFragment)
|
||||
{
|
||||
const G4double r0 = 1.5; // fm
|
||||
const G4double SingleParticleLevelDensity =
|
||||
0.595*G4PreCompoundParameters::GetAddress()->GetLevelDensity(); // AC
|
||||
const G4double r0 = 1.5*fermi;
|
||||
G4double exEnergy = aFragment.GetExcitationEnergy();
|
||||
G4double B = GetBindingEnergy();
|
||||
|
||||
G4double R0J = 1.1;
|
||||
G4double exEnergy = aFragment.GetExcitationEnergy()/MeV;
|
||||
G4double probA = GetCondensationProbability()*R0J*0.104/
|
||||
(r0*pow(GetRestA(),1.0/3.0)*sqrt(GetA()*exEnergy));
|
||||
G4double probB = GetExcitonLevelDensityRatio()*
|
||||
( (eKin-GetCoulombBarrier())/exEnergy );
|
||||
G4double ratio = (eKin+GetBindingEnergy() )/exEnergy;
|
||||
G4double exponent = GetRestA()-1.5;
|
||||
if ( exponent>100. && ratio<1. ) return 0.;
|
||||
G4double probC = pow( ratio, exponent );
|
||||
G4double probD = pow( 1.0 - ratio,
|
||||
aFragment.GetNumberOfExcitons()-GetA()-1.0 ) ;
|
||||
G4double Z = aFragment.GetZ();
|
||||
G4double C = GetCCoef(Z);
|
||||
|
||||
G4double probA = (3.0/4.0)*sqrt(2.0/GetReducedMass())*(1.0+C)*GetExcitonLevelDensityRatio()*
|
||||
GetCondensationProbability()*(eKin - GetCoulombBarrier())/
|
||||
(r0*pow(GetRestA(),1.0/3.0)*exEnergy*sqrt(eKin+B));
|
||||
|
||||
G4double base = 1.0 + B/exEnergy;
|
||||
G4double exponent = GetA() - 1.0;
|
||||
if (exponent > 100.0 && base < 1.0) return 0.0;
|
||||
G4double probB = pow(base,exponent);
|
||||
|
||||
base = 1.0 - ((eKin+B)/exEnergy);
|
||||
exponent = aFragment.GetNumberOfExcitons() - 1.0 - GetA();
|
||||
if (exponent > 100.0 && base < 1.0) return 0.0;
|
||||
G4double probC = pow(base,exponent);
|
||||
|
||||
G4double prob = probA * probB * probC;
|
||||
|
||||
// return GetCondensationProbability()*R0J*0.104/
|
||||
// (r0*pow(GetRestA(),1.0/3.0)*sqrt(GetA()*exEnergy))*
|
||||
// GetExcitonLevelDensityRatio()*
|
||||
// ( (eKin-GetCoulombBarrier())/exEnergy )*
|
||||
// pow( ( (eKin+GetBindingEnergy() )/exEnergy), GetRestA()-1.5)*
|
||||
// pow(1.0 - (eKin + GetBindingEnergy())/exEnergy ,
|
||||
// aFragment.GetNumberOfExcitons()-GetA()-1.0 ) ;
|
||||
|
||||
G4double prob = probA*probB*probC*probD;
|
||||
if (prob < 1.e-100) return 0.;
|
||||
else return prob;
|
||||
|
||||
// Corrections in return statemet by V. Krylov:
|
||||
// - GetA() and GetRestA() were intechanged
|
||||
|
||||
// G4double R0J = 1.1;
|
||||
// G4double probA = GetCondensationProbability()*R0J*0.104/
|
||||
// (r0*pow(GetRestA(),1.0/3.0)*sqrt(GetA()*exEnergy));
|
||||
// G4double probB = GetExcitonLevelDensityRatio()*((eKin-GetCoulombBarrier())/exEnergy);
|
||||
// G4double ratio = (eKin+GetBindingEnergy())/exEnergy;
|
||||
// G4double exponent = GetRestA()-1.5;
|
||||
// if ( exponent>100. && ratio<1. ) return 0.;
|
||||
// G4double probC = pow( ratio, exponent );
|
||||
// G4double probD = pow( 1.0 - ratio,
|
||||
// aFragment.GetNumberOfExcitons()-GetA()-1.0 );
|
||||
// G4double prob = probA*probB*probC*probD;
|
||||
|
||||
|
||||
if (prob < 1.e-100) return 0.;
|
||||
else return prob;
|
||||
}
|
||||
|
||||
|
||||
G4double G4VPreCompoundIon::GetKineticEnergy(const G4Fragment & aFragment)
|
||||
{
|
||||
G4double DJ = - GetCoulombBarrier();
|
||||
G4double DJ = - GetCoulombBarrier();
|
||||
|
||||
G4double T = aFragment.GetNumberOfParticles() + aFragment.GetNumberOfHoles() - GetA() - 1.0;
|
||||
G4double R2 = GetMaximalKineticEnergy();
|
||||
G4double R1 = R2 + GetCoulombBarrier();
|
||||
G4double T = aFragment.GetNumberOfParticles() + aFragment.GetNumberOfHoles() - GetA() - 1.0;
|
||||
G4double R2 = GetMaximalKineticEnergy();
|
||||
G4double R1 = R2 + GetCoulombBarrier();
|
||||
|
||||
G4double E = 0.0;
|
||||
|
||||
if (T <= -0.1) return R1;
|
||||
else if (T <= 0.1) {
|
||||
G4double E1 = R1;
|
||||
G4double E = 0.0;
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
G4double PJ1 = GetA() - 1.5;
|
||||
G4double AbsBindingE = abs(GetBindingEnergy());
|
||||
if (GetBindingEnergy() <= 0.0 && AbsBindingE > GetCoulombBarrier())
|
||||
E = AbsBindingE + G4UniformRand()*(aFragment.GetExcitationEnergy()/MeV);
|
||||
else
|
||||
E = GetCoulombBarrier() + G4UniformRand()*R2;
|
||||
T3 = pow((E+GetBindingEnergy())/(E1+GetBindingEnergy()),PJ1)*
|
||||
((E+DJ)/(E1+DJ));
|
||||
} while (G4UniformRand() > T3);
|
||||
return E;
|
||||
} else {
|
||||
G4double PJ1 = GetA() - 1.5;
|
||||
G4double ES = (aFragment.GetExcitationEnergy()/MeV)*(GetA()-0.5)+
|
||||
((aFragment.GetExcitationEnergy()/MeV)-R2)*(aFragment.GetNumberOfParticles()+
|
||||
if (T <= -0.1) E = R1;
|
||||
else if (T <= 0.1) {
|
||||
G4double E1 = R1;
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
G4double PJ1 = GetA() - 1.5;
|
||||
G4double AbsBindingE = abs(GetBindingEnergy());
|
||||
if (GetBindingEnergy() <= 0.0 && AbsBindingE > GetCoulombBarrier()) {
|
||||
E = AbsBindingE + G4UniformRand()*aFragment.GetExcitationEnergy();
|
||||
} else {
|
||||
E = GetCoulombBarrier() + G4UniformRand()*R2;
|
||||
}
|
||||
T3 = pow((E+GetBindingEnergy())/(E1+GetBindingEnergy()),PJ1)*((E+DJ)/(E1+DJ));
|
||||
} while (G4UniformRand() > T3);
|
||||
} else {
|
||||
G4double PJ1 = GetA() - 1.5;
|
||||
G4double ES = aFragment.GetExcitationEnergy()*(GetA()-0.5)+
|
||||
(aFragment.GetExcitationEnergy()-R2)*(aFragment.GetNumberOfParticles()+
|
||||
aFragment.GetNumberOfHoles()-2.5);
|
||||
G4double E1 = (ES + sqrt(ES*ES-((aFragment.GetExcitationEnergy()/MeV)-R2)*(GetA()-1.5)*
|
||||
G4double E1 = (ES + sqrt(ES*ES-(aFragment.GetExcitationEnergy()-R2)*(GetA()-1.5)*
|
||||
(aFragment.GetNumberOfParticles()+aFragment.GetNumberOfHoles()-1.5)*
|
||||
4.0*(aFragment.GetExcitationEnergy()/MeV)))/
|
||||
((aFragment.GetNumberOfParticles()+aFragment.GetNumberOfHoles()-1.5)*2.0)
|
||||
- (aFragment.GetExcitationEnergy()/MeV) + R1;
|
||||
G4double E = 0.0;
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
if (GetBindingEnergy() <= 0.0 && abs(GetBindingEnergy()) > GetCoulombBarrier())
|
||||
E = abs(GetBindingEnergy()) + G4UniformRand()*(aFragment.GetExcitationEnergy()/MeV);
|
||||
else
|
||||
E = GetCoulombBarrier()+G4UniformRand()*R2;
|
||||
T3 = (pow((E+GetBindingEnergy())/(E1+GetBindingEnergy()),PJ1)*
|
||||
((E+DJ)/(E1+DJ))) * pow((R1-E)/(R1-E1),T);
|
||||
} while (G4UniformRand() > T3);
|
||||
return E;
|
||||
}
|
||||
4.0*aFragment.GetExcitationEnergy()))/
|
||||
((aFragment.GetNumberOfParticles()+aFragment.GetNumberOfHoles()-1.5)*2.0)
|
||||
- aFragment.GetExcitationEnergy() + R1;
|
||||
G4double E = 0.0;
|
||||
G4double T3 = 0.0;
|
||||
do {
|
||||
if (GetBindingEnergy() <= 0.0 && abs(GetBindingEnergy()) > GetCoulombBarrier()) {
|
||||
E = abs(GetBindingEnergy()) + G4UniformRand()*(aFragment.GetExcitationEnergy());
|
||||
} else {
|
||||
E = GetCoulombBarrier() + G4UniformRand()*R2;
|
||||
}
|
||||
T3 = (pow((E + GetBindingEnergy())/(E1 + GetBindingEnergy()),PJ1)*
|
||||
((E+DJ)/(E1+DJ))) * pow((R1-E)/(R1-E1),T);
|
||||
} while (G4UniformRand() > T3);
|
||||
}
|
||||
return E;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user