Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
5 tasks
whokion opened this issue Jun 5, 2023 · 7 comments
Closed
5 tasks

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

whokion opened this issue Jun 5, 2023 · 7 comments
Assignees
Labels
physics Particles, processes, and stepping algorithms

Comments

@whokion
Copy link
Contributor

whokion commented Jun 5, 2023

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:

  • Add nuclear_mass in ElementRecord equivalent to G4NucleiProperties::GetNuclearMass and an associated accessor in MaterialParams, and a unit test
  • Implement helpers equivalent to G4WentzelOKandVIxSection and G4ScreeningMottCrossSections, and a unit test
  • Implement CoulombScatteringData necessary for G4eCoulombScatteringModel
  • Implement CoulombScatteringProcess, CoulombScatteringModel and CoulombScatteringInteractor based on G4eCoulombScatteringModel and G4CoulombScattering, and unit tests
  • Integrate codes into the celeritas simulation pipeline (celer-sim and celer-g4 applications)
@whokion whokion added the physics Particles, processes, and stepping algorithms label Jun 5, 2023
@sethrj
Copy link
Member

sethrj commented Jun 6, 2023

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
Copy link
Contributor Author

whokion commented Jun 6, 2023

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
Copy link
Member

sethrj commented Jun 6, 2023

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:

  • CoulombScatteringData and a corresponding Model class to manage the data
  • CoulombScatteringView which would take a material and energy and have the helper functions like calc_nuclear_xs, calc_electron_xs
  • I don't think it need to calculate cross sections on the fly , but if it does make a CoulombScatteringXsCalculator forG4eCoulombScatteringModel::ComputeCrossSectionPerAtom
  • G4WentzelOKandVIxSection::SampleSingleScattering becomes a Distribution that samples polar angle
  • G4eCoulombScatteringModel::SampleSecondaries becomes an Interactor
  • Create the Process and add the interfaces to move the data from GeantImporter

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
Copy link
Contributor Author

whokion commented Jun 6, 2023

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
Copy link
Contributor

hhollenb commented Jun 8, 2023

Add G4ScreeningMottCrossSections

@sethrj
Copy link
Member

sethrj commented Jun 8, 2023

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
Copy link
Member

sethrj commented Oct 30, 2023

Completed by #861 and #899

@sethrj sethrj closed this as completed Oct 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
physics Particles, processes, and stepping algorithms
Projects
None yet
Development

No branches or pull requests

4 participants