File indexing completed on 2025-08-02 08:29:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 #ifndef G4SubEvtRunManager_hh
0040 #define G4SubEvtRunManager_hh 1
0041
0042 #include "G4TaskRunManager.hh"
0043
0044 #include <atomic>
0045 #include <map>
0046
0047 class G4WorkerSubEvtRunManager;
0048
0049 class G4SubEvtRunManager : public G4TaskRunManager
0050 {
0051 friend class G4RunManagerFactory;
0052
0053 public:
0054 static G4SubEvtRunManager* GetMasterRunManager()
0055 {
0056 auto* _rm = G4MTRunManager::GetMasterRunManager();
0057 return dynamic_cast<G4SubEvtRunManager*>(_rm);
0058 }
0059
0060 G4SubEvtRunManager(G4bool useTBB = G4GetEnv<G4bool>("G4USE_TBB", false));
0061 G4SubEvtRunManager(G4VUserTaskQueue* taskQueue,
0062 G4bool useTBB = G4GetEnv<G4bool>("G4USE_TBB", false), G4int evtGrainsize = 0);
0063 ~G4SubEvtRunManager() override;
0064
0065
0066 void Initialize() override;
0067 void Initialize(uint64_t nthreads) override { PTL::TaskRunManager::Initialize(nthreads); }
0068 void RunInitialization() override;
0069 void InitializeEventLoop(G4int n_event, const char* macroFile = nullptr,
0070 G4int n_select = -1) override;
0071 void TerminateOneEvent() override;
0072 void ProcessOneEvent(G4int i_event) override;
0073 void ConstructScoringWorlds() override;
0074 void RunTermination() override;
0075 void CleanUpPreviousEvents() override;
0076
0077
0078 G4bool SetUpAnEvent(G4Event*, G4long&, G4long&, G4long&, G4bool = true) override
0079 { return false; }
0080 G4int SetUpNEvents(G4Event*, G4SeedsQueue*, G4bool = true) override
0081 { return -1; }
0082
0083 void RegisterSubEventType(G4int ty, G4int maxEnt) override;
0084
0085 void RegisterSubEvtWorker(G4WorkerSubEvtRunManager*,G4int);
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 const G4SubEvent* GetSubEvent(G4int ty, G4bool& notReady,
0098 G4long& s1, G4long& s2, G4long& s3, G4bool reseedRequired = true) override;
0099
0100
0101
0102
0103
0104 void SubEventFinished(const G4SubEvent* se,const G4Event* evt) override;
0105
0106
0107 void MergeScores(const G4ScoringManager* localScoringManager) override;
0108
0109
0110 void MergeRun(const G4Run*) override
0111 {}
0112
0113
0114
0115
0116
0117 std::size_t GetNumberActiveThreads() const override
0118 { return threads.size(); }
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 void SetUserInitialization(G4VUserPhysicsList* userPL) override;
0130 void SetUserInitialization(G4VUserDetectorConstruction* userDC) override;
0131 void SetUserInitialization(G4UserWorkerInitialization* userInit) override;
0132 void SetUserInitialization(G4UserWorkerThreadInitialization* userInit) override;
0133 void SetUserInitialization(G4VUserActionInitialization* userInit) override;
0134 void SetUserAction(G4UserRunAction* userAction) override;
0135 void SetUserAction(G4VUserPrimaryGeneratorAction* userAction) override;
0136 void SetUserAction(G4UserEventAction* userAction) override;
0137 void SetUserAction(G4UserStackingAction* userAction) override;
0138 void SetUserAction(G4UserTrackingAction* userAction) override;
0139 void SetUserAction(G4UserSteppingAction* userAction) override;
0140
0141
0142
0143 void RequestWorkersProcessCommandsStack() override;
0144
0145
0146
0147 void ThisWorkerProcessCommandsStackDone() override;
0148
0149
0150
0151
0152 void WaitForReadyWorkers() override {}
0153 void WaitForEndEventLoopWorkers() override;
0154
0155
0156 WorkerActionRequest ThisWorkerWaitForNextAction() override
0157 {
0158 return WorkerActionRequest::UNDEFINED;
0159 }
0160
0161 void AbortRun(G4bool softAbort = false) override;
0162 void AbortEvent() override;
0163
0164 protected:
0165 void ComputeNumberOfTasks() override
0166 {
0167
0168 numberOfTasks = (G4int)threadPool->size();
0169 numberOfEventsPerTask = -1;
0170 eventModulo = -1;
0171 }
0172
0173
0174
0175
0176
0177 G4bool InitializeSeeds(G4int ) override { return false; };
0178
0179
0180 void RefillSeeds() override;
0181
0182
0183
0184
0185 void CreateAndStartWorkers() override;
0186
0187 void TerminateWorkers() override;
0188 void NewActionRequest(WorkerActionRequest) override {}
0189 void AddEventTask(G4int) override;
0190
0191 void SetUpSeedsForSubEvent(G4long& s1, G4long& s2, G4long& s3);
0192
0193 void MergeTrajectories(const G4SubEvent* se,const G4Event* evt) override;
0194 void UpdateScoringForSubEvent(const G4SubEvent* se,const G4Event* evt) override;
0195
0196 void CleanUpUnnecessaryEvents(G4int keepNEvents) override;
0197 void StackPreviousEvent(G4Event* anEvent) override;
0198
0199 protected:
0200 std::atomic<G4bool> runInProgress = false;
0201
0202 private:
0203 G4bool trajectoriesToBeMerged = false;
0204 std::map<G4int,G4int> fSubEvtTypeMap;
0205 std::map<G4WorkerSubEvtRunManager*,G4int> fWorkerMap;
0206
0207 G4bool CheckSubEvtTypes();
0208
0209 public:
0210 void TrajectoriesToBeMerged(G4bool val=true) override
0211 { trajectoriesToBeMerged = val; }
0212 };
0213
0214 #endif