Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/run/include/G4VPhysicsConstructor.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 // G4VPhysicsConstructor
 27 //
 28 // Class description:
 29 //
 30 // This class is a virtual class for constructing particles and processes.
 31 // This class objects is being registered to G4VPhysicsList.
 32 //
 33 // User must implement following four virtual methods in the concrete class
 34 // derived from this class:
 35 //
 36 // - virtual void ConstructParticle();
 37 //     All necessary particle type will be instantiated.
 38 // - virtual void ConstructProcess();
 39 //     All physics processes will be instantiated and
 40 //     registered to the process manager of each particle type.
 41 //
 42 // Only one physics constructor can be registered to a Modular Physics List
 43 // for each "physics_type". Physics constructors with same "physics_type"
 44 // can be replaced by using the method:
 45 //   G4VModularPhysicsList::ReplacePhysics().
 46 
 47 // Original author: H.Kurashige (Kobe University), 12 November 2000
 48 // --------------------------------------------------------------------
 49 #ifndef G4VPhysicsConstructor_hh
 50 #define G4VPhysicsConstructor_hh 1
 51 
 52 #include "G4ParticleTable.hh"
 53 #include "G4PhysicsListHelper.hh"
 54 #include "G4VUPLSplitter.hh"
 55 #include "G4ios.hh"
 56 #include "globals.hh"
 57 
 58 #include "rundefs.hh"
 59 
 60 #include <vector>
 61 
 62 class G4PhysicsBuilderInterface;
 63 
 64 class G4VPCData
 65 {
 66     // Encapsulate the fields of class G4VPhysicsConstructor
 67     // that are per-thread.
 68 
 69   public:
 70     using PhysicsBuilders_V = std::vector<G4PhysicsBuilderInterface*>;
 71     void initialize();
 72     G4ParticleTable::G4PTblDicIterator* _aParticleIterator;
 73 
 74     PhysicsBuilders_V* _builders = nullptr;
 75 };
 76 
 77 // The type G4VPCManager is introduced to encapsulate the methods used by
 78 // both the master thread and worker threads to allocate memory space for
 79 // the fields encapsulated by the class G4VPCData. When each thread
 80 // changes the value for these fields, it refers to them using a macro
 81 // definition defined below. For every G4VPhysicsConstructor instance,
 82 // there is a corresponding G4VPCData instance. All G4VPCData instances
 83 // are organized by the class G4VUPLManager as an array.
 84 // The field "int g4vuplInstanceID" is added to the class G4VUserPhysicsList.
 85 // The value of this field in each G4VUserPhysicsList instance is the
 86 // subscript of the corresponding G44VUPLData instance.
 87 // In order to use the class G44VUPLManager, we add a static member in the class
 88 // G4VUserPhysicsList as follows: "static G4VUPLManager subInstanceManager".
 89 // Both the master thread and worker threads change the length of the array
 90 // for G44VUPLData instances mutually along with G4VUserPhysicsList
 91 // instances are created. For each worker thread, it dynamically creates ions.
 92 // Consider any thread A, if there is any other thread which creates an ion.
 93 // This ion is shared by the thread A. So the thread A leaves an empty space
 94 // in the array of G4PDefData instances for the ion.
 95 //
 96 // Important Note: you may wonder why we are introducing this mechanism
 97 //                 since there is only one PL for each application.
 98 //                 This is true, in the sense that only one PL is allowed
 99 //                 to be associated to a G4RunManager, however a user can
100 //                 instantiate as many PLs are needed and at run-time select
101 //                 one of the PLs to be used we thus need this mechanism to
102 //                 guarantee that the system works without problems in case of
103 //                 this (unusual) case. This may be reviewed in the future
104 //
105 using G4VPCManager = G4VUPLSplitter<G4VPCData>;
106 using G4VPhyscicsConstructorManager = G4VPCManager;
107 
108 class G4VPhysicsConstructor
109 {
110   public:
111     G4VPhysicsConstructor(const G4String& = "");
112     G4VPhysicsConstructor(const G4String& name, G4int physics_type);
113     virtual ~G4VPhysicsConstructor();
114 
115     // This method will be invoked in the Construct() method.
116     // Each particle type will be instantiated.
117     virtual void ConstructParticle() = 0;
118 
119     // This method will be invoked in the Construct() method.
120     // Each physics process will be instantiated and
121     // registered to the process manager of each particle type.
122     virtual void ConstructProcess() = 0;
123 
124     inline void SetPhysicsName(const G4String& = "");
125     inline const G4String& GetPhysicsName() const;
126 
127     inline void SetPhysicsType(G4int);
128     inline G4int GetPhysicsType() const;
129 
130     inline G4int GetInstanceID() const;
131     static const G4VPCManager& GetSubInstanceManager();
132 
133     // Method called by kernel to destroy thread-local data, equivalent to
134     // destructor in sequential mode. Derived classes implementing this
135     // method, must also call this base class method.
136     virtual void TerminateWorker();
137 
138     // Set/get control flag for output message
139     //  0: Silent
140     //  1: Warning message
141     //  2: More
142     // verbose level is set equal to physics list when registered.
143     inline void SetVerboseLevel(G4int value);
144     inline G4int GetVerboseLevel() const;
145 
146   protected:
147     using PhysicsBuilder_V = G4VPCData::PhysicsBuilders_V;
148 
149     // Register a process to the particle type according to the ordering
150     // parameter table. 'true' is returned if the process is registered
151     // successfully.
152     inline G4bool RegisterProcess(G4VProcess* process, G4ParticleDefinition* particle);
153 
154     G4ParticleTable::G4PTblDicIterator* GetParticleIterator() const;
155 
156     // This returns a copy of the vector of pointers.
157     PhysicsBuilder_V GetBuilders() const;
158 
159     void AddBuilder(G4PhysicsBuilderInterface* bld);
160 
161   protected:
162     G4int verboseLevel = 0;
163     G4String namePhysics = "";
164     G4int typePhysics = 0;
165 
166     G4ParticleTable* theParticleTable = nullptr;
167     G4int g4vpcInstanceID = 0;
168     G4RUN_DLL static G4VPCManager subInstanceManager;
169 };
170 
171 // Inline methods implementations
172 
173 inline void G4VPhysicsConstructor::SetVerboseLevel(G4int value)
174 {
175   verboseLevel = value;
176 }
177 
178 inline G4int G4VPhysicsConstructor::GetVerboseLevel() const
179 {
180   return verboseLevel;
181 }
182 
183 inline void G4VPhysicsConstructor::SetPhysicsName(const G4String& name)
184 {
185   namePhysics = name;
186 }
187 
188 inline const G4String& G4VPhysicsConstructor::GetPhysicsName() const
189 {
190   return namePhysics;
191 }
192 
193 inline void G4VPhysicsConstructor::SetPhysicsType(G4int val)
194 {
195   if (val > 0) {
196     typePhysics = val;
197   }
198 }
199 
200 inline G4int G4VPhysicsConstructor::GetPhysicsType() const
201 {
202   return typePhysics;
203 }
204 
205 inline G4bool G4VPhysicsConstructor::RegisterProcess(G4VProcess* process,
206                                                      G4ParticleDefinition* particle)
207 {
208   return G4PhysicsListHelper::GetPhysicsListHelper()->RegisterProcess(process, particle);
209 }
210 
211 inline const G4VPCManager& G4VPhysicsConstructor::GetSubInstanceManager()
212 {
213   return subInstanceManager;
214 }
215 
216 #endif
217