Import Geant4 5.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-08 16:57:27 +02:00
parent 330b82b769
commit 37fff30d2e
5733 changed files with 263867 additions and 74574 deletions
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4ImportanceAlgorithm.cc,v 1.4 2002/04/09 16:23:49 gcosmo Exp $
// GEANT4 tag $Name: geant4-04-01 $
// $Id: G4ImportanceAlgorithm.cc,v 1.9 2002/11/04 10:43:07 dressel Exp $
// GEANT4 tag $Name: geant4-05-00 $
//
// ----------------------------------------------------------------------
// GEANT 4 class source file
@@ -49,59 +49,67 @@ G4ImportanceAlgorithm::~G4ImportanceAlgorithm()
}
G4Nsplit_Weight
G4ImportanceAlgorithm::Calculate(G4double ipre_over_ipost,
G4ImportanceAlgorithm::Calculate(G4double ipre,
G4double ipost,
G4double init_w) const
{
if ((ipre_over_ipost<0.25 || ipre_over_ipost> 4) && !fWorned) {
G4std::ostrstream os;
os << "Calculate: ipre_over_ipost ! in [0.25, 4]: ipre_over_ipost = "
<< ipre_over_ipost << '\0' << G4endl;
Warning(os.str());
fWorned = true;
if (ipre_over_ipost<=0) {
Error("Calculate: ipre_over_ipost<=0");
G4Nsplit_Weight nw = {0,0};
if (ipost>0.){
if (!(ipre>0.)){
G4Exception("Error: G4ImportanceAlgorithm::Calculate: ipre==0.");
}
G4double ipre_over_ipost = ipre/ipost;
if ((ipre_over_ipost<0.25 || ipre_over_ipost> 4) && !fWorned) {
G4std::ostrstream os;
os << "Calculate: ipre_over_ipost ! in [0.25, 4]: ipre_over_ipost = "
<< ipre_over_ipost << '\0' << G4endl;
Warning(os.str());
fWorned = true;
if (ipre_over_ipost<=0) {
Error("Calculate: ipre_over_ipost<=0");
}
}
if (init_w<=0.) {
Error("Calculate: iniitweight<= 0. found");
}
}
if (init_w<=0.) {
Error("Calculate: iniitweight<= 0. found");
}
// default geometrical splitting
// in integer mode
// for ipre_over_ipost <= 1
G4double inv = 1./ipre_over_ipost;
G4Nsplit_Weight nw( (int)inv, init_w * ipre_over_ipost);
// geometrical splitting for double mode
if (ipre_over_ipost<1) {
if ( G4double(nw.fN) != inv) {
// double mode
// probability p for splitting into n+1 tracks
G4double p = inv - nw.fN;
// default geometrical splitting
// in integer mode
// for ipre_over_ipost <= 1
G4double inv = 1./ipre_over_ipost;
nw.fN = static_cast<G4int>(inv);
nw.fW = init_w * ipre_over_ipost;
// geometrical splitting for double mode
if (ipre_over_ipost<1) {
if ( static_cast<G4double>(nw.fN) != inv) {
// double mode
// probability p for splitting into n+1 tracks
G4double p = inv - nw.fN;
// get a random number out of [0,1)
G4double r = G4UniformRand();
if (r<p) {
nw.fN++;
}
}
}
// ipre_over_ipost > 1
// russian roulett
else if (ipre_over_ipost>1) {
// probabiity for killing track
G4double p = 1-inv;
// get a random number out of [0,1)
G4double r = G4UniformRand();
if (r<p) {
nw.fN++;
}
}
}
// ipre_over_ipost > 1
// russian roulett
else {
// probabiity for killing track
G4double p = 1-inv;
// get a random number out of [0,1)
G4double r = G4UniformRand();
if (r<p) {
// kill track
nw.fN = 0;
nw.fW = 0;
}
else {
nw.fN = 1;
// kill track
nw.fN = 0;
nw.fW = 0;
}
else {
nw.fN = 1;
}
}
}
return nw;
}