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 // $Id: G4NistManager.cc 74262 2013-10-02 14:37:32Z gcosmo $ >> 27 // 26 // ------------------------------------------- 28 // ------------------------------------------------------------------- 27 // 29 // 28 // GEANT4 Class file 30 // GEANT4 Class file 29 // 31 // 30 // 32 // 31 // File name: G4NistManager 33 // File name: G4NistManager 32 // 34 // 33 // Author: Vladimir Ivanchenko 35 // Author: Vladimir Ivanchenko 34 // 36 // 35 // Creation date: 23.12.2004 37 // Creation date: 23.12.2004 36 // 38 // >> 39 // Modifications: >> 40 // 27.02.06 V.Ivanchneko add ConstructNewGasMaterial >> 41 // 18.04.06 V.Ivanchneko add combined creation of materials (NIST + user) >> 42 // 11.05.06 V.Ivanchneko add warning flag to FindMaterial method >> 43 // 26.07.07 V.Ivanchneko modify destructor to provide complete destruction >> 44 // of all elements and materials >> 45 // 27-07-07, improve destructor (V.Ivanchenko) >> 46 // 28.07.07 V.Ivanchneko make simple methods inline >> 47 // 28.07.07 V.Ivanchneko simplify Print methods >> 48 // 26.10.11, new scheme for G4Exception (mma) 37 // 49 // 38 // ------------------------------------------- 50 // ------------------------------------------------------------------- 39 // 51 // 40 // Class Description: 52 // Class Description: 41 // 53 // 42 // Element data from the NIST DB on Atomic Wei 54 // Element data from the NIST DB on Atomic Weights and Isotope Compositions 43 // http://physics.nist.gov/PhysRefData/Composi 55 // http://physics.nist.gov/PhysRefData/Compositions/index.html >> 56 // >> 57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 44 59 45 #include "G4NistManager.hh" 60 #include "G4NistManager.hh" 46 #include "G4AutoLock.hh" << 47 #include "G4NistMessenger.hh" 61 #include "G4NistMessenger.hh" >> 62 #include "G4Isotope.hh" 48 63 49 << 64 G4NistManager* G4NistManager::instance = 0; 50 namespace << 51 { << 52 G4Mutex nistManagerMutex = G4MUTEX_INITIALIZER << 53 } << 54 65 55 //....oooOO0OOooo........oooOO0OOooo........oo 66 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 56 67 57 G4NistManager* G4NistManager::Instance() 68 G4NistManager* G4NistManager::Instance() 58 { 69 { 59 static G4NistManager manager; << 70 if (instance == 0) { 60 return &manager; << 71 static G4NistManager manager; >> 72 instance = &manager; >> 73 } >> 74 return instance; 61 } 75 } 62 76 63 //....oooOO0OOooo........oooOO0OOooo........oo 77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 78 65 G4NistManager::~G4NistManager() 79 G4NistManager::~G4NistManager() 66 { 80 { >> 81 // G4cout << "NistManager: start material destruction" << G4endl; >> 82 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); >> 83 size_t nmat = theMaterialTable->size(); >> 84 size_t i; >> 85 for(i=0; i<nmat; i++) { >> 86 if((*theMaterialTable)[i]) { delete (*theMaterialTable)[i]; } >> 87 } >> 88 // G4cout << "NistManager: start element destruction" << G4endl; >> 89 const G4ElementTable* theElementTable = G4Element::GetElementTable(); >> 90 size_t nelm = theElementTable->size(); >> 91 for(i=0; i<nelm; i++) { >> 92 if((*theElementTable)[i]) { delete (*theElementTable)[i]; } >> 93 } >> 94 // G4cout << "NistManager: start isotope destruction" << G4endl; >> 95 const G4IsotopeTable* theIsotopeTable = G4Isotope::GetIsotopeTable(); >> 96 size_t niso = theIsotopeTable->size(); >> 97 for(i=0; i<niso; i++) { >> 98 if((*theIsotopeTable)[i]) { delete (*theIsotopeTable)[i]; } >> 99 } >> 100 // G4cout << "NistManager: end isotope destruction" << G4endl; 67 delete messenger; 101 delete messenger; 68 delete matBuilder; 102 delete matBuilder; 69 delete elmBuilder; << 103 delete elmBuilder; 70 delete fICRU90; << 104 // G4cout << "NistManager: end destruction" << G4endl; 71 } 105 } 72 106 73 //....oooOO0OOooo........oooOO0OOooo........oo 107 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 74 108 75 G4Material* G4NistManager::BuildMaterialWithNe << 109 G4Material* 76 const G4String& basename, G4double density, << 110 G4NistManager::BuildMaterialWithNewDensity(const G4String& name, >> 111 const G4String& basename, >> 112 G4double density, >> 113 G4double temperature, >> 114 G4double pressure) 77 { 115 { 78 G4Material* bmat = FindOrBuildMaterial(name) 116 G4Material* bmat = FindOrBuildMaterial(name); 79 if (bmat != nullptr) { << 117 if(bmat) { 80 G4cout << "G4NistManager::BuildMaterialWit 118 G4cout << "G4NistManager::BuildMaterialWithNewDensity ERROR: " << G4endl; 81 G4cout << " New material <" << name << "> 119 G4cout << " New material <" << name << "> cannot be built because material" 82 << " with the same name already exi << 120 << " with the same name already exist" << G4endl; 83 G4Exception("G4NistManager::BuildMaterialW << 121 G4Exception("G4NistManager::BuildMaterialWithNewDensity()", "mat101", 84 "Wrong material name"); << 122 FatalException, "Wrong material name"); 85 return nullptr; << 123 return 0; 86 } 124 } 87 bmat = FindOrBuildMaterial(basename); 125 bmat = FindOrBuildMaterial(basename); 88 if (bmat == nullptr) { << 126 if(!bmat) { 89 G4cout << "G4NistManager::BuildMaterialWit 127 G4cout << "G4NistManager::BuildMaterialWithNewDensity ERROR: " << G4endl; 90 G4cout << " New material <" << name << "> 128 G4cout << " New material <" << name << "> cannot be built because " << G4endl; 91 G4cout << " base material <" << basename < << 129 G4cout << " base material <" << basename << "> does not exist" << G4endl; 92 G4Exception("G4NistManager::BuildMaterialW << 130 G4Exception("G4NistManager::BuildMaterialWithNewDensity()", "mat102", 93 "Wrong material name"); << 131 FatalException, "Wrong material name"); 94 return nullptr; << 132 return 0; 95 } 133 } 96 G4double dens = density; 134 G4double dens = density; 97 G4double temp = temperature; 135 G4double temp = temperature; 98 G4double pres = pressure; 136 G4double pres = pressure; 99 if (dens == 0.0) { << 137 if(dens == 0.0) { 100 dens = bmat->GetDensity(); 138 dens = bmat->GetDensity(); 101 temp = bmat->GetTemperature(); 139 temp = bmat->GetTemperature(); 102 pres = bmat->GetPressure(); << 140 pres = bmat->GetPressure(); 103 } 141 } 104 auto mat = new G4Material(name, dens, bmat, << 142 G4Material* mat = new G4Material(name, dens, bmat, bmat->GetState(), >> 143 temp, pres); 105 return mat; 144 return mat; 106 } 145 } 107 << 146 108 //....oooOO0OOooo........oooOO0OOooo........oo 147 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 109 148 110 void G4NistManager::PrintElement(const G4Strin << 149 void G4NistManager::PrintElement(const G4String& symbol) 111 { 150 { 112 if (symbol == "all") { << 151 if (symbol == "all") { elmBuilder->PrintElement(0); } 113 elmBuilder->PrintElement(0); << 152 else { elmBuilder->PrintElement(elmBuilder->GetZ(symbol)); } 114 } << 115 else { << 116 elmBuilder->PrintElement(elmBuilder->GetZ( << 117 } << 118 } 153 } 119 154 120 //....oooOO0OOooo........oooOO0OOooo........oo 155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 121 156 122 void G4NistManager::PrintG4Element(const G4Str << 157 void G4NistManager::PrintG4Element(const G4String& name) 123 { 158 { 124 for (auto const & elm : *G4Element::GetEleme << 159 const G4ElementTable* theElementTable = G4Element::GetElementTable(); 125 if (name == elm->GetName() || "all" == nam << 160 size_t nelm = theElementTable->size(); >> 161 for(size_t i=0; i<nelm; i++) { >> 162 G4Element* elm = (*theElementTable)[i]; >> 163 if ( name == elm->GetName() || "all" == name) { 126 G4cout << *elm << G4endl; 164 G4cout << *elm << G4endl; >> 165 return; 127 } 166 } 128 } 167 } 129 } 168 } 130 169 131 //....oooOO0OOooo........oooOO0OOooo........oo 170 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 132 171 133 void G4NistManager::PrintG4Material(const G4St << 172 void G4NistManager::PrintG4Material(const G4String& name) 134 { 173 { 135 for (auto const & mat : *G4Material::GetMate << 174 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); 136 if (name == mat->GetName() || "all" == nam << 175 size_t nmat = theMaterialTable->size(); >> 176 for(size_t i=0; i<nmat; i++) { >> 177 G4Material* mat = (*theMaterialTable)[i]; >> 178 if ( name == mat->GetName() || "all" == name) { 137 G4cout << *mat << G4endl; 179 G4cout << *mat << G4endl; >> 180 return; 138 } 181 } 139 } 182 } 140 } 183 } 141 184 142 //....oooOO0OOooo........oooOO0OOooo........oo 185 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 143 186 144 void G4NistManager::SetVerbose(G4int val) 187 void G4NistManager::SetVerbose(G4int val) 145 { 188 { 146 verbose = val; 189 verbose = val; 147 elmBuilder->SetVerbose(val); 190 elmBuilder->SetVerbose(val); 148 matBuilder->SetVerbose(val); 191 matBuilder->SetVerbose(val); 149 } 192 } 150 193 151 //....oooOO0OOooo........oooOO0OOooo........oo 194 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 152 195 >> 196 #include "G4Threading.hh" >> 197 153 G4NistManager::G4NistManager() 198 G4NistManager::G4NistManager() 154 { 199 { 155 nElements = 0; << 200 if(G4Threading::IsWorkerThread() == true) { 156 nMaterials = 0; << 201 G4Exception ("G4NistMaterial::G4NistManager()", "mat090", FatalException, 157 verbose = 0; << 202 "Attempt to instantiate G4NistManager in worker thread"); >> 203 } 158 204 159 theMaterialTable = G4Material::GetMaterialTa << 205 nElements = 0; 160 theElementTable = G4Element::GetElementTable << 206 nMaterials = 0; 161 theIsotopeTable = G4Isotope::GetIsotopeTable << 207 verbose = 0; 162 208 163 elmBuilder = new G4NistElementBuilder(verbos 209 elmBuilder = new G4NistElementBuilder(verbose); 164 matBuilder = new G4NistMaterialBuilder(elmBu << 210 matBuilder = new G4NistMaterialBuilder(elmBuilder,verbose); 165 << 211 166 messenger = new G4NistMessenger(this); << 212 messenger = new G4NistMessenger(this); 167 g4pow = G4Pow::GetInstance(); 213 g4pow = G4Pow::GetInstance(); 168 214 169 // compute frequently used values for mean a 215 // compute frequently used values for mean atomic numbers 170 for (G4int j = 1; j < 101; ++j) { << 216 for(G4int j=1; j<101; ++j) { 171 G4double A = elmBuilder->GetAtomicMassAmu( 217 G4double A = elmBuilder->GetAtomicMassAmu(j); 172 POWERA27[j] = std::pow(A, 0.27); << 218 POWERA27[j] = std::pow(A,0.27); 173 LOGAZ[j] = std::log(A); << 219 LOGAZ[j] = std::log(A); 174 } 220 } 175 POWERA27[0] = 1.0; 221 POWERA27[0] = 1.0; 176 LOGAZ[0] = 0.0; << 222 LOGAZ[0] = 0.0; 177 fICRU90 = nullptr; << 178 } 223 } 179 224 180 //....oooOO0OOooo........oooOO0OOooo........oo 225 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 181 << 182 G4ICRU90StoppingData* G4NistManager::GetICRU90 << 183 { << 184 if (fICRU90 == nullptr) { << 185 G4AutoLock l(&nistManagerMutex); << 186 if (fICRU90 == nullptr) { << 187 fICRU90 = new G4ICRU90StoppingData(); << 188 } << 189 l.unlock(); << 190 } << 191 return fICRU90; << 192 } << 193 << 194 //....oooOO0OOooo........oooOO0OOooo........oo << 195 << 196 void G4NistManager::SetDensityEffectCalculator << 197 { << 198 if (mname == "all") { << 199 for (auto mat : materials) { << 200 SetDensityEffectCalculatorFlag(mat, val) << 201 } << 202 } << 203 else { << 204 G4Material* mat = FindMaterial(mname); << 205 SetDensityEffectCalculatorFlag(mat, val); << 206 } << 207 } << 208 << 209 //....oooOO0OOooo........oooOO0OOooo........oo << 210 << 211 void G4NistManager::SetDensityEffectCalculator << 212 { << 213 if (mat != nullptr) { << 214 mat->ComputeDensityEffectOnFly(val); << 215 } << 216 } << 217 226