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 // G4FieldManagerStore implementation 27 // 28 // Author: J.Apostolakis, 07.12.2007 - Adapted 29 // ------------------------------------------- 30 31 #include "G4Types.hh" 32 #include "G4FieldManagerStore.hh" 33 #include "G4ChordFinder.hh" 34 35 // ******************************************* 36 // Static class variables 37 // ******************************************* 38 // 39 G4ThreadLocal G4FieldManagerStore* G4FieldMana 40 G4ThreadLocal G4bool G4FieldManagerStore::lock 41 42 // ******************************************* 43 // Protected constructor: Construct underlying 44 // initial size of 100 entries 45 // ******************************************* 46 // 47 G4FieldManagerStore::G4FieldManagerStore() 48 { 49 reserve(100); 50 } 51 52 // ******************************************* 53 // Destructor 54 // ******************************************* 55 // 56 G4FieldManagerStore::~G4FieldManagerStore() 57 { 58 Clean(); 59 fgInstance = nullptr; 60 } 61 62 // ******************************************* 63 // Delete all elements from the store 64 // ******************************************* 65 // 66 void G4FieldManagerStore::Clean() 67 { 68 // Locks store for deletion of field manager 69 // performed at this stage. G4FieldManagers 70 // 71 locked = true; 72 73 G4FieldManagerStore* store = GetInstance(); 74 75 for(const auto & pos : *store) 76 { 77 delete pos; 78 } 79 80 locked = false; 81 store->clear(); 82 } 83 84 // ******************************************* 85 // Add field manager to container 86 // ******************************************* 87 // 88 void G4FieldManagerStore::Register(G4FieldMana 89 { 90 GetInstance()->push_back(pFieldManager); 91 } 92 93 // ******************************************* 94 // Remove volume from container 95 // ******************************************* 96 // 97 void G4FieldManagerStore::DeRegister(G4FieldMa 98 { 99 if (!locked) // Do not de-register if loc 100 { 101 for (auto i=GetInstance()->cbegin(); i!=Ge 102 { 103 if (*i==pFieldMgr) // For LogVol was 104 { 105 GetInstance()->erase(i); 106 break; 107 } 108 } 109 } 110 } 111 112 // ******************************************* 113 // Return ptr to Store, setting if necessary 114 // ******************************************* 115 // 116 G4FieldManagerStore* G4FieldManagerStore::GetI 117 { 118 if (fgInstance == nullptr) 119 { 120 fgInstance = new G4FieldManagerStore; 121 } 122 return fgInstance; 123 } 124 125 // ******************************************* 126 // Return ptr to Store 127 // ******************************************* 128 // 129 G4FieldManagerStore* G4FieldManagerStore::GetI 130 { 131 return fgInstance; 132 } 133 134 // ******************************************* 135 // Globally reset the state 136 // ******************************************* 137 // 138 void 139 G4FieldManagerStore::ClearAllChordFindersState 140 { 141 G4ChordFinder* pChordFnd; 142 143 for (const auto & mgr : *GetInstance()) 144 { 145 pChordFnd = mgr->GetChordFinder(); 146 if( pChordFnd != nullptr ) 147 { 148 pChordFnd->ResetStepEstimate(); 149 } 150 } 151 } 152