make scene able to run parallel simulations
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user