Geant4 Cross Reference |
>> 1 // This code implementation is the intellectual property of >> 2 // the GEANT4 collaboration. 1 // 3 // 2 // ******************************************* << 4 // By copying, distributing or modifying the Program (or any work 3 // * License and Disclaimer << 5 // based on the Program) you indicate your acceptance of this statement, 4 // * << 6 // and all its terms. 5 // * The Geant4 software is copyright of th << 7 // 6 // * the Geant4 Collaboration. It is provided << 8 // $Id: G4MaterialPropertiesTable.cc,v 1.5.2.1.4.1 1999/12/08 17:34:06 gunter Exp $ 7 // * conditions of the Geant4 Software License << 9 // GEANT4 tag $Name: geant4-01-01 $ 8 // * LICENSE and available at http://cern.ch/ << 10 // 9 // * include a list of copyright holders. << 11 // 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 ////////////////////////////////////////////// 12 //////////////////////////////////////////////////////////////////////// 27 // G4MaterialPropertiesTable Implementation 13 // G4MaterialPropertiesTable Implementation 28 ////////////////////////////////////////////// 14 //////////////////////////////////////////////////////////////////////// 29 // 15 // 30 // File: G4MaterialPropertiesTable.cc << 16 // File: G4MaterialPropertiesTable.cc 31 // Version: 1.0 17 // Version: 1.0 32 // Created: 1996-02-08 18 // Created: 1996-02-08 33 // Author: Juliet Armstrong 19 // Author: Juliet Armstrong 34 // Updated: 2005-05-12 add SetGROUPVEL(), << 20 // Updated: 1999-11-05 Migration from G4RWTPtrHashDictionary to STL 35 // Horton-Smith (bug report #741) << 36 // 2002-11-05 add named material << 37 // 1999-11-05 Migration from G4RW << 38 // by John Allison 21 // by John Allison 39 // 1997-03-26 by Peter Gumplinger 22 // 1997-03-26 by Peter Gumplinger 40 // > cosmetics (only) 23 // > cosmetics (only) >> 24 // mail: gum@triumf.ca 41 // 25 // 42 ////////////////////////////////////////////// 26 //////////////////////////////////////////////////////////////////////// 43 27 44 #include "G4MaterialPropertiesTable.hh" << 45 << 46 #include "G4Log.hh" << 47 #include "G4OpticalMaterialProperties.hh" << 48 #include "G4PhysicalConstants.hh" << 49 #include "globals.hh" 28 #include "globals.hh" >> 29 #include "G4MaterialPropertiesTable.hh" 50 30 51 #include <algorithm> << 31 ////////////// 52 #include <cassert> << 32 // Operators 53 << 33 ////////////// 54 #ifdef G4MULTITHREADED << 34 55 # include "G4AutoLock.hh" << 35 /************** 56 namespace << 36 G4MaterialPropertiesTable& 57 { << 37 G4MaterialPropertiesTable::operator =(const G4MaterialPropertiesTable& right) 58 G4Mutex materialPropertyTableMutex = G4MUTEX_I << 38 { 59 } << 39 if (this == &right) return *this; 60 #endif << 40 61 << 41 // clear any current contents of MPT 62 G4MaterialPropertiesTable::G4MaterialPropertie << 42 63 { << 43 MPT.clearAndDestroy(); 64 // elements of these 2 vectors must be in sa << 44 65 // the corresponding enums in G4MaterialProp << 45 // want to make an actual copy -- not a shallow copy which is 66 fMatPropNames.assign(kNumberOfPropertyIndex, << 46 // the default for RWTPrtHashDictionary's assignment operator 67 fMatPropNames[kRINDEX] = << 47 68 fMatPropNames[kREFLECTIVITY] = << 48 G4RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> 69 fMatPropNames[kREALRINDEX] = << 49 rightMPT(right.MPT); 70 fMatPropNames[kIMAGINARYRINDEX] = << 50 G4RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector> 71 fMatPropNames[kEFFICIENCY] = << 51 rightIterator(rightMPT); 72 fMatPropNames[kTRANSMITTANCE] = << 52 rightIterator.reset(); 73 fMatPropNames[kSPECULARLOBECONSTANT] = << 53 while (++rightIterator) { 74 fMatPropNames[kSPECULARSPIKECONSTANT] = << 54 G4MaterialPropertyVector *newProp = 75 fMatPropNames[kBACKSCATTERCONSTANT] = << 55 new G4MaterialPropertyVector(*(rightIterator.value())); 76 fMatPropNames[kGROUPVEL] = << 56 G4String *newKey = 77 fMatPropNames[kMIEHG] = << 57 new G4String(*(rightIterator.key())); 78 fMatPropNames[kRAYLEIGH] = << 58 MPT.insertKeyAndValue(newKey, newProp); 79 fMatPropNames[kWLSCOMPONENT] = << 59 } 80 fMatPropNames[kWLSABSLENGTH] = << 60 return *this; 81 fMatPropNames[kWLSCOMPONENT2] = << 61 } 82 fMatPropNames[kWLSABSLENGTH2] = << 62 **********/ 83 fMatPropNames[kABSLENGTH] = << 63 84 fMatPropNames[kPROTONSCINTILLATIONYIELD] = << 64 ///////////////// 85 fMatPropNames[kDEUTERONSCINTILLATIONYIELD] = << 65 // Constructors 86 fMatPropNames[kTRITONSCINTILLATIONYIELD] = << 66 ///////////////// 87 fMatPropNames[kALPHASCINTILLATIONYIELD] = << 67 88 fMatPropNames[kIONSCINTILLATIONYIELD] = << 68 G4MaterialPropertiesTable::G4MaterialPropertiesTable() {} 89 fMatPropNames[kELECTRONSCINTILLATIONYIELD] = << 69 90 fMatPropNames[kSCINTILLATIONCOMPONENT1] = << 70 /********* 91 fMatPropNames[kSCINTILLATIONCOMPONENT2] = << 71 G4MaterialPropertiesTable::G4MaterialPropertiesTable 92 fMatPropNames[kSCINTILLATIONCOMPONENT3] = << 72 (const G4MaterialPropertiesTable &right) : 93 fMatPropNames[kCOATEDRINDEX] = << 73 MPT(hashString), MPTiterator(MPT) 94 << 74 { 95 fMP.assign(kNumberOfPropertyIndex, nullptr); << 75 // want to make an actual copy -- not a shallow copy which is 96 << 76 // the default for RWTPrtHashDictionary's assignment operator 97 fMatConstPropNames.assign(kNumberOfConstProp << 77 98 fMatConstPropNames[kSURFACEROUGHNESS] = << 78 G4RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> 99 fMatConstPropNames[kISOTHERMAL_COMPRESSIBILI << 79 rightMPT(right.MPT); 100 fMatConstPropNames[kRS_SCALE_FACTOR] = << 80 G4RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector> 101 fMatConstPropNames[kWLSMEANNUMBERPHOTONS] = << 81 rightIterator(rightMPT); 102 fMatConstPropNames[kWLSTIMECONSTANT] = << 82 103 fMatConstPropNames[kWLSMEANNUMBERPHOTONS2] = << 83 rightIterator.reset(); 104 fMatConstPropNames[kWLSTIMECONSTANT2] = << 84 105 fMatConstPropNames[kMIEHG_FORWARD] = << 85 while (++rightIterator) { 106 fMatConstPropNames[kMIEHG_BACKWARD] = << 86 G4MaterialPropertyVector *newProp = 107 fMatConstPropNames[kMIEHG_FORWARD_RATIO] = << 87 new G4MaterialPropertyVector(*(rightIterator.value())); 108 fMatConstPropNames[kSCINTILLATIONYIELD] = << 88 G4String *newKey = 109 fMatConstPropNames[kRESOLUTIONSCALE] = << 89 new G4String(*(rightIterator.key())); 110 fMatConstPropNames[kFERMIPOT] = << 90 MPT.insertKeyAndValue(newKey, newProp); 111 fMatConstPropNames[kDIFFUSION] = << 91 } 112 fMatConstPropNames[kSPINFLIP] = << 92 } 113 fMatConstPropNames[kLOSS] = << 93 *******/ 114 fMatConstPropNames[kLOSSCS] = << 94 115 fMatConstPropNames[kABSCS] = << 95 //////////////// 116 fMatConstPropNames[kSCATCS] = << 96 // Destructors 117 fMatConstPropNames[kMR_NBTHETA] = << 97 //////////////// 118 fMatConstPropNames[kMR_NBE] = << 119 fMatConstPropNames[kMR_RRMS] = << 120 fMatConstPropNames[kMR_CORRLEN] = << 121 fMatConstPropNames[kMR_THETAMIN] = << 122 fMatConstPropNames[kMR_THETAMAX] = << 123 fMatConstPropNames[kMR_EMIN] = << 124 fMatConstPropNames[kMR_EMAX] = << 125 fMatConstPropNames[kMR_ANGNOTHETA] = << 126 fMatConstPropNames[kMR_ANGNOPHI] = << 127 fMatConstPropNames[kMR_ANGCUT] = << 128 fMatConstPropNames[kSCINTILLATIONTIMECONSTAN << 129 fMatConstPropNames[kSCINTILLATIONTIMECONSTAN << 130 fMatConstPropNames[kSCINTILLATIONTIMECONSTAN << 131 fMatConstPropNames[kSCINTILLATIONRISETIME1] << 132 fMatConstPropNames[kSCINTILLATIONRISETIME2] << 133 fMatConstPropNames[kSCINTILLATIONRISETIME3] << 134 fMatConstPropNames[kSCINTILLATIONYIELD1] = << 135 fMatConstPropNames[kSCINTILLATIONYIELD2] = << 136 fMatConstPropNames[kSCINTILLATIONYIELD3] = << 137 fMatConstPropNames[kPROTONSCINTILLATIONYIELD << 138 fMatConstPropNames[kPROTONSCINTILLATIONYIELD << 139 fMatConstPropNames[kPROTONSCINTILLATIONYIELD << 140 fMatConstPropNames[kDEUTERONSCINTILLATIONYIE << 141 fMatConstPropNames[kDEUTERONSCINTILLATIONYIE << 142 fMatConstPropNames[kDEUTERONSCINTILLATIONYIE << 143 fMatConstPropNames[kTRITONSCINTILLATIONYIELD << 144 fMatConstPropNames[kTRITONSCINTILLATIONYIELD << 145 fMatConstPropNames[kTRITONSCINTILLATIONYIELD << 146 fMatConstPropNames[kALPHASCINTILLATIONYIELD1 << 147 fMatConstPropNames[kALPHASCINTILLATIONYIELD2 << 148 fMatConstPropNames[kALPHASCINTILLATIONYIELD3 << 149 fMatConstPropNames[kIONSCINTILLATIONYIELD1] << 150 fMatConstPropNames[kIONSCINTILLATIONYIELD2] << 151 fMatConstPropNames[kIONSCINTILLATIONYIELD3] << 152 fMatConstPropNames[kELECTRONSCINTILLATIONYIE << 153 fMatConstPropNames[kELECTRONSCINTILLATIONYIE << 154 fMatConstPropNames[kELECTRONSCINTILLATIONYIE << 155 fMatConstPropNames[kCOATEDTHICKNESS] = << 156 fMatConstPropNames[kCOATEDFRUSTRATEDTRANSMIS << 157 fMatConstPropNames[kPROTONSCINTILLATIONTIMEC << 158 fMatConstPropNames[kPROTONSCINTILLATIONTIMEC << 159 fMatConstPropNames[kPROTONSCINTILLATIONTIMEC << 160 fMatConstPropNames[kDEUTERONSCINTILLATIONTIM << 161 fMatConstPropNames[kDEUTERONSCINTILLATIONTIM << 162 fMatConstPropNames[kDEUTERONSCINTILLATIONTIM << 163 fMatConstPropNames[kTRITONSCINTILLATIONTIMEC << 164 fMatConstPropNames[kTRITONSCINTILLATIONTIMEC << 165 fMatConstPropNames[kTRITONSCINTILLATIONTIMEC << 166 fMatConstPropNames[kALPHASCINTILLATIONTIMECO << 167 fMatConstPropNames[kALPHASCINTILLATIONTIMECO << 168 fMatConstPropNames[kALPHASCINTILLATIONTIMECO << 169 fMatConstPropNames[kIONSCINTILLATIONTIMECONS << 170 fMatConstPropNames[kIONSCINTILLATIONTIMECONS << 171 fMatConstPropNames[kIONSCINTILLATIONTIMECONS << 172 fMatConstPropNames[kELECTRONSCINTILLATIONTIM << 173 fMatConstPropNames[kELECTRONSCINTILLATIONTIM << 174 fMatConstPropNames[kELECTRONSCINTILLATIONTIM << 175 fMCP.assign(kNumberOfConstPropertyIndex, {0. << 176 } << 177 98 178 G4MaterialPropertiesTable::~G4MaterialProperti 99 G4MaterialPropertiesTable::~G4MaterialPropertiesTable() 179 { 100 { 180 for (auto prop : fMP) { << 101 // MPT.clearAndDestroy(); 181 delete (prop); << 102 MPTiterator i; 182 } << 103 for (i = MPT.begin(); i != MPT.end(); ++i) { 183 } << 104 delete (*i).second; 184 << 185 G4int G4MaterialPropertiesTable::GetConstPrope << 186 { << 187 // Returns the constant material property in << 188 << 189 std::size_t index = std::distance(fMatConstP << 190 std::find(fMatConstPropNames.cbegin(), fMa << 191 if (index < fMatConstPropNames.size()) { << 192 return (G4int)index; << 193 } << 194 << 195 G4ExceptionDescription ed; << 196 ed << "Constant Material Property Index for << 197 G4Exception("G4MaterialPropertiesTable::GetC << 198 return 0; << 199 } << 200 << 201 G4int G4MaterialPropertiesTable::GetPropertyIn << 202 { << 203 // Returns the material property index corre << 204 std::size_t index = std::distance( << 205 fMatPropNames.cbegin(), std::find(fMatProp << 206 if (index < fMatPropNames.size()) { << 207 return (G4int)index; << 208 } << 209 G4ExceptionDescription ed; << 210 ed << "Material Property Index for key " << << 211 G4Exception("G4MaterialPropertiesTable::GetP << 212 return 0; << 213 } << 214 << 215 G4double G4MaterialPropertiesTable::GetConstPr << 216 { << 217 // Returns the constant material property co << 218 // fatal exception if property not found << 219 << 220 if (index < (G4int)fMCP.size() && fMCP[index << 221 return fMCP[index].first; << 222 } << 223 G4ExceptionDescription ed; << 224 ed << "Constant Material Property " << fMatC << 225 G4Exception("G4MaterialPropertiesTable::GetC << 226 return 0.; << 227 } << 228 << 229 G4double G4MaterialPropertiesTable::GetConstPr << 230 { << 231 // Returns the constant material property co << 232 // fatal exception if property not found << 233 << 234 return GetConstProperty(GetConstPropertyInde << 235 } << 236 << 237 G4double G4MaterialPropertiesTable::GetConstPr << 238 { << 239 return GetConstProperty(GetConstPropertyInde << 240 } << 241 << 242 G4bool G4MaterialPropertiesTable::ConstPropert << 243 { << 244 // Returns true if a const property correspo << 245 << 246 return index >= 0 && index < (G4int)fMCP.siz << 247 } << 248 << 249 G4bool G4MaterialPropertiesTable::ConstPropert << 250 { << 251 // Returns true if a const property 'key' ex << 252 std::size_t index = std::distance(fMatConstP << 253 std::find(fMatConstPropNames.cbegin(), fMa << 254 if (index < fMatConstPropNames.size()) { // << 255 return ConstPropertyExists((G4int)index); << 256 } << 257 return false; << 258 } << 259 << 260 G4bool G4MaterialPropertiesTable::ConstPropert << 261 { << 262 std::size_t index = std::distance(fMatConstP << 263 std::find(fMatConstPropNames.cbegin(), fMa << 264 if (index < fMatConstPropNames.size()) { // << 265 return ConstPropertyExists((G4int)index); << 266 } << 267 return false; << 268 } << 269 << 270 G4MaterialPropertyVector* G4MaterialProperties << 271 { << 272 // Returns a Material Property Vector corres << 273 if (std::find(fMatPropNames.cbegin(), fMatPr << 274 const G4int index = GetPropertyIndex(G4Str << 275 return GetProperty(index); << 276 } << 277 return nullptr; << 278 } << 279 << 280 G4MaterialPropertyVector* G4MaterialProperties << 281 { << 282 if (std::find(fMatPropNames.cbegin(), fMatPr << 283 const G4int index = GetPropertyIndex(G4Str << 284 return GetProperty(index); << 285 } << 286 return nullptr; << 287 } << 288 << 289 G4MaterialPropertyVector* G4MaterialProperties << 290 { << 291 // Returns a Material Property Vector corres << 292 // returns nullptr if the property has not b << 293 if (index >= 0 && index < (G4int)fMP.size()) << 294 return fMP[index]; << 295 } << 296 return nullptr; << 297 } << 298 << 299 G4MaterialPropertyVector* G4MaterialProperties << 300 const std::vector<G4double>& photonEnergies, << 301 G4bool createNewKey, G4bool spline) << 302 { << 303 if (photonEnergies.size() != propertyValues. << 304 G4ExceptionDescription ed; << 305 ed << "AddProperty error. Number of proper << 306 << "energy values. Property name: " << << 307 G4Exception("G4MaterialPropertiesTable::Ad << 308 } << 309 << 310 if (photonEnergies.size() == 1) { << 311 G4ExceptionDescription ed; << 312 ed << "AddProperty warning. A material pro << 313 << "Unless you will later add an entry, << 314 << "Property name: " << key; << 315 G4Exception("G4MaterialPropertiesTable::Ad << 316 } << 317 << 318 // G4PhysicsVector assumes energies are in i << 319 for (std::size_t i = 0; i < photonEnergies.s << 320 if (photonEnergies.at(i + 1) < photonEnerg << 321 G4ExceptionDescription ed; << 322 ed << "Energies in material property vec << 323 << "order. Key: " << key << " Energy: << 324 G4Exception("G4MaterialPropertiesTable:: << 325 } << 326 } << 327 << 328 // if the key doesn't exist, add it if reque << 329 if (std::find(fMatPropNames.cbegin(), fMatPr << 330 if (createNewKey) { << 331 fMatPropNames.push_back(key); << 332 fMP.push_back(nullptr); << 333 } << 334 else { << 335 G4ExceptionDescription ed; << 336 ed << "Attempting to create a new materi << 337 << "createNewKey parameter of AddProp << 338 G4Exception("G4MaterialPropertiesTable:: << 339 } << 340 } << 341 << 342 auto* mpv = new G4MaterialPropertyVector(pho << 343 mpv->SetVerboseLevel(1); << 344 if (spline) { << 345 mpv->FillSecondDerivatives(); << 346 } << 347 G4int index = GetPropertyIndex(key); << 348 fMP[index] = mpv; << 349 << 350 // if key is RINDEX, we calculate GROUPVEL - << 351 // contribution from Tao Lin (IHEP, the JUNO << 352 if (key == "RINDEX") { << 353 CalculateGROUPVEL(); << 354 } 105 } 355 << 106 MPT.clear(); 356 return mpv; << 357 } 107 } 358 108 359 G4MaterialPropertyVector* G4MaterialProperties << 109 //////////// 360 G4double* photonEnergies, G4double* property << 110 // Methods 361 G4bool spline) << 111 //////////// 362 { << 363 // Provides a way of adding a property to th << 364 // Table given a pair of arrays and a key << 365 G4String k(key); << 366 << 367 std::vector<G4double> energies(photonEnergie << 368 std::vector<G4double> values(propertyValues, << 369 return AddProperty(k, energies, values, crea << 370 } << 371 112 372 void G4MaterialPropertiesTable::AddProperty( << 113 void G4MaterialPropertiesTable::AddProperty(char *key, 373 const G4String& key, G4MaterialPropertyVecto << 114 G4double *PhotonMomenta, >> 115 G4double *PropertyValues, >> 116 G4int NumEntries) 374 { 117 { 375 // Provides a way of adding a property to t << 118 G4MaterialPropertyVector *mpv = 376 // Table given an G4MaterialPropertyVector << 119 new G4MaterialPropertyVector(PhotonMomenta, 377 << 120 PropertyValues, 378 // G4PhysicsVector assumes energies are in i << 121 NumEntries); 379 if (mpv->GetVectorLength() > 1) { << 122 MPT [G4String(key)] = mpv; 380 for (std::size_t i = 0; i < mpv->GetVector << 381 if (mpv->Energy(i + 1) < mpv->Energy(i)) << 382 G4ExceptionDescription ed; << 383 ed << "Energies in material property v << 384 << "order. Key: " << key << " Energ << 385 G4Exception("G4MaterialPropertiesTable << 386 } << 387 } << 388 } << 389 << 390 if (mpv->GetVectorLength() <= 1) { << 391 G4ExceptionDescription ed; << 392 ed << "AddProperty warning. A material pro << 393 << "Unless you will later add an entry, << 394 << "Property name: " << key; << 395 G4Exception("G4MaterialPropertiesTable::Ad << 396 } << 397 << 398 // if the key doesn't exist, add it << 399 if (std::find(fMatPropNames.cbegin(), fMatPr << 400 if (createNewKey) { << 401 fMatPropNames.push_back(key); << 402 fMP.push_back(nullptr); << 403 } << 404 else { << 405 G4ExceptionDescription ed; << 406 ed << "Attempting to create a new materi << 407 << "createNewKey parameter of AddProp << 408 G4Exception("G4MaterialPropertiesTable:: << 409 } << 410 } << 411 G4int index = GetPropertyIndex(key); << 412 fMP[index] = mpv; << 413 << 414 // if key is RINDEX, we calculate GROUPVEL - << 415 // contribution from Tao Lin (IHEP, the JUNO << 416 if (key == "RINDEX") { << 417 CalculateGROUPVEL(); << 418 } << 419 } 123 } 420 124 421 void G4MaterialPropertiesTable::AddProperty( << 125 void G4MaterialPropertiesTable::AddProperty(char *key, 422 const char* key, G4MaterialPropertyVector* m << 126 G4MaterialPropertyVector *mpv) 423 { 127 { 424 AddProperty(G4String(key), mpv, createNewKey << 128 // Provides a way of adding a property to the Material Properties 425 } << 129 // Table given an G4MaterialPropertyVector Reference and a key 426 130 427 void G4MaterialPropertiesTable::AddProperty(co << 131 MPT [G4String(key)] = mpv; 428 { << 132 } 429 // load a material property vector defined i << 430 G4MaterialPropertyVector* v = G4OpticalMater << 431 AddProperty(key, v); << 432 } << 433 133 434 void G4MaterialPropertiesTable::AddConstProper << 134 void G4MaterialPropertiesTable::RemoveProperty(char *key) 435 const G4String& key, G4double propertyValue, << 436 { 135 { 437 // Provides a way of adding a constant prope << 136 MPT.erase(G4String(key)); 438 // Table given a key << 439 if (std::find(fMatConstPropNames.cbegin(), f << 440 fMatConstPropNames.cend()) << 441 { << 442 if (createNewKey) { << 443 fMatConstPropNames.push_back(key); << 444 fMCP.emplace_back(0., true); << 445 } << 446 else { << 447 G4ExceptionDescription ed; << 448 ed << "Attempting to create a new materi << 449 << " without setting\n" << 450 << "createNewKey parameter of AddProp << 451 G4Exception("G4MaterialPropertiesTable:: << 452 } << 453 } << 454 G4int index = GetConstPropertyIndex(key); << 455 << 456 fMCP[index] = std::pair<G4double, G4bool>{pr << 457 } 137 } 458 138 459 void G4MaterialPropertiesTable::AddConstProper << 139 G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty(char *key) 460 const char* key, G4double propertyValue, G4b << 461 { 140 { 462 // Provides a way of adding a constant prope << 141 return MPT [G4String(key)]; 463 // Table given a key << 464 AddConstProperty(G4String(key), propertyValu << 465 } 142 } 466 143 467 void G4MaterialPropertiesTable::RemoveConstPro << 144 void G4MaterialPropertiesTable::AddEntry(char *key, >> 145 G4double aPhotonMomentum, >> 146 G4double aPropertyValue) 468 { 147 { 469 G4int index = GetConstPropertyIndex(key); << 148 G4MaterialPropertyVector *targetVector=MPT [G4String(key)]; 470 if (index < (G4int)fMCP.size()) { << 149 if (targetVector != NULL) { 471 fMCP[index] = std::pair<G4double, G4bool>{ << 150 targetVector->AddElement(aPhotonMomentum, aPropertyValue); 472 } << 151 } >> 152 else { >> 153 G4Exception("G4MaterialPropertiesTable::AddEntry ==> " >> 154 "Material Property Vector not found."); >> 155 } 473 } 156 } 474 157 475 void G4MaterialPropertiesTable::RemoveConstPro << 158 void G4MaterialPropertiesTable::RemoveEntry(char *key, >> 159 G4double aPhotonMomentum) 476 { 160 { 477 RemoveConstProperty(G4String(key)); << 161 G4MaterialPropertyVector *targetVector=MPT [G4String(key)]; >> 162 if (targetVector) { >> 163 targetVector->RemoveElement(aPhotonMomentum); >> 164 } >> 165 else { >> 166 G4Exception("G4MaterialPropertiesTable::AddEntry ==> " >> 167 "Material Property Vector not found."); >> 168 } 478 } 169 } 479 << 170 void G4MaterialPropertiesTable::DumpTable() 480 void G4MaterialPropertiesTable::RemoveProperty << 481 { 171 { 482 G4int index = GetPropertyIndex(key); << 172 MPTiterator i; 483 delete fMP[index]; << 173 for (i = MPT.begin(); i != MPT.end(); ++i) { 484 fMP[index] = nullptr; << 174 G4cout << *(*i).first << G4endl; 485 } << 175 (*i).second->DumpVector(); 486 << 487 void G4MaterialPropertiesTable::RemoveProperty << 488 << 489 void G4MaterialPropertiesTable::AddEntry( << 490 const G4String& key, G4double aPhotonEnergy, << 491 { << 492 // Allows to add an entry pair directly to t << 493 // given a key. << 494 if (std::find(fMatPropNames.cbegin(), fMatPr << 495 G4ExceptionDescription ed; << 496 ed << "Material Property Vector " << key < << 497 G4Exception("G4MaterialPropertiesTable::Ad << 498 } << 499 G4int index = GetPropertyIndex(key); << 500 << 501 G4MaterialPropertyVector* targetVector = fMP << 502 if (targetVector != nullptr) { << 503 // do not allow duplicate energies << 504 for (std::size_t i = 0; i < targetVector-> << 505 if (aPhotonEnergy == targetVector->Energ << 506 G4ExceptionDescription ed; << 507 ed << "Energy values in material prope << 508 << "Key: " << key; << 509 G4Exception("G4MaterialPropertiesTable << 510 } << 511 } << 512 << 513 targetVector->InsertValues(aPhotonEnergy, << 514 } << 515 else { << 516 G4ExceptionDescription ed; << 517 ed << "Material Property Vector " << key < << 518 G4Exception("G4MaterialPropertiesTable::Ad << 519 } << 520 if (key == "RINDEX") { << 521 CalculateGROUPVEL(); << 522 } << 523 } << 524 << 525 void G4MaterialPropertiesTable::AddEntry( << 526 const char* key, G4double aPhotonEnergy, G4d << 527 { << 528 AddEntry(G4String(key), aPhotonEnergy, aProp << 529 } << 530 << 531 void G4MaterialPropertiesTable::DumpTable() co << 532 { << 533 // material properties << 534 G4int j = 0; << 535 for (const auto& prop : fMP) { << 536 if (prop != nullptr) { << 537 G4cout << j << ": " << fMatPropNames[j] << 538 prop->DumpValues(); << 539 } << 540 ++j; << 541 } << 542 // material constant properties << 543 j = 0; << 544 for (const auto& cprop : fMCP) { << 545 if (cprop.second) { << 546 G4cout << j << ": " << fMatConstPropName << 547 } << 548 ++j; << 549 } 176 } 550 } << 551 << 552 G4MaterialPropertyVector* G4MaterialProperties << 553 { << 554 #ifdef G4MULTITHREADED << 555 G4AutoLock mptm(&materialPropertyTableMutex) << 556 #endif << 557 << 558 // check if "GROUPVEL" already exists. If so << 559 if (fMP[kGROUPVEL] != nullptr) { << 560 this->RemoveProperty("GROUPVEL"); << 561 } << 562 << 563 // fetch RINDEX data, give up if unavailable << 564 G4MaterialPropertyVector* rindex = this->Get << 565 if (rindex == nullptr) { << 566 return nullptr; << 567 } << 568 << 569 // RINDEX exists but has no entries, give up << 570 if (rindex->GetVectorLength() == 0) { << 571 return nullptr; << 572 } << 573 << 574 // add GROUPVEL vector << 575 auto* groupvel = new G4MaterialPropertyVecto << 576 groupvel->SetVerboseLevel(1); << 577 << 578 // fill GROUPVEL vector using RINDEX values << 579 // rindex built-in "iterator" was advanced t << 580 G4double E0 = rindex->Energy(0); << 581 G4double n0 = (*rindex)[0]; << 582 << 583 if (E0 <= 0.) { << 584 G4Exception("G4MaterialPropertiesTable::Ca << 585 "Optical Photon Energy <= 0"); << 586 } << 587 << 588 if (rindex->GetVectorLength() >= 2) { << 589 // good, we have at least two entries in R << 590 // get next energy/value pair << 591 << 592 G4double E1 = rindex->Energy(1); << 593 G4double n1 = (*rindex)[1]; << 594 << 595 if (E1 <= 0.) { << 596 G4Exception("G4MaterialPropertiesTable:: << 597 "Optical Photon Energy <= 0"); << 598 } << 599 << 600 G4double vg; << 601 << 602 // add entry at first photon energy << 603 vg = c_light / (n0 + (n1 - n0) / G4Log(E1 << 604 << 605 // allow only for 'normal dispersion' -> d << 606 if ((vg < 0) || (vg > c_light / n0)) { << 607 vg = c_light / n0; << 608 } << 609 << 610 groupvel->InsertValues(E0, vg); << 611 << 612 // add entries at midpoints between remain << 613 for (std::size_t i = 2; i < rindex->GetVec << 614 vg = c_light / (0.5 * (n0 + n1) + (n1 - << 615 << 616 // allow only for 'normal dispersion' -> << 617 if ((vg < 0) || (vg > c_light / (0.5 * ( << 618 vg = c_light / (0.5 * (n0 + n1)); << 619 } << 620 groupvel->InsertValues(0.5 * (E0 + E1), << 621 << 622 // get next energy/value pair, or exit l << 623 E0 = E1; << 624 n0 = n1; << 625 E1 = rindex->Energy(i); << 626 n1 = (*rindex)[i]; << 627 << 628 if (E1 <= 0.) { << 629 G4Exception("G4MaterialPropertiesTable << 630 "Optical Photon Energy <= 0"); << 631 } << 632 } << 633 << 634 // add entry at last photon energy << 635 vg = c_light / (n1 + (n1 - n0) / G4Log(E1 << 636 << 637 // allow only for 'normal dispersion' -> d << 638 if ((vg < 0) || (vg > c_light / n1)) { << 639 vg = c_light / n1; << 640 } << 641 groupvel->InsertValues(E1, vg); << 642 } << 643 else // only one entry in RINDEX -- weird! << 644 { << 645 groupvel->InsertValues(E0, c_light / n0); << 646 } << 647 << 648 this->AddProperty("GROUPVEL", groupvel); << 649 << 650 return groupvel; << 651 } 177 } 652 178