Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VUserChemistryList.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/*
27 * G4VUserChemistryList.cc
28 *
29 * Created on: 23 oct. 2013
30 * Author: kara
31 */
32
34
35#include <G4VScheduler.hh>
36#include "G4MoleculeTable.hh"
38#include "G4ProcessManager.hh"
40
42fIsPhysicsConstructor(flag)
43{
44 verboseLevel = 1;
45}
46
48{
50 if (chemMan != nullptr)
51 {
52 chemMan->Deregister(*this);
53 }
54}
55
57 G4double startingTime)
58{
59 G4VScheduler::Instance()->RegisterModel(timeStepModel, startingTime);
60}
61
63{
64 G4MoleculeTable* theMoleculeTable = G4MoleculeTable::Instance();
65
67 theMoleculeTable->GetDefintionIterator();
68
69 iterator.reset();
70 while (iterator())
71 {
72 G4MoleculeDefinition* moleculeDef = iterator.value();
73 BuildPhysicsTable(moleculeDef);
74 }
75}
76
78{
79 //Get processes from master thread;
80 G4ProcessManager* pManager = moleculeDef->GetProcessManager();
81
82 if (pManager == nullptr)
83 {
84#ifdef G4VERBOSE
85 if (verboseLevel > 0)
86 {
87 G4cout << "G4VUserPhysicsList::BuildPhysicsTable "
88 << " : No Process Manager for " << moleculeDef->GetParticleName()
89 << G4endl;
90 G4cout << moleculeDef->GetParticleName()
91 << " should be created in your PhysicsList" <<G4endl;
92 }
93#endif
94 G4Exception("G4VUserChemistryList::BuildPhysicsTable",
95 "Run0271", FatalException,
96 "No process manager");
97 return;
98 }
99
100 G4ProcessManager* pManagerShadow = moleculeDef->GetMasterProcessManager();
101 G4ProcessVector* pVector = pManager->GetProcessList();
102 if (pVector == nullptr)
103 {
104#ifdef G4VERBOSE
105 if (verboseLevel > 0)
106 {
107 G4cout << "G4VUserChemistryList::BuildPhysicsTable "
108 << " : No Process Vector for " << moleculeDef->GetParticleName()
109 << G4endl;
110 }
111#endif
112 G4Exception("G4VUserChemistryList::BuildPhysicsTable",
113 "Run0272", FatalException,
114 "No process Vector");
115 return;
116 }
117#ifdef G4VERBOSE
118 if (verboseLevel > 2)
119 {
120 G4cout << "G4VUserChemistryList::BuildPhysicsTable %%%%%% "
121 << moleculeDef->GetParticleName() << G4endl;
122 G4cout << " ProcessManager : " << pManager
123 << " ProcessManagerShadow : " << pManagerShadow << G4endl;
124 for(G4int iv1=0;iv1<(G4int)pVector->size();++iv1)
125 {
126 G4cout << " " << iv1 << " - " << (*pVector)[iv1]->GetProcessName()
127 << G4endl;
128 }
129 G4cout << "--------------------------------------------------------------"
130 << G4endl;
131 G4ProcessVector* pVectorShadow = pManagerShadow->GetProcessList();
132
133 for(G4int iv2=0;iv2<(G4int)pVectorShadow->size();++iv2)
134 {
135 G4cout << " " << iv2 << " - " << (*pVectorShadow)[iv2]->GetProcessName()
136 << G4endl;
137 }
138 }
139#endif
140 for (G4int j = 0; j < (G4int)pVector->size(); ++j)
141 {
142 //Andrea July 16th 2013 : migration to new interface...
143 //Infer if we are in a worker thread or master thread
144 //Master thread is the one in which the process manager
145 // and process manager shadow pointers are the same
146 if (pManagerShadow == pManager)
147 {
148 (*pVector)[j]->BuildPhysicsTable(*moleculeDef);
149 }
150 else
151 {
152 (*pVector)[j]->BuildWorkerPhysicsTable(*moleculeDef);
153 }
154
155 }
156}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static G4DNAChemistryManager * GetInstanceIfExists()
void Deregister(G4VUserChemistryList &)
G4MoleculeDefinitionIterator GetDefintionIterator()
static G4MoleculeTable * Instance()
G4ProcessManager * GetProcessManager() const
G4ProcessManager * GetMasterProcessManager() const
const G4String & GetParticleName() const
G4ProcessVector * GetProcessList() const
std::size_t size() const
static G4VScheduler * Instance()
virtual void RegisterModel(G4VITStepModel *, double)
G4VUserChemistryList(G4bool flag=true)
void RegisterTimeStepModel(G4VITStepModel *timeStepModel, G4double startingTime=0)