Import Geant4 11.3.0 source tree

This commit is contained in:
Gabriele Cosmo
2024-12-06 11:11:40 +01:00
parent e58e650b32
commit 32390e802b
1984 changed files with 98713 additions and 83996 deletions
@@ -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,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
@@ -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;
}
@@ -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;
}