Geant4  10.03.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
33 #include "G4VUserChemistryList.hh"
34 
35 #include <G4VScheduler.hh>
36 #include "G4MoleculeTable.hh"
37 #include "G4MoleculeDefinition.hh"
38 #include "G4ProcessManager.hh"
39 #include "G4DNAChemistryManager.hh"
40 
42 fIsPhysicsConstructor(flag)
43 {
44  verboseLevel = 1;
45 }
46 
48 {
50  if (chemMan)
51  {
52  chemMan->Deregister(this);
53  }
54 }
55 
57  double 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)
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)
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<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<pVectorShadow->size();iv2++)
134  {
135  G4cout << " " << iv2 << " - " << (*pVectorShadow)[iv2]->GetProcessName()
136  << G4endl;
137  }
138  }
139 #endif
140  for (G4int j = 0; j < 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 }
void Deregister(G4VUserChemistryList *)
static G4VScheduler * Instance()
Definition: G4VScheduler.cc:48
virtual void RegisterModel(G4VITStepModel *, double)
Definition: G4VScheduler.hh:69
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4VUserChemistryList(bool flag=true)
G4GLOB_DLL std::ostream G4cout
G4ProcessManager * GetMasterProcessManager() const
static G4MoleculeTable * Instance()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
G4int size() const
G4MoleculeDefinitionIterator GetDefintionIterator()
G4ProcessManager * GetProcessManager() const
#define G4endl
Definition: G4ios.hh:61
static G4DNAChemistryManager * GetInstanceIfExists()
G4ProcessVector * GetProcessList() const
void RegisterTimeStepModel(G4VITStepModel *timeStepModel, double startingTime=0)