Import Geant4 11.3.0 source tree
This commit is contained in:
+2
-2
@@ -52,12 +52,12 @@ CreateFragmentVector()
|
||||
theFragVector->push_back(new G4PreCompoundProton());
|
||||
// deuterium
|
||||
theFragVector->push_back(new G4PreCompoundDeuteron());
|
||||
// alpha
|
||||
theFragVector->push_back(new G4PreCompoundAlpha());
|
||||
// triton
|
||||
theFragVector->push_back(new G4PreCompoundTriton());
|
||||
// helium3
|
||||
theFragVector->push_back(new G4PreCompoundHe3());
|
||||
// alpha
|
||||
theFragVector->push_back(new G4PreCompoundAlpha());
|
||||
|
||||
return theFragVector;
|
||||
}
|
||||
|
||||
+37
-39
@@ -37,42 +37,27 @@
|
||||
#include "G4KalbachCrossSection.hh"
|
||||
#include "G4ChatterjeeCrossSection.hh"
|
||||
#include "G4DeexPrecoParameters.hh"
|
||||
#include "G4InterfaceToXS.hh"
|
||||
#include "G4IsotopeList.hh"
|
||||
#include "Randomize.hh"
|
||||
|
||||
G4PreCompoundFragment::G4PreCompoundFragment(const G4ParticleDefinition* p,
|
||||
G4VCoulombBarrier* aCoulBarrier)
|
||||
: G4VPreCompoundFragment(p, aCoulBarrier)
|
||||
{
|
||||
muu = probmax = 0.0;
|
||||
if(0 == theZ) { index = 0; }
|
||||
else if(1 == theZ) { index = theA; }
|
||||
else { index = theA + 1; }
|
||||
}
|
||||
{}
|
||||
|
||||
G4double G4PreCompoundFragment::CalcEmissionProbability(const G4Fragment& fr)
|
||||
{
|
||||
//G4cout << theCoulombBarrier << " " << GetMaximalKineticEnergy() << G4endl;
|
||||
// If theCoulombBarrier effect is included in the emission probabilities
|
||||
// Coulomb barrier is the lower limit of integration over kinetic energy
|
||||
|
||||
theEmissionProbability = 0.0;
|
||||
|
||||
if (theMaxKinEnergy <= theMinKinEnergy) { return 0.0; }
|
||||
|
||||
// compute power once
|
||||
if(0 < index) {
|
||||
muu = G4KalbachCrossSection::ComputePowerParameter(theResA, index);
|
||||
}
|
||||
|
||||
theEmissionProbability =
|
||||
IntegrateEmissionProbability(theMinKinEnergy, theMaxKinEnergy, fr);
|
||||
/*
|
||||
theEmissionProbability = (Initialize(fr)) ?
|
||||
IntegrateEmissionProbability(theMinKinEnergy, theMaxKinEnergy, fr) : 0.0;
|
||||
/*
|
||||
G4cout << "## G4PreCompoundFragment::CalcEmisProb "
|
||||
<< "Z= " << fr.GetZ_asInt()
|
||||
<< " A= " << fr.GetA_asInt()
|
||||
<< " Elow= " << LowerLimit/MeV
|
||||
<< " Eup= " << UpperLimit/MeV
|
||||
<< "Zf= " << fr.GetZ_asInt()
|
||||
<< " Af= " << fr.GetA_asInt()
|
||||
<< " Elow= " << theMinKinEnergy
|
||||
<< " Eup= " << theMaxKinEnergy
|
||||
<< " prob= " << theEmissionProbability
|
||||
<< " index=" << index << " Z=" << theZ << " A=" << theA
|
||||
<< G4endl;
|
||||
*/
|
||||
return theEmissionProbability;
|
||||
@@ -106,24 +91,37 @@ G4PreCompoundFragment::IntegrateEmissionProbability(G4double low, G4double up,
|
||||
return sum;
|
||||
}
|
||||
|
||||
G4double G4PreCompoundFragment::CrossSection(G4double ekin) const
|
||||
G4double G4PreCompoundFragment::CrossSection(G4double ekin)
|
||||
{
|
||||
G4double res;
|
||||
if(OPTxs == 0 || (OPTxs == 4 && theMaxKinEnergy < 10.)) {
|
||||
res = GetOpt0(ekin);
|
||||
/*
|
||||
G4cout << "G4PreCompoundFragment::CrossSection OPTxs=" << OPTxs << " E=" << ekin
|
||||
<< " resZ=" << theResZ << " resA=" << theResA << " index=" << index
|
||||
<< " fXSection:" << fXSection << G4endl;
|
||||
*/
|
||||
// compute power once
|
||||
if (OPTxs > 1 && 0 < index && theResA != lastA) {
|
||||
lastA = theResA;
|
||||
muu = G4KalbachCrossSection::ComputePowerParameter(lastA, index);
|
||||
}
|
||||
if (OPTxs == 0) {
|
||||
recentXS = GetOpt0(ekin);
|
||||
} else if (OPTxs == 1) {
|
||||
G4int Z = std::min(theResZ, ZMAXNUCLEARDATA);
|
||||
//G4double e = std::max(ekin, lowEnergyLimitMeV[Z]);
|
||||
recentXS = fXSection->GetElementCrossSection(ekin, Z)/CLHEP::millibarn;
|
||||
|
||||
} else if(OPTxs <= 2) {
|
||||
res = G4ChatterjeeCrossSection::ComputeCrossSection(ekin,
|
||||
theCoulombBarrier,
|
||||
theResA13, muu,
|
||||
index, theZ, theResA);
|
||||
} else if (OPTxs == 2) {
|
||||
recentXS = G4ChatterjeeCrossSection::ComputeCrossSection(ekin,
|
||||
theCoulombBarrier,
|
||||
theResA13, muu,
|
||||
index, theZ, theResA);
|
||||
|
||||
} else {
|
||||
res = G4KalbachCrossSection::ComputeCrossSection(ekin, theCoulombBarrier,
|
||||
theResA13, muu, index,
|
||||
theZ, theA, theResA);
|
||||
recentXS = G4KalbachCrossSection::ComputeCrossSection(ekin, theCoulombBarrier,
|
||||
theResA13, muu, index,
|
||||
theZ, theA, theResA);
|
||||
}
|
||||
return res;
|
||||
return recentXS;
|
||||
}
|
||||
|
||||
G4double G4PreCompoundFragment::GetOpt0(G4double ekin) const
|
||||
|
||||
+6
-8
@@ -77,15 +77,13 @@ G4double G4PreCompoundFragmentVector::CalculateProbabilities(
|
||||
//G4cout << "## G4PreCompoundFragmentVector::CalculateProbabilities nCh= "
|
||||
// << nChannels << G4endl;
|
||||
G4double probtot = 0.0;
|
||||
for (G4int i=0; i< nChannels; ++i) {
|
||||
(*theChannels)[i]->Initialize(aFragment);
|
||||
G4double prob = ((*theChannels)[i]->IsItPossible(aFragment))
|
||||
? (*theChannels)[i]->CalcEmissionProbability(aFragment)
|
||||
: 0.0;
|
||||
probtot += prob;
|
||||
for (G4int i=0; i<nChannels; ++i) {
|
||||
if ((*theChannels)[i]->Initialize(aFragment)) {
|
||||
G4double prob = (*theChannels)[i]->CalcEmissionProbability(aFragment);
|
||||
probtot += prob;
|
||||
}
|
||||
probabilities[i] = probtot;
|
||||
//G4cout<<" prob= " << prob << " probtot= " << probtot
|
||||
// << " for "<< i << "-th channel" <<G4endl;
|
||||
//G4cout<< " probtot= " << probtot << " for "<< i << "-th channel" <<G4endl;
|
||||
}
|
||||
return probtot;
|
||||
}
|
||||
|
||||
+35
-16
@@ -36,6 +36,7 @@
|
||||
#include "G4NuclearLevelData.hh"
|
||||
#include "G4DeexPrecoParameters.hh"
|
||||
#include "G4VCoulombBarrier.hh"
|
||||
#include "G4InterfaceToXS.hh"
|
||||
|
||||
G4VPreCompoundFragment::G4VPreCompoundFragment(
|
||||
const G4ParticleDefinition* part, G4VCoulombBarrier* aCoulombBarrier)
|
||||
@@ -47,12 +48,24 @@ G4VPreCompoundFragment::G4VPreCompoundFragment(
|
||||
theMass = particle->GetPDGMass();
|
||||
fNucData = G4NuclearLevelData::GetInstance();
|
||||
theParameters = fNucData->GetParameters();
|
||||
OPTxs = theParameters->GetDeexModelType();
|
||||
g4calc = G4Pow::GetInstance();
|
||||
|
||||
if (1 == theZ && 1 == theA) { index = 1; }
|
||||
else if (1 == theZ && 2 == theA) { index = 2; }
|
||||
else if (1 == theZ && 3 == theA) { index = 3; }
|
||||
else if (2 == theZ && 3 == theA) { index = 4; }
|
||||
else if (2 == theZ && 4 == theA) { index = 5; }
|
||||
|
||||
if (OPTxs == 1) {
|
||||
fXSection = new G4InterfaceToXS(particle, index);
|
||||
}
|
||||
}
|
||||
|
||||
G4VPreCompoundFragment::~G4VPreCompoundFragment()
|
||||
{
|
||||
delete theCoulombBarrierPtr;
|
||||
delete fXSection;
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
@@ -72,7 +85,7 @@ operator << (std::ostream &out, const G4VPreCompoundFragment *theFragment)
|
||||
return out;
|
||||
}
|
||||
|
||||
void
|
||||
G4bool
|
||||
G4VPreCompoundFragment::Initialize(const G4Fragment& aFragment)
|
||||
{
|
||||
theFragA = aFragment.GetA_asInt();
|
||||
@@ -81,33 +94,39 @@ G4VPreCompoundFragment::Initialize(const G4Fragment& aFragment)
|
||||
theResZ = theFragZ - theZ;
|
||||
|
||||
theMinKinEnergy = theMaxKinEnergy = theCoulombBarrier = 0.0;
|
||||
if ((theResA < theResZ) || (theResA < theA) || (theResZ < theZ)) {
|
||||
return;
|
||||
if ((theResA < theResZ) || (theResA < theA) || (theResZ < theZ)
|
||||
|| (theResA == theA && theResZ < theZ)
|
||||
|| ((theResA > 1) && (theResA == theResZ || theResZ == 0))) {
|
||||
return false;
|
||||
}
|
||||
theResMass = G4NucleiProperties::GetNuclearMass(theResA, theResZ);
|
||||
G4double Ecm = aFragment.GetMomentum().m();
|
||||
if (Ecm <= theResMass + theMass) { return 0.0; }
|
||||
|
||||
theResA13 = g4calc->Z13(theResA);
|
||||
|
||||
G4double elim = 0.0;
|
||||
if (0 < theZ) {
|
||||
theCoulombBarrier = theCoulombBarrierPtr->
|
||||
GetCoulombBarrier(theResA, theResZ, aFragment.GetExcitationEnergy());
|
||||
elim = (0 < OPTxs) ? theCoulombBarrier*0.5 : theCoulombBarrier;
|
||||
}
|
||||
G4double elim = (0 == OPTxs) ? theCoulombBarrier : theCoulombBarrier*0.6;
|
||||
|
||||
|
||||
// Compute Maximal Kinetic Energy which can be carried by fragments
|
||||
// after separation - the true assimptotic value
|
||||
theMaxKinEnergy =
|
||||
0.5*((Ecm - theResMass)*(Ecm + theResMass) + theMass*theMass)/Ecm - theMass;
|
||||
G4double resM = Ecm - theMass - elim;
|
||||
if (resM < theResMass) { return false; }
|
||||
theMinKinEnergy =
|
||||
0.5*((Ecm - resM)*(Ecm + resM) + theMass*theMass)/Ecm - theMass;
|
||||
|
||||
if (theMinKinEnergy >= theMaxKinEnergy) { return false; }
|
||||
// Calculate masses
|
||||
theResMass = G4NucleiProperties::GetNuclearMass(theResA, theResZ);
|
||||
theReducedMass = theResMass*theMass/(theResMass + theMass);
|
||||
|
||||
// Compute Binding Energies for fragments
|
||||
// needed to separate a fragment from the nucleus
|
||||
theBindingEnergy = theResMass + theMass - aFragment.GetGroundStateMass();
|
||||
|
||||
// Compute Maximal Kinetic Energy which can be carried by fragments
|
||||
// after separation - the true assimptotic value
|
||||
G4double Ecm = aFragment.GetMomentum().m();
|
||||
G4double twoEcm = Ecm + Ecm;
|
||||
theMaxKinEnergy = std::max(((Ecm-theResMass)*(Ecm+theResMass) +
|
||||
theMass*theMass)/twoEcm - theMass, 0.0);
|
||||
theMinKinEnergy = (elim == 0.0) ? 0.0 :
|
||||
std::max(((theMass+elim)*(twoEcm-theMass-elim) +
|
||||
theMass*theMass)/twoEcm - theMass, 0.0);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user