45 {
46public:
47
48 enum { kRANK_MASTER = 0 };
49
50 enum {
51 kTAG_G4COMMAND = 100,
52 kTAG_G4STATUS = 200,
53 kTAG_G4SEED = 300,
54 kTAG_DATA = 1000,
55 kTAG_HISTO = 1001,
56 kTAG_RUN = 1002,
57 kTAG_CMDSCR = 1003,
59 };
60
62 G4MPImanager(
int argc,
char** argv,
int nof_extra_workers = 0);
64
66
67
69
70 G4int GetVerbose() const;
71 void SetVerbose(G4int iverbose);
72
73 G4int GetTotalSize() const;
74 G4int GetActiveSize() const;
75 G4int GetRank() const;
76
77 G4bool IsMaster() const;
78 G4bool IsSlave() const;
79 G4bool IsExtraWorker() const;
80
81 G4bool IsInitMacro() const;
82 const G4String& GetInitFileName()
const;
83
84 G4bool IsBatchMode() const;
85 const G4String& GetMacroFileName()
const;
86
87 void SetMasterWeight(G4double aweight);
88 G4double GetMasterWeight() const;
89
92
94
95
97 void ShowStatus();
98 void ShowSeeds();
99 void SetSeed(G4int inode, G4long seed);
100 void WaitBeamOn();
101
102
103 void DistributeSeeds();
104 void ExecuteMacroFile(
const G4String& fname, G4bool qbatch=
false);
105 G4bool CheckThreadStatus();
106 void ExecuteThreadCommand(
const G4String& command);
107 void ExecuteBeamOnThread(
const G4String& command);
108 void JoinBeamOnThread();
109
110 void BeamOn(G4int nevent, G4bool qdivide=true);
112 G4int GetEventsInMaster() const {return fevents_in_master;}
113 G4int GetEventsInSlave() const {return fevents_in_slave;}
114
115
116 void ShowHelp() const;
117
118 const MPI::Intracomm* GetComm() const { return &COMM_G4COMMAND_; }
119 const MPI_Comm* GetProcessingComm() const { return &processing_comm_; }
120 const MPI_Comm* GetCollectingComm() const { return &collecting_comm_; }
121 const MPI_Comm* GetAllComm() const { return &all_comm_; }
122private:
124
125
127 void ParseArguments(G4int argc, char** argv);
128 void UpdateStatus();
129
134
135
137
139
140 G4int verbose_;
141
142
143 G4bool is_master_;
144 G4bool is_slave_;
145 G4bool is_extra_worker_;
146 G4int rank_;
147 G4int size_;
148 G4int world_size_;
149
150
151 MPI::Intracomm COMM_G4COMMAND_;
152
153 MPI_Comm processing_comm_;
154
155 MPI_Comm collecting_comm_;
156
157 MPI_Comm all_comm_;
158
159 MPI_Group world_group_;
160 MPI_Group processing_group_;
161 MPI_Group collecting_group_;
162 MPI_Group all_group_;
163
164
165 G4bool qfcout_;
166 std::ofstream fscout_;
167
168
169 G4bool qinitmacro_;
171 G4bool qbatchmode_;
173
174
175 pthread_t thread_id_;
176 G4int fevents_in_master = 0;
177 G4int fevents_in_slave = 0;
178
179
180 G4double master_weight_;
181 G4int nof_extra_workers_;
182};
183
184
186{
188}
189
191{
193}
194
196{
197 G4int lv = iverbose;
198 if( iverbose > 1 ) lv = 1;
199 if( iverbose < 0 ) lv = 0;
200
202 return;
203}
204
206{
208}
209
211{
213}
214
216{
218}
219
221{
223}
224
226{
228}
229
231{
233}
234
236{
238
239}
240
242{
244
245}
246
248{
250}
251
253{
255}
256
258{
260
263}
264
266{
268}
269
271{
273}
274
276{
278}
279
280#endif
void Print(const std::vector< T > &data)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
G4String macro_file_name_
G4bool IsExtraWorker() const
G4VMPIseedGenerator * GetSeedGenerator() const
const G4String & GetMacroFileName() const
void SetMasterWeight(G4double aweight)
void SetVerbose(G4int iverbose)
G4VMPIseedGenerator * seed_generator_
G4bool IsInitMacro() const
G4int GetActiveSize() const
G4bool IsBatchMode() const
G4VMPIextraWorker * extra_worker_
G4int GetTotalSize() const
const G4String & GetInitFileName() const
G4MPIsession * GetMPIsession() const
G4double GetMasterWeight() const
G4VMPIextraWorker * GetExtraWorker() const
void message(G4RunManager *runmanager)
ts_scorers example shows how to use global scorers.