Reproducing neutron yield of AmO2 through (alpha,n) process

Geant4 Version: 4-11-03 Patch 02
Operating System: Mac OS Sequoia 15.7.2
Compiler/Version: Installed via Anaconda 2.4.0 – CMake reports compiler is AppleClang 17.0.0.17000319
CMake Version: 4.2.0

Hi,

I’ve been using ESA’s GRAS for several years to perform trapped radiation analysis for spacecraft design, but am trying to use G4 directly for some work on radioisotope radiation emission characteristics. I’m simulating (α,n) neutron production from Am-241 in AmO₂ , basing my code on a modified version of the rdecay02 example which comes with Geant4.

My simulation produces ~1,200 neutrons per 100 million Am-241 decays, which translates to a neutron yield of ~1.4 × 10⁶ n/s/g of AmO₂. However, the literature value for AmO₂ is 2.7 × 10³ n/s/g (this value is consistently quoted - e.g. Lees & Lindley, Annals of Nuclear Energy, Vol.5, p133, 1978). So my result is ~500× too high.

My geometry is as follows:

  • Target is a 1 cm radius solid sphere of AmO2 (density 11.68 g/cm³, mass ~48.9 g)
  • Detector is a spherical shell of Ge, inner radius 3cm, outer radius 23cm (20 cm thick).
  • A 2cm radial gap (vacuum/G4_Galactic) sits between the Ge shell and the AmO2
  • World volume is a 146 x 146 x 146 cm box filled with G4_Galactic
  • AmO2 and Ge volumes are concentric spheres centred at the origin.

My materials definition is as follows:

// O-16, O-17, O-18 isotopes

G4Isotope* O16 = new G4Isotope(“O16”, 8, 16, 15.9949*g/mole);

G4Isotope* O17 = new G4Isotope(“O17”, 8, 17, 16.9991*g/mole);

G4Isotope* O18 = new G4Isotope(“O18”, 8, 18, 17.9992*g/mole);

G4Element* elO = new G4Element(“Oxygen_natural”, “O”, 3);

elO->AddIsotope(O16, 99.757*perCent);

elO->AddIsotope(O17,  0.038*perCent);

elO->AddIsotope(O18,  0.205*perCent);

// Am-241 isotope

G4Isotope* Am241 = new G4Isotope(“Am241”, 95, 241, 241.0568*g/mole);

G4Element* elAm = new G4Element(“Americium241”, “Am”, 1);

elAm->AddIsotope(Am241, 100.0*perCent);

// AmO2 material

fTargetMater = new G4Material(“AmO2”, 11.68*g/cm3, 2);

fTargetMater->AddElement(elAm, 1);

fTargetMater->AddElement(elO, 2);

I’m using a General Particle Source generating 100 million Am-241 ions at rest, uniformly distributed throughout the AmO₂ sphere volume, undergoing radioactive decay (and confirmed this is producing ~5.5 MeV alphas):

/gps/particle ion

/gps/ion 95 241 0 0

/gps/energy 0 eV

/gps/pos/type Volume

/gps/pos/shape Sphere

/gps/pos/centre 0 0 0 mm

/gps/pos/radius 1 cm

/gps/pos/confine Target

My nuclear data libraries are as follows - the G4 output at run time confirms these are being read successfully:

G4PARTICLETENDLDATA=/path/to/G4TENDL1.4

G4NEUTRONHPDATA=/path/to/NDL4.7.1

G4PARTICLEXSDATA=/path/to/G4PARTICLEXS3.1

I’m using a custom physics list with G4ParticleHPInelastic to handle alpha inelastic reactions via TENDL data:

void PhysicsList::AddAlphaInelasticHP()

