Geant4 Cross Reference |
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 41 G4VUserChemistryList::G4VUserChemistryList(G4bool flag) : 42 fIsPhysicsConstructor(flag) 43 { 44 verboseLevel = 1; 45 } 46 47 G4VUserChemistryList::~G4VUserChemistryList() 48 { 49 G4DNAChemistryManager* chemMan = G4DNAChemistryManager::GetInstanceIfExists(); 50 if (chemMan != nullptr) 51 { 52 chemMan->Deregister(*this); 53 } 54 } 55 56 void G4VUserChemistryList::RegisterTimeStepModel(G4VITStepModel* timeStepModel, 57 G4double startingTime) 58 { 59 G4VScheduler::Instance()->RegisterModel(timeStepModel, startingTime); 60 } 61 62 void G4VUserChemistryList::BuildPhysicsTable() 63 { 64 G4MoleculeTable* theMoleculeTable = G4MoleculeTable::Instance(); 65 66 G4MoleculeDefinitionIterator iterator = 67 theMoleculeTable->GetDefintionIterator(); 68 69 iterator.reset(); 70 while (iterator()) 71 { 72 G4MoleculeDefinition* moleculeDef = iterator.value(); 73 BuildPhysicsTable(moleculeDef); 74 } 75 } 76 77 void G4VUserChemistryList::BuildPhysicsTable(G4MoleculeDefinition* moleculeDef) 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 } 157