76 G4int IterationsLimit = 100000;
86 G4double theMeanMult = theMicrocanonicalEnsemble->GetMeanMultiplicity();
87 if (theMeanMult <= MaxAverageMultiplicity) {
90 theChannel = theMicrocanonicalEnsemble->ChooseAandZ(theFragment);
105 theChannel = theMacrocanonicalEnsemble->
ChooseAandZ(theFragment);
109 if (!ChannelOk)
delete theChannel;
111 }
while (!ChannelOk);
116 theResult->push_back(
new G4Fragment(theFragment));
117 delete theMicrocanonicalEnsemble;
118 if (theMacrocanonicalEnsemble != 0)
delete theMacrocanonicalEnsemble;
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");
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);
176 }
while (ScaleFactor > 1.0+1.e-5 && std::abs(ScaleFactor-SavedScaleFactor)/ScaleFactor > 1.e-10);
180 G4FragmentVector::iterator i;
181 for (i = theResult->begin(); i != theResult->end(); i++) {
183 FourMom.boost(theFragment.
GetMomentum().boostVector());
184 (*i)->SetMomentum(FourMom);
185 #ifdef PRECOMPOUND_TEST
186 (*i)->SetCreatorModel(
G4String(
"G4StatMF"));
191 delete theMicrocanonicalEnsemble;
192 if (theMacrocanonicalEnsemble != 0)
delete theMacrocanonicalEnsemble;
223 }
else if (Da < 0.0) {
225 Tb -= 0.5 * std::fabs(Tb);
227 if (Tb < 0.001*
MeV)
return false;
231 Db = (U - TotalEnergy)/U;
236 Tb += 0.5 * std::fabs(Tb);
241 Db = (U - TotalEnergy)/U;
249 for (
G4int j = 0; j < 1000; j++) {
251 if (std::abs(Ta-Tc) <=
eps) {
276 Temperature = (Ta+Tb)/2.0;
285 G4double Coulomb = (3./5.)*(elm_coupling*Z*Z)
291 return -MassExcess0 + Coulomb + ChannelEnergy;
static G4Pow * GetInstance()
G4VStatMFEnsemble * _theEnsemble
static G4double GetKappaCoulomb()
CLHEP::Hep3Vector G4ThreeVector
G4double GetFragmentsEnergy(G4double T) const
G4double GetMeanTemperature(void) const
static const G4double eps
size_t GetMultiplicity(void)
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
static G4double GetMaxAverageMultiplicity(G4int A)
static G4double GetMassExcess(const G4int A, const G4int Z)
G4double Z13(G4int Z) const
G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)
const G4LorentzVector & GetMomentum() const
std::vector< G4Fragment * > G4FragmentVector
static const G4double A[nN]
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double CalcEnergy(G4int A, G4int Z, const G4StatMFChannel *aChannel, G4double T)
G4bool FindTemperatureOfBreakingChannel(const G4Fragment &theFragment, const G4StatMFChannel *aChannel, G4double &Temperature)
G4bool CheckFragments(void)
G4double GetExcitationEnergy() const
CLHEP::HepLorentzVector G4LorentzVector