60 _NumOfNeutralFragments(0),
61 _NumOfChargedFragments(0)
74 std::deque<G4StatMFFragment*>::iterator i;
79 G4int Z = (*i)->GetZ();
80 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;
139 std::deque<G4StatMFFragment*>::iterator i;
141 theResult->push_back((*i)->GetFragment(T));
176 TooMuchIterations =
false;
185 G4bool ThereAreOverlaps =
false;
186 std::deque<G4StatMFFragment*>::iterator i;
196 std::deque<G4StatMFFragment*>::iterator j;
199 G4ThreeVector FragToFragVector = (*i)->GetPosition() - (*j)->GetPosition();
201 g4pow->
Z13((*j)->GetA()));
202 if ( (ThereAreOverlaps = (FragToFragVector.mag2() < Rmin*Rmin)) )
break;
205 }
while (ThereAreOverlaps && counter < 1000);
209 TooMuchIterations =
true;
213 }
while (TooMuchIterations);
259 SummedP.setX(0.0);SummedP.setY(0.0);SummedP.setZ(0.0);
260 for (
G4int i = idx; i < idx+NF-2; i++)
268 Boltzmann = std::sqrt(E)*std::exp(-E/T);
271 while (RandE > Boltzmann);
282 AvailableE = KinE - SummedE;
285 while (AvailableE <= p.mag2()/(2.0*(
_theFragments[i1]->GetNuclearMass()+
293 if (CTM12 > 0.9999) {CosTheta1 = 1.;}
301 while (CosTheta1*CosTheta1 < CTM12);
303 while (CTM12 >= 0.0 && CosTheta1 < 0.0);
306 if (CTM12 < 0.0) Sign = 1.0;
311 G4double P1 = (p.mag()*CosTheta1+Sign*std::sqrt(p.mag2()*(CosTheta1*CosTheta1-CTM12)))/H;
312 G4double P2 = std::sqrt(P1*P1+p.mag2() - 2.0*P1*p.mag()*CosTheta1);
314 G4double SinTheta1 = std::sqrt(1.0 - CosTheta1*CosTheta1);
319 G4double CosTheta2 = (p.mag2() + P2*P2 - P1*
P1)/(2.0*p.mag()*
P2);
321 if (CosTheta2 > -1.0 && CosTheta2 < 1.0) SinTheta2 = std::sqrt(1.0 - CosTheta2*CosTheta2);
323 G4ThreeVector p1(P1*SinTheta1*CosPhi1,P1*SinTheta1*SinPhi1,P1*CosTheta1);
324 G4ThreeVector p2(P2*SinTheta2*CosPhi2,P2*SinTheta2*SinPhi2,P2*CosTheta2);
331 SummedE += p1.mag2()/(2.0*
_theFragments[i1]->GetNuclearMass()) +
347 G4double CoulombEnergy = (3./5.)*(elm_coupling*anZ*anZ)*
351 if (CoulombEnergy <= 0.0)
return;
353 G4int Iterations = 0;
378 force.setX(0.0); force.setY(0.0); force.setZ(0.0);
383 distance = Pos[i] - Pos[j];
386 (distance.mag2()*distance.mag()))*distance;
392 TimeN = TimeS + DeltaTime;
398 Vel[i] += Accel[i]*(TimeN-TimeS);
399 Pos[i] += (SavedVel+Vel[i])*(TimeN-TimeS)*0.5;
408 while (Iterations++ < 100);
419 G4double Eta = ( CoulombEnergy + KineticEnergy ) / TotalKineticEnergy;
449 G4double Alpha2 = std::sqrt(V.mag2() - Alpha1*Alpha1);
454 ( (V.x() - Alpha1*U.x())/Alpha2 ) * P.x() + N.x() * P.y() + U.x() * P.z(),
455 ( (V.y() - Alpha1*U.y())/Alpha2 ) * P.x() + N.y() * P.y() + U.y() * P.z(),
456 ( (V.z() - Alpha1*U.z())/Alpha2 ) * P.x() + N.z() * P.y() + U.z() * P.z()
458 return RotatedMomentum;
470 G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta);
473 Magnitude*std::cos(Phi)*CosTheta,
474 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
void PlaceFragments(G4int anA)
std::vector< G4Fragment * > G4FragmentVector
G4int _NumOfNeutralFragments
void FragmentsMomenta(G4int NF, G4int idx, G4double T)
static const G4double A[nN]
G4double GetFragmentsCoulombEnergy(void)
static const G4double * P2[nN]
std::deque< G4StatMFFragment * > _theFragments
short Sign(short a, short b)
G4bool CheckFragments(void)
void SolveEqOfMotion(G4int anA, G4int anZ, G4double T)
G4FragmentVector * GetFragments(G4int anA, G4int anZ, G4double T)