Skip to content

Commit 9a7f6a5

Browse files
amandalundsethrj
andauthored
Add optical WLS secondary generation (#2339)
* Add WLS optical photon secondary generation * Resample WLS polarization while not orthogonal and use more robust sampling method to avoid extremely high rejection rate See also #2197 (comment) * Fix missing update to core state counters num_pending in WLS generator action * Save all generator accum stats in standalone optical runner * Don't emit secondary photons if the incident photon energy is below the CDF sampling grid * Add WLS generator test and geometry with WLS properties * Clear distribution data buffer before invoking WLS interactor * clang-tidy and copilot feedback * Address initial feedback * Address feedback * Add WLS generator test * Skip num_generated check with float build --------- Co-authored-by: Seth R. Johnson <johnsonsr@ornl.gov>
1 parent ef6495b commit 9a7f6a5

41 files changed

Lines changed: 1254 additions & 188 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/celeritas/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ endif()
183183

184184
if(CELERITAS_USE_CUDA OR CELERITAS_USE_HIP)
185185
list(APPEND SOURCES
186+
optical/detail/Filler.cu
186187
track/detail/Filler.cu
187188
alongstep/detail/AlongStepKernels.cu
188189
)
@@ -407,6 +408,7 @@ celeritas_polysource(optical/gen/OffloadAction)
407408
celeritas_polysource(optical/gen/OffloadGatherAction)
408409
celeritas_polysource(optical/gen/PrimaryGeneratorAction)
409410
celeritas_polysource(optical/gen/DirectGeneratorAction)
411+
celeritas_polysource(optical/gen/WlsGeneratorAction)
410412
celeritas_polysource(optical/gen/detail/GeneratorAlgorithms)
411413
celeritas_polysource(optical/gen/detail/OffloadAlgorithms)
412414
celeritas_polysource(optical/surface/BoundaryAction)

src/celeritas/optical/CoreParams.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,16 +131,13 @@ CoreParams::CoreParams(Input&& input) : input_(std::move(input))
131131
CP_VALIDATE_INPUT(surface);
132132
CP_VALIDATE_INPUT(detectors);
133133
CP_VALIDATE_INPUT(action_reg);
134+
CP_VALIDATE_INPUT(aux_reg);
134135
CP_VALIDATE_INPUT(gen_reg);
135136
CP_VALIDATE_INPUT(max_streams);
136137
#undef CP_VALIDATE_INPUT
137138

138139
CELER_EXPECT(input_);
139140

140-
if (!input_.aux_reg)
141-
{
142-
input_.aux_reg = std::make_shared<AuxParamsRegistry>();
143-
}
144141
if (!input_.output_reg)
145142
{
146143
input_.output_reg = std::make_shared<OutputRegistry>();

src/celeritas/optical/CoreParams.hh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class CoreParams final : public ParamsDataInterface<CoreParamsData>
7676
SPActionRegistry action_reg;
7777
SPOutputRegistry output_reg;
7878
SPGeneratorRegistry gen_reg;
79-
SPAuxRegistry aux_reg; //!< Optional, empty default
79+
SPAuxRegistry aux_reg;
8080

8181
// Problem definition and state
8282
SPConstCoreGeo geometry;
@@ -103,9 +103,9 @@ class CoreParams final : public ParamsDataInterface<CoreParamsData>
103103
explicit operator bool() const
104104
{
105105
return geometry && material && rng && sim && volume && surface
106-
&& surface_physics && action_reg && gen_reg && max_streams
107-
&& capacity.generators > 0 && capacity.tracks > 0
108-
&& capacity.primaries > 0;
106+
&& surface_physics && action_reg && aux_reg && gen_reg
107+
&& max_streams && capacity.generators > 0
108+
&& capacity.tracks > 0 && capacity.primaries > 0;
109109
}
110110
};
111111

src/celeritas/optical/Interaction.hh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ struct Interaction
3737
Real3 direction; //!< Post-interaction direction
3838
Real3 polarization; //!< Post-interaction polarization
3939
Action action{Action::scattered}; //!< Flags for interaction result
40-
WlsDistributionData distribution; //!< Data for generating WLS secondaries
4140

4241
//! Return an interaction representing an absorbed process
4342
static inline CELER_FUNCTION Interaction from_absorption();

src/celeritas/optical/PhysicsParams.cc

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
//---------------------------------------------------------------------------//
77
#include "PhysicsParams.hh"
88

9+
#include "corecel/data/AuxParamsRegistry.hh"
910
#include "corecel/io/Logger.hh"
1011
#include "corecel/sys/ActionRegistry.hh"
12+
#include "celeritas/phys/GeneratorRegistry.hh"
1113

1214
#include "MaterialParams.hh"
1315
#include "MfpBuilder.hh"
1416
#include "Model.hh"
1517
#include "action/DiscreteSelectAction.hh"
18+
#include "gen/WlsGeneratorAction.hh"
1619
#include "model/AbsorptionModel.hh"
1720
#include "model/MieModel.hh"
1821
#include "model/RayleighModel.hh"
@@ -36,11 +39,16 @@ namespace optical
3639
PhysicsParams::PhysicsParams(inp::OpticalBulkPhysics const& input,
3740
SPConstMaterials const& materials,
3841
SPConstCoreMaterials const& core_materials,
39-
SPActionRegistry action_reg)
42+
SPActionRegistry action_reg,
43+
SPAuxRegistry aux_reg,
44+
SPGeneratorRegistry gen_reg,
45+
size_type gen_capacity)
4046
{
4147
CELER_EXPECT(materials);
4248
CELER_EXPECT(core_materials);
4349
CELER_EXPECT(action_reg);
50+
CELER_EXPECT(aux_reg);
51+
CELER_EXPECT(gen_reg);
4452

4553
CELER_VALIDATE(input, << "no optical bulk models are present");
4654

@@ -52,8 +60,13 @@ PhysicsParams::PhysicsParams(inp::OpticalBulkPhysics const& input,
5260
action_reg->insert(discrete_select_);
5361

5462
// Build models
55-
models_ = this->build_models(
56-
input, materials, core_materials, *action_reg);
63+
models_ = this->build_models(input,
64+
materials,
65+
core_materials,
66+
*action_reg,
67+
*aux_reg,
68+
*gen_reg,
69+
gen_capacity);
5770
}
5871

5972
// Construct data
@@ -72,11 +85,17 @@ PhysicsParams::PhysicsParams(inp::OpticalBulkPhysics const& input,
7285
//---------------------------------------------------------------------------//
7386
/*!
7487
* Construct optical models and register them in the given registry.
88+
*
89+
* If WLS is enabled, a generator action is constructed for creating secondary
90+
* photons.
7591
*/
7692
auto PhysicsParams::build_models(inp::OpticalBulkPhysics const& input,
7793
SPConstMaterials materials,
7894
SPConstCoreMaterials core_materials,
79-
ActionRegistry& action_reg) const -> VecModels
95+
ActionRegistry& action_reg,
96+
AuxParamsRegistry& aux_reg,
97+
GeneratorRegistry& gen_reg,
98+
size_type gen_capacity) const -> VecModels
8099
{
81100
VecModels models;
82101
if (input.absorption)
@@ -97,17 +116,44 @@ auto PhysicsParams::build_models(inp::OpticalBulkPhysics const& input,
97116
action_reg.next_id(), input.rayleigh, materials, core_materials));
98117
action_reg.insert(models.back());
99118
}
100-
if (input.wls)
101-
{
102-
models.push_back(std::make_shared<WavelengthShiftModel>(
103-
action_reg.next_id(), input.wls, materials, "wls"));
104-
action_reg.insert(models.back());
105-
}
106-
if (input.wls2)
119+
if (input.wls || input.wls2)
107120
{
108-
models.push_back(std::make_shared<WavelengthShiftModel>(
109-
action_reg.next_id(), input.wls2, materials, "wls2"));
110-
action_reg.insert(models.back());
121+
WlsGeneratorAction::Input gen_inp;
122+
gen_inp.aux_id = aux_reg.next_id();
123+
gen_inp.gen_id = gen_reg.next_id();
124+
gen_inp.capacity = gen_capacity;
125+
126+
if (input.wls)
127+
{
128+
auto model
129+
= std::make_shared<WavelengthShiftModel>(action_reg.next_id(),
130+
gen_inp.aux_id,
131+
input.wls,
132+
materials,
133+
GeneratorType::wls);
134+
gen_inp.wls = model;
135+
action_reg.insert(model);
136+
models.push_back(std::move(model));
137+
}
138+
if (input.wls2)
139+
{
140+
auto model
141+
= std::make_shared<WavelengthShiftModel>(action_reg.next_id(),
142+
gen_inp.aux_id,
143+
input.wls2,
144+
materials,
145+
GeneratorType::wls2);
146+
gen_inp.wls2 = model;
147+
action_reg.insert(model);
148+
models.push_back(std::move(model));
149+
}
150+
151+
// Action ID for the WLS generator must be greater than all model IDs
152+
gen_inp.action_id = action_reg.next_id();
153+
auto gen = std::make_shared<WlsGeneratorAction>(std::move(gen_inp));
154+
action_reg.insert(gen);
155+
aux_reg.insert(gen);
156+
gen_reg.insert(gen);
111157
}
112158
return models;
113159
}