{

G4ParticleDefinition* alpha = G4Alpha::Alpha();

G4ProcessManager* pManager = alpha->GetProcessManager();

// Remove existing alphaInelastic process

G4ProcessVector* processList = pManager->GetProcessList();

for (size_t i = 0; i < processList->size(); ++i) {

if ((*processList)[i]->GetProcessName() == “alphaInelastic”) {

pManager->RemoveProcess((*processList)[i]);

break;

}

}

// Create new inelastic process with ParticleHP

G4HadronInelasticProcess* alphaInelastic =

new G4HadronInelasticProcess(“alphaInelastic”, G4Alpha::Definition());

// ParticleHP model for low energies (uses TENDL data)

G4ParticleHPInelastic* hpModel = new G4ParticleHPInelastic();

hpModel->SetMinEnergy(0.0 * MeV);

hpModel->SetMaxEnergy(20.0 * MeV);

alphaInelastic->RegisterMe(hpModel);

// Binary cascade for higher energies

G4BinaryLightIonReaction* blic = new G4BinaryLightIonReaction();

blic->SetMinEnergy(15.0 * MeV);

blic->SetMaxEnergy(6.0 * GeV);

alphaInelastic->RegisterMe(blic);

// Glauber-Gribov cross-sections

G4ComponentGGNuclNuclXsc* ggNuclNuclXsc = new G4ComponentGGNuclNuclXsc();

G4CrossSectionInelastic* alphaNucleonXsc =

new G4CrossSectionInelastic(ggNuclNuclXsc);

alphaInelastic->AddDataSet(alphaNucleonXsc);

pManager->AddDiscreteProcess(alphaInelastic);

}

The base physics list uses the following models:

  • G4EmStandardPhysics
  • G4DecayPhysics
  • BiasedRDPhysics (custom radioactive decay)
  • G4HadronPhysicsQGSP_BIC
  • G4HadronElasticPhysics
  • G4IonPhysics

Finally my macro is as follows - I’m restricting the decay to AmO2 only - no daughter decays:

/control/verbose 0

/run/verbose 0

/event/verbose 0

/tracking/verbose 0

#

# Set the target/detector geometry

# Note: For sphere, “Length” is interpreted as diameter (radius = length/2)

/rdecay02/det/setTargetRadius 1 cm

/rdecay02/det/setTargetLength 2 cm

/rdecay02/det/setDetectorThickness 20 cm

/rdecay02/det/setDetectorLength 40 cm

#

# Randomise the seed FIRST

/random/setSeeds -1 -1

/run/initialize

#

# Set a very high time threshold to allow all decays to happen

/process/had/rdm/thresholdForVeryLongDecayTime 1.0e+60 year

#

/process/list

#

# rdm is applied only to the target volume

/process/had/rdm/noVolumes

/process/had/rdm/selectVolume Target

#

# Only Am-241 decays (no daughters)

/process/had/rdm/nucleusLimits 241 241 95 95

# ============================================

# GPS Configuration - Volumetric Am-241 source

# ============================================

#

# Define the source particle (Am-241 ion at rest)

/gps/particle ion

/gps/ion 95 241 0 0

/gps/energy 0 eV

#

# Volumetric distribution - sphere

/gps/pos/type Volume

/gps/pos/shape Sphere

/gps/pos/centre 0 0 0 mm

/gps/pos/radius 1 cm

#

# Isotropic angular distribution (for decay products)

/gps/ang/type iso

#

# Confine source to Target logical volume

# This ensures particles only start inside the AmO2 sphere

/gps/pos/confine Target

#

# ============================================

# Analysis and Run Settings

# ============================================

/analysis/h1/set 6 100 0. 15. MeV

#

# Complete chain decays

/analysis/setFileName Am241c_volumetric

/run/printProgress 1000000

/run/beamOn 100000000

My results are as follows:

With TENDL-1.4 +ParticleHP:

  • Neutrons generated: ~1,170 (statistical variation across runs)
  • Alpha inelastic events: ~3,650
  • Calculated yield: 1.4 × 10⁶ n/s/g of AmO₂

With standard G4IonPhysics (no TENDL):

  • Neutrons generated: 0-1
  • The standard physics completely misses (α,n) reactions on oxygen

With QGSP_BIC_AllHP:

  • Neutrons generated: 1
  • Also fails to produce (α,n) reactions

During Execution I receive a sequence of warnings like this:

G4IonTable::GetIon() : illegal atomic number/mass Z =-2 A = -3 E = 0 *** G4Exception : hadr01 issued by :G4ParticleHPFinalState:adjust_final_state G4ParticleHPFinalState oneMoreSec_pd Z=95 - 97 A=242 - 245 projectile neutron No adjustment will be done!

