49 if (theFragment.GetExcitationEnergy() <= 0.0) {
74 G4int IterationsLimit = 100000;
84 G4double theMeanMult = theMicrocanonicalEnsemble->GetMeanMultiplicity();
85 if (theMeanMult <= MaxAverageMultiplicity) {
88 theChannel = theMicrocanonicalEnsemble->ChooseAandZ(theFragment);
89 _theEnsemble = theMicrocanonicalEnsemble;
97 _theEnsemble = theMacrocanonicalEnsemble;
103 theChannel = theMacrocanonicalEnsemble->
ChooseAandZ(theFragment);
107 if (!ChannelOk)
delete theChannel;
110 }
while (!ChannelOk);
115 theResult->push_back(
new G4Fragment(theFragment));
116 delete theMicrocanonicalEnsemble;
117 if (theMacrocanonicalEnsemble != 0)
delete theMacrocanonicalEnsemble;
129 if (FindTemperatureOfBreakingChannel(theFragment,theChannel,Temperature))
break;
140 }
while (Iterations++ < IterationsLimit );
145 if (Iterations >= IterationsLimit)
146 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMF::BreakItUp: Was not possible to solve for temperature of breaking channel");
150 GetFragments(theFragment.GetA_asInt(),theFragment.GetZ_asInt(),Temperature);
157 InitialMomentum.
boost(-InitialMomentum.boostVector());
162 G4FragmentVector::iterator j;
163 for (j = theResult->begin(); j != theResult->end(); j++)
164 FragmentsEnergy += (*j)->GetMomentum().
e();
165 SavedScaleFactor = ScaleFactor;
166 ScaleFactor = InitialMomentum.e()/FragmentsEnergy;
168 for (j = theResult->begin(); j != theResult->end(); j++) {
169 ScaledMomentum = ScaleFactor * (*j)->GetMomentum().vect();
170 G4double Mass = (*j)->GetMomentum().m();
172 NewMomentum.
setVect(ScaledMomentum);
173 NewMomentum.
setE(std::sqrt(ScaledMomentum.mag2()+Mass*Mass));
174 (*j)->SetMomentum(NewMomentum);
177 }
while (ScaleFactor > 1.0+1.e-5 && std::abs(ScaleFactor-SavedScaleFactor)/ScaleFactor > 1.e-10);
181 G4FragmentVector::iterator i;
182 for (i = theResult->begin(); i != theResult->end(); i++) {
184 FourMom.
boost(theFragment.GetMomentum().boostVector());
185 (*i)->SetMomentum(FourMom);
189 delete theMicrocanonicalEnsemble;
190 if (theMacrocanonicalEnsemble != 0)
delete theMacrocanonicalEnsemble;
G4double GetMeanTemperature(void) const
size_t GetMultiplicity(void)
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
static G4double GetMaxAverageMultiplicity(G4int A)
HepLorentzVector & boost(double, double, double)
std::vector< G4Fragment * > G4FragmentVector
void setVect(const Hep3Vector &)
G4bool CheckFragments(void)