src/celeritas/optical/PhysicsParams.hh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
namespace celeritas
1818
{
1919
class ActionRegistry;
20+
class AuxParamsRegistry;
21+
class GeneratorRegistry;
2022
class MaterialParams;
2123

2224
namespace optical
@@ -36,6 +38,8 @@ class PhysicsParams final : public ParamsDataInterface<PhysicsParamsData>
3638
//! \name Type aliases
3739
using ActionIdRange = Range<ActionId>;
3840
using SPActionRegistry = std::shared_ptr<ActionRegistry>;
41+
using SPAuxRegistry = std::shared_ptr<AuxParamsRegistry>;
42+
using SPGeneratorRegistry = std::shared_ptr<GeneratorRegistry>;
3943
using SPConstModel = std::shared_ptr<Model const>;
4044
using SPConstCoreMaterials
4145
= std::shared_ptr<celeritas::MaterialParams const>;
@@ -48,7 +52,10 @@ class PhysicsParams final : public ParamsDataInterface<PhysicsParamsData>
4852
explicit PhysicsParams(inp::OpticalBulkPhysics const&,
4953
SPConstMaterials const&,
5054
SPConstCoreMaterials const&,
51-
SPActionRegistry);
55+
SPActionRegistry,
56+
SPAuxRegistry,
57+
SPGeneratorRegistry,
58+
size_type);
5259