I’ve been looking at this for weeks, trying to track down the error or omission, and would appreciate any advice. Some questions:

  • Is TENDL-1.4 known to overestimate (α,n) cross-sections for O-17 and O-18?
  • Is there a better way to implement alpha inelastic physics for light target nuclei in Geant4 11.3?
  • Should I be using a different physics list or data library? (TENDL-2021? Different approach entirely?)
  • Could the warnings about illegal Z/A values be causing incorrect neutron counting or double-counting?
  • Is there a validated Geant4 example for (α,n) source calculations I should reference?

Any thoughts or advice welcome. Thanks for reading.

Hello,

My simulation produces ~1,200 neutrons per 100 million Am-241 decays, which translates to a neutron yield of ~1.4 × 10⁶ n/s/g of AmO₂. However, the literature value for AmO₂ is 2.7 × 10³ n/s/g

If you want your neutron yield to be three orders of magnitude smaller, then you would expect your simulation to produce ~1-2 neutrons, which is what G4IonPhysics and QGSP_BIC_AllHP give you, right?

Can you try increasing the number of primaries?

Regards
Max

could you try :

1- G4IonPhysicsXS instead of G4IonPhysics

2- G4IonPhysicsPHP instead of G4IonPhysics (TENDL needed)

In both case, to avoid double counting, do not use your PhysicsList::AddAlphaInelasticHP()

PhysicsList of Activation, hadronic/Hadr05, Hadr06, Hadr07, NeutronSource are similar.

example NeutronSource is similar (but not identical !) to yours.

Hi Max,

Thank you very much for your reply. I’ve run a higher statistical significance model (1 billion events), with QGSP_BIC_AllHP (no TENDL), but no neutrons have been generated this time. The only changes made were to swap my physics model back to the following PhysicsList.cc file:

/// \file PhysicsList.cc
/// \brief Implementation of the PhysicsList class
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

#include "PhysicsList.hh"
#include "BiasedRDPhysics.hh"

#include "G4NuclideTable.hh"
#include "G4SystemOfUnits.hh"

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

