ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4MPIscorerMerger.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4MPIscorerMerger.hh
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 #ifndef G4MPISCORERMERGER_HH
27 #define G4MPISCORERMERGER_HH
28 #include "G4ScoringManager.hh"
29 #include <vector>
30 #include <memory>
31 #include <utility>
32 #include <mpi.h>
33 #include "G4MPImanager.hh"
34 
35 //typedef G4THitsMap<G4double> HitMap;
37 
38 // This class allows for merging over MPI two command line scorers
39 // via MPI
41 public:
44  G4int destination = G4MPImanager::kRANK_MASTER,
45  G4int verbosity = 0 );
46  virtual ~G4MPIscorerMerger();
47 
48  //Get/set methods
51  void SetVerbosity( G4int ver ) { verbose = ver; }
52 
53  //Main Interface: call this method to merge all results to rank0
54  void Merge();
55 
56 protected:
57  void SetupOutputBuffer(char* buff, G4int size, G4int position) {
58  outputBuffer = buff;
59  outputBufferSize=size;
61  }
62  void DestroyBuffer() {
63  delete[] outputBuffer;
64  outputBuffer = nullptr;
67  ownsBuffer = false;
68  }
69 
71  void Pack(const G4ScoringManager*);
72  void UnPackAndMerge(const G4ScoringManager*);
73 
75  void Pack(const G4VScoringMesh*);
77 
79  //void Pack(const HitMap*);//Used When hits are <double>
80  void Pack(const HitStatDoubleMap*);//Used when hits are statdouble
81  //HitMap* UnPackHitMap(const G4String& detName, const G4String& colName);
82  HitStatDoubleMap* UnPackHitStatDoubleMap(const G4String& detName, const G4String& colName);
83 
84  //Return size (in bytes) of the message needed to send the mesh
87  //G4int CalculatePackSize(const HitMap*) const;
89 
90 protected:
91  void Send(const unsigned int destination);
92  void Receive(const unsigned int source);
93 
94 private:
95  char* outputBuffer;
98  long bytesSent;
101  unsigned int commSize;
102  unsigned int destinationRank;
103  MPI::Intracomm comm;
105 
106 };
107 
108 #endif //G4MPISCORERMERGER_HH
109