Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /* 26 /* 27 * G4VUserChemistryList.cc 27 * G4VUserChemistryList.cc 28 * 28 * 29 * Created on: 23 oct. 2013 29 * Created on: 23 oct. 2013 30 * Author: kara 30 * Author: kara 31 */ 31 */ 32 32 33 #include "G4VUserChemistryList.hh" 33 #include "G4VUserChemistryList.hh" 34 34 35 #include <G4VScheduler.hh> 35 #include <G4VScheduler.hh> 36 #include "G4MoleculeTable.hh" 36 #include "G4MoleculeTable.hh" 37 #include "G4MoleculeDefinition.hh" 37 #include "G4MoleculeDefinition.hh" 38 #include "G4ProcessManager.hh" 38 #include "G4ProcessManager.hh" 39 #include "G4DNAChemistryManager.hh" 39 #include "G4DNAChemistryManager.hh" 40 40 41 G4VUserChemistryList::G4VUserChemistryList(G4b << 41 G4VUserChemistryList::G4VUserChemistryList(bool flag) : 42 fIsPhysicsConstructor(flag) 42 fIsPhysicsConstructor(flag) 43 { 43 { 44 verboseLevel = 1; 44 verboseLevel = 1; 45 } 45 } 46 46 47 G4VUserChemistryList::~G4VUserChemistryList() 47 G4VUserChemistryList::~G4VUserChemistryList() 48 { 48 { 49 G4DNAChemistryManager* chemMan = G4DNAChemis 49 G4DNAChemistryManager* chemMan = G4DNAChemistryManager::GetInstanceIfExists(); 50 if (chemMan != nullptr) << 50 if (chemMan) 51 { 51 { 52 chemMan->Deregister(*this); 52 chemMan->Deregister(*this); 53 } 53 } 54 } 54 } 55 55 56 void G4VUserChemistryList::RegisterTimeStepMod 56 void G4VUserChemistryList::RegisterTimeStepModel(G4VITStepModel* timeStepModel, 57 << 57 double startingTime) 58 { 58 { 59 G4VScheduler::Instance()->RegisterModel(time 59 G4VScheduler::Instance()->RegisterModel(timeStepModel, startingTime); 60 } 60 } 61 61 62 void G4VUserChemistryList::BuildPhysicsTable() 62 void G4VUserChemistryList::BuildPhysicsTable() 63 { 63 { 64 G4MoleculeTable* theMoleculeTable = G4Molecu 64 G4MoleculeTable* theMoleculeTable = G4MoleculeTable::Instance(); 65 65 66 G4MoleculeDefinitionIterator iterator = 66 G4MoleculeDefinitionIterator iterator = 67 theMoleculeTable->GetDefintionIterator() 67 theMoleculeTable->GetDefintionIterator(); 68 68 69 iterator.reset(); 69 iterator.reset(); 70 while (iterator()) 70 while (iterator()) 71 { 71 { 72 G4MoleculeDefinition* moleculeDef = iterat 72 G4MoleculeDefinition* moleculeDef = iterator.value(); 73 BuildPhysicsTable(moleculeDef); 73 BuildPhysicsTable(moleculeDef); 74 } 74 } 75 } 75 } 76 76 77 void G4VUserChemistryList::BuildPhysicsTable(G 77 void G4VUserChemistryList::BuildPhysicsTable(G4MoleculeDefinition* moleculeDef) 78 { 78 { 79 //Get processes from master thread; 79 //Get processes from master thread; 80 G4ProcessManager* pManager = moleculeDef->Ge 80 G4ProcessManager* pManager = moleculeDef->GetProcessManager(); 81 81 82 if (pManager == nullptr) << 82 if (!pManager) 83 { 83 { 84 #ifdef G4VERBOSE 84 #ifdef G4VERBOSE 85 if (verboseLevel > 0) 85 if (verboseLevel > 0) 86 { 86 { 87 G4cout << "G4VUserPhysicsList::BuildPhys 87 G4cout << "G4VUserPhysicsList::BuildPhysicsTable " 88 << " : No Process Manager for " < 88 << " : No Process Manager for " << moleculeDef->GetParticleName() 89 << G4endl; 89 << G4endl; 90 G4cout << moleculeDef->GetParticleName() 90 G4cout << moleculeDef->GetParticleName() 91 << " should be created in your PhysicsLi 91 << " should be created in your PhysicsList" <<G4endl; 92 } 92 } 93 #endif 93 #endif 94 G4Exception("G4VUserChemistryList::BuildPh 94 G4Exception("G4VUserChemistryList::BuildPhysicsTable", 95 "Run0271", FatalException, 95 "Run0271", FatalException, 96 "No process manager"); 96 "No process manager"); 97 return; 97 return; 98 } 98 } 99 99 100 G4ProcessManager* pManagerShadow = moleculeD 100 G4ProcessManager* pManagerShadow = moleculeDef->GetMasterProcessManager(); 101 G4ProcessVector* pVector = pManager->GetProc 101 G4ProcessVector* pVector = pManager->GetProcessList(); 102 if (pVector == nullptr) << 102 if (!pVector) 103 { 103 { 104 #ifdef G4VERBOSE 104 #ifdef G4VERBOSE 105 if (verboseLevel > 0) 105 if (verboseLevel > 0) 106 { 106 { 107 G4cout << "G4VUserChemistryList::BuildPh 107 G4cout << "G4VUserChemistryList::BuildPhysicsTable " 108 << " : No Process Vector for " << 108 << " : No Process Vector for " << moleculeDef->GetParticleName() 109 << G4endl; 109 << G4endl; 110 } 110 } 111 #endif 111 #endif 112 G4Exception("G4VUserChemistryList::BuildPh 112 G4Exception("G4VUserChemistryList::BuildPhysicsTable", 113 "Run0272", FatalException, 113 "Run0272", FatalException, 114 "No process Vector"); 114 "No process Vector"); 115 return; 115 return; 116 } 116 } 117 #ifdef G4VERBOSE 117 #ifdef G4VERBOSE 118 if (verboseLevel > 2) 118 if (verboseLevel > 2) 119 { 119 { 120 G4cout << "G4VUserChemistryList::BuildPhys 120 G4cout << "G4VUserChemistryList::BuildPhysicsTable %%%%%% " 121 << moleculeDef->GetParticleName() < 121 << moleculeDef->GetParticleName() << G4endl; 122 G4cout << " ProcessManager : " << pManager 122 G4cout << " ProcessManager : " << pManager 123 << " ProcessManagerShadow : " << pM 123 << " ProcessManagerShadow : " << pManagerShadow << G4endl; 124 for(G4int iv1=0;iv1<(G4int)pVector->size() << 124 for(std::size_t iv1=0;iv1<pVector->size();++iv1) 125 { 125 { 126 G4cout << " " << iv1 << " - " << (*pVec 126 G4cout << " " << iv1 << " - " << (*pVector)[iv1]->GetProcessName() 127 << G4endl; 127 << G4endl; 128 } 128 } 129 G4cout << "------------------------------- 129 G4cout << "--------------------------------------------------------------" 130 << G4endl; 130 << G4endl; 131 G4ProcessVector* pVectorShadow = pManagerS 131 G4ProcessVector* pVectorShadow = pManagerShadow->GetProcessList(); 132 132 133 for(G4int iv2=0;iv2<(G4int)pVectorShadow-> << 133 for(std::size_t iv2=0;iv2<pVectorShadow->size();++iv2) 134 { 134 { 135 G4cout << " " << iv2 << " - " << (*pVec 135 G4cout << " " << iv2 << " - " << (*pVectorShadow)[iv2]->GetProcessName() 136 << G4endl; 136 << G4endl; 137 } 137 } 138 } 138 } 139 #endif 139 #endif 140 for (G4int j = 0; j < (G4int)pVector->size() << 140 for (std::size_t j = 0; j < pVector->size(); ++j) 141 { 141 { 142 //Andrea July 16th 2013 : migration to new 142 //Andrea July 16th 2013 : migration to new interface... 143 //Infer if we are in a worker thread or ma 143 //Infer if we are in a worker thread or master thread 144 //Master thread is the one in which the pr 144 //Master thread is the one in which the process manager 145 // and process manager shadow pointers are 145 // and process manager shadow pointers are the same 146 if (pManagerShadow == pManager) 146 if (pManagerShadow == pManager) 147 { 147 { 148 (*pVector)[j]->BuildPhysicsTable(*molecu 148 (*pVector)[j]->BuildPhysicsTable(*moleculeDef); 149 } 149 } 150 else 150 else 151 { 151 { 152 (*pVector)[j]->BuildWorkerPhysicsTable(* 152 (*pVector)[j]->BuildWorkerPhysicsTable(*moleculeDef); 153 } 153 } 154 154 155 } 155 } 156 } 156 } 157 157