File indexing completed on 2025-01-18 09:58:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #ifndef G4ParticleHPFissionSpectrum_h
0030 #define G4ParticleHPFissionSpectrum_h 1
0031
0032 #include "G4Exp.hh"
0033 #include "G4ParticleHPVector.hh"
0034 #include "G4VParticleHPEDis.hh"
0035 #include "G4ios.hh"
0036 #include "Randomize.hh"
0037 #include "globals.hh"
0038
0039 #include <CLHEP/Units/SystemOfUnits.h>
0040
0041 #include <fstream>
0042
0043
0044
0045 class G4ParticleHPFissionSpectrum : public G4VParticleHPEDis
0046 {
0047 public:
0048 G4ParticleHPFissionSpectrum() { expm1 = G4Exp(-1.); }
0049 ~G4ParticleHPFissionSpectrum() override = default;
0050
0051 inline void Init(std::istream& aDataFile) override
0052 {
0053 theFractionalProb.Init(aDataFile, CLHEP::eV);
0054 theThetaDist.Init(aDataFile, CLHEP::eV);
0055 }
0056
0057 inline G4double GetFractionalProbability(G4double anEnergy) override
0058 {
0059 return theFractionalProb.GetY(anEnergy);
0060 }
0061
0062 inline G4double Sample(G4double anEnergy) override
0063 {
0064 G4double theta = theThetaDist.GetY(anEnergy);
0065
0066
0067 G4double result = 0., cut;
0068 G4double range = 50 * CLHEP::MeV;
0069 G4double max = Maxwell((theta * CLHEP::eV) / 2., theta);
0070 G4double value;
0071 G4int icounter = 0;
0072 G4int icounter_max = 1024;
0073 do {
0074 icounter++;
0075 if (icounter > icounter_max) {
0076 G4cout << "Loop-counter exceeded the threshold value at " << __LINE__ << "th line of "
0077 << __FILE__ << "." << G4endl;
0078 break;
0079 }
0080 result = range * G4UniformRand();
0081 value = Maxwell(result, theta);
0082 cut = G4UniformRand();
0083 } while (cut > value / max);
0084 return result;
0085 }
0086
0087 private:
0088
0089 inline G4double Maxwell(G4double anEnergy, G4double theta)
0090 {
0091 G4double result = std::sqrt(anEnergy / CLHEP::eV) * G4Exp(-anEnergy / CLHEP::eV / theta);
0092 return result;
0093 }
0094
0095 private:
0096 G4double expm1;
0097
0098 G4ParticleHPVector theFractionalProb;
0099
0100 G4ParticleHPVector theThetaDist;
0101 };
0102
0103 #endif