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.
This is an initial implementation of optical models and their associated data structures.
General overview:
OpticalModel: acts like both a process (building cross sections / mean free paths) and as a model (action to run the interactor).
ImportedOpticalMaterials: physics data for optical models is really just optical material properties. This serves as a list of imported optical material data that models will access directly to get their physics data.
OpticalModelBuilder: constructs the ImportedOpticalMaterials and is responsible for building the appropriate models based on the user's selection.
OpticalPhysicsParams: responsible for building each optical model, adding them to the action registry, and building their MFP grids in OpticalPhysicsParamsData.
OpticalMfpBuilder: A helper class to have optical models build MFP grids on a per optical material basis.
AbsorptionModel: An almost trivial optical model. Has no data and just kills the track when called.
RayleighModel: A more complex optical model. Included to make sure API for building model-specific data is sensible.
This PR isn't merge ready yet, and is meant to be a discussion point for how we want to organize optical models. Some functions and classes are empty, and I'm in the middle of adding tests.
Thoughts / discussion questions:
May be better to have something like this in ImportData:
Will we want an OpticalMaterialParams? Is there ever a point where we need to process ImportOpticalMaterials and store the data outside of optical model specific data collections?
How much flexibility do we want to give to user defined optical models? Should we have an ImportOpticalModel structure? A lambda table in ImportOpticalModel would duplicate the mean free paths in ImportOpticalMaterial...
OpticalMfpBuilder is a bit awkward. There should be a better way to do this that is also portable to Cerenkov and scintillation parameter building.
This is an initial implementation of optical models and their associated data structures.
General overview:
OpticalModel
: acts like both a process (building cross sections / mean free paths) and as a model (action to run the interactor).ImportedOpticalMaterials
: physics data for optical models is really just optical material properties. This serves as a list of imported optical material data that models will access directly to get their physics data.OpticalModelBuilder
: constructs theImportedOpticalMaterials
and is responsible for building the appropriate models based on the user's selection.OpticalPhysicsParams
: responsible for building each optical model, adding them to the action registry, and building their MFP grids inOpticalPhysicsParamsData
.OpticalMfpBuilder
: A helper class to have optical models build MFP grids on a per optical material basis.AbsorptionModel
: An almost trivial optical model. Has no data and just kills the track when called.RayleighModel
: A more complex optical model. Included to make sure API for building model-specific data is sensible.This PR isn't merge ready yet, and is meant to be a discussion point for how we want to organize optical models. Some functions and classes are empty, and I'm in the middle of adding tests.
Thoughts / discussion questions:
ImportData
:OpticalMaterialParams
? Is there ever a point where we need to processImportOpticalMaterial
s and store the data outside of optical model specific data collections?ImportOpticalModel
structure? A lambda table inImportOpticalModel
would duplicate the mean free paths inImportOpticalMaterial
...OpticalMfpBuilder
is a bit awkward. There should be a better way to do this that is also portable to Cerenkov and scintillation parameter building.