Geant4 11.1.1
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//
48 : std::vector<G4FieldManager*>()
49{
50 reserve(100);
51}
52
53// ***************************************************************************
54// Destructor
55// ***************************************************************************
56//
58{
59 Clean();
60 fgInstance = nullptr;
61}
62
63// ***************************************************************************
64// Delete all elements from the store
65// ***************************************************************************
66//
68{
69 // Locks store for deletion of field managers. De-registration will be
70 // performed at this stage. G4FieldManagers will not de-register themselves.
71 //
72 locked = true;
73
75
76 for(auto pos=store->cbegin(); pos!=store->cend(); ++pos)
77 {
78 if (*pos) { delete *pos; }
79 }
80
81 locked = false;
82 store->clear();
83}
84
85// ***************************************************************************
86// Add field manager to container
87// ***************************************************************************
88//
90{
91 GetInstance()->push_back(pFieldManager);
92}
93
94// ***************************************************************************
95// Remove volume from container
96// ***************************************************************************
97//
99{
100 if (!locked) // Do not de-register if locked !
101 {
102 for (auto i=GetInstance()->cbegin(); i!=GetInstance()->cend(); ++i)
103 {
104 if (*i==pFieldMgr) // For LogVol was **i == *pLogVolume ... Reason?
105 {
106 GetInstance()->erase(i);
107 break;
108 }
109 }
110 }
111}
112
113// ***************************************************************************
114// Return ptr to Store, setting if necessary
115// ***************************************************************************
116//
118{
119 if (fgInstance == nullptr)
120 {
121 fgInstance = new G4FieldManagerStore;
122 }
123 return fgInstance;
124}
125
126// ***************************************************************************
127// Return ptr to Store
128// ***************************************************************************
129//
131{
132 return fgInstance;
133}
134
135// ***************************************************************************
136// Globally reset the state
137// ***************************************************************************
138//
139void
141{
142 G4ChordFinder* pChordFnd;
143
144 for (auto i=GetInstance()->cbegin(); i!=GetInstance()->cend(); ++i)
145 {
146 pChordFnd = (*i)->GetChordFinder();
147 if( pChordFnd != nullptr )
148 {
149 pChordFnd->ResetStepEstimate();
150 }
151 }
152}
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