62   _NumOfNeutralFragments(0), 
 
   63   _NumOfChargedFragments(0)
 
   68   if (!_theFragments.empty()) {
 
   69     std::for_each(_theFragments.begin(),_theFragments.end(),
 
   76   std::deque<G4StatMFFragment*>::iterator i;
 
   77   for (i = _theFragments.begin(); 
 
   78        i != _theFragments.end(); ++i) 
 
   82       if ( (A > 1 && (Z > A || Z <= 0)) || (A==1 && Z > A) || A <= 0 ) 
return false;
 
   94     _NumOfNeutralFragments++;
 
   97     _NumOfChargedFragments++;
 
  105   G4double Coulomb = std::accumulate(_theFragments.begin(),_theFragments.end(),
 
  117   G4double TranslationalEnergy = 1.5*T*_theFragments.size();
 
  119   std::deque<G4StatMFFragment*>::const_iterator i;
 
  120   for (i = _theFragments.begin(); i != _theFragments.end(); ++i)
 
  122       Energy += (*i)->GetEnergy(T);
 
  124   return Energy + TranslationalEnergy;  
 
  132   CoulombImpulse(anA,anZ,T);
 
  135   FragmentsMomenta(_NumOfNeutralFragments, _NumOfChargedFragments, T);
 
  138   std::deque<G4StatMFFragment*>::iterator i;
 
  139   for (i = _theFragments.begin(); i != _theFragments.end(); ++i)
 
  140     theResult->push_back((*i)->GetFragment(T));
 
  155   FragmentsMomenta(_NumOfChargedFragments, 0, T);
 
  159   SolveEqOfMotion(anA,anZ,T);
 
  164 void G4StatMFChannel::PlaceFragments(
G4int anA)
 
  175       TooMuchIterations = 
false;
 
  178       G4double R = (Rsys - R0*g4calc->
Z13(_theFragments[0]->GetA()))*
 
  180       _theFragments[0]->SetPosition(IsotropicVector(R));
 
  184       G4bool ThereAreOverlaps = 
false;
 
  185       std::deque<G4StatMFFragment*>::iterator i;
 
  186       for (i = _theFragments.begin()+1; i != _theFragments.end(); ++i) 
 
  192           (*i)->SetPosition(IsotropicVector(R));
 
  195           std::deque<G4StatMFFragment*>::iterator j;
 
  196           for (j = _theFragments.begin(); j != i; ++j) 
 
  199             (*i)->GetPosition() - (*j)->GetPosition();
 
  201                       g4calc->
Z13((*j)->GetA()));
 
  202           if ( (ThereAreOverlaps = (FragToFragVector.
mag2() < Rmin*Rmin))) 
 
  207         } 
while (ThereAreOverlaps && counter < 1000);
 
  211           TooMuchIterations = 
true;
 
  216     } 
while (TooMuchIterations);
 
  220 void G4StatMFChannel::FragmentsMomenta(
G4int NF, 
G4int idx,
 
  235       p = IsotropicVector(std::sqrt(2.0*_theFragments[idx]->GetNuclearMass()*KinE));
 
  236       _theFragments[idx]->SetMomentum(
p);
 
  241       G4double M1 = _theFragments[idx]->GetNuclearMass();
 
  242       G4double M2 = _theFragments[idx+1]->GetNuclearMass();
 
  243       p = IsotropicVector(std::sqrt(2.0*KinE*(M1*M2)/(M1+M2)));     
 
  244       _theFragments[idx]->SetMomentum(
p);
 
  245       _theFragments[idx+1]->SetMomentum(-
p);
 
  260       SummedP.setX(0.0);SummedP.setY(0.0);SummedP.setZ(0.0);
 
  261       for (
G4int i = idx; i < idx+NF-2; ++i) 
 
  273           p = IsotropicVector(std::sqrt(2.0*E*_theFragments[i]->GetNuclearMass()));
 
  274           _theFragments[i]->SetMomentum(
p);
 
  283       AvailableE = KinE - SummedE;
 
  287       while (AvailableE <= 
p.mag2()/(2.0*(_theFragments[i1]->GetNuclearMass()+
 
  288                       _theFragments[i2]->GetNuclearMass())));
 
  289       G4double H = 1.0 + _theFragments[i2]->GetNuclearMass()
 
  290     /_theFragments[i1]->GetNuclearMass();
 
  291       G4double CTM12 = H*(1.0 - 2.0*_theFragments[i2]->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);
 
  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);
 
  333       p1 = RotateMomentum(
p,
b,p1);
 
  334       p2 = RotateMomentum(
p,
b,p2);
 
  337       SummedE += p1.mag2()/(2.0*_theFragments[i1]->GetNuclearMass()) + 
 
  338     p2.mag2()/(2.0*_theFragments[i2]->GetNuclearMass());        
 
  340       _theFragments[i1]->SetMomentum(p1);
 
  341       _theFragments[i2]->SetMomentum(p2);
 
  355   if (CoulombEnergy <= 0.0) 
return;
 
  357   G4int Iterations = 0;
 
  367   for (i = 0; i < _NumOfChargedFragments; i++) 
 
  369       Vel[i] = (1.0/(_theFragments[i]->GetNuclearMass()))*
 
  370     _theFragments[i]->GetMomentum();
 
  371       Pos[i] = _theFragments[i]->GetPosition();
 
  378     for (i = 0; i < _NumOfChargedFragments; i++) 
 
  381     for (
G4int j = 0; j < _NumOfChargedFragments; j++) 
 
  385         distance = Pos[i] - Pos[j];
 
  387               *_theFragments[j]->GetZ()/
 
  388               (distance.mag2()*distance.mag()))*distance;
 
  391     Accel[i] = (1./(_theFragments[i]->GetNuclearMass()))*force;
 
  394     TimeN = TimeS + DeltaTime;
 
  396     for ( i = 0; i < _NumOfChargedFragments; i++) 
 
  399     Vel[i] += Accel[i]*(TimeN-TimeS);
 
  400     Pos[i] += (SavedVel+Vel[i])*(TimeN-TimeS)*0.5;
 
  405   } 
while (Iterations++ < 100);
 
  409   for (i = 0; i < _NumOfChargedFragments; i++) 
 
  411       TotalKineticEnergy += _theFragments[i]->GetNuclearMass()*
 
  415   G4double KineticEnergy = 1.5*_theFragments.size()*T;
 
  416   G4double Eta = ( CoulombEnergy + KineticEnergy ) / TotalKineticEnergy;
 
  417   for (i = 0; i < _NumOfChargedFragments; i++) 
 
  423   for (i = 0; i < _NumOfChargedFragments; i++) 
 
  425       _theFragments[i]->SetMomentum(_theFragments[i]->GetNuclearMass()*Vel[i]);
 
  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()
 
G4double GetFragmentsEnergy(G4double T) const 
 
G4double GetCoulombEnergy(void) const 
 
G4double operator()(G4double &, G4StatMFFragment *&frag)
 
static constexpr double twopi
 
void CreateFragment(G4int A, G4int Z)
 
G4double Z13(G4int Z) const 
 
double A(double temperature)
 
std::vector< G4Fragment * > G4FragmentVector
 
G4double G4Exp(G4double initial_x)
Exponential Function double precision. 
 
G4double GetFragmentsCoulombEnergy(void)
 
G4double A13(G4double A) const 
 
static const G4double * P2[nN]
 
Hep3Vector cross(const Hep3Vector &) const 
 
G4bool CheckFragments(void)
 
G4FragmentVector * GetFragments(G4int anA, G4int anZ, G4double T)