00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 const int DEBUG = 0;
00018
00019 #include "BDSGlobalConstants.hh"
00020
00021 #include "BDSMaterials.hh"
00022
00023 using namespace std;
00024
00025 BDSMaterials::BDSMaterials()
00026 {
00027 Initialise();
00028 }
00029
00030 void BDSMaterials::Initialise()
00031 {
00032 G4String name, symbol;
00033 G4double a, z, density;
00034
00035
00036
00037
00038 G4double fractionmass;
00039
00040 G4double temperature, pressure;
00041
00042 G4Material* tmpMaterial;
00043 G4Element* tmpElement;
00044
00045
00046
00047
00048
00049 tmpElement = new G4Element
00050 (name="Hydrogen" , symbol="H" , z= 1., a= 1.00*g/mole);
00051 elements[symbol] = tmpElement;
00052
00053 tmpElement = new G4Element
00054 (name="Helium" , symbol="He", z= 2., a= 4.0026*g/mole);
00055 elements[symbol] = tmpElement;
00056
00057 tmpElement = new G4Element
00058 (name="Beryllium" , symbol="Be", z= 4., a= 9.0122*g/mole);
00059 elements[symbol] = tmpElement;
00060
00061 tmpElement = new G4Element
00062 (name="Carbon" , symbol="C" , z= 6., a= 12.00*g/mole);
00063 elements[symbol] = tmpElement;
00064
00065 tmpElement = new G4Element
00066 (name="Nitrogen" , symbol="N" , z= 7., a= 14.01*g/mole);
00067 elements[symbol] = tmpElement;
00068
00069 tmpElement = new G4Element
00070 (name="Oxygen" , symbol="O" , z= 8., a= 16.00*g/mole);
00071 elements[symbol] = tmpElement;
00072
00073 tmpElement = new G4Element
00074 (name="Aluminium" , symbol="Al", z= 13., a= 26.98*g/mole);
00075 elements[symbol] = tmpElement;
00076
00077 tmpElement = new G4Element
00078 (name="Silicon" , symbol="Si", z= 14., a= 28.09*g/mole);
00079 elements[symbol] = tmpElement;
00080
00081 tmpElement = new G4Element
00082 (name="Phosphorous", symbol="P" , z= 15., a= 30.973762*g/mole);
00083 elements[symbol] = tmpElement;
00084
00085 tmpElement = new G4Element
00086 (name="Sulphur" , symbol="S" , z= 16., a= 32.066*g/mole);
00087 elements[symbol] = tmpElement;
00088
00089 tmpElement = new G4Element
00090 (name="Calcium" , symbol="Ca", z= 20., a= 40.078*g/mole);
00091 elements[symbol] = tmpElement;
00092
00093 tmpElement = new G4Element
00094 (name="Titanium" , symbol="Ti", z= 22., a= 47.867*g/mole);
00095 elements[symbol] = tmpElement;
00096
00097 tmpElement = new G4Element
00098 (name="Vanadium" , symbol="V" , z= 23., a= 50.9415*g/mole);
00099 elements[symbol] = tmpElement;
00100
00101 tmpElement = new G4Element
00102 (name="Manganese" , symbol="Mn", z= 25., a= 54.93805*g/mole);
00103 elements[symbol] = tmpElement;
00104
00105 tmpElement = new G4Element
00106 (name="Iron" , symbol="Fe", z= 26., a= 55.847*g/mole);
00107 elements[symbol] = tmpElement;
00108
00109 tmpElement = new G4Element
00110 (name="Cobalt" , symbol="Co", z= 27., a= 58.93*g/mole);
00111 elements[symbol] = tmpElement;
00112
00113 tmpElement = new G4Element
00114 (name="Nickel" , symbol="Ni", z= 28., a= 58.693*g/mole);
00115 elements[symbol] = tmpElement;
00116
00117 tmpElement = new G4Element
00118 (name="Copper" , symbol="Cu", z= 29., a= 63.546*g/mole);
00119 elements[symbol] = tmpElement;
00120
00121 tmpElement = new G4Element
00122 (name="Niobium" , symbol="Nb", z= 41., a= 92.906*g/mole);
00123 elements[symbol] = tmpElement;
00124
00125 tmpElement = new G4Element
00126 (name="Samarium" , symbol="Sm", z= 62., a= 150.4*g/mole);
00127 elements[symbol] = tmpElement;
00128
00129 tmpElement = new G4Element
00130 (name="Tungsten" , symbol="W" , z= 74., a= 183.84*g/mole);
00131 elements[symbol] = tmpElement;
00132
00133 tmpElement = new G4Element
00134 (name="Lead" , symbol="Pb", z= 82., a= 207.2*g/mole);
00135 elements[symbol] = tmpElement;
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 tmpMaterial = new G4Material
00148 (name="Aluminium" , density= 2.700*g/cm3, 1, kStateSolid);
00149 tmpMaterial->AddElement(elements["Al"],1);
00150 materials[name] = tmpMaterial;
00151
00152 tmpMaterial = new G4Material
00153 (name="Vanadium" , density= 5.800*g/cm3, 1, kStateSolid);
00154 tmpMaterial->AddElement(elements["V"],1);
00155 materials[name] = tmpMaterial;
00156
00157 tmpMaterial = new G4Material
00158 (name="Tungsten" , density= 19.3 *g/cm3, 1, kStateSolid);
00159 tmpMaterial->AddElement(elements["W"],1);
00160 materials[name] = tmpMaterial;
00161
00162 tmpMaterial = new G4Material
00163 (name="Iron" , density= 7.87 *g/cm3, 1, kStateSolid);
00164 tmpMaterial->AddElement(elements["Fe"],1);
00165 materials[name] = tmpMaterial;
00166
00167 tmpMaterial = new G4Material
00168 (name="Copper" , density= 8.96 *g/cm3, 1, kStateSolid);
00169 tmpMaterial->AddElement(elements["Cu"],1);
00170 materials[name] = tmpMaterial;
00171
00172 tmpMaterial = new G4Material
00173 (name="WeightIron" , density= 7.87 *g/cm3, 1, kStateSolid);
00174 tmpMaterial->AddElement(elements["Fe"],1);
00175 materials[name] = tmpMaterial;
00176
00177 tmpMaterial = new G4Material
00178 (name="Titanium" , density= 4.54 *g/cm3, 1, kStateSolid);
00179 tmpMaterial->AddElement(elements["Ti"],1);
00180 materials[name] = tmpMaterial;
00181
00182 tmpMaterial = new G4Material
00183 (name="Graphite" , density= 2.265*g/cm3, 1, kStateSolid);
00184 tmpMaterial->AddElement(elements["C"],1);
00185 materials[name] = tmpMaterial;
00186
00187 tmpMaterial = new G4Material
00188 (name="Lead" , density= 11.35 *g/cm3, 1, kStateSolid);
00189 tmpMaterial->AddElement(elements["Pb"],1);
00190 materials[name] = tmpMaterial;
00191
00192 tmpMaterial = new G4Material
00193 (name="Silicon" , density= 2.33 *g/cm3, 1, kStateSolid);
00194 tmpMaterial->AddElement(elements["Si"],1);
00195 materials[name] = tmpMaterial;
00196
00197 tmpMaterial = new G4Material
00198 (name="Beryllium" , density= 1.848*g/cm3, 1, kStateSolid);
00199 tmpMaterial->AddElement(elements["Be"],1);
00200 materials[name] = tmpMaterial;
00201
00202 tmpMaterial = new G4Material
00203 (name="SmCo" , density= 8.4 *g/cm3, 2, kStateSolid, 300*kelvin);
00204 tmpMaterial->AddElement(elements["Sm"],fractionmass=0.338);
00205 tmpMaterial->AddElement(elements["Co"],fractionmass=0.662);
00206 materials[name] = tmpMaterial;
00207
00208 tmpMaterial = new G4Material
00209 (name="Niobium" , density= 8.57 *g/cm3, 1, kStateSolid, 2*kelvin);
00210 tmpMaterial->AddElement(elements["Nb"],1);
00211 materials[name] = tmpMaterial;
00212
00213
00214 tmpMaterial = new G4Material
00215 (name="TitaniumAlloy" , density= 4.48 *g/cm3, 3, kStateSolid, 300*kelvin);
00216 tmpMaterial->AddElement(elements["V"], fractionmass=0.025);
00217 tmpMaterial->AddElement(elements["Al"], fractionmass=0.03 );
00218 tmpMaterial->AddElement(elements["Ti"], fractionmass=0.945);
00219 materials[name] = tmpMaterial;
00220
00221
00222 tmpMaterial = new G4Material
00223 (name="CarbonSteel" , density= 7.87 *g/cm3, 5, kStateSolid, 100*kelvin);
00224 tmpMaterial->AddElement(elements["C"], fractionmass=0.0017);
00225 tmpMaterial->AddElement(elements["Mn"], fractionmass=0.0045);
00226 tmpMaterial->AddElement(elements["P"], fractionmass=0.0004);
00227 tmpMaterial->AddElement(elements["S"], fractionmass=0.0005);
00228 tmpMaterial->AddElement(elements["Fe"], fractionmass=0.9929);
00229 materials[name] = tmpMaterial;
00230
00231 tmpMaterial = new G4Material
00232 (name="NbTi" , density= 5.6 *g/cm3, 2, kStateSolid, 4*kelvin);
00233 tmpMaterial->AddElement(elements["Nb"], 1);
00234 tmpMaterial->AddElement(elements["Ti"], 1);
00235 materials[name] = tmpMaterial;
00236
00237 tmpMaterial = new G4Material
00238 (name="Concrete" , density= 2.3 *g/cm3, 6, kStateSolid, 300*kelvin);
00239 tmpMaterial->AddElement(elements["Si"], 0.227915);
00240 tmpMaterial->AddElement(elements["O"], 0.60541);
00241 tmpMaterial->AddElement(elements["H"], 0.09972);
00242 tmpMaterial->AddElement(elements["Ca"], 0.04986);
00243 tmpMaterial->AddElement(elements["Al"], 0.014245);
00244 tmpMaterial->AddElement(elements["Fe"], 0.00285);
00245 materials[name] = tmpMaterial;
00246
00247
00248 tmpMaterial = new G4Material
00249 (name="Invar" , density= 8.1 *kg/m3, 2, kStateSolid, 2*kelvin);
00250 tmpMaterial->AddElement(elements["Ni"], fractionmass=0.35);
00251 tmpMaterial->AddElement(elements["Fe"], fractionmass=0.65);
00252 materials[name] = tmpMaterial;
00253
00254
00255 tmpMaterial = new G4Material
00256 (name="Soil" , density= 1.9 *g/cm3, 4, kStateSolid, 300*kelvin);
00257 tmpMaterial->AddElement(elements["Si"],0.33377483443708611 );
00258 tmpMaterial->AddElement(elements["O"], 0.57218543046357617);
00259 tmpMaterial->AddElement(elements["H"], 0.022516556291390728);
00260 tmpMaterial->AddElement(elements["Al"], 0.071523178807947022);
00261 materials[name] = tmpMaterial;
00262
00263 tmpMaterial = new G4Material
00264 (name="LeadTungstate" , density= 8.27 *g/cm3, 3, kStateSolid);
00265 tmpMaterial->AddElement(elements["Pb"], 1);
00266 tmpMaterial->AddElement(elements["W"], 1);
00267 tmpMaterial->AddElement(elements["O"], 4);
00268 materials[name] = tmpMaterial;
00269
00270
00271
00272
00273 tmpMaterial = new G4Material
00274 (name="LiquidHelium" , density= 0.12498*g/cm3, 1, kStateLiquid, 4.15*kelvin);
00275 tmpMaterial->AddElement(elements["He"],1);
00276 materials[name] = tmpMaterial;
00277
00278 tmpMaterial=new G4Material
00279 (name="Water" , density= 1.00 *g/cm3, 2, kStateLiquid, 300*kelvin);
00280 tmpMaterial->AddElement(elements["O"], 1);
00281 tmpMaterial->AddElement(elements["H"], 2);
00282 materials[name] = tmpMaterial;
00283
00284
00285
00286
00287 pressure = 1.e-9*(1.e-3*bar);
00288
00289
00290
00291 pressure*=BDSGlobals->GetBackgroundScaleFactor();
00292
00293
00294
00295 temperature = 300*kelvin;
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306 density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))
00307 * 30*g/(22.4*1.e-3*m3) ;
00308 tmpMaterial = new G4Material
00309 (name="Air" , density, 2, kStateGas, temperature, pressure);
00310 tmpMaterial->AddElement(elements["O"], fractionmass=0.2);
00311 tmpMaterial->AddElement(elements["N"], fractionmass=0.8);
00312 materials[name] = tmpMaterial;
00313
00314 density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))
00315 * (12.+16.)*g/(22.4*1.e-3*m3) ;
00316 tmpMaterial = new G4Material
00317 (name="CarbonMonoxide", density, 2, kStateGas, temperature, pressure);
00318 tmpMaterial->AddElement(elements["C"], 1);
00319 tmpMaterial->AddElement(elements["O"], 1);
00320 materials[name] = tmpMaterial;
00321
00322 density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))
00323
00324
00325
00326 * 30*g/(22.4*1.e-3*m3) ;
00327 G4cout<< " ***************** defining Vacuum"<<G4endl;
00328 G4cout<< "pressure="<<pressure/bar<<" bar"<<G4endl;
00329 G4cout<< "temp="<<temperature/kelvin<<" K"<<G4endl;
00330 G4cout<< "density="<<density/(g/m3)<<"g/m^3"<<G4endl;
00331 tmpMaterial = new G4Material
00332 (name="Vacuum" , density, 1, kStateGas, temperature, pressure);
00333 tmpMaterial->AddMaterial(materials["Air"], fractionmass=1.);
00334 materials[name] = tmpMaterial;
00335
00336 tmpMaterial = new G4Material
00337 (name="LaserVac" , density, 1, kStateGas, temperature, pressure);
00338 tmpMaterial->AddMaterial(materials["Air"], fractionmass=1.);
00339 materials[name] = tmpMaterial;
00340
00341 density=37.403/10.*g/cm3;
00342
00343 tmpMaterial = new G4Material
00344 (name="BeamGasPlugMat", density, 2);
00345
00346
00347 tmpMaterial->AddElement(elements["C"], 1);
00348 tmpMaterial->AddElement(elements["O"], 1);
00349 materials[name] = tmpMaterial;
00350
00351 }
00352
00353 void BDSMaterials::AddMaterial(G4Material* aMaterial, G4String aName)
00354 {
00355 if(materials.insert(make_pair(aName,aMaterial)).second)
00356 G4cout << "New material : " << aName << " added to material table" << G4endl;
00357 else G4Exception("Material "+aName+" already exists\n");
00358 }
00359
00360
00361
00362 void BDSMaterials::AddMaterial(G4String aName, G4double itsZ, G4double itsA, G4double itsDensity)
00363 {
00364 G4Material* tmpMaterial = new G4Material(aName, itsZ, itsA*g/mole, itsDensity*g/cm3);
00365 if(materials.insert(make_pair(aName,tmpMaterial)).second)
00366 G4cout << "New material : " << aName << " added to material table" << G4endl;
00367 else G4Exception("Material "+aName+" already exists\n");
00368 }
00369
00370 void BDSMaterials::AddMaterial(G4String aName, G4double itsDensity, G4State itsState,
00371 G4double itsTemp, G4double itsPressure,
00372 list<char*> itsComponents, list<G4double> itsComponentsFractions)
00373 {
00374 G4Material* tmpMaterial = new G4Material(aName, itsDensity*g/cm3,
00375 (G4int)itsComponents.size(),itsState, itsTemp*kelvin, itsPressure*atmosphere);
00376 list<char*>::iterator sIter;
00377 list<G4double>::iterator dIter;
00378 for(sIter = itsComponents.begin(), dIter = itsComponentsFractions.begin();
00379 sIter != itsComponents.end();
00380 sIter++, dIter++)
00381 {
00382 tmpMaterial->AddElement(GetElement(*sIter),(*dIter));
00383 }
00384 if(materials.insert(make_pair(aName,tmpMaterial)).second)
00385 G4cout << "New material : " << aName << " added to material table" << G4endl;
00386 else G4Exception("Material "+aName+" already exists\n");
00387 }
00388
00389 void BDSMaterials::AddMaterial(G4String aName, G4double itsDensity, G4State itsState,
00390 G4double itsTemp, G4double itsPressure,
00391 list<char*> itsComponents, list<G4int> itsComponentsWeights)
00392 {
00393 G4Material* tmpMaterial = new G4Material(aName, itsDensity*g/cm3,
00394 (G4int)itsComponents.size(),itsState, itsTemp*kelvin, itsPressure*atmosphere);
00395 list<char*>::iterator sIter;
00396 list<G4int>::iterator iIter;
00397 for(sIter = itsComponents.begin(), iIter = itsComponentsWeights.begin();
00398 sIter != itsComponents.end();
00399 sIter++, iIter++)
00400 {
00401 tmpMaterial->AddElement(GetElement(*sIter),(*iIter));
00402 }
00403 if(materials.insert(make_pair(aName,tmpMaterial)).second)
00404 G4cout << "New material : " << aName << " added to material table" << G4endl;
00405 else G4Exception("Material "+aName+" already exists\n");
00406 }
00407
00408 void BDSMaterials::AddElement(G4Element* aElement, G4String aSymbol)
00409 {
00410 if(elements.insert(make_pair(aSymbol,aElement)).second)
00411 G4cout << "New atom : " << aSymbol << G4endl;
00412 else G4Exception("Atom "+aSymbol+" already exists\n");
00413 }
00414
00415 void BDSMaterials::AddElement(G4String aName, G4String aSymbol, G4double itsZ, G4double itsA)
00416 {
00417 G4Element* tmpElement = new G4Element(aName, aSymbol, itsZ, itsA*g/mole);
00418 if(elements.insert(make_pair(aSymbol,tmpElement)).second)
00419 G4cout << "New atom : " << aSymbol << G4endl;
00420 else G4Exception("Atom "+aSymbol+" already exists\n");
00421 }
00422
00423 G4Material* BDSMaterials::GetMaterial(G4String aMaterial)
00424 {
00425 map<G4String,G4Material*>::iterator iter = materials.find(aMaterial);
00426 if(iter != materials.end()) return (*iter).second;
00427 else{
00428 G4Exception("Material "+aMaterial+" not known. Aborting.");
00429 exit(1);
00430 }
00431 }
00432
00433 G4Element* BDSMaterials::GetElement(G4String aSymbol)
00434 {
00435 map<G4String,G4Element*>::iterator iter = elements.find(aSymbol);
00436 if(iter != elements.end()) return (*iter).second;
00437 else{
00438 G4Exception("Element "+aSymbol+" not known. Aborting.");
00439 exit(1);
00440 }
00441 }
00442
00443 void BDSMaterials::ListMaterials(){
00444 G4cout << "Available elements are:" << G4endl;
00445 G4cout << "Aluminium - Al" << G4endl;
00446 G4cout << "Calcium - Ca" << G4endl;
00447 G4cout << "Carbon - C" << G4endl;
00448 G4cout << "Cobalt - Co" << G4endl;
00449 G4cout << "Helium - He" << G4endl;
00450 G4cout << "Hydrogen - H" << G4endl;
00451 G4cout << "Iron - Fe" << G4endl;
00452 G4cout << "Lead - Pb" << G4endl;
00453 G4cout << "Manganese - Mn" << G4endl;
00454 G4cout << "Niobium - Nb" << G4endl;
00455 G4cout << "Nitrogen - N" << G4endl;
00456 G4cout << "Oxygen - O" << G4endl;
00457 G4cout << "Phosphorus - P" << G4endl;
00458 G4cout << "Samarium - Sm" << G4endl;
00459 G4cout << "Silicon - Si" << G4endl;
00460 G4cout << "Sulphur - S" << G4endl;
00461 G4cout << "Titanium - Ti" << G4endl;
00462 G4cout << "Tungsten - W" << G4endl;
00463 G4cout << "Vanadium - V" << G4endl;
00464 G4cout << "***************" << G4endl;
00465 G4cout << "Available materials are:" << G4endl;
00466 G4cout << "Air" << G4endl;
00467 G4cout << "Aluminium" << G4endl;
00468 G4cout << "Beryllium" << G4endl;
00469 G4cout << "CarbonMonoxide" << G4endl;
00470 G4cout << "CarbonSteel" << G4endl;
00471 G4cout << "Concrete" << G4endl;
00472 G4cout << "Copper" << G4endl;
00473 G4cout << "Graphite" << G4endl;
00474 G4cout << "Invar" << G4endl;
00475 G4cout << "Iron" << G4endl;
00476 G4cout << "LaserVac" << G4endl;
00477 G4cout << "Lead" << G4endl;
00478 G4cout << "LeadTungstate" << G4endl;
00479 G4cout << "LiquidHelium" << G4endl;
00480 G4cout << "NbTi" << G4endl;
00481 G4cout << "Niobium" << G4endl;
00482 G4cout << "Silicon" << G4endl;
00483 G4cout << "SmCo" << G4endl;
00484 G4cout << "Soil" << G4endl;
00485 G4cout << "Titanium" << G4endl;
00486 G4cout << "TitaniumAlloy" << G4endl;
00487 G4cout << "Tungsten" << G4endl;
00488 G4cout << "Vacuum" << G4endl;
00489 G4cout << "Vanadium" << G4endl;
00490 G4cout << "Water" << G4endl;
00491 G4cout << "WeightIron" << G4endl;
00492 }
00493
00494 BDSMaterials::~BDSMaterials(){
00495 map<G4String,G4Material*>::iterator mIter;
00496 for(mIter = materials.begin(); mIter!=materials.end(); mIter++)
00497 delete (*mIter).second;
00498 materials.clear();
00499
00500 map<G4String,G4Element*>::iterator eIter;
00501 for(eIter = elements.begin(); eIter!=elements.end(); eIter++)
00502 delete (*eIter).second;
00503 elements.clear();
00504 }