Import Geant4 9.4.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 16:25:56 +02:00
parent 74cad5e589
commit 89a9605df1
4440 changed files with 379508 additions and 189225 deletions
+141 -125
View File
@@ -23,9 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
// $Id: G4Material.cc,v 1.42 2008/08/13 16:06:42 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4Material.cc,v 1.44 2010/10/25 10:35:11 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
@@ -73,9 +72,9 @@
#include "G4Material.hh"
#include "G4UnitsTable.hh"
#include "G4Pow.hh"
#include <iomanip>
G4MaterialTable G4Material::theMaterialTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -90,13 +89,14 @@ G4Material::G4Material(const G4String& name, G4double z,
InitializePointers();
if (density < universe_mean_density)
{ G4cerr << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << G4endl;
density = universe_mean_density;
}
{
G4cerr << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << G4endl;
density = universe_mean_density;
}
fDensity = density;
fState = state;
@@ -118,8 +118,8 @@ G4Material::G4Material(const G4String& name, G4double z,
if (fState == kStateUndefined)
{
if (fDensity > kGasThreshold) fState = kStateSolid;
else fState = kStateGas;
if (fDensity > kGasThreshold) { fState = kStateSolid; }
else { fState = kStateGas; }
}
ComputeDerivedQuantities();
@@ -138,12 +138,13 @@ G4Material::G4Material(const G4String& name, G4double density,
InitializePointers();
if (density < universe_mean_density)
{G4cerr << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << G4endl;
density = universe_mean_density;
{
G4cerr << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << G4endl;
density = universe_mean_density;
}
fDensity = density;
@@ -161,8 +162,8 @@ G4Material::G4Material(const G4String& name, G4double density,
if (fState == kStateUndefined)
{
if (fDensity > kGasThreshold) fState = kStateSolid;
else fState = kStateGas;
if (fDensity > kGasThreshold) { fState = kStateSolid; }
else { fState = kStateGas; }
}
}
@@ -177,6 +178,7 @@ G4Material::G4Material(__void__&)
fMaterialPropertiesTable(0), fIndexInTable(0),
VecNbOfAtomsPerVolume(0), fIonisation(0), fSandiaTable(0)
{
InitializePointers();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -194,7 +196,7 @@ void G4Material::AddElement(G4Element* element, G4int nAtoms)
// filling ...
if ( G4int(fNumberOfElements) < maxNbComponents ) {
theElementVector->push_back(element);
fAtomsVector [fNumberOfElements] = nAtoms;
fAtomsVector[fNumberOfElements] = nAtoms;
fNumberOfComponents = ++fNumberOfElements;
element->increaseCountUse();
} else {
@@ -205,19 +207,19 @@ void G4Material::AddElement(G4Element* element, G4int nAtoms)
}
// filled.
if ( G4int(fNumberOfElements) == maxNbComponents ) {
// compute proportion by mass
size_t i=0;
G4double Zmol(0.), Amol(0.);
for (i=0;i<fNumberOfElements;i++) {
Zmol += fAtomsVector[i]*(*theElementVector)[i]->GetZ();
Amol += fAtomsVector[i]*(*theElementVector)[i]->GetA();
}
for (i=0;i<fNumberOfElements;i++) {
fMassFractionVector[i] = fAtomsVector[i]
*(*theElementVector)[i]->GetA()/Amol;
}
// compute proportion by mass
size_t i=0;
G4double Zmol(0.), Amol(0.);
for (i=0; i<fNumberOfElements; ++i) {
Zmol += fAtomsVector[i]*(*theElementVector)[i]->GetZ();
Amol += fAtomsVector[i]*(*theElementVector)[i]->GetA();
}
for (i=0; i<fNumberOfElements; ++i) {
fMassFractionVector[i] = fAtomsVector[i]
*(*theElementVector)[i]->GetA()/Amol;
}
ComputeDerivedQuantities();
ComputeDerivedQuantities();
}
}
@@ -235,16 +237,16 @@ void G4Material::AddElement(G4Element* element, G4double fraction)
// filling ...
if (G4int(fNumberOfComponents) < maxNbComponents) {
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
if (el<fNumberOfElements) fMassFractionVector[el] += fraction;
else {
theElementVector->push_back(element);
fMassFractionVector[el] = fraction;
fNumberOfElements++;
element->increaseCountUse();
}
fNumberOfComponents++;
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) { ++el; }
if (el<fNumberOfElements) fMassFractionVector[el] += fraction;
else {
theElementVector->push_back(element);
fMassFractionVector[el] = fraction;
++fNumberOfElements;
element->increaseCountUse();
}
++fNumberOfComponents;
} else {
G4cerr << "G4Material::AddElement ERROR for " << fName << " nElement= "
<< fNumberOfElements << G4endl;
@@ -255,26 +257,26 @@ void G4Material::AddElement(G4Element* element, G4double fraction)
// filled.
if (G4int(fNumberOfComponents) == maxNbComponents) {
size_t i=0;
G4double Zmol(0.), Amol(0.);
// check sum of weights -- OK?
G4double wtSum(0.0);
for (i=0;i<fNumberOfElements;i++) {
wtSum += fMassFractionVector[i];
Zmol += fMassFractionVector[i]*(*theElementVector)[i]->GetZ();
Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA();
}
if (std::abs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! for " << fName << " sum of fractional masses "
<< wtSum << " is not 1 - results may be wrong"
<< G4endl;
}
for (i=0;i<fNumberOfElements;i++) {
fAtomsVector[i] =
G4int(fMassFractionVector[i]*Amol/(*theElementVector)[i]->GetA()+0.5);
}
size_t i=0;
G4double Zmol(0.), Amol(0.);
// check sum of weights -- OK?
G4double wtSum(0.0);
for (i=0; i<fNumberOfElements; ++i) {
wtSum += fMassFractionVector[i];
Zmol += fMassFractionVector[i]*(*theElementVector)[i]->GetZ();
Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA();
}
if (std::fabs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! for " << fName << " sum of fractional masses "
<< wtSum << " is not 1 - results may be wrong"
<< G4endl;
}
for (i=0; i<fNumberOfElements; ++i) {
fAtomsVector[i] =
G4int(fMassFractionVector[i]*Amol/(*theElementVector)[i]->GetA()+0.5);
}
ComputeDerivedQuantities();
ComputeDerivedQuantities();
}
}
@@ -298,7 +300,7 @@ void G4Material::AddMaterial(G4Material* material, G4double fraction)
fArrayLength += nelm - 1;
G4double* v1 = new G4double[fArrayLength];
G4int* i1 = new G4int[fArrayLength];
for(G4int i=0; i<nold; i++) {
for(G4int i=0; i<nold; ++i) {
v1[i] = fMassFractionVector[i];
i1[i] = fAtomsVector[i];
}
@@ -310,8 +312,8 @@ void G4Material::AddMaterial(G4Material* material, G4double fraction)
// filling ...
if (G4int(fNumberOfComponents) < maxNbComponents) {
for (size_t elm=0; elm<nelm; elm++)
{
for (size_t elm=0; elm<nelm; ++elm)
{
G4Element* element = (*(material->GetElementVector()))[elm];
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
@@ -321,11 +323,11 @@ void G4Material::AddMaterial(G4Material* material, G4double fraction)
theElementVector->push_back(element);
fMassFractionVector[el] = fraction
*(material->GetFractionVector())[elm];
fNumberOfElements++;
++fNumberOfElements;
element->increaseCountUse();
}
}
fNumberOfComponents++;
}
++fNumberOfComponents;
} else {
G4cerr << "G4Material::AddElement ERROR for " << fName << " nElement= "
<< fNumberOfElements << G4endl;
@@ -335,26 +337,26 @@ void G4Material::AddMaterial(G4Material* material, G4double fraction)
// filled.
if (G4int(fNumberOfComponents) == maxNbComponents) {
size_t i=0;
G4double Zmol(0.), Amol(0.);
// check sum of weights -- OK?
G4double wtSum(0.0);
for (i=0;i<fNumberOfElements;i++) {
wtSum += fMassFractionVector[i];
Zmol += fMassFractionVector[i]*(*theElementVector)[i]->GetZ();
Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA();
}
if (std::abs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! for " << fName << " sum of fractional masses "
<< wtSum << " is not 1 - results may be wrong"
<< G4endl;
}
for (i=0;i<fNumberOfElements;i++) {
fAtomsVector[i] =
G4int(fMassFractionVector[i]*Amol/(*theElementVector)[i]->GetA()+0.5);
}
size_t i=0;
G4double Zmol(0.), Amol(0.);
// check sum of weights -- OK?
G4double wtSum(0.0);
for (i=0; i<fNumberOfElements; ++i) {
wtSum += fMassFractionVector[i];
Zmol += fMassFractionVector[i]*(*theElementVector)[i]->GetZ();
Amol += fMassFractionVector[i]*(*theElementVector)[i]->GetA();
}
if (std::fabs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! for " << fName << " sum of fractional masses "
<< wtSum << " is not 1 - results may be wrong"
<< G4endl;
}
for (i=0;i<fNumberOfElements;i++) {
fAtomsVector[i] =
G4int(fMassFractionVector[i]*Amol/(*theElementVector)[i]->GetA()+0.5);
}
ComputeDerivedQuantities();
ComputeDerivedQuantities();
}
}
@@ -368,10 +370,10 @@ void G4Material::ComputeDerivedQuantities()
// Number of atoms per volume (per element), total nb of electrons per volume
G4double Zi, Ai;
TotNbOfAtomsPerVolume = 0.;
if (VecNbOfAtomsPerVolume) delete [] VecNbOfAtomsPerVolume;
if (VecNbOfAtomsPerVolume) { delete [] VecNbOfAtomsPerVolume; }
VecNbOfAtomsPerVolume = new G4double[fNumberOfElements];
TotNbOfElectPerVolume = 0.;
for (size_t i=0;i<fNumberOfElements;i++) {
for (size_t i=0; i<fNumberOfElements; ++i) {
Zi = (*theElementVector)[i]->GetZ();
Ai = (*theElementVector)[i]->GetA();
VecNbOfAtomsPerVolume[i] = Avogadro*fDensity*fMassFractionVector[i]/Ai;
@@ -382,9 +384,9 @@ void G4Material::ComputeDerivedQuantities()
ComputeRadiationLength();
ComputeNuclearInterLength();
if (fIonisation) delete fIonisation;
if (fIonisation) { delete fIonisation; }
fIonisation = new G4IonisParamMat(this);
if (fSandiaTable) delete fSandiaTable;
if (fSandiaTable) { delete fSandiaTable; }
fSandiaTable = new G4SandiaTable(this);
}
@@ -393,9 +395,9 @@ void G4Material::ComputeDerivedQuantities()
void G4Material::ComputeRadiationLength()
{
G4double radinv = 0.0 ;
for (size_t i=0;i<fNumberOfElements;i++) {
for (size_t i=0;i<fNumberOfElements;++i) {
radinv += VecNbOfAtomsPerVolume[i]*((*theElementVector)[i]->GetfRadTsai());
}
}
fRadlen = (radinv <= 0.0 ? DBL_MAX : 1./radinv);
}
@@ -405,10 +407,11 @@ void G4Material::ComputeNuclearInterLength()
{
const G4double lambda0 = 35*g/cm2;
G4double NILinv = 0.0;
for (size_t i=0;i<fNumberOfElements;i++) {
NILinv +=
VecNbOfAtomsPerVolume[i]*std::pow(((*theElementVector)[i]->GetN()),0.6666667);
}
G4Pow* g4pow = G4Pow::GetInstance();
for (size_t i=0; i<fNumberOfElements; ++i) {
NILinv +=
VecNbOfAtomsPerVolume[i]*g4pow->Z23(G4int((*theElementVector)[i]->GetN()+0.5));
}
NILinv *= amu/lambda0;
fNuclInterLen = (NILinv <= 0.0 ? DBL_MAX : 1./NILinv);
}
@@ -426,6 +429,18 @@ void G4Material::InitializePointers()
fIonisation = 0;
fSandiaTable = 0;
// initilized data members
fDensity = 0.0;
fState = kStateUndefined;
fTemp = 0.0;
fPressure = 0.0;
maxNbComponents = 0;
fArrayLength = 0;
TotNbOfAtomsPerVolume = 0;
TotNbOfElectPerVolume = 0;
fRadlen = 0.0;
fNuclInterLen = 0.0;
// Store in the static Table of Materials
theMaterialTable.push_back(this);
fIndexInTable = theMaterialTable.size() - 1;
@@ -452,15 +467,15 @@ G4Material* G4Material::GetMaterial(G4String materialName, G4bool warning)
// search the material by its name
for (size_t J=0 ; J<theMaterialTable.size() ; J++)
{
if (theMaterialTable[J]->GetName() == materialName)
return theMaterialTable[J];
if (theMaterialTable[J]->GetName() == materialName)
{ return theMaterialTable[J]; }
}
// the material does not exist in the table
if (warning) {
G4cout << "\n---> warning from G4Material::GetMaterial(). The material: "
<< materialName << " does not exist in the table. Return NULL pointer."
<< G4endl;
G4cout << "\n---> warning from G4Material::GetMaterial(). The material: "
<< materialName << " does not exist in the table. Return NULL pointer."
<< G4endl;
}
return 0;
}
@@ -478,12 +493,12 @@ G4Material::G4Material(const G4Material& right)
G4Material::~G4Material()
{
// G4cout << "### Destruction of material " << fName << " started" <<G4endl;
if (theElementVector) delete theElementVector;
if (fMassFractionVector) delete [] fMassFractionVector;
if (fAtomsVector) delete [] fAtomsVector;
if (VecNbOfAtomsPerVolume) delete [] VecNbOfAtomsPerVolume;
if (fIonisation) delete fIonisation;
if (fSandiaTable) delete fSandiaTable;
if (theElementVector) { delete theElementVector; }
if (fMassFractionVector) { delete [] fMassFractionVector; }
if (fAtomsVector) { delete [] fAtomsVector; }
if (VecNbOfAtomsPerVolume) { delete [] VecNbOfAtomsPerVolume; }
if (fIonisation) { delete fIonisation; }
if (fSandiaTable) { delete fSandiaTable; }
// Remove this material from theMaterialTable.
//
@@ -503,10 +518,10 @@ const G4Material& G4Material::operator=(const G4Material& right)
fTemp = right.fTemp;
fPressure = right.fPressure;
if (fImplicitElement) delete ((*theElementVector)[0]);
if (theElementVector) delete theElementVector;
if (fMassFractionVector) delete [] fMassFractionVector;
if (fAtomsVector) delete [] fAtomsVector;
if (fImplicitElement) { delete ((*theElementVector)[0]); }
if (theElementVector) { delete theElementVector; }
if (fMassFractionVector) { delete [] fMassFractionVector; }
if (fAtomsVector) { delete [] fAtomsVector; }
maxNbComponents = right.maxNbComponents;
fNumberOfComponents = right.fNumberOfComponents;
@@ -523,7 +538,7 @@ const G4Material& G4Material::operator=(const G4Material& right)
} else {
theElementVector = new G4ElementVector(fNumberOfElements,0);
fMassFractionVector = new G4double[fNumberOfElements];
for (size_t i=0; i<fNumberOfElements; i++) {
for (size_t i=0; i<fNumberOfElements; ++i) {
(*theElementVector)[i]= (*right.theElementVector)[i];
fMassFractionVector[i]= right.fMassFractionVector[i];
}
@@ -577,14 +592,14 @@ std::ostream& operator<<(std::ostream& flux, G4Material* material)
<< " Imean: " << std::setw(7) << std::setprecision(3)
<< G4BestUnit(material->GetIonisation()->GetMeanExcitationEnergy(),"Energy");
if(material->fState == kStateGas)
if(material->fState == kStateGas) {
flux
<< " temperature: " << std::setw(6) << std::setprecision(2)
<< (material->fTemp)/kelvin << " K"
<< " pressure: " << std::setw(6) << std::setprecision(2)
<< (material->fPressure)/atmosphere << " atm";
for (size_t i=0; i<material->fNumberOfElements; i++)
}
for (size_t i=0; i<material->fNumberOfElements; i++) {
flux
<< "\n ---> " << (*(material->theElementVector))[i]
<< " ElmMassFraction: " << std::setw(6)<< std::setprecision(2)
@@ -592,7 +607,7 @@ std::ostream& operator<<(std::ostream& flux, G4Material* material)
<< " ElmAbundance " << std::setw(6)<< std::setprecision(2)
<< 100*(material->VecNbOfAtomsPerVolume[i])/(material->TotNbOfAtomsPerVolume)
<< " %";
}
flux.precision(prec);
flux.setf(mode,std::ios::floatfield);
@@ -601,7 +616,7 @@ std::ostream& operator<<(std::ostream& flux, G4Material* material)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
std::ostream& operator<<(std::ostream& flux, G4Material& material)
std::ostream& operator<<(std::ostream& flux, G4Material& material)
{
flux << &material;
return flux;
@@ -611,14 +626,15 @@ std::ostream& operator<<(std::ostream& flux, G4Material* material)
std::ostream& operator<<(std::ostream& flux, G4MaterialTable MaterialTable)
{
//Dump info for all known materials
flux << "\n***** Table : Nb of materials = " << MaterialTable.size()
<< " *****\n" << G4endl;
//Dump info for all known materials
flux << "\n***** Table : Nb of materials = " << MaterialTable.size()
<< " *****\n" << G4endl;
for (size_t i=0; i<MaterialTable.size(); i++) flux << MaterialTable[i]
<< G4endl << G4endl;
for (size_t i=0; i<MaterialTable.size(); ++i) {
flux << MaterialTable[i] << G4endl << G4endl;
}
return flux;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......