Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4FieldManagerStore implementation << 27 // 26 // 28 // Author: J.Apostolakis, 07.12.2007 - Adapted << 27 // $Id: G4FieldManagerStore.cc,v 1.4 2008/01/17 10:56:23 gcosmo Exp $ >> 28 // GEANT4 tag $Name: geant4-09-02 $ >> 29 // >> 30 // G4FieldManagerStore >> 31 // >> 32 // Implementation for singleton container >> 33 // >> 34 // History: >> 35 // 07.12.07 J.Apostolakis Adapted from G4LogicalVolumeStore 29 // ------------------------------------------- 36 // -------------------------------------------------------------------- 30 37 31 #include "G4Types.hh" 38 #include "G4Types.hh" 32 #include "G4FieldManagerStore.hh" 39 #include "G4FieldManagerStore.hh" 33 #include "G4ChordFinder.hh" 40 #include "G4ChordFinder.hh" 34 41 35 // ******************************************* 42 // *************************************************************************** 36 // Static class variables 43 // Static class variables 37 // ******************************************* 44 // *************************************************************************** 38 // 45 // 39 G4ThreadLocal G4FieldManagerStore* G4FieldMana << 46 G4FieldManagerStore* G4FieldManagerStore::fgInstance = 0; 40 G4ThreadLocal G4bool G4FieldManagerStore::lock << 47 G4bool G4FieldManagerStore::locked = false; 41 48 42 // ******************************************* 49 // *************************************************************************** 43 // Protected constructor: Construct underlying 50 // Protected constructor: Construct underlying container with 44 // initial size of 100 entries 51 // initial size of 100 entries 45 // ******************************************* 52 // *************************************************************************** 46 // 53 // 47 G4FieldManagerStore::G4FieldManagerStore() 54 G4FieldManagerStore::G4FieldManagerStore() >> 55 : std::vector<G4FieldManager*>() 48 { 56 { 49 reserve(100); 57 reserve(100); 50 } 58 } 51 59 52 // ******************************************* 60 // *************************************************************************** 53 // Destructor 61 // Destructor 54 // ******************************************* 62 // *************************************************************************** 55 // 63 // 56 G4FieldManagerStore::~G4FieldManagerStore() 64 G4FieldManagerStore::~G4FieldManagerStore() 57 { 65 { 58 Clean(); 66 Clean(); 59 fgInstance = nullptr; << 60 } 67 } 61 68 62 // ******************************************* 69 // *************************************************************************** 63 // Delete all elements from the store 70 // Delete all elements from the store 64 // ******************************************* 71 // *************************************************************************** 65 // 72 // 66 void G4FieldManagerStore::Clean() 73 void G4FieldManagerStore::Clean() 67 { 74 { 68 // Locks store for deletion of field manager 75 // Locks store for deletion of field managers. De-registration will be 69 // performed at this stage. G4FieldManagers 76 // performed at this stage. G4FieldManagers will not de-register themselves. 70 // 77 // 71 locked = true; 78 locked = true; 72 79 >> 80 size_t i=0; 73 G4FieldManagerStore* store = GetInstance(); 81 G4FieldManagerStore* store = GetInstance(); 74 82 75 for(const auto & pos : *store) << 83 for(iterator pos=store->begin(); pos!=store->end(); pos++) 76 { 84 { 77 delete pos; << 85 if (*pos) { delete *pos; } >> 86 i++; 78 } 87 } 79 88 >> 89 #ifdef G4GEOMETRY_DEBUG >> 90 if (store->size() < i-1) >> 91 { G4cout << "No field managers deleted. Already deleted by user ?" << G4endl; } >> 92 else >> 93 { G4cout << i-1 << " field managers deleted !" << G4endl; } >> 94 #endif >> 95 80 locked = false; 96 locked = false; 81 store->clear(); 97 store->clear(); 82 } 98 } 83 99 84 // ******************************************* 100 // *************************************************************************** 85 // Add field manager to container 101 // Add field manager to container 86 // ******************************************* 102 // *************************************************************************** 87 // 103 // 88 void G4FieldManagerStore::Register(G4FieldMana 104 void G4FieldManagerStore::Register(G4FieldManager* pFieldManager) 89 { 105 { 90 GetInstance()->push_back(pFieldManager); 106 GetInstance()->push_back(pFieldManager); 91 } 107 } 92 108 93 // ******************************************* 109 // *************************************************************************** 94 // Remove volume from container 110 // Remove volume from container 95 // ******************************************* 111 // *************************************************************************** 96 // 112 // 97 void G4FieldManagerStore::DeRegister(G4FieldMa 113 void G4FieldManagerStore::DeRegister(G4FieldManager* pFieldMgr) 98 { 114 { 99 if (!locked) // Do not de-register if loc 115 if (!locked) // Do not de-register if locked ! 100 { 116 { 101 for (auto i=GetInstance()->cbegin(); i!=Ge << 117 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++) 102 { 118 { 103 if (*i==pFieldMgr) // For LogVol was 119 if (*i==pFieldMgr) // For LogVol was **i == *pLogVolume ... Reason? 104 { 120 { 105 GetInstance()->erase(i); 121 GetInstance()->erase(i); 106 break; 122 break; 107 } 123 } 108 } 124 } 109 } 125 } 110 } 126 } 111 127 112 // ******************************************* 128 // *************************************************************************** 113 // Return ptr to Store, setting if necessary 129 // Return ptr to Store, setting if necessary 114 // ******************************************* 130 // *************************************************************************** 115 // 131 // 116 G4FieldManagerStore* G4FieldManagerStore::GetI 132 G4FieldManagerStore* G4FieldManagerStore::GetInstance() 117 { 133 { 118 if (fgInstance == nullptr) << 134 static G4FieldManagerStore worldStore; >> 135 if (!fgInstance) 119 { 136 { 120 fgInstance = new G4FieldManagerStore; << 137 fgInstance = &worldStore; 121 } 138 } 122 return fgInstance; 139 return fgInstance; 123 } 140 } 124 141 125 // ******************************************* 142 // *************************************************************************** 126 // Return ptr to Store << 127 // ******************************************* << 128 // << 129 G4FieldManagerStore* G4FieldManagerStore::GetI << 130 { << 131 return fgInstance; << 132 } << 133 << 134 // ******************************************* << 135 // Globally reset the state 143 // Globally reset the state 136 // ******************************************* 144 // *************************************************************************** 137 // 145 // 138 void 146 void 139 G4FieldManagerStore::ClearAllChordFindersState 147 G4FieldManagerStore::ClearAllChordFindersState() 140 { 148 { 141 G4ChordFinder* pChordFnd; << 149 G4ChordFinder *pChordFnd; 142 150 143 for (const auto & mgr : *GetInstance()) << 151 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++) 144 { 152 { 145 pChordFnd = mgr->GetChordFinder(); << 153 pChordFnd = (*i)->GetChordFinder(); 146 if( pChordFnd != nullptr ) << 154 if( pChordFnd ) 147 { 155 { 148 pChordFnd->ResetStepEstimate(); 156 pChordFnd->ResetStepEstimate(); 149 } 157 } 150 } 158 } 151 } 159 } 152 160