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 // 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 Weights and Isotope Compositions 43 // http://physics.nist.gov/PhysRefData/Compositions/index.html 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........oooOO0OOooo........oooOO0OOooo..... 56 57 G4NistManager* G4NistManager::Instance() 58 { 59 static G4NistManager manager; 60 return &manager; 61 } 62 63 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 65 G4NistManager::~G4NistManager() 66 { 67 delete messenger; 68 delete matBuilder; 69 delete elmBuilder; 70 delete fICRU90; 71 } 72 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 74 75 G4Material* G4NistManager::BuildMaterialWithNewDensity(const G4String& name, 76 const G4String& basename, G4double density, G4double temperature, G4double pressure) 77 { 78 G4Material* bmat = FindOrBuildMaterial(name); 79 if (bmat != nullptr) { 80 G4cout << "G4NistManager::BuildMaterialWithNewDensity ERROR: " << G4endl; 81 G4cout << " New material <" << name << "> cannot be built because material" 82 << " with the same name already exists." << G4endl; 83 G4Exception("G4NistManager::BuildMaterialWithNewDensity()", "mat101", FatalException, 84 "Wrong material name"); 85 return nullptr; 86 } 87 bmat = FindOrBuildMaterial(basename); 88 if (bmat == nullptr) { 89 G4cout << "G4NistManager::BuildMaterialWithNewDensity ERROR: " << G4endl; 90 G4cout << " New material <" << name << "> cannot be built because " << G4endl; 91 G4cout << " base material <" << basename << "> does not exist." << G4endl; 92 G4Exception("G4NistManager::BuildMaterialWithNewDensity()", "mat102", FatalException, 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, bmat->GetState(), temp, pres); 105 return mat; 106 } 107 108 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 109 110 void G4NistManager::PrintElement(const G4String& symbol) const 111 { 112 if (symbol == "all") { 113 elmBuilder->PrintElement(0); 114 } 115 else { 116 elmBuilder->PrintElement(elmBuilder->GetZ(symbol)); 117 } 118 } 119 120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 121 122 void G4NistManager::PrintG4Element(const G4String& name) const 123 { 124 for (auto const & elm : *G4Element::GetElementTable()) { 125 if (name == elm->GetName() || "all" == name) { 126 G4cout << *elm << G4endl; 127 } 128 } 129 } 130 131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 132 133 void G4NistManager::PrintG4Material(const G4String& name) const 134 { 135 for (auto const & mat : *G4Material::GetMaterialTable()) { 136 if (name == mat->GetName() || "all" == name) { 137 G4cout << *mat << G4endl; 138 } 139 } 140 } 141 142 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 143 144 void G4NistManager::SetVerbose(G4int val) 145 { 146 verbose = val; 147 elmBuilder->SetVerbose(val); 148 matBuilder->SetVerbose(val); 149 } 150 151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 152 153 G4NistManager::G4NistManager() 154 { 155 nElements = 0; 156 nMaterials = 0; 157 verbose = 0; 158 159 theMaterialTable = G4Material::GetMaterialTable(); 160 theElementTable = G4Element::GetElementTable(); 161 theIsotopeTable = G4Isotope::GetIsotopeTable(); 162 163 elmBuilder = new G4NistElementBuilder(verbose); 164 matBuilder = new G4NistMaterialBuilder(elmBuilder, verbose); 165 166 messenger = new G4NistMessenger(this); 167 g4pow = G4Pow::GetInstance(); 168 169 // compute frequently used values for mean atomic numbers 170 for (G4int j = 1; j < 101; ++j) { 171 G4double A = elmBuilder->GetAtomicMassAmu(j); 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........oooOO0OOooo........oooOO0OOooo...... 181 182 G4ICRU90StoppingData* G4NistManager::GetICRU90StoppingData() 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........oooOO0OOooo........oooOO0OOooo...... 195 196 void G4NistManager::SetDensityEffectCalculatorFlag(const G4String& mname, G4bool val) 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........oooOO0OOooo........oooOO0OOooo...... 210 211 void G4NistManager::SetDensityEffectCalculatorFlag(G4Material* mat, G4bool val) 212 { 213 if (mat != nullptr) { 214 mat->ComputeDensityEffectOnFly(val); 215 } 216 } 217