G4NuclearAbrasionGeometry.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:              G4NuclearAbrasionGeometry.cc
00039 //
00040 // Version:             B.1
00041 // Date:                15/04/04
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 // 18 November 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 // 4 June 2004, J.P. Wellisch, CERN, Switzerland
00059 // resolving technical portability issues.
00060 //
00061 // 12 June 2012, A. Ribon, CERN, Switzerland
00062 // Fixing trivial warning errors of shadowed variables. 
00063 //
00064 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00066 //
00067 #include "G4NuclearAbrasionGeometry.hh"
00068 #include "G4WilsonRadius.hh"
00069 #include "G4PhysicalConstants.hh"
00070 #include "G4SystemOfUnits.hh"
00072 //
00073 G4NuclearAbrasionGeometry::G4NuclearAbrasionGeometry (G4double AP1,
00074   G4double AT1, G4double r1)
00075 {
00076 //
00077 //
00078 // Initialise variables for interaction geometry.
00079 //
00080   G4WilsonRadius aR;
00081   AP = AP1;
00082   AT = AT1;
00083   rP = aR.GetWilsonRadius(AP);
00084   rT = aR.GetWilsonRadius(AT);
00085   r  = r1;
00086   n  = rP / (rP + rT);
00087   b  = r / (rP + rT);
00088   m  = rT / rP;
00089   Q  = (1.0 - b)/n;
00090   S  = Q * Q;
00091   T  = S * Q;
00092   R  = std::sqrt(m*n);
00093   U  = 1.0/m - 2.0;
00094 //
00095 //
00096 // Initialise the threshold radius-ratio at which interactions are considered
00097 // peripheral or central.
00098 //  
00099   rth = 2.0/3.0;
00100   B   = 10.0 * MeV;
00101 }
00103 //
00104 G4NuclearAbrasionGeometry::~G4NuclearAbrasionGeometry ()
00105 {;}
00107 //
00108 void G4NuclearAbrasionGeometry::SetPeripheralThreshold (G4double rth1)
00109   {if (rth1 > 0.0 && rth1 <= 1.0) rth = rth1;}
00111 //
00112 G4double G4NuclearAbrasionGeometry::GetPeripheralThreshold ()
00113   {return rth;}
00115 //
00116 G4double G4NuclearAbrasionGeometry::P ()
00117 {
00118 //
00119 //
00120 // Initialise the value for P, then determine the actual value depending upon
00121 // whether the projectile is larger or smaller than the target and these radii
00122 // in relation to the impact parameter.
00123 //
00124   G4double valueP = 0.0;
00125 
00126   if (rT > rP)
00127   {
00128     if (rT-rP<=r && r<=rT+rP) valueP = 0.125*R*U*S - 0.125*(0.5*R*U+1.0)*T;
00129     else                      valueP = -1.0;
00130   }
00131   else
00132   {
00133     if (rP-rT<=r && r<=rP+rT) valueP = 0.125*R*U*S - 0.125*(0.5*std::sqrt(n/m)*U-
00134       (std::sqrt(1.0-m*m)/n - 1.0)*std::sqrt((2.0-m)/std::pow(m,5.0)))*T;
00135     else                      valueP = (std::sqrt(1.0-m*m)/n-1.0)*std::sqrt(1.0-b*b/n/n);
00136   }
00137 
00138   if (!(valueP <= 1.0 && valueP>= -1.0))
00139   {
00140     if (valueP > 1.0) valueP =  1.0;
00141     else         valueP = -1.0;
00142   }
00143   return valueP;
00144 }
00146 //
00147 G4double G4NuclearAbrasionGeometry::F ()
00148 {
00149 //
00150 //
00151 // Initialise the value for F, then determine the actual value depending upon
00152 // whether the projectile is larger or smaller than the target and these radii
00153 // in relation to the impact parameter.
00154 //
00155   G4double valueF = 0.0;
00156 
00157   if (rT > rP)
00158   {
00159     if (rT-rP<=r && r<=rT+rP) valueF = 0.75*R*S - 0.125*(3.0*R-1.0)*T;
00160     else                      valueF = 1.0;
00161   }
00162   else
00163   {
00164     if (rP-rT<=r && r<=rP+rT) valueF = 0.75*R*S - 0.125*(3.0*std::sqrt(n/m)-
00165       (1.0-std::pow(1.0-m*m,3.0/2.0))*std::sqrt(1.0-std::pow(1.0-m,2.0))/std::pow(m,3.0))*T;
00166     else                      valueF = (1.0-std::pow(1.0-m*m,3.0/2.0))*std::sqrt(1.0-b*b/n/n);
00167   }
00168 
00169   if (!(valueF <= 1.0 && valueF>= 0.0))
00170   {
00171     if (valueF > 1.0) valueF = 1.0;
00172     else         valueF = 0.0;
00173   }
00174   return valueF;
00175 }
00177 //
00178 G4double G4NuclearAbrasionGeometry::GetExcitationEnergyOfProjectile ()
00179 {
00180   G4double F1 = F();
00181   G4double P1 = P();
00182   G4double Es = 0.0;
00183 
00184   Es = 0.95 * MeV * 4.0 * pi * rP*rP/fermi/fermi *
00185        (1.0+P1-std::pow(1.0-F1,2.0/3.0));
00186 //  if (rT < rP && r < rP-rT)
00187   if ((r-rP)/rT < rth)
00188   {
00189     G4double omega = 0.0;
00190     if      (AP < 12.0)  omega = 1500.0;
00191     else if (AP <= 16.0) omega = 1500.0 - 320.0*(AP-12.0);
00192     Es *= 1.0 + F1*(5.0+omega*F1*F1);
00193   }
00194   
00195   if (Es < 0.0) 
00196     Es = 0.0;
00197   else if (Es > B * AP)
00198     Es = B * AP;
00199   return Es;
00200 }
00201 
00202 
00203 G4double G4NuclearAbrasionGeometry::GetExcitationEnergyOfTarget ()
00204 {
00205   // This member function declares a new G4NuclearAbrasionGeometry object 
00206   // but with the projectile and target exchanged to determine the values
00207   // for F and P.  Determination of the excess surface area and excitation
00208   // energy is as above.
00209 
00210   G4NuclearAbrasionGeometry* revAbrasionGeometry =
00211     new G4NuclearAbrasionGeometry(AT, AP, r);
00212   G4double F1 = revAbrasionGeometry->F();
00213   G4double P1 = revAbrasionGeometry->P();
00214   G4double Es = 0.0;
00215 
00216   Es = 0.95 * MeV * 4.0 * pi * rT*rT/fermi/fermi *
00217        (1.0+P1-std::pow(1.0-F1,2.0/3.0));
00218 
00219 //  if (rP < rT && r < rT-rP)
00220   if ((r-rT)/rP < rth) {
00221     G4double omega = 0.0;
00222     if      (AT < 12.0)  omega = 1500.0;
00223     else if (AT <= 16.0) omega = 1500.0 - 320.0*(AT-12.0);
00224     Es *= 1.0 + F1*(5.0+omega*F1*F1);
00225   }
00226   
00227   if (Es < 0.0)
00228     Es = 0.0;
00229   else if (Es > B * AT)
00230     Es = B * AT;
00231 
00232   delete revAbrasionGeometry;
00233 
00234   return Es;
00235 }

Generated on Mon May 27 17:49:06 2013 for Geant4 by  doxygen 1.4.7