Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4UserWorkerThreadInitialization implementa 27 // 28 // Authors: M.Asai, A.Dotti (SLAC), 16 Septemb 29 // ------------------------------------------- 30 31 #include "G4UserWorkerThreadInitialization.hh" 32 33 #include "G4AutoLock.hh" 34 #include "G4MTRunManagerKernel.hh" 35 #include "G4UImanager.hh" 36 #include "G4VUserActionInitialization.hh" 37 #include "G4VUserPhysicsList.hh" 38 #include "G4WorkerRunManager.hh" 39 #include "G4WorkerThread.hh" 40 41 #include <sstream> 42 43 // ------------------------------------------- 44 #ifdef G4MULTITHREADED 45 G4Thread* G4UserWorkerThreadInitialization::Cr 46 { 47 // Note: this method is called by G4MTRunMan 48 // here we are still sequential. 49 // Create a new thread/worker structure 50 auto worker = new G4Thread; 51 G4THREADCREATE(worker, &G4MTRunManagerKernel 52 return worker; 53 } 54 #else 55 G4Thread* G4UserWorkerThreadInitialization::Cr 56 { 57 return new G4Thread; 58 } 59 #endif 60 61 // ------------------------------------------- 62 #ifdef G4MULTITHREADED 63 void G4UserWorkerThreadInitialization::JoinWor 64 { 65 G4THREADJOIN(*aThread); 66 } 67 #else // Avoid compilation warning in sequent 68 void G4UserWorkerThreadInitialization::JoinWor 69 #endif 70 71 // ------------------------------------------- 72 namespace 73 { 74 G4Mutex rngCreateMutex = G4MUTEX_INITIALIZER; 75 } 76 77 // ------------------------------------------- 78 void G4UserWorkerThreadInitialization::SetupRN 79 { 80 G4AutoLock l(&rngCreateMutex); 81 // No default available, let's create the in 82 // A Call to this just forces the creation t 83 G4Random::getTheEngine(); 84 // Poor man's solution to check which RNG En 85 CLHEP::HepRandomEngine* retRNG = nullptr; 86 87 // Need to make these calls thread safe 88 if (dynamic_cast<const CLHEP::HepJamesRandom 89 retRNG = new CLHEP::HepJamesRandom; 90 } 91 else if (dynamic_cast<const CLHEP::MixMaxRng 92 retRNG = new CLHEP::MixMaxRng; 93 } 94 else if (dynamic_cast<const CLHEP::RanecuEng 95 retRNG = new CLHEP::RanecuEngine; 96 } 97 else if (dynamic_cast<const CLHEP::RanluxppE 98 retRNG = new CLHEP::RanluxppEngine; 99 } 100 else if (dynamic_cast<const CLHEP::Ranlux64E 101 const auto theRNG = dynamic_cast<const CLH 102 retRNG = new CLHEP::Ranlux64Engine(123, th 103 } 104 else if (dynamic_cast<const CLHEP::MTwistEng 105 retRNG = new CLHEP::MTwistEngine; 106 } 107 else if (dynamic_cast<const CLHEP::DualRand* 108 retRNG = new CLHEP::DualRand; 109 } 110 else if (dynamic_cast<const CLHEP::RanluxEng 111 const auto theRNG = dynamic_cast<const CLH 112 retRNG = new CLHEP::RanluxEngine(123, theR 113 } 114 else if (dynamic_cast<const CLHEP::RanshiEng 115 retRNG = new CLHEP::RanshiEngine; 116 } 117 118 if (retRNG != nullptr) { 119 G4Random::setTheEngine(retRNG); 120 } 121 else { 122 // Does a new method, such as aNewRng->new 123 G4ExceptionDescription msg; 124 msg << " Unknown type of RNG Engine - " << 125 << " Can cope only with HepJamesRandom 126 << " Ranlux++, MTwistEngine, DualRand, 127 << " Cannot clone this type of RNG eng 128 << " Aborting " << G4endl; 129 G4Exception("G4UserWorkerThreadInitializat 130 msg); 131 } 132 } 133 134 // ------------------------------------------- 135 G4WorkerRunManager* G4UserWorkerThreadInitiali 136 { 137 return new G4WorkerRunManager(); 138 } 139