G4WilsonAblationModel.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // *                                                                  *
00021 // * Parts of this code which have been  developed by QinetiQ Ltd     *
00022 // * under contract to the European Space Agency (ESA) are the        *
00023 // * intellectual property of ESA. Rights to use, copy, modify and    *
00024 // * redistribute this software for general public use are granted    *
00025 // * in compliance with any licensing, distribution and development   *
00026 // * policy adopted by the Geant4 Collaboration. This code has been   *
00027 // * written by QinetiQ Ltd for the European Space Agency, under ESA  *
00028 // * contract 17191/03/NL/LvH (Aurora Programme).                     *
00029 // *                                                                  *
00030 // * By using,  copying,  modifying or  distributing the software (or *
00031 // * any work based  on the software)  you  agree  to acknowledge its *
00032 // * use  in  resulting  scientific  publications,  and indicate your *
00033 // * acceptance of all terms of the Geant4 Software license.          *
00034 // ********************************************************************
00035 //
00036 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00037 //
00038 // MODULE:              G4WilsonAblationModel.cc
00039 //
00040 // Version:             1.0
00041 // Date:                08/12/2009
00042 // Author:              P R Truscott
00043 // Organisation:        QinetiQ Ltd, UK
00044 // Customer:            ESA/ESTEC, NOORDWIJK
00045 // Contract:            17191/03/NL/LvH
00046 //
00047 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00048 //
00049 // CHANGE HISTORY
00050 // --------------
00051 //
00052 // 6 October 2003, P R Truscott, QinetiQ Ltd, UK
00053 // Created.
00054 //
00055 // 15 March 2004, P R Truscott, QinetiQ Ltd, UK
00056 // Beta release
00057 //
00058 // 08 December 2009, P R Truscott, QinetiQ Ltd, UK
00059 // Ver 1.0
00060 // Updated as a result of changes in the G4Evaporation classes.  These changes
00061 // affect mostly SelectSecondariesByEvaporation, and now you have variables
00062 // associated with the evaporation model which can be changed:
00063 //    OPTxs to select the inverse cross-section
00064 //    OPTxs = 0      => Dostrovski's parameterization
00065 //    OPTxs = 1 or 2 => Chatterjee's paramaterization
00066 //    OPTxs = 3 or 4 => Kalbach's parameterization
00067 //    useSICB        => use superimposed Coulomb Barrier for inverse cross
00068 //                      sections
00069 // Other problem found with G4Fragment definition using Lorentz vector and
00070 // **G4ParticleDefinition**.  This does not allow A and Z to be defined for the
00071 // fragment for some reason.  Now the fragment is defined more explicitly:
00072 //    G4Fragment *fragment = new G4Fragment(A, Z, lorentzVector);
00073 // to avoid this quirk.  Bug found in SelectSecondariesByDefault: *type is now
00074 // equated to evapType[i] whereas previously it was equated to fragType[i].
00075 // 
00076 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00078 //
00079 #include <iomanip>
00080 #include <numeric>
00081 
00082 #include "G4WilsonAblationModel.hh"
00083 #include "G4PhysicalConstants.hh"
00084 #include "G4SystemOfUnits.hh"
00085 #include "Randomize.hh"
00086 #include "G4ParticleTable.hh"
00087 #include "G4IonTable.hh"
00088 #include "G4Alpha.hh"
00089 #include "G4He3.hh"
00090 #include "G4Triton.hh"
00091 #include "G4Deuteron.hh"
00092 #include "G4Proton.hh"
00093 #include "G4Neutron.hh"
00094 #include "G4AlphaEvaporationChannel.hh"
00095 #include "G4He3EvaporationChannel.hh"
00096 #include "G4TritonEvaporationChannel.hh"
00097 #include "G4DeuteronEvaporationChannel.hh"
00098 #include "G4ProtonEvaporationChannel.hh"
00099 #include "G4NeutronEvaporationChannel.hh"
00100 #include "G4LorentzVector.hh"
00101 #include "G4VEvaporationChannel.hh"
00102 
00104 //
00105 G4WilsonAblationModel::G4WilsonAblationModel()
00106 {
00107 //
00108 //
00109 // Send message to stdout to advise that the G4Abrasion model is being used.
00110 //
00111   PrintWelcomeMessage();
00112 //
00113 //
00114 // Set the default verbose level to 0 - no output.
00115 //
00116   verboseLevel = 0;  
00117 //
00118 //
00119 // Set the binding energy per nucleon .... did I mention that this is a crude
00120 // model for nuclear de-excitation?
00121 //
00122   B = 10.0 * MeV;
00123 //
00124 //
00125 // It is possuble to switch off secondary particle production (other than the
00126 // final nuclear fragment).  The default is on.
00127 //
00128   produceSecondaries = true;
00129 //
00130 //
00131 // Now we need to define the decay modes.  We're using the G4Evaporation model
00132 // to help determine the kinematics of the decay.
00133 //
00134   nFragTypes  = 6;
00135   fragType[0] = G4Alpha::Alpha();
00136   fragType[1] = G4He3::He3();
00137   fragType[2] = G4Triton::Triton();
00138   fragType[3] = G4Deuteron::Deuteron();
00139   fragType[4] = G4Proton::Proton();
00140   fragType[5] = G4Neutron::Neutron();
00141 //
00142 //
00143 // Set verboseLevel default to no output.
00144 //
00145   verboseLevel = 0;
00146   theChannelFactory = new G4EvaporationFactory();
00147   theChannels = theChannelFactory->GetChannel();
00148 //
00149 //
00150 // Set defaults for evaporation classes.  These can be overridden by user
00151 // "set" methods.
00152 //
00153   OPTxs   = 3;
00154   useSICB = false;
00155   fragmentVector = 0;
00156 }
00158 //
00159 G4WilsonAblationModel::~G4WilsonAblationModel()
00160 {
00161   if (theChannels != 0) theChannels = 0;
00162   if (theChannelFactory != 0) delete theChannelFactory;
00163 }
00165 //
00166 G4FragmentVector *G4WilsonAblationModel::BreakItUp
00167   (const G4Fragment &theNucleus)
00168 {
00169 //
00170 //
00171 // Initilise the pointer to the G4FragmentVector used to return the information
00172 // about the breakup.
00173 //
00174   fragmentVector = new G4FragmentVector;
00175   fragmentVector->clear();
00176 //
00177 //
00178 // Get the A, Z and excitation of the nucleus.
00179 //
00180   G4int A     = theNucleus.GetA_asInt();
00181   G4int Z     = theNucleus.GetZ_asInt();
00182   G4double ex = theNucleus.GetExcitationEnergy();
00183   if (verboseLevel >= 2)
00184   {
00185     G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
00186            <<"oooooooooooooooooooooooooooooooooooooooo"
00187            <<G4endl;
00188     G4cout.precision(6);
00189     G4cout <<"IN G4WilsonAblationModel" <<G4endl;
00190     G4cout <<"Initial prefragment A=" <<A
00191            <<", Z=" <<Z
00192            <<", excitation energy = " <<ex/MeV <<" MeV"
00193            <<G4endl; 
00194   }
00195 //
00196 //
00197 // Check that there is a nucleus to speak of.  It's possible there isn't one
00198 // or its just a proton or neutron.  In either case, the excitation energy
00199 // (from the Lorentz vector) is not used.
00200 //
00201   if (A == 0)
00202   {
00203     if (verboseLevel >= 2)
00204     {
00205       G4cout <<"No nucleus to decay" <<G4endl;
00206       G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
00207              <<"oooooooooooooooooooooooooooooooooooooooo"
00208              <<G4endl;
00209     }
00210     return fragmentVector;
00211   }
00212   else if (A == 1)
00213   {
00214     G4LorentzVector lorentzVector = theNucleus.GetMomentum();
00215     lorentzVector.setE(lorentzVector.e()-ex+10.0*eV);
00216     if (Z == 0)
00217     {
00218       G4Fragment *fragment = new G4Fragment(lorentzVector,G4Neutron::Neutron());
00219       fragmentVector->push_back(fragment);
00220     }
00221     else
00222     {
00223       G4Fragment *fragment = new G4Fragment(lorentzVector,G4Proton::Proton());
00224       fragmentVector->push_back(fragment);
00225     }
00226     if (verboseLevel >= 2)
00227     {
00228       G4cout <<"Final fragment is in fact only a nucleon) :" <<G4endl;
00229       G4cout <<(*fragmentVector)[0] <<G4endl;
00230       G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
00231              <<"oooooooooooooooooooooooooooooooooooooooo"
00232              <<G4endl;
00233     }
00234     return fragmentVector;
00235   }
00236 //
00237 //
00238 // Then the number of nucleons ablated (either as nucleons or light nuclear
00239 // fragments) is based on a simple argument for the binding energy per nucleon.
00240 //
00241   G4int DAabl = (G4int) (ex / B);
00242   if (DAabl > A) DAabl = A;
00243 // The following lines are no longer accurate given we now treat the final fragment
00244 //  if (verboseLevel >= 2)
00245 //    G4cout <<"Number of nucleons ejected = " <<DAabl <<G4endl;
00246 
00247 //
00248 //
00249 // Determine the nuclear fragment from the ablation process by sampling the
00250 // Rudstam equation.
00251 //
00252   G4int AF = A - DAabl;
00253   G4int ZF = 0;
00254   if (AF > 0)
00255   {
00256     G4double AFd = (G4double) AF;
00257     G4double R = 11.8 / std::pow(AFd, 0.45);
00258     G4int minZ = Z - DAabl;
00259     if (minZ <= 0) minZ = 1;
00260 //
00261 //
00262 // Here we define an integral probability distribution based on the Rudstam
00263 // equation assuming a constant AF.
00264 //    
00265     G4double sig[100];
00266     G4double sum = 0.0;
00267     for (G4int ii=minZ; ii<= Z; ii++)
00268     {
00269       sum   += std::exp(-R*std::pow(std::abs(ii - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
00270       sig[ii] = sum;
00271     }
00272 //
00273 //
00274 // Now sample that distribution to determine a value for ZF.
00275 //
00276     G4double xi  = G4UniformRand();
00277     G4int iz     = minZ;
00278     G4bool found = false;
00279     while (iz <= Z && !found)
00280     {
00281       found = (xi <= sig[iz]/sum);
00282       if (!found) iz++;
00283     }
00284     if (iz > Z)
00285       ZF = Z;
00286     else
00287       ZF = iz;
00288   }
00289   G4int DZabl = Z - ZF;
00290 //
00291 //
00292 // Now determine the nucleons or nuclei which have bee ablated.  The preference
00293 // is for the production of alphas, then other nuclei in order of decreasing
00294 // binding energy. The energies assigned to the products of the decay are
00295 // provisional for the moment (the 10eV is just to avoid errors with negative
00296 // excitation energies due to rounding).
00297 //
00298   G4double totalEpost = 0.0;
00299   evapType.clear();
00300   for (G4int ift=0; ift<nFragTypes; ift++)
00301   {
00302     G4ParticleDefinition *type = fragType[ift];
00303     G4double n  = std::floor((G4double) DAabl / type->GetBaryonNumber() + 1.0E-10);
00304     G4double n1 = 1.0E+10;
00305     if (fragType[ift]->GetPDGCharge() > 0.0)
00306       n1 = std::floor((G4double) DZabl / type->GetPDGCharge() + 1.0E-10);
00307     if (n > n1) n = n1;
00308     if (n > 0.0)
00309     {
00310       G4double mass = type->GetPDGMass();
00311       for (G4int j=0; j<(G4int) n; j++)
00312       {
00313         totalEpost += mass;
00314         evapType.push_back(type);
00315       }
00316       DAabl -= (G4int) (n * type->GetBaryonNumber() + 1.0E-10);
00317       DZabl -= (G4int) (n * type->GetPDGCharge() + 1.0E-10);
00318     }
00319   }
00320 //
00321 //
00322 // Determine the properties of the final nuclear fragment.  Note that if
00323 // the final fragment is predicted to have a nucleon number of zero, then
00324 // really it's the particle last in the vector evapType which becomes the
00325 // final fragment.  Therefore delete this from the vector if this is the
00326 // case.
00327 //
00328   G4double massFinalFrag = 0.0;
00329   if (AF > 0)
00330     massFinalFrag = G4ParticleTable::GetParticleTable()->GetIonTable()->
00331       GetIonMass(ZF,AF);
00332   else
00333   {
00334     G4ParticleDefinition *type = evapType[evapType.size()-1];
00335     AF                         = type->GetBaryonNumber();
00336     ZF                         = (G4int) (type->GetPDGCharge() + 1.0E-10);
00337     evapType.erase(evapType.end()-1);
00338   }
00339   totalEpost   += massFinalFrag;
00340 //
00341 //
00342 // Provide verbose output on the nuclear fragment if requested.
00343 //
00344   if (verboseLevel >= 2)
00345   {
00346     G4cout <<"Final fragment      A=" <<AF
00347            <<", Z=" <<ZF
00348            <<G4endl;
00349     for (G4int ift=0; ift<nFragTypes; ift++)
00350     {
00351       G4ParticleDefinition *type = fragType[ift];
00352       G4int n                    = std::count(evapType.begin(),evapType.end(),type);
00353       if (n > 0) 
00354         G4cout <<"Particle type: " <<std::setw(10) <<type->GetParticleName()
00355                <<", number of particles emitted = " <<n <<G4endl;
00356     }
00357   }
00358 //
00359 // Add the total energy from the fragment.  Note that the fragment is assumed
00360 // to be de-excited and does not undergo photo-evaporation .... I did mention
00361 // this is a bit of a crude model?
00362 //
00363   G4double massPreFrag      = theNucleus.GetGroundStateMass();
00364   G4double totalEpre        = massPreFrag + ex;
00365   G4double excess           = totalEpre - totalEpost;
00366 //  G4Fragment *resultNucleus(theNucleus);
00367   G4Fragment *resultNucleus = new G4Fragment(A, Z, theNucleus.GetMomentum());
00368   G4ThreeVector boost(0.0,0.0,0.0);
00369   G4int nEvap = 0;
00370   if (produceSecondaries && evapType.size()>0)
00371   {
00372     if (excess > 0.0)
00373     {
00374       SelectSecondariesByEvaporation (resultNucleus);
00375       nEvap = fragmentVector->size();
00376       boost = resultNucleus->GetMomentum().findBoostToCM();
00377       if (evapType.size() > 0)
00378         SelectSecondariesByDefault (boost);
00379     }
00380     else
00381       SelectSecondariesByDefault(G4ThreeVector(0.0,0.0,0.0));
00382   }
00383 
00384   if (AF > 0)
00385   {
00386     G4double mass = G4ParticleTable::GetParticleTable()->GetIonTable()->
00387       GetIonMass(ZF,AF);
00388     G4double e    = mass + 10.0*eV;
00389     G4double p    = std::sqrt(e*e-mass*mass);
00390     G4ThreeVector direction(0.0,0.0,1.0);
00391     G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e);
00392     lorentzVector.boost(-boost);
00393     G4Fragment* frag = new G4Fragment(AF, ZF, lorentzVector);
00394     fragmentVector->push_back(frag);
00395   }
00396   delete resultNucleus;
00397 //
00398 //
00399 // Provide verbose output on the ablation products if requested.
00400 //
00401   if (verboseLevel >= 2)
00402   {
00403     if (nEvap > 0)
00404     {
00405       G4cout <<"----------------------" <<G4endl;
00406       G4cout <<"Evaporated particles :" <<G4endl;
00407       G4cout <<"----------------------" <<G4endl;
00408     }
00409     G4int ie = 0;
00410     G4FragmentVector::iterator iter;
00411     for (iter = fragmentVector->begin(); iter != fragmentVector->end(); iter++)
00412     {
00413       if (ie == nEvap)
00414       {
00415 //        G4cout <<*iter  <<G4endl;
00416         G4cout <<"---------------------------------" <<G4endl;
00417         G4cout <<"Particles from default emission :" <<G4endl;
00418         G4cout <<"---------------------------------" <<G4endl;
00419       }
00420       G4cout <<*iter <<G4endl;
00421     }
00422     G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
00423            <<"oooooooooooooooooooooooooooooooooooooooo"
00424            <<G4endl;
00425   }
00426 
00427   return fragmentVector;    
00428 }
00430 //
00431 void G4WilsonAblationModel::SelectSecondariesByEvaporation
00432   (G4Fragment *intermediateNucleus)
00433 {
00434   G4Fragment theResidualNucleus = *intermediateNucleus;
00435   G4bool evaporate = true;
00436   while (evaporate && evapType.size() != 0)
00437   {
00438 //
00439 //
00440 // Here's the cheaky bit.  We're hijacking the G4Evaporation model, in order to
00441 // more accurately sample to kinematics, but the species of the nuclear
00442 // fragments will be the ones of our choosing as above.
00443 //
00444     std::vector <G4VEvaporationChannel*>  theChannels1;
00445     theChannels1.clear();
00446     std::vector <G4VEvaporationChannel*>::iterator i;
00447     VectorOfFragmentTypes::iterator iter;
00448     std::vector <VectorOfFragmentTypes::iterator> iters;
00449     iters.clear();
00450     iter = std::find(evapType.begin(), evapType.end(), G4Alpha::Alpha());
00451     if (iter != evapType.end())
00452     {
00453       theChannels1.push_back(new G4AlphaEvaporationChannel);
00454       i = theChannels1.end() - 1;
00455       (*i)->SetOPTxs(OPTxs);
00456       (*i)->UseSICB(useSICB);
00457 //      (*i)->Initialize(theResidualNucleus);
00458       iters.push_back(iter);
00459     }
00460     iter = std::find(evapType.begin(), evapType.end(), G4He3::He3());
00461     if (iter != evapType.end())
00462     {
00463       theChannels1.push_back(new G4He3EvaporationChannel);
00464       i = theChannels1.end() - 1;
00465       (*i)->SetOPTxs(OPTxs);
00466       (*i)->UseSICB(useSICB);
00467 //      (*i)->Initialize(theResidualNucleus);
00468       iters.push_back(iter);
00469     }
00470     iter = std::find(evapType.begin(), evapType.end(), G4Triton::Triton());
00471     if (iter != evapType.end())
00472     {
00473       theChannels1.push_back(new G4TritonEvaporationChannel);
00474       i = theChannels1.end() - 1;
00475       (*i)->SetOPTxs(OPTxs);
00476       (*i)->UseSICB(useSICB);
00477 //      (*i)->Initialize(theResidualNucleus);
00478       iters.push_back(iter);
00479     }
00480     iter = std::find(evapType.begin(), evapType.end(), G4Deuteron::Deuteron());
00481     if (iter != evapType.end())
00482     {
00483       theChannels1.push_back(new G4DeuteronEvaporationChannel);
00484       i = theChannels1.end() - 1;
00485       (*i)->SetOPTxs(OPTxs);
00486       (*i)->UseSICB(useSICB);
00487 //      (*i)->Initialize(theResidualNucleus);
00488       iters.push_back(iter);
00489     }
00490     iter = std::find(evapType.begin(), evapType.end(), G4Proton::Proton());
00491     if (iter != evapType.end())
00492     {
00493       theChannels1.push_back(new G4ProtonEvaporationChannel);
00494       i = theChannels1.end() - 1;
00495       (*i)->SetOPTxs(OPTxs);
00496       (*i)->UseSICB(useSICB);
00497 //      (*i)->Initialize(theResidualNucleus);
00498       iters.push_back(iter);
00499     }
00500     iter = std::find(evapType.begin(), evapType.end(), G4Neutron::Neutron());
00501     if (iter != evapType.end())
00502     {
00503       theChannels1.push_back(new G4NeutronEvaporationChannel);
00504       i = theChannels1.end() - 1;
00505       (*i)->SetOPTxs(OPTxs);
00506       (*i)->UseSICB(useSICB);
00507 //      (*i)->Initialize(theResidualNucleus);
00508       iters.push_back(iter);
00509     }
00510     G4int nChannels = theChannels1.size();
00511 
00512     G4double totalProb = 0.0;
00513     G4int ich = 0;
00514     G4double probEvapType[6] = {0.0};
00515     std::vector<G4VEvaporationChannel*>::iterator iterEv;
00516     for (iterEv=theChannels1.begin(); iterEv!=theChannels1.end(); iterEv++) {
00517       totalProb += (*iterEv)->GetEmissionProbability(intermediateNucleus);
00518       probEvapType[ich] = totalProb;
00519       ++ich;
00520     }
00521     if (totalProb > 0.0) {
00522 //
00523 //
00524 // The emission probability for at least one of the evaporation channels is
00525 // positive, therefore work out which one should be selected and decay
00526 // the nucleus.
00527 //
00528       G4double xi = totalProb*G4UniformRand();
00529       G4int ii     = 0;
00530       for (ii=0; ii<nChannels; ii++) {
00531         if (xi < probEvapType[ii]) { break; }
00532       }
00533       if (ii >= nChannels) { ii = nChannels - 1; }
00534       G4FragmentVector *evaporationResult = theChannels1[ii]->
00535         BreakUp(*intermediateNucleus);
00536       fragmentVector->push_back((*evaporationResult)[0]);
00537       *intermediateNucleus = *(*evaporationResult)[1];
00538       //delete evaporationResult->back();
00539       delete evaporationResult;
00540       //evapType.erase(iters[ii]);
00541     }
00542     else
00543     {
00544 //
00545 //
00546 // Probability for further evaporation is nil so have to escape from this
00547 // routine and set the energies of the secondaries to 10eV.
00548 //
00549       evaporate = false;
00550     }
00551   }
00552   
00553   return;
00554 }
00556 //
00557 void G4WilsonAblationModel::SelectSecondariesByDefault (G4ThreeVector boost)
00558 {
00559   for (unsigned i=0; i<evapType.size(); i++)
00560   {
00561     G4ParticleDefinition *type = evapType[i];
00562     G4double mass              = type->GetPDGMass();
00563     G4double e                 = mass + 10.0*eV;
00564     G4double p                 = std::sqrt(e*e-mass*mass);
00565     G4double costheta          = 2.0*G4UniformRand() - 1.0;
00566     G4double sintheta          = std::sqrt((1.0 - costheta)*(1.0 + costheta));
00567     G4double phi               = twopi * G4UniformRand() * rad;
00568     G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
00569     G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e);
00570     lorentzVector.boost(-boost);
00571 // Possibility that the following line is not correctly carrying over A and Z
00572 // from particle definition.  Force values.  PRT 03/12/2009.
00573 //    G4Fragment *fragment          = 
00574 //      new G4Fragment(lorentzVector, type);
00575     G4int A = type->GetBaryonNumber();
00576     G4int Z = (G4int) (type->GetPDGCharge() + 1.0E-10);
00577     G4Fragment *fragment          = 
00578       new G4Fragment(A, Z, lorentzVector);
00579 
00580     fragmentVector->push_back(fragment);
00581   }
00582 }
00584 //
00585 void G4WilsonAblationModel::PrintWelcomeMessage ()
00586 {
00587   G4cout <<G4endl;
00588   G4cout <<" *****************************************************************"
00589          <<G4endl;
00590   G4cout <<" Nuclear ablation model for nuclear-nuclear interactions activated"
00591          <<G4endl;
00592   G4cout <<" (Written by QinetiQ Ltd for the European Space Agency)"
00593          <<G4endl;
00594   G4cout <<" *****************************************************************"
00595          <<G4endl;
00596   G4cout << G4endl;
00597 
00598   return;
00599 }
00601 //

Generated on Mon May 27 17:50:25 2013 for Geant4 by  doxygen 1.4.7