Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4Material.cc
Go to the documentation of this file.
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// $Id$
27//
28//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
29//
30// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
31// 10-07-96, new data members added by L.Urban
32// 12-12-96, new data members added by L.Urban
33// 20-01-97, aesthetic rearrangement. RadLength calculation modified.
34// Data members Zeff and Aeff REMOVED (i.e. passed to the Elements).
35// (local definition of Zeff in DensityEffect and FluctModel...)
36// Vacuum defined as a G4State. Mixture flag removed, M.Maire.
37// 29-01-97, State=Vacuum automatically set density=0 in the contructors.
38// Subsequent protections have been put in the calculation of
39// MeanExcEnergy, ShellCorrectionVector, DensityEffect, M.Maire.
40// 11-02-97, ComputeDensityEffect() rearranged, M.Maire.
41// 20-03-97, corrected initialization of pointers, M.Maire.
42// 28-05-98, the kState=kVacuum has been removed.
43// automatic check for a minimal density, M.Maire
44// 12-06-98, new method AddMaterial() allowing mixture of materials, M.Maire
45// 09-07-98, ionisation parameters removed from the class, M.Maire
46// 05-10-98, change names: NumDensity -> NbOfAtomsPerVolume
47// 18-11-98, new interface to SandiaTable
48// 19-01-99 enlarge tolerance on test of coherence of gas conditions
49// 19-07-99, Constructors with chemicalFormula added by V.Ivanchenko
50// 16-01-01, Nuclear interaction length, M.Maire
51// 12-03-01, G4bool fImplicitElement;
52// copy constructor and assignement operator revised (mma)
53// 03-05-01, flux.precision(prec) at begin/end of operator<<
54// 17-07-01, migration to STL. M. Verderi.
55// 14-09-01, Suppression of the data member fIndexInTable
56// 26-02-02, fIndexInTable renewed
57// 16-04-02, G4Exception put in constructor with chemical formula
58// 06-05-02, remove the check of the ideal gas state equation
59// 06-08-02, remove constructors with chemical formula (mma)
60// 22-01-04, proper STL handling of theElementVector (Hisaya)
61// 30-03-05, warning in GetMaterial(materialName)
62// 09-03-06, minor change of printout (V.Ivanchenko)
63// 10-01-07, compute fAtomVector in the case of mass fraction (V.Ivanchenko)
64// 27-07-07, improve destructor (V.Ivanchenko)
65// 18-10-07, move definition of material index to InitialisePointers (V.Ivanchenko)
66// 13-08-08, do not use fixed size arrays (V.Ivanchenko)
67// 26-10-11, new scheme for G4Exception (mma)
68// 13-04-12, map<G4Material*,G4double> fMatComponents, filled in AddMaterial()
69// 21-04-12, fMassOfMolecule, computed for AtomsCount (mma)
70//
71//
72//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
73
74#include <iomanip>
75
76#include "G4Material.hh"
77#include "G4UnitsTable.hh"
78#include "G4Pow.hh"
80#include "G4SystemOfUnits.hh"
81
82G4MaterialTable G4Material::theMaterialTable;
83
84//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
85
86// Constructor to create a material from scratch
87
89 G4double a, G4double density,
90 G4State state, G4double temp, G4double pressure)
91 : fName(name)
92{
93 InitializePointers();
94
95 if (density < universe_mean_density)
96 {
97 G4cout << "--- Warning from G4Material::G4Material()"
98 << " define a material with density=0 is not allowed. \n"
99 << " The material " << name << " will be constructed with the"
100 << " default minimal density: " << universe_mean_density/(g/cm3)
101 << "g/cm3" << G4endl;
102 density = universe_mean_density;
103 }
104
105 fDensity = density;
106 fState = state;
107 fTemp = temp;
108 fPressure = pressure;
109
110 // Initialize theElementVector allocating one
111 // element corresponding to this material
112 maxNbComponents = fNumberOfComponents = fNumberOfElements = 1;
113 fArrayLength = maxNbComponents;
114 fImplicitElement = true;
115 theElementVector = new G4ElementVector();
116 theElementVector->push_back( new G4Element(name, " ", z, a));
117 fMassFractionVector = new G4double[1];
118 fMassFractionVector[0] = 1. ;
119 fMassOfMolecule = a/Avogadro;
120
121 (*theElementVector)[0] -> increaseCountUse();
122
123 if (fState == kStateUndefined)
124 {
125 if (fDensity > kGasThreshold) { fState = kStateSolid; }
126 else { fState = kStateGas; }
127 }
128
129 ComputeDerivedQuantities();
130}
131
132//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
133
134// Constructor to create a material from a List of constituents
135// (elements and/or materials) added with AddElement or AddMaterial
136
138 G4int nComponents,
139 G4State state, G4double temp, G4double pressure)
140 : fName(name)
141{
142 InitializePointers();
143
144 if (density < universe_mean_density)
145 {
146 G4cout << "--- Warning from G4Material::G4Material()"
147 << " define a material with density=0 is not allowed. \n"
148 << " The material " << name << " will be constructed with the"
149 << " default minimal density: " << universe_mean_density/(g/cm3)
150 << "g/cm3" << G4endl;
151 density = universe_mean_density;
152 }
153
154 fDensity = density;
155 fState = state;
156 fTemp = temp;
157 fPressure = pressure;
158
159 maxNbComponents = nComponents;
160 fArrayLength = maxNbComponents;
161 fNumberOfComponents = fNumberOfElements = 0;
162 theElementVector = new G4ElementVector();
163 theElementVector->reserve(maxNbComponents);
164
165 if (fState == kStateUndefined)
166 {
167 if (fDensity > kGasThreshold) { fState = kStateSolid; }
168 else { fState = kStateGas; }
169 }
170}
171
172//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
173
174// Constructor to create a material from base material
175
177 const G4Material* bmat,
178 G4State state, G4double temp, G4double pressure)
179 : fName(name)
180{
181 InitializePointers();
182
183 if (density < universe_mean_density)
184 {
185 G4cout << "--- Warning from G4Material::G4Material()"
186 << " define a material with density=0 is not allowed. \n"
187 << " The material " << name << " will be constructed with the"
188 << " default minimal density: " << universe_mean_density/(g/cm3)
189 << "g/cm3" << G4endl;
190 density = universe_mean_density;
191 }
192
193 fDensity = density;
194 fState = state;
195 fTemp = temp;
196 fPressure = pressure;
197
198 fBaseMaterial = bmat;
199 fChemicalFormula = fBaseMaterial->GetChemicalFormula();
200 fMassOfMolecule = fBaseMaterial->GetMassOfMolecule();
201
202 fNumberOfElements = fBaseMaterial->GetNumberOfElements();
203 maxNbComponents = fNumberOfElements;
204 fNumberOfComponents = fNumberOfElements;
205
206 fMaterialPropertiesTable = fBaseMaterial->GetMaterialPropertiesTable();
207
208 CopyPointersOfBaseMaterial();
209}
210
211//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
212
213// Fake default constructor - sets only member data and allocates memory
214// for usage restricted to object persistency
215
217 : fNumberOfComponents(0), fNumberOfElements(0), theElementVector(0),
218 fImplicitElement(false), fMassFractionVector(0), fAtomsVector(0),
219 fMaterialPropertiesTable(0), fIndexInTable(0),
220 VecNbOfAtomsPerVolume(0), fIonisation(0), fSandiaTable(0)
221{
222 InitializePointers();
223}
224
225//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
226
228{
229 // G4cout << "### Destruction of material " << fName << " started" <<G4endl;
230 if(!fBaseMaterial) {
231 if (theElementVector) { delete theElementVector; }
232 if (fMassFractionVector) { delete [] fMassFractionVector; }
233 if (fAtomsVector) { delete [] fAtomsVector; }
234 if (fSandiaTable) { delete fSandiaTable; }
235 }
236 if (fIonisation) { delete fIonisation; }
237 if (VecNbOfAtomsPerVolume) { delete [] VecNbOfAtomsPerVolume; }
238
239 // Remove this material from theMaterialTable.
240 //
241 theMaterialTable[fIndexInTable] = 0;
242}
243
244//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
245
246void G4Material::InitializePointers()
247{
248 theElementVector = 0;
249 fMassFractionVector = 0;
250 fAtomsVector = 0;
251 fMaterialPropertiesTable = 0;
252
253 VecNbOfAtomsPerVolume = 0;
254 fIonisation = 0;
255 fSandiaTable = 0;
256
257 fBaseMaterial = 0;
258
259 fImplicitElement = false;
260 fChemicalFormula = "";
261
262 // initilized data members
263 fDensity = 0.0;
264 fState = kStateUndefined;
265 fTemp = 0.0;
266 fPressure = 0.0;
267 maxNbComponents = 0;
268 fArrayLength = 0;
269 TotNbOfAtomsPerVolume = 0;
270 TotNbOfElectPerVolume = 0;
271 fRadlen = 0.0;
272 fNuclInterLen = 0.0;
273 fMassOfMolecule = 0.0;
274
275 // Store in the static Table of Materials
276 theMaterialTable.push_back(this);
277 fIndexInTable = theMaterialTable.size() - 1;
278}
279
280//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
281
282void G4Material::ComputeDerivedQuantities()
283{
284 // Header routine to compute various properties of material.
285 //
286
287 // Number of atoms per volume (per element), total nb of electrons per volume
288 G4double Zi, Ai;
289 TotNbOfAtomsPerVolume = 0.;
290 if (VecNbOfAtomsPerVolume) { delete [] VecNbOfAtomsPerVolume; }
291 VecNbOfAtomsPerVolume = new G4double[fNumberOfElements];
292 TotNbOfElectPerVolume = 0.;
293 for (size_t i=0; i<fNumberOfElements; ++i) {
294 Zi = (*theElementVector)[i]->GetZ();
295 Ai = (*theElementVector)[i]->GetA();
296 VecNbOfAtomsPerVolume[i] = Avogadro*fDensity*fMassFractionVector[i]/Ai;
297 TotNbOfAtomsPerVolume += VecNbOfAtomsPerVolume[i];
298 TotNbOfElectPerVolume += VecNbOfAtomsPerVolume[i]*Zi;
299 }
300
301 ComputeRadiationLength();
302 ComputeNuclearInterLength();
303
304 if (fIonisation) { delete fIonisation; }
305 fIonisation = new G4IonisParamMat(this);
306 if (fSandiaTable) { delete fSandiaTable; }
307 fSandiaTable = new G4SandiaTable(this);
308}
309
310//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
311
312void G4Material::CopyPointersOfBaseMaterial()
313{
314 G4double factor = fDensity/fBaseMaterial->GetDensity();
315 TotNbOfAtomsPerVolume = factor*fBaseMaterial->GetTotNbOfAtomsPerVolume();
316 TotNbOfElectPerVolume = factor*fBaseMaterial->GetTotNbOfElectPerVolume();
317
318 theElementVector = const_cast<G4ElementVector*>(fBaseMaterial->GetElementVector());
319 fMassFractionVector = const_cast<G4double*>(fBaseMaterial->GetFractionVector());
320 fAtomsVector = const_cast<G4int*>(fBaseMaterial->GetAtomsVector());
321
322 const G4double* v = fBaseMaterial->GetVecNbOfAtomsPerVolume();
323 if (VecNbOfAtomsPerVolume) { delete [] VecNbOfAtomsPerVolume; }
324 VecNbOfAtomsPerVolume = new G4double[fNumberOfElements];
325 for (size_t i=0; i<fNumberOfElements; ++i) {
326 VecNbOfAtomsPerVolume[i] = factor*v[i];
327 }
328 fRadlen = fBaseMaterial->GetRadlen()/factor;
329 fNuclInterLen = fBaseMaterial->GetNuclearInterLength()/factor;
330 if (fIonisation) { delete fIonisation; }
331 fIonisation = new G4IonisParamMat(this);
332
333 fSandiaTable = fBaseMaterial->GetSandiaTable();
334 fIonisation->SetMeanExcitationEnergy(fBaseMaterial->GetIonisation()->GetMeanExcitationEnergy());
335}
336
337//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
338
339// AddElement -- composition by atom count
340
342{
343 // initialization
344 if ( fNumberOfElements == 0 ) {
345 fAtomsVector = new G4int [fArrayLength];
346 fMassFractionVector = new G4double[fArrayLength];
347 }
348
349 // filling ...
350 if ( G4int(fNumberOfElements) < maxNbComponents ) {
351 theElementVector->push_back(element);
352 fAtomsVector[fNumberOfElements] = nAtoms;
353 fNumberOfComponents = ++fNumberOfElements;
354 element->increaseCountUse();
355 } else {
356 G4cout << "G4Material::AddElement ERROR for " << fName << " nElement= "
357 << fNumberOfElements << G4endl;
358 G4Exception ("G4Material::AddElement()", "mat031", FatalException,
359 "Attempt to add more than the declared number of elements.");
360 }
361 // filled.
362 if ( G4int(fNumberOfElements) == maxNbComponents ) {
363 // compute proportion by mass
364 size_t i=0;
365 G4double Amol = 0.;
366 for (i=0; i<fNumberOfElements; ++i) {
367 G4double w = fAtomsVector[i]*(*theElementVector)[i]->GetA();
368 Amol += w;
369 fMassFractionVector[i] = w;
370 }
371 for (i=0; i<fNumberOfElements; ++i) {
372 fMassFractionVector[i] /= Amol;
373 }
374
375 fMassOfMolecule = Amol/Avogadro;
376 ComputeDerivedQuantities();
377 }
378}
379
380//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
381
382// AddElement -- composition by fraction of mass
383
385{
386 if(fraction < 0.0 || fraction > 1.0) {
387 G4cout << "G4Material::AddElement ERROR for " << fName << " and "
388 << element->GetName() << " mass fraction= " << fraction
389 << " is wrong " << G4endl;
390 G4Exception ("G4Material::AddElement()", "mat032", FatalException,
391 "Attempt to add element with wrong mass fraction");
392 }
393 // initialization
394 if (fNumberOfComponents == 0) {
395 fMassFractionVector = new G4double[fArrayLength];
396 fAtomsVector = new G4int [fArrayLength];
397 }
398 // filling ...
399 if (G4int(fNumberOfComponents) < maxNbComponents) {
400 size_t el = 0;
401 while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) { ++el; }
402 if (el<fNumberOfElements) fMassFractionVector[el] += fraction;
403 else {
404 theElementVector->push_back(element);
405 fMassFractionVector[el] = fraction;
406 ++fNumberOfElements;
407 element->increaseCountUse();
408 }
409 ++fNumberOfComponents;
410 } else {
411 G4cout << "G4Material::AddElement ERROR for " << fName << " nElement= "
412 << fNumberOfElements << G4endl;
413 G4Exception ("G4Material::AddElement()", "mat033", FatalException,
414 "Attempt to add more than the declared number of elements.");
415 }
416
417 // filled.
418 if (G4int(fNumberOfComponents) == maxNbComponents) {
419
420 size_t i=0;
421 G4double Zmol(0.), Amol(0.);
422 // check sum of weights -- OK?
423 G4double wtSum(0.0);
424 for (i=0; i<fNumberOfElements; ++i) {
425 wtSum += fMassFractionVector[i];
426 Zmol += fMassFractionVector[i]*(*theElementVector)[i]->GetZ();
427 Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA();
428 }
429 if (std::fabs(1.-wtSum) > perThousand) {
430 G4cerr << "WARNING !! for " << fName << " sum of fractional masses "
431 << wtSum << " is not 1 - results may be wrong"
432 << G4endl;
433 }
434 for (i=0; i<fNumberOfElements; ++i) {
435 fAtomsVector[i] =
436 G4int(fMassFractionVector[i]*Amol/(*theElementVector)[i]->GetA()+0.5);
437 }
438
439 ComputeDerivedQuantities();
440 }
441}
442
443//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
444
445// AddMaterial -- composition by fraction of mass
446
448{
449 if(fraction < 0.0 || fraction > 1.0) {
450 G4cout << "G4Material::AddMaterial ERROR for " << fName << " and "
451 << material->GetName() << " mass fraction= " << fraction
452 << " is wrong " << G4endl;
453 G4Exception ("G4Material::AddMaterial()", "mat034", FatalException,
454 "Attempt to add material with wrong mass fraction");
455 }
456 // initialization
457 if (fNumberOfComponents == 0) {
458 fMassFractionVector = new G4double[fArrayLength];
459 fAtomsVector = new G4int [fArrayLength];
460 }
461
462 size_t nelm = material->GetNumberOfElements();
463
464 // arrays should be extended
465 if(nelm > 1) {
466 G4int nold = fArrayLength;
467 fArrayLength += nelm - 1;
468 G4double* v1 = new G4double[fArrayLength];
469 G4int* i1 = new G4int[fArrayLength];
470 for(G4int i=0; i<nold; ++i) {
471 v1[i] = fMassFractionVector[i];
472 i1[i] = fAtomsVector[i];
473 }
474 delete [] fAtomsVector;
475 delete [] fMassFractionVector;
476 fMassFractionVector = v1;
477 fAtomsVector = i1;
478 }
479
480 // filling ...
481 if (G4int(fNumberOfComponents) < maxNbComponents) {
482 for (size_t elm=0; elm<nelm; ++elm)
483 {
484 G4Element* element = (*(material->GetElementVector()))[elm];
485 size_t el = 0;
486 while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
487 if (el < fNumberOfElements) fMassFractionVector[el] += fraction
488 *(material->GetFractionVector())[elm];
489 else {
490 theElementVector->push_back(element);
491 fMassFractionVector[el] = fraction
492 *(material->GetFractionVector())[elm];
493 ++fNumberOfElements;
494 element->increaseCountUse();
495 }
496 }
497 ++fNumberOfComponents;
498 ///store massFraction of material component
499 fMatComponents[material] = fraction;
500
501 } else {
502 G4cout << "G4Material::AddMaterial ERROR for " << fName << " nElement= "
503 << fNumberOfElements << G4endl;
504 G4Exception ("G4Material::AddMaterial()", "mat035", FatalException,
505 "Attempt to add more than the declared number of components.");
506 }
507
508 // filled.
509 if (G4int(fNumberOfComponents) == maxNbComponents) {
510 size_t i=0;
511 G4double Zmol(0.), Amol(0.);
512 // check sum of weights -- OK?
513 G4double wtSum(0.0);
514 for (i=0; i<fNumberOfElements; ++i) {
515 wtSum += fMassFractionVector[i];
516 Zmol += fMassFractionVector[i]*(*theElementVector)[i]->GetZ();
517 Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA();
518 }
519 if (std::fabs(1.-wtSum) > perThousand) {
520 G4cout << "G4Material::AddMaterial WARNING !! for " << fName
521 << " sum of fractional masses "
522 << wtSum << " is not 1 - results may be wrong"
523 << G4endl;
524 }
525 for (i=0;i<fNumberOfElements;i++) {
526 fAtomsVector[i] =
527 G4int(fMassFractionVector[i]*Amol/(*theElementVector)[i]->GetA()+0.5);
528 }
529
530 ComputeDerivedQuantities();
531 }
532}
533
534//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
535
536void G4Material::ComputeRadiationLength()
537{
538 G4double radinv = 0.0 ;
539 for (size_t i=0;i<fNumberOfElements;++i) {
540 radinv += VecNbOfAtomsPerVolume[i]*((*theElementVector)[i]->GetfRadTsai());
541 }
542 fRadlen = (radinv <= 0.0 ? DBL_MAX : 1./radinv);
543}
544
545//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
546
547void G4Material::ComputeNuclearInterLength()
548{
549 const G4double lambda0 = 35*g/cm2;
550 G4double NILinv = 0.0;
551 G4Pow* g4pow = G4Pow::GetInstance();
552 for (size_t i=0; i<fNumberOfElements; ++i) {
553 NILinv +=
554 VecNbOfAtomsPerVolume[i]*g4pow->Z23(G4int((*theElementVector)[i]->GetN()+0.5));
555 }
556 NILinv *= amu/lambda0;
557 fNuclInterLen = (NILinv <= 0.0 ? DBL_MAX : 1./NILinv);
558}
559
560//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
561
563{
564 return &theMaterialTable;
565}
566
567//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
568
570{
571 return theMaterialTable.size();
572}
573
574//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
575
576G4Material* G4Material::GetMaterial(const G4String& materialName, G4bool warning)
577{
578 // search the material by its name
579 for (size_t J=0 ; J<theMaterialTable.size() ; ++J)
580 {
581 if (theMaterialTable[J]->GetName() == materialName)
582 { return theMaterialTable[J]; }
583 }
584
585 // the material does not exist in the table
586 if (warning) {
587 G4cout << "G4Material::GetMaterial() WARNING: The material: "
588 << materialName << " does not exist in the table. Return NULL pointer."
589 << G4endl;
590 }
591 return 0;
592}
593
594//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
595
597{
598 InitializePointers();
599 *this = right;
600}
601
602//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
603
605{
606 if (fNumberOfElements > 1) {
607 G4cout << "G4Material ERROR in GetZ. The material: " << fName << " is a mixture."
608 << G4endl;
609 G4Exception ("G4Material::GetZ()", "mat036", FatalException,
610 "the Atomic number is not well defined." );
611 }
612 return (*theElementVector)[0]->GetZ();
613}
614
615//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
616
618{
619 if (fNumberOfElements > 1) {
620 G4cout << "G4Material ERROR in GetA. The material: " << fName << " is a mixture."
621 << G4endl;
622 G4Exception ("G4Material::GetA()", "mat037", FatalException,
623 "the Atomic mass is not well defined." );
624 }
625 return (*theElementVector)[0]->GetA();
626}
627
628//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
629
630const G4Material& G4Material::operator=(const G4Material& right)
631{
632 if (this != &right)
633 {
634 fName = right.fName;
635 fChemicalFormula = right.fChemicalFormula;
636 fDensity = right.fDensity;
637 fState = right.fState;
638 fTemp = right.fTemp;
639 fPressure = right.fPressure;
640
641 if(!fBaseMaterial) {
642 if (theElementVector) { delete theElementVector; }
643 if (fMassFractionVector) { delete [] fMassFractionVector; }
644 if (fAtomsVector) { delete [] fAtomsVector; }
645 if (fIonisation) { delete fIonisation; }
646 if (fSandiaTable) { delete fSandiaTable; }
647 }
648
649 if (VecNbOfAtomsPerVolume) { delete [] VecNbOfAtomsPerVolume; }
650
651 maxNbComponents = right.maxNbComponents;
652 fNumberOfComponents = right.fNumberOfComponents;
653 fNumberOfElements = right.fNumberOfElements;
654 fImplicitElement = right.fImplicitElement;
655
656 fMaterialPropertiesTable = right.fMaterialPropertiesTable;
657 fBaseMaterial = right.fBaseMaterial;
658 fMassOfMolecule= right.fMassOfMolecule;
659 fMatComponents= right.fMatComponents;
660
661 if(fBaseMaterial) {
662 CopyPointersOfBaseMaterial();
663
664 } else {
665 theElementVector = new G4ElementVector(fNumberOfElements,0);
666 fMassFractionVector = new G4double[fNumberOfElements];
667 fAtomsVector = new G4int[fNumberOfElements];
668 for (size_t i=0; i<fNumberOfElements; ++i) {
669 (*theElementVector)[i] = (*right.theElementVector)[i];
670 fMassFractionVector[i] = right.fMassFractionVector[i];
671 fAtomsVector[i] = right.fAtomsVector[i];
672 }
673 ComputeDerivedQuantities();
674 }
675
676 }
677 return *this;
678}
679
680//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
681
683{
684 return (this == (G4Material *) &right);
685}
686
687//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
688
690{
691 return (this != (G4Material *) &right);
692}
693
694//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
695
696
697std::ostream& operator<<(std::ostream& flux, G4Material* material)
698{
699 std::ios::fmtflags mode = flux.flags();
700 flux.setf(std::ios::fixed,std::ios::floatfield);
701 G4long prec = flux.precision(3);
702
703 flux
704 << " Material: " << std::setw(8) << material->fName
705 << " " << material->fChemicalFormula << " "
706 << " density: " << std::setw(6) << std::setprecision(3)
707 << G4BestUnit(material->fDensity,"Volumic Mass")
708 << " RadL: " << std::setw(7) << std::setprecision(3)
709 << G4BestUnit(material->fRadlen,"Length")
710 << " Nucl.Int.Length: " << std::setw(7) << std::setprecision(3)
711 << G4BestUnit(material->fNuclInterLen,"Length")
712 << " Imean: " << std::setw(7) << std::setprecision(3)
713 << G4BestUnit(material->GetIonisation()->GetMeanExcitationEnergy(),"Energy");
714
715 if(material->fState == kStateGas) {
716 flux
717 << " temperature: " << std::setw(6) << std::setprecision(2)
718 << (material->fTemp)/kelvin << " K"
719 << " pressure: " << std::setw(6) << std::setprecision(2)
720 << (material->fPressure)/atmosphere << " atm";
721 }
722 for (size_t i=0; i<material->fNumberOfElements; i++) {
723 flux
724 << "\n ---> " << (*(material->theElementVector))[i]
725 << "\n ElmMassFraction: "
726 << std::setw(6)<< std::setprecision(2)
727 << (material->fMassFractionVector[i])/perCent << " %"
728 << " ElmAbundance " << std::setw(6)<< std::setprecision(2)
729 << 100*(material->VecNbOfAtomsPerVolume[i])/(material->TotNbOfAtomsPerVolume)
730 << " % \n";
731 }
732 flux.precision(prec);
733 flux.setf(mode,std::ios::floatfield);
734
735 return flux;
736}
737
738//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
739
740std::ostream& operator<<(std::ostream& flux, G4Material& material)
741{
742 flux << &material;
743 return flux;
744}
745
746//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
747
748std::ostream& operator<<(std::ostream& flux, G4MaterialTable MaterialTable)
749{
750 //Dump info for all known materials
751 flux << "\n***** Table : Nb of materials = " << MaterialTable.size()
752 << " *****\n" << G4endl;
753
754 for (size_t i=0; i<MaterialTable.size(); ++i) {
755 flux << MaterialTable[i] << G4endl << G4endl;
756 }
757
758 return flux;
759}
760
761//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
std::vector< G4Element * > G4ElementVector
@ fIonisation
@ FatalException
std::vector< G4Material * > G4MaterialTable
std::ostream & operator<<(std::ostream &flux, G4Material *material)
Definition: G4Material.cc:697
G4State
Definition: G4Material.hh:114
@ kStateSolid
Definition: G4Material.hh:114
@ kStateGas
Definition: G4Material.hh:114
@ kStateUndefined
Definition: G4Material.hh:114
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
double G4double
Definition: G4Types.hh:64
long G4long
Definition: G4Types.hh:68
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
const G4String & GetName() const
Definition: G4Element.hh:127
void increaseCountUse()
Definition: G4Element.hh:192
G4double GetMeanExcitationEnergy() const
void SetMeanExcitationEnergy(G4double value)
G4double GetDensity() const
Definition: G4Material.hh:179
const G4String & GetChemicalFormula() const
Definition: G4Material.hh:178
static const G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:562
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:189
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
Definition: G4Material.hh:251
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:208
static size_t GetNumberOfMaterials()
Definition: G4Material.cc:569
G4double GetZ() const
Definition: G4Material.cc:604
const G4double * GetFractionVector() const
Definition: G4Material.hh:193
G4double GetTotNbOfElectPerVolume() const
Definition: G4Material.hh:211
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:225
void AddElement(G4Element *element, G4int nAtoms)
Definition: G4Material.cc:341
virtual ~G4Material()
Definition: G4Material.cc:227
size_t GetNumberOfElements() const
Definition: G4Material.hh:185
const G4int * GetAtomsVector() const
Definition: G4Material.hh:197
G4int operator!=(const G4Material &) const
Definition: G4Material.cc:689
G4double GetA() const
Definition: G4Material.cc:617
G4SandiaTable * GetSandiaTable() const
Definition: G4Material.hh:228
G4Material(const G4String &name, G4double z, G4double a, G4double density, G4State state=kStateUndefined, G4double temp=CLHEP::STP_Temperature, G4double pressure=CLHEP::STP_Pressure)
Definition: G4Material.cc:88
G4double GetRadlen() const
Definition: G4Material.hh:219
G4double GetMassOfMolecule() const
Definition: G4Material.hh:241
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:205
G4int operator==(const G4Material &) const
Definition: G4Material.cc:682
void AddMaterial(G4Material *material, G4double fraction)
Definition: G4Material.cc:447
const G4String & GetName() const
Definition: G4Material.hh:177
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:576
G4double GetNuclearInterLength() const
Definition: G4Material.hh:222
Definition: G4Pow.hh:54
static G4Pow * GetInstance()
Definition: G4Pow.cc:50
G4double Z23(G4int Z)
Definition: G4Pow.hh:134
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define DBL_MAX
Definition: templates.hh:83