make scene able to run parallel simulations

This commit is contained in:
AndreaRigoni
2026-03-19 21:51:38 +00:00
parent 85e1f1448f
commit c44a7738c0
12 changed files with 247 additions and 24 deletions

View File

@@ -70,9 +70,10 @@ static void CheckGeant4Environment() {
class SceneImpl {
public:
// constructor //
SceneImpl() : m_RunManager(G4RunManagerFactory::CreateRunManager(G4RunManagerType::Serial)),
SceneImpl() : m_RunManager(G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default)),
m_Emitter(nullptr),
m_Output(nullptr) {
m_Output(nullptr),
m_Verbosity(0) {
m_RunManager->SetUserInitialization(new PhysicsList);
}
@@ -86,7 +87,9 @@ public:
// Set mandatory initialization classes for Geant4
m_RunManager->SetUserInitialization(new SceneDetectorConstruction(this));
m_RunManager->SetUserInitialization(
new ActionInitialization(m_Emitter, m_Output));
new ActionInitialization(m_Emitter, m_Output, m_Verbosity));
m_RunManager->SetVerboseLevel(m_Verbosity);
// Initialize Geant4
m_RunManager->Initialize();
@@ -99,6 +102,7 @@ public:
G4RunManager *m_RunManager;
EmitterPrimary *m_Emitter;
Vector<GeantEvent> *m_Output;
int m_Verbosity;
};
SceneDetectorConstruction::SceneDetectorConstruction(SceneImpl *owner)
@@ -177,6 +181,10 @@ void Scene::SetEmitter(EmitterPrimary *emitter) {
void Scene::Initialize() {
d->Initialize();
}
void Scene::SetVerbosity(int level) {
d->m_Verbosity = level;
if (d->m_RunManager) d->m_RunManager->SetVerboseLevel(level);
}
void Scene::RunSimulation(int nEvents, Vector<GeantEvent> &results) {
d->m_Output = &results;
@@ -185,7 +193,10 @@ void Scene::RunSimulation(int nEvents, Vector<GeantEvent> &results) {
// (ActionInitialization was already set during Initialize, but we need
// to ensure the output pointer is current)
d->m_RunManager->SetUserInitialization(
new ActionInitialization(d->m_Emitter, &results));
new ActionInitialization(d->m_Emitter, &results, d->m_Verbosity));
// Re-run initialization to propagate the ActionInitialization change to worker threads
d->m_RunManager->Initialize();
d->m_RunManager->BeamOn(nEvents);
}