Geant4 11.3.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4FieldManagerStore.cc
Go to the documentation of this file.
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// G4FieldManagerStore implementation
27//
28// Author: J.Apostolakis, 07.12.2007 - Adapted from G4LogicalVolumeStore
29// --------------------------------------------------------------------
30
31#include "G4Types.hh"
33#include "G4ChordFinder.hh"
34
35// ***************************************************************************
36// Static class variables
37// ***************************************************************************
38//
39G4ThreadLocal G4FieldManagerStore* G4FieldManagerStore::fgInstance = nullptr;
40G4ThreadLocal G4bool G4FieldManagerStore::locked = false;
41
42// ***************************************************************************
43// Protected constructor: Construct underlying container with
44// initial size of 100 entries
45// ***************************************************************************
46//
51
52// ***************************************************************************
53// Destructor
54// ***************************************************************************
55//
57{
58 Clean();
59 fgInstance = nullptr;
60}
61
62// ***************************************************************************
63// Delete all elements from the store
64// ***************************************************************************
65//
67{
68 // Locks store for deletion of field managers. De-registration will be
69 // performed at this stage. G4FieldManagers will not de-register themselves.
70 //
71 locked = true;
72
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//
89{
90 GetInstance()->push_back(pFieldManager);
91}
92
93// ***************************************************************************
94// Remove volume from container
95// ***************************************************************************
96//
98{
99 if (!locked) // Do not de-register if locked !
100 {
101 for (auto i=GetInstance()->cbegin(); i!=GetInstance()->cend(); ++i)
102 {
103 if (*i==pFieldMgr) // For LogVol was **i == *pLogVolume ... Reason?
104 {
105 GetInstance()->erase(i);
106 break;
107 }
108 }
109 }
110}
111
112// ***************************************************************************
113// Return ptr to Store, setting if necessary
114// ***************************************************************************
115//
117{
118 if (fgInstance == nullptr)
119 {
120 fgInstance = new G4FieldManagerStore;
121 }
122 return fgInstance;
123}
124
125// ***************************************************************************
126// Return ptr to Store
127// ***************************************************************************
128//
133
134// ***************************************************************************
135// Globally reset the state
136// ***************************************************************************
137//
138void
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}
bool G4bool
Definition G4Types.hh:86
void ResetStepEstimate()
static void DeRegister(G4FieldManager *pVolume)
static void Register(G4FieldManager *pVolume)
static G4FieldManagerStore * GetInstanceIfExist()
static G4FieldManagerStore * GetInstance()
#define G4ThreadLocal
Definition tls.hh:77