celeritas-project / celeritas

Celeritas is a new Monte Carlo transport code designed to accelerate scientific discovery in high energy physics by improving detector simulation throughput and energy efficiency using GPUs.
https://celeritas-project.github.io/celeritas/user/index.html
Other
62 stars 32 forks source link

Add electron/positron Single (Coulomb) Scattering Model #801

Closed whokion closed 10 months ago

whokion commented 1 year ago

The single elastic scattering is an alternative to the multiple scattering process when the average number of collisions per charged track is relatively small or in low-density gaseous media. It can be also used in mixed simulation algorithms to describe charged particle transport more accurately in physical content, but still in a computationally efficient way. We implement an electron/positron Coulomb Scattering model of Wenzel [ref: G. Wentzel, Z. Phys. 40 (1927) 590] based on G4CoulombScattering process and G4eCoulombScatteringModel. For details, refer to the section, 8.2 of the Geant4 physics manual, Release 10.7 or
the paper by J.M. Fernández-Varea, R. Mayol, J. Baró and F. Salvat, On the theory and simulation of multiple elastic scattering of electrons. Nucl. Instrum. and Meth. in Phys. Research B, 73 (1993) 447–473, doi:10.1016/0168-583X(93)95827-R. The following is a list of related sub-tasks:

sethrj commented 1 year ago

For G4NucleiProperties I think we should extend the MaterialParams to have nuclides as well as elements; the nuclide data would include binding energies imported from Geant4 via GeantImporter and associated classes.

whokion commented 1 year ago

That would be great as G4NucleiProperties will be used in many other places (in hadronic physics models including photo- and eletro-nuclear interactions). So, should we open another issue for extending MaterialParams to cover G4NucleiProperties and related classes?

sethrj commented 1 year ago

I think that the Nuclide upgrade would make a good first pull request: it's small enough and self contained. Then after that, based on a quick review of the Geant4 classes, I'd refactor the G4WentzelOKandVIxSection, G4eCoulombScatteringModel, and G4CoulombScattering into several classes:

And since a lot of these are tied to the WentzelOKandVI model which is abbreviated wokvi maybe some of these classes should have a Wokvi or WOI prefix instead of CoulombScattering?

whokion commented 1 year ago

Yes, we do not need to implement G4eCoulombScatteringModel::ComputeCrossSectionPerAtom as the lambda table for the CoulombScattering process will be imported from Geant4 (and do not need G4WentzelOKandVIxSection::ComputeTransportCrossSectionPerAtom either), but excerpt only relevant parts of G4WentzelOKandVIxSection that need for an Interactor associated with the model. So, can @stognini help for extending MaterialParams while Hayden reviews other relevant classes and start to implement them as parallel?

hhollenb commented 1 year ago

Add G4ScreeningMottCrossSections

sethrj commented 1 year ago

Starting point for material data:

//---------------------------------------------------------------------------//
/*!
 * Fundamental, invariant properties of a nuclide.
 */
struct NuclideRecord
{
    AtomicNumber atomic_number;  //!< Z number
    AtomicNumber atomic_mass;  //!< A number (TODO: fix type?)
    units::AmuMass atomic_mass;  //!< Isotope-weighted average atomic mass
};

//---------------------------------------------------------------------------//
/*!
 * Fractional element component of a material.
 *
 * This represents, e.g., the fraction of hydrogen in water.
 */
struct ElNuclideComponent
{
    NuclideId nuclide;  //!< Index in MaterialParams elements
    real_type fraction;  //!< Fraction of number density
};

//---------------------------------------------------------------------------//
/*!
 * Fundamental, invariant properties of an element.
 *
 * Add elemental properties as needed if they apply to more than one physics
 * model. (When nuclear physics is implemented, add isotopes.)
 *
 * Note that more than one "element def" can exist for a single atomic number:
 * there might be different enrichments of an element in the problem.
 */
struct ElementRecord
{
    AtomicNumber atomic_number;  //!< Z number
    units::AmuMass atomic_mass;  //!< Isotope-weighted average atomic mass
    ItemRange<ElNuclideComponent> nuclides;  //!< Nuclide components
sethrj commented 10 months ago

Completed by #861 and #899