62 _NumOfNeutralFragments(0),
63 _NumOfChargedFragments(0)
76 std::deque<G4StatMFFragment*>::iterator i;
81 G4int Z = (*i)->GetZ();
82 if ( (A > 1 && (Z > A || Z <= 0)) || (A==1 && Z > A) || A <= 0 )
return false;
119 std::deque<G4StatMFFragment*>::const_iterator i;
122 Energy += (*i)->GetEnergy(T);
124 return Energy + TranslationalEnergy;
138 std::deque<G4StatMFFragment*>::iterator i;
140 theResult->push_back((*i)->GetFragment(T));
175 TooMuchIterations =
false;
184 G4bool ThereAreOverlaps =
false;
185 std::deque<G4StatMFFragment*>::iterator i;
195 std::deque<G4StatMFFragment*>::iterator j;
199 (*i)->GetPosition() - (*j)->GetPosition();
201 g4pow->
Z13((*j)->GetA()));
202 if ( (ThereAreOverlaps = (FragToFragVector.mag2() < Rmin*Rmin)))
207 }
while (ThereAreOverlaps && counter < 1000);
211 TooMuchIterations =
true;
216 }
while (TooMuchIterations);
260 SummedP.setX(0.0);SummedP.setY(0.0);SummedP.setZ(0.0);
261 for (
G4int i = idx; i < idx+NF-2; ++i)
283 AvailableE = KinE - SummedE;
287 while (AvailableE <= p.mag2()/(2.0*(
_theFragments[i1]->GetNuclearMass()+
292 *AvailableE/p.mag2());
296 if (CTM12 > 1.) {CosTheta1 = 1.;}
305 while (CosTheta1*CosTheta1 < CTM12);
308 while (CTM12 >= 0.0 && CosTheta1 < 0.0);
311 if (CTM12 < 0.0) Sign = 1.0;
315 G4double P1 = (p.mag()*CosTheta1+Sign*std::sqrt(p.mag2()
316 *(CosTheta1*CosTheta1-CTM12)))/H;
317 G4double P2 = std::sqrt(P1*P1+p.mag2() - 2.0*P1*p.mag()*CosTheta1);
319 G4double SinTheta1 = std::sqrt(1.0 - CosTheta1*CosTheta1);
324 G4double CosTheta2 = (p.mag2() + P2*P2 - P1*
P1)/(2.0*p.mag()*
P2);
326 if (CosTheta2 > -1.0 && CosTheta2 < 1.0) {
327 SinTheta2 = std::sqrt(1.0 - CosTheta2*CosTheta2);
329 G4ThreeVector p1(P1*SinTheta1*CosPhi1,P1*SinTheta1*SinPhi1,P1*CosTheta1);
330 G4ThreeVector p2(P2*SinTheta2*CosPhi2,P2*SinTheta2*SinPhi2,P2*CosTheta2);
337 SummedE += p1.mag2()/(2.0*
_theFragments[i1]->GetNuclearMass()) +
352 G4double CoulombEnergy = 0.6*elm_coupling*anZ*anZ*
355 if (CoulombEnergy <= 0.0)
return;
357 G4int Iterations = 0;
385 distance = Pos[i] - Pos[j];
388 (distance.mag2()*distance.mag()))*distance;
394 TimeN = TimeS + DeltaTime;
399 Vel[i] += Accel[i]*(TimeN-TimeS);
400 Pos[i] += (SavedVel+Vel[i])*(TimeN-TimeS)*0.5;
405 }
while (Iterations++ < 100);
416 G4double Eta = ( CoulombEnergy + KineticEnergy ) / TotalKineticEnergy;
444 G4double Alpha2 = std::sqrt(V.mag2() - Alpha1*Alpha1);
449 ( (V.x() - Alpha1*U.x())/Alpha2 ) * P.x() + N.x() * P.y() + U.x() * P.z(),
450 ( (V.y() - Alpha1*U.y())/Alpha2 ) * P.x() + N.y() * P.y() + U.y() * P.z(),
451 ( (V.z() - Alpha1*U.z())/Alpha2 ) * P.x() + N.z() * P.y() + U.z() * P.z()
453 return RotatedMomentum;
461 G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta);
464 Magnitude*std::cos(Phi)*CosTheta,
465 Magnitude*std::sin(Phi));
static G4Pow * GetInstance()
static const G4double * P1[nN]
static G4double GetKappaCoulomb()
CLHEP::Hep3Vector G4ThreeVector
void CoulombImpulse(G4int anA, G4int anZ, G4double T)
G4double GetFragmentsEnergy(G4double T) const
G4double GetCoulombEnergy(void) const
G4ThreeVector RotateMomentum(G4ThreeVector Pa, G4ThreeVector V, G4ThreeVector P)
G4double operator()(G4double &, G4StatMFFragment *&frag)
G4int _NumOfChargedFragments
G4ThreeVector IsotropicVector(G4double Magnitude=1.0)
void CreateFragment(G4int A, G4int Z)
G4double Z13(G4int Z) const
double A(double temperature)
static const double twopi
void PlaceFragments(G4int anA)
std::vector< G4Fragment * > G4FragmentVector
G4int _NumOfNeutralFragments
void FragmentsMomenta(G4int NF, G4int idx, G4double T)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double GetFragmentsCoulombEnergy(void)
G4double A13(G4double A) const
static const G4double * P2[nN]
std::deque< G4StatMFFragment * > _theFragments
G4bool CheckFragments(void)
void SolveEqOfMotion(G4int anA, G4int anZ, G4double T)
G4FragmentVector * GetFragments(G4int anA, G4int anZ, G4double T)