Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 26 // ------------------------------------------- 27 // 28 // GEANT4 Class file 29 // 30 // 31 // File name: G4NistManager 32 // 33 // Author: Vladimir Ivanchenko 34 // 35 // Creation date: 23.12.2004 36 // 37 // 38 // ------------------------------------------- 39 // 40 // Class Description: 41 // 42 // Element data from the NIST DB on Atomic Wei 43 // http://physics.nist.gov/PhysRefData/Composi 44 45 #include "G4NistManager.hh" 46 #include "G4AutoLock.hh" 47 #include "G4NistMessenger.hh" 48 49 50 namespace 51 { 52 G4Mutex nistManagerMutex = G4MUTEX_INITIALIZER 53 } 54 55 //....oooOO0OOooo........oooOO0OOooo........oo 56 57 G4NistManager* G4NistManager::Instance() 58 { 59 static G4NistManager manager; 60 return &manager; 61 } 62 63 //....oooOO0OOooo........oooOO0OOooo........oo 64 65 G4NistManager::~G4NistManager() 66 { 67 delete messenger; 68 delete matBuilder; 69 delete elmBuilder; 70 delete fICRU90; 71 } 72 73 //....oooOO0OOooo........oooOO0OOooo........oo 74 75 G4Material* G4NistManager::BuildMaterialWithNe 76 const G4String& basename, G4double density, 77 { 78 G4Material* bmat = FindOrBuildMaterial(name) 79 if (bmat != nullptr) { 80 G4cout << "G4NistManager::BuildMaterialWit 81 G4cout << " New material <" << name << "> 82 << " with the same name already exi 83 G4Exception("G4NistManager::BuildMaterialW 84 "Wrong material name"); 85 return nullptr; 86 } 87 bmat = FindOrBuildMaterial(basename); 88 if (bmat == nullptr) { 89 G4cout << "G4NistManager::BuildMaterialWit 90 G4cout << " New material <" << name << "> 91 G4cout << " base material <" << basename < 92 G4Exception("G4NistManager::BuildMaterialW 93 "Wrong material name"); 94 return nullptr; 95 } 96 G4double dens = density; 97 G4double temp = temperature; 98 G4double pres = pressure; 99 if (dens == 0.0) { 100 dens = bmat->GetDensity(); 101 temp = bmat->GetTemperature(); 102 pres = bmat->GetPressure(); 103 } 104 auto mat = new G4Material(name, dens, bmat, 105 return mat; 106 } 107 108 //....oooOO0OOooo........oooOO0OOooo........oo 109 110 void G4NistManager::PrintElement(const G4Strin 111 { 112 if (symbol == "all") { 113 elmBuilder->PrintElement(0); 114 } 115 else { 116 elmBuilder->PrintElement(elmBuilder->GetZ( 117 } 118 } 119 120 //....oooOO0OOooo........oooOO0OOooo........oo 121 122 void G4NistManager::PrintG4Element(const G4Str 123 { 124 for (auto const & elm : *G4Element::GetEleme 125 if (name == elm->GetName() || "all" == nam 126 G4cout << *elm << G4endl; 127 } 128 } 129 } 130 131 //....oooOO0OOooo........oooOO0OOooo........oo 132 133 void G4NistManager::PrintG4Material(const G4St 134 { 135 for (auto const & mat : *G4Material::GetMate 136 if (name == mat->GetName() || "all" == nam 137 G4cout << *mat << G4endl; 138 } 139 } 140 } 141 142 //....oooOO0OOooo........oooOO0OOooo........oo 143 144 void G4NistManager::SetVerbose(G4int val) 145 { 146 verbose = val; 147 elmBuilder->SetVerbose(val); 148 matBuilder->SetVerbose(val); 149 } 150 151 //....oooOO0OOooo........oooOO0OOooo........oo 152 153 G4NistManager::G4NistManager() 154 { 155 nElements = 0; 156 nMaterials = 0; 157 verbose = 0; 158 159 theMaterialTable = G4Material::GetMaterialTa 160 theElementTable = G4Element::GetElementTable 161 theIsotopeTable = G4Isotope::GetIsotopeTable 162 163 elmBuilder = new G4NistElementBuilder(verbos 164 matBuilder = new G4NistMaterialBuilder(elmBu 165 166 messenger = new G4NistMessenger(this); 167 g4pow = G4Pow::GetInstance(); 168 169 // compute frequently used values for mean a 170 for (G4int j = 1; j < 101; ++j) { 171 G4double A = elmBuilder->GetAtomicMassAmu( 172 POWERA27[j] = std::pow(A, 0.27); 173 LOGAZ[j] = std::log(A); 174 } 175 POWERA27[0] = 1.0; 176 LOGAZ[0] = 0.0; 177 fICRU90 = nullptr; 178 } 179 180 //....oooOO0OOooo........oooOO0OOooo........oo 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