Import Geant4 5.0.0 source tree
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user