PhysicsList::PhysicsList() : QGSP_BIC_AllHP()
{
  G4cout << "\n========================================" << G4endl;
  G4cout << "Using QGSP_BIC_AllHP physics list" << G4endl;
  G4cout << "========================================\n" << G4endl;

  // Mandatory for G4NuclideTable
  G4NuclideTable::GetInstance()->SetThresholdOfHalfLife(0.1 * picosecond);
  G4NuclideTable::GetInstance()->SetLevelTolerance(1.0 * eV);
  
  // Replace radioactive decay with biased version
  ReplacePhysics(new BiasedRDPhysics());
  
  SetVerboseLevel(1);
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

and the PhysicsList.hh revised as follows:

/// \file PhysicsList.hh
/// \brief Definition of the PhysicsList class
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

#ifndef PhysicsList_h
#define PhysicsList_h 1

#include "QGSP_BIC_AllHP.hh"

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

class PhysicsList : public QGSP_BIC_AllHP
{
  public:
    PhysicsList();
    ~PhysicsList() override = default;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

#endif

Then I unloaded TENDL using

unset G4PARTICLETENDLDATA

and rebuilt the code and ran. The output is as follows:

 The run is 1000000000 Am241 of 1 MeV through : 
 Target   : Length = 2 cm  Radius    = 1 cm  Material = AmO2
 Detector : Length = 40 cm  Thickness = 20 cm  Material = G4_Ge

 Mean energy deposit in target,   in time window = 5.6347 MeV;  rms = 105.98 keV
 Mean energy deposit in detector, in time window = 3.0779 keV;  rms = 105.96 keV

 Process calls frequency in target :
            NoProcess=1000010988      RadioactiveDecay=-1921190643                  Rayl=56029279
       Transportation=5299350        alphaInelastic=     12                 compt=6423000
                eBrem=    260                 eIoni=-1693143785            hadElastic=  39788
              ionIoni=-942120766                   msc=-1616688866                  phot=1072823824


 Process calls frequency in detector:
     RadioactiveDecay=      7                  Rayl= 336650        Transportation= 243773
                compt= 273094                 eBrem=   8766                 eIoni=30263422
              ionIoni= 911206                   msc=44076927                  phot=6193318


 List of generated particles in target:
          Np237: 999999983  Emean =  346.41 eV 	( 2.5029 meV --> 93.678 keV)
  Np237[102.959]: 143799956  Emean =  91.879 keV	( 61.351 meV --> 91.966 keV)
  Np237[129.990]:  101952  Emean =  91.398 keV	( 85.578 keV --> 91.516 keV)
  Np237[158.497]: 16691175  Emean =  91.029 keV	( 79.872 keV --> 91.042 keV)
  Np237[191.530]:      71  Emean =  86.857 keV	( 85.924 keV --> 87.3 keV)
  Np237[225.957]:  155981  Emean =  89.794 keV	( 80.86 keV --> 89.92 keV)
  Np237[267.556]:    7156  Emean =  65.161 keV	( 0.43656 meV --> 89.229 keV)
  Np237[281.356]:     478  Emean =  37.283 meV	( 5.9081 meV --> 120.17 meV)
  Np237[305.050]:   24295  Emean =  88.605 keV	( 88.605 keV --> 88.605 keV)
  Np237[324.420]:   17440  Emean =  87.751 keV	( 85.219 keV --> 88.283 keV)
  Np237[33.196]: 219340509  Emean =  1.0222 keV	( 1.5716 meV --> 93.126 keV)
  Np237[332.376]:    3049  Emean =  87.534 keV	( 87.337 keV --> 88.151 keV)
  Np237[359.700]:    5944  Emean =  87.697 keV	( 87.697 keV --> 87.697 keV)
  Np237[368.602]:    8819  Emean =  87.549 keV	( 87.549 keV --> 87.549 keV)
  Np237[370.928]:    3013  Emean =   87.51 keV	( 87.51 keV --> 87.51 keV)
  Np237[395.530]:    7058  Emean =  87.101 keV	( 87.101 keV --> 87.101 keV)
  Np237[434.120]:    3934  Emean =  86.459 keV	( 86.459 keV --> 86.459 keV)
  Np237[452.545]:    4062  Emean =  86.153 keV	( 86.153 keV --> 86.153 keV)
  Np237[459.693]:    3916  Emean =  86.034 keV	( 86.034 keV --> 86.034 keV)
  Np237[486.210]:    1369  Emean =  85.593 keV	( 85.593 keV --> 85.593 keV)
  Np237[546.120]:    1020  Emean =  84.597 keV	( 84.597 keV --> 84.597 keV)
  Np237[59.541]: 993183381  Emean =  79.291 keV	( 4.2783 meV --> 92.688 keV)
  Np237[721.961]:    6962  Emean =  81.674 keV	( 81.674 keV --> 81.674 keV)
  Np237[75.899]:  404265  Emean =  92.348 keV	( 80.57 keV --> 92.416 keV)
  Np237[755.685]:     821  Emean =  81.113 keV	( 81.113 keV --> 81.113 keV)
  Np237[799.820]:      43  Emean =  80.379 keV	( 80.379 keV --> 80.379 keV)
            O16:   10975  Emean =  387.32 keV	( 14.416 eV  --> 3.2137 MeV)
            O17:       8  Emean =  277.92 keV	( 117.08 keV --> 414.05 keV)
            O18:      22  Emean =  438.54 keV	( 51.861 keV --> 2.9234 MeV)
          alpha: 1000000000  Emean =  5.4786 MeV	( 4.7576 MeV --> 5.5441 MeV)
             e-: -462393490  Emean = -142.32 keV	( 2.1094e-05 meV --> 736.8 keV)
          gamma: 1076967684  Emean =  29.539 keV	( 21.73 eV  --> 767.25 keV)

 List of generated particles in detector:
             e-: 48771642  Emean =  4.6034 keV	( 2.4051 meV --> 744.91 keV)
          gamma: 2049479  Emean =   9.605 keV	( 31.9 eV  --> 322.57 keV)

I will try another run with the same physics model but with TENDL included (takes around 24 hours to turn this around) and see if I get non-zero neutrons.

Thanks for your help - much appreciated

Nigel

Hi Maire,

Many thanks for responding and posting those suggestions - I’ll get on to that next and post back. As explained in my reply to Max, my turnaround time is quite long, but I’ll post back when I have implemented those suggestions and conducted a run. Thank you for your help!

Best Regards

Nigel