5360
//! Number of optical models
5461
inline ModelId::size_type num_models() const { return models_.size(); }
@@ -81,7 +88,10 @@ class PhysicsParams final : public ParamsDataInterface<PhysicsParamsData>
8188
VecModels build_models(inp::OpticalBulkPhysics const&,
8289
SPConstMaterials,
8390
SPConstCoreMaterials,
84-
ActionRegistry&) const;
91+
ActionRegistry&,
92+
AuxParamsRegistry&,
93+
GeneratorRegistry&,
94+
size_type) const;
8595
void build_mfps(MaterialParams const& mats, HostValue& data) const;
8696
//!@}
8797
};

src/celeritas/optical/Runner.cc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "corecel/io/OutputInterfaceAdapter.hh"
1212
#include "corecel/io/OutputRegistry.hh"
1313
#include "celeritas/inp/StandaloneInputIO.json.hh"
14+
#include "celeritas/phys/GeneratorRegistry.hh"
1415
#include "celeritas/setup/Problem.hh"
1516

1617
#include "CoreParams.hh"
@@ -142,8 +143,13 @@ auto Runner::run() const -> Result
142143

143144
Result result;
144145
result.counters = state_->accum();
145-
result.counters.generators.push_back(
146-
loaded_.problem.generator->counters(*state_->aux()).accum);
146+
for (auto gen_id : range(GeneratorId(this->params()->gen_reg()->size())))
147+
{
148+
auto const gen = this->params()->gen_reg()->at(gen_id);
149+
CELER_ASSERT(gen);
150+
result.counters.generators.push_back(
151+
gen->counters(*state_->aux()).accum);
152+
}
147153
result.action_times
148154
= loaded_.problem.transporter->get_action_times(*state_->aux());
149155

src/celeritas/optical/Types.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@ namespace celeritas
1212
{
1313
namespace optical
1414
{
15+
//---------------------------------------------------------------------------//
16+
/*!
17+
* Get a string corresponding to the photon generating process.
18+
*/
19+
char const* to_cstring(GeneratorType value)
20+
{
21+
static EnumStringMapper<GeneratorType> const to_cstring_impl{
22+
"cherenkov",
23+
"scintillation",
24+
"wls",
25+
"wls2",
26+
};
27+
return to_cstring_impl(value);
28+
}
29+
1530
//---------------------------------------------------------------------------//
1631
/*!
1732
* Get a string corresponding to an optical surface physics step.

src/celeritas/optical/Types.hh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ enum class GeneratorType
3333
{
3434
cherenkov,
3535
scintillation,
36+
wls,
37+
wls2,
3638
size_
3739
};
3840

@@ -95,6 +97,7 @@ enum class WlsDistribution
9597
// FREE FUNCTIONS
9698
//---------------------------------------------------------------------------//
9799

100+
char const* to_cstring(GeneratorType);
98101
char const* to_cstring(SurfacePhysicsOrder);
99102
char const* to_cstring(ReflectionMode);
100103
char const* to_cstring(WlsDistribution);

0 commit comments

Comments
 (0)