47 delete theMicrocanonicalEnsemble;
48 delete theMacrocanonicalEnsemble;
59 theMicrocanonicalEnsemble->Initialise(theFragment);
61 const G4int iLimit = 20;
66 for (
G4int i=0; i<iLimit; ++i) {
67 for (
G4int j=0; j<iLimit; ++j) {
69 G4double theMeanMult = theMicrocanonicalEnsemble->GetMeanMultiplicity();
70 if (theMeanMult <= MaxAverageMultiplicity) {
74 theChannel = theMicrocanonicalEnsemble->ChooseAandZ(theFragment);
75 fEnsemble = theMicrocanonicalEnsemble;
81 theMacrocanonicalEnsemble->Initialise(theFragment);
82 fEnsemble = theMacrocanonicalEnsemble;
87 theChannel = theMacrocanonicalEnsemble->ChooseAandZ(theFragment);
107 Temperature = fEnsemble->GetMeanTemperature();
109 if (FindTemperatureOfBreakingChannel(theFragment, theChannel, Temperature)) {
119 theChannel =
nullptr;
128 theResult->push_back(
new G4Fragment(theFragment));
139 for (
G4int i=0; i<iLimit; ++i) {
141 if (
nullptr == theResult) {
continue; }
144 for (
auto const & ptr : *theResult) {
145 G4double e = ptr->GetMomentum().e();
146 G4double m1 = ptr->GetGroundStateMass() + ptr->GetExcitationEnergy();
148 ekin += std::max(e - m1, 0.0);
151 if (etot - m0 + ekin > 0.0 && ekin > 0.0) {
break; }
154 for (
auto const & ptr : *theResult) {
163 if (
nullptr == theResult || ekin <= 0.0) {
165 theResult->push_back(
new G4Fragment(theFragment));
169 G4double x = 1.0 + (etot - m0)/ekin;
173 for (
auto const & ptr : *theResult) {
174 G4double m1 = ptr->GetGroundStateMass() + ptr->GetExcitationEnergy();
175 G4double ek = std::max((ptr->GetMomentum().e() - m1)*x, 0.0);
176 auto mom = ptr->GetMomentum().vect().unit();
177 mom *= std::sqrt(ek * (ek + 2.0*m1));
178 lv1.
set(mom.x(), mom.y(), mom.z(), ek + m1);
180 ptr->SetMomentum(lv1);
185G4bool G4StatMF::FindTemperatureOfBreakingChannel(
const G4Fragment & theFragment,
194 G4double T = std::max(Temperature, 0.0012*CLHEP::MeV);
196 G4double TotalEnergy = CalcEnergy(
A,Z,aChannel,T);
205 }
else if (Da < 0.0) {
208 if (T < 0.001*MeV)
return false;
210 TotalEnergy = CalcEnergy(
A,Z,aChannel,T);
212 Db = (U - TotalEnergy)/U;
220 TotalEnergy = CalcEnergy(
A,Z,aChannel,T);
222 Db = (U - TotalEnergy)/U;
227 G4double eps = 1.0e-14 * std::abs(T-Ta);
231 for (
G4int j = 0; j < 1000; j++) {
233 if (std::abs(Ta-Tc) <= eps) {
239 TotalEnergy = CalcEnergy(
A,Z,aChannel,T);
255 Temperature = (Ta+T)*0.5;
std::vector< G4Fragment * > G4FragmentVector
CLHEP::HepLorentzVector G4LorentzVector
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void set(double x, double y, double z, double t)
G4double GetGroundStateMass() const
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
static G4double GetMassExcess(const G4int A, const G4int Z)
G4bool CheckFragments(void)
G4double GetFragmentsEnergy(G4double T) const
size_t GetMultiplicity(void)
G4FragmentVector * GetFragments(G4int anA, G4int anZ, G4double T)
static G4double GetMaxAverageMultiplicity(G4int A)
static G4double GetCoulomb()
G4FragmentVector * BreakItUp(const G4Fragment &theNucleus) override