Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/particle_hp/include/G4ParticleHPMadlandNixSpectrum.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 //
 27 // P. Arce, June-2014 Conversion neutron_hp to particle_hp
 28 //
 29 #ifndef G4ParticleHPMadlandNixSpectrum_h
 30 #define G4ParticleHPMadlandNixSpectrum_h 1
 31 
 32 #include "G4Exp.hh"
 33 #include "G4Log.hh"
 34 #include "G4ParticleHPVector.hh"
 35 #include "G4Pow.hh"
 36 #include "G4VParticleHPEDis.hh"
 37 #include "G4ios.hh"
 38 #include "Randomize.hh"
 39 #include "globals.hh"
 40 
 41 #include <CLHEP/Units/PhysicalConstants.h>
 42 
 43 #include <cmath>
 44 #include <fstream>
 45 
 46 //     #include <nag.h> @
 47 //     #include <nags.h> @
 48 
 49 // we will need a List of these .... one per term.
 50 
 51 class G4ParticleHPMadlandNixSpectrum : public G4VParticleHPEDis
 52 {
 53   public:
 54     G4ParticleHPMadlandNixSpectrum()
 55     {
 56       expm1 = G4Exp(-1.);
 57       theAvarageKineticPerNucleonForLightFragments = 0.0;
 58       theAvarageKineticPerNucleonForHeavyFragments = 0.0;
 59     }
 60     ~G4ParticleHPMadlandNixSpectrum() override = default;
 61 
 62     inline void Init(std::istream& aDataFile) override
 63     {
 64       theFractionalProb.Init(aDataFile);
 65       aDataFile >> theAvarageKineticPerNucleonForLightFragments;
 66       theAvarageKineticPerNucleonForLightFragments *= CLHEP::eV;
 67       aDataFile >> theAvarageKineticPerNucleonForHeavyFragments;
 68       theAvarageKineticPerNucleonForHeavyFragments *= CLHEP::eV;
 69       theMaxTemp.Init(aDataFile);
 70     }
 71 
 72     inline G4double GetFractionalProbability(G4double anEnergy) override
 73     {
 74       return theFractionalProb.GetY(anEnergy);
 75     }
 76 
 77     G4double Sample(G4double anEnergy) override;
 78 
 79   private:
 80     G4double Madland(G4double aSecEnergy, G4double tm);
 81 
 82     inline G4double FissionIntegral(G4double tm, G4double anEnergy)
 83     {
 84       return 0.5
 85              * (GIntegral(tm, anEnergy, theAvarageKineticPerNucleonForLightFragments)
 86                 + GIntegral(tm, anEnergy, theAvarageKineticPerNucleonForHeavyFragments));
 87     }
 88 
 89     G4double GIntegral(G4double tm, G4double anEnergy, G4double aMean);
 90 
 91     inline G4double Gamma05(G4double aValue)
 92     {
 93       G4double result;
 94       // gamma(1.2,x*X) = std::sqrt(CLHEP::pi)*Erf(x)
 95       G4double x = std::sqrt(aValue);
 96       G4double t = 1. / (1 + 0.47047 * x);
 97       result =
 98         1
 99         - (0.3480242 * t - 0.0958798 * t * t + 0.7478556 * t * t * t) * G4Exp(-aValue);  // @ check
100       result *= std::sqrt(CLHEP::pi);
101       return result;
102     }
103 
104     inline G4double Gamma15(G4double aValue)
105     {
106       G4double result;
107       // gamma(a+1, x) = a*gamma(a,x)-x**a*std::exp(-x)
108       result = 0.5 * Gamma05(aValue) - std::sqrt(aValue) * G4Exp(-aValue);  // @ check
109       return result;
110     }
111 
112     inline G4double Gamma25(G4double aValue)
113     {
114       G4double result;
115       result =
116         1.5 * Gamma15(aValue) - G4Pow::GetInstance()->powA(aValue, 1.5) * G4Exp(aValue);  // @ check
117       return result;
118     }
119 
120     inline G4double E1(G4double aValue)
121     {
122       // good only for rather low aValue @@@ replace by the corresponding NAG function for the
123       // exponential integral. (<5 seems ok.
124       G4double gamma = 0.577216;
125       G4double precision = 0.000001;
126       G4double result = -gamma - G4Log(aValue);
127       G4double term = -aValue;
128       // 110527TKDB  Unnessary codes, Detected by gcc4.6 compiler
129       // G4double last;
130       G4int count = 1;
131       result -= term;
132       for (;;) {
133         count++;
134         // 110527TKDB  Unnessary codes, Detected by gcc4.6 compiler
135         // last = result;
136         term = -term * aValue * (count - 1) / (count * count);
137         result -= term;
138         if (std::fabs(term) / std::fabs(result) < precision) break;
139       }
140       //    NagError *fail; @
141       //    result = nag_exp_integral(aValue, fail); @
142       return result;
143     }
144 
145   private:
146     G4double expm1;
147 
148   private:
149     G4ParticleHPVector theFractionalProb;
150 
151     G4double theAvarageKineticPerNucleonForLightFragments;
152     G4double theAvarageKineticPerNucleonForHeavyFragments;
153 
154     G4ParticleHPVector theMaxTemp;
155 };
156 
157 #endif
158