77 :
fName(name), fSymbol(symbol)
82 ed <<
"Fail to create G4Element " << name
83 <<
" Z= " << zeff <<
" < 1 !";
88 ed <<
"G4Element Warning: " << name <<
" Z= " << zeff
89 <<
" A= " << aeff/(
g/
mole);
97 fNeff = fAeff/(
g/
mole);
99 if(fNeff < 1.0) fNeff = 1.0;
103 ed <<
"Fail to create G4Element " << name
104 <<
" with Z= " << zeff <<
" N= " << fNeff
105 <<
" N < Z is not allowed" <<
G4endl;
110 fAtomicShells =
new G4double[fNbOfAtomicShells];
111 fNbOfShellElectrons =
new G4int[fNbOfAtomicShells];
113 AddNaturalIsotopes();
115 for (
G4int i=0;i<fNbOfAtomicShells;i++)
120 ComputeDerivedQuantities();
130 :
fName(name),fSymbol(symbol)
132 InitializePointers();
134 size_t n = size_t(nIsotopes);
138 ed <<
"Fail to create G4Element " << name
139 <<
" <" << symbol <<
"> with " << nIsotopes
144 fRelativeAbundanceVector =
new G4double[nIsotopes];
154 if (theIsotopeVector == 0) {
156 ed <<
"Fail to add Isotope to G4Element " << fName
157 <<
" with Z= " << fZeff <<
" N= " << fNeff;
164 if ( fNumberOfIsotopes < (
G4int)theIsotopeVector->size() ) {
166 if (fNumberOfIsotopes==0) { fZeff =
G4double(iz); }
169 ed <<
"Fail to add Isotope Z= " << iz <<
" to G4Element " << fName
170 <<
" with different Z= " << fZeff << fNeff;
175 fRelativeAbundanceVector[fNumberOfIsotopes] = abundance;
176 (*theIsotopeVector)[fNumberOfIsotopes] = isotope;
181 ed <<
"Fail to add Isotope Z= " << iz <<
" to G4Element " << fName
182 <<
" - more isotopes than declaired ";
188 if ( fNumberOfIsotopes == (
G4int)theIsotopeVector->size() ) {
191 for (
G4int i=0; i<fNumberOfIsotopes; i++) {
192 fAeff += fRelativeAbundanceVector[i]*(*theIsotopeVector)[i]->GetA();
193 wtSum += fRelativeAbundanceVector[i];
195 if(wtSum > 0.0) { fAeff /= wtSum; }
196 fNeff = fAeff/(
g/
mole);
199 for(
G4int i=0; i<fNumberOfIsotopes; ++i) {
200 fRelativeAbundanceVector[i] /= wtSum;
205 fAtomicShells =
new G4double[fNbOfAtomicShells];
206 fNbOfShellElectrons =
new G4int[fNbOfAtomicShells];
208 for (
G4int j = 0; j < fNbOfAtomicShells; j++ )
213 ComputeDerivedQuantities();
219 void G4Element::InitializePointers()
221 theIsotopeVector =
nullptr;
222 fRelativeAbundanceVector =
nullptr;
223 fAtomicShells =
nullptr;
224 fNbOfShellElectrons =
nullptr;
225 fIonisation =
nullptr;
226 fNumberOfIsotopes = 0;
227 fNaturalAbundance =
false;
233 fNbOfAtomicShells = 0;
246 : fZeff(0), fNeff(0), fAeff(0)
248 InitializePointers();
255 if (theIsotopeVector) {
delete theIsotopeVector; }
256 if (fRelativeAbundanceVector) {
delete [] fRelativeAbundanceVector; }
257 if (fAtomicShells) {
delete [] fAtomicShells; }
258 if (fNbOfShellElectrons) {
delete [] fNbOfShellElectrons; }
259 if (fIonisation) {
delete fIonisation; }
262 theElementTable[fIndexInTable] = 0;
267 void G4Element::ComputeDerivedQuantities()
272 theElementTable.push_back(
this);
273 fIndexInTable = theElementTable.size() - 1;
276 ComputeCoulombFactor();
277 ComputeLradTsaiFactor();
280 if (fIonisation) {
delete fIonisation; }
287 void G4Element::ComputeCoulombFactor()
292 static const G4double k1 = 0.0083 , k2 = 0.20206 ,k3 = 0.0020 , k4 = 0.0369 ;
297 fCoulomb = (k1*az4 + k2 + 1./(1.+az2))*az2 - (k3*az4 + k4)*az4;
302 void G4Element::ComputeLradTsaiFactor()
308 static const G4double Lrad_light[] = {5.31 , 4.79 , 4.74 , 4.71} ;
309 static const G4double Lprad_light[] = {6.144 , 5.621 , 5.805 , 5.924} ;
317 if (iz <= 3) { Lrad = Lrad_light[iz] ; Lprad = Lprad_light[iz] ; }
318 else { Lrad = log184 - logZ3 ; Lprad = log1194 - 2*logZ3;}
320 fRadTsai = 4*
alpha_rcl2*fZeff*(fZeff*(Lrad-fCoulomb) + Lprad);
325 void G4Element::AddNaturalIsotopes()
333 const std::vector<G4String> elmnames =
335 if(Z < (
G4int)elmnames.size()) { fSymbol = elmnames[
Z]; }
336 else { fSymbol = fName; }
339 fNumberOfIsotopes = 0;
340 for(
G4int i=0; i<
n; ++i) {
343 theIsotopeVector =
new G4IsotopeVector((
unsigned int)fNumberOfIsotopes,0);
344 fRelativeAbundanceVector =
new G4double[fNumberOfIsotopes];
347 for(
G4int i=0; i<
n; ++i) {
351 std::ostringstream strm;
352 strm << fSymbol <<
N;
353 (*theIsotopeVector)[idx] =
new G4Isotope(strm.str(),
Z,
N, 0.0, 0);
354 fRelativeAbundanceVector[idx] = x;
359 if(xsum != 0.0 && xsum != 1.0) {
360 for(
G4int i=0; i<idx; ++i) { fRelativeAbundanceVector[i] /= xsum; }
362 fNaturalAbundance =
true;
369 if (i<0 || i>=fNbOfAtomicShells) {
371 ed <<
"Invalid argument " << i <<
" in for G4Element " << fName
372 <<
" with Z= " << fZeff
373 <<
" and Nshells= " << fNbOfAtomicShells;
377 return fAtomicShells[i];
384 if (i<0 || i>=fNbOfAtomicShells) {
386 ed <<
"Invalid argument " << i <<
" for G4Element " << fName
387 <<
" with Z= " << fZeff
388 <<
" and Nshells= " << fNbOfAtomicShells;
389 G4Exception(
"G4Element::GetNbOfShellElectrons()",
"mat016",
393 return fNbOfShellElectrons[i];
400 return &theElementTable;
407 return theElementTable.size();
415 for (
size_t J=0; J<theElementTable.size(); ++J)
417 if (theElementTable[J]->
GetName() == elementName)
418 return theElementTable[J];
423 G4cout <<
"\n---> warning from G4Element::GetElement(). The element: "
424 << elementName <<
" does not exist in the table. Return NULL pointer."
434 std::ios::fmtflags mode = flux.flags();
435 flux.setf(std::ios::fixed,std::ios::floatfield);
439 <<
" Element: " << element->fName <<
" (" << element->fSymbol <<
")"
440 <<
" Z = " << std::setw(4) << std::setprecision(1) << element->fZeff
441 <<
" N = " << std::setw(5) << std::setprecision(1)
443 <<
" A = " << std::setw(6) << std::setprecision(3)
444 << (element->fAeff)/(
g/
mole) <<
" g/mole";
446 for (
G4int i=0; i<element->fNumberOfIsotopes; i++)
448 <<
"\n ---> " << (*(element->theIsotopeVector))[i]
449 <<
" abundance: " << std::setw(6) << std::setprecision(3)
450 << (element->fRelativeAbundanceVector[i])/
perCent <<
" %";
452 flux.precision(prec);
453 flux.setf(mode,std::ios::floatfield);
470 flux <<
"\n***** Table : Nb of elements = " << ElementTable.size()
473 for (
size_t i=0; i<ElementTable.size(); i++) flux << ElementTable[i]
static constexpr double perMillion
std::vector< G4Isotope * > G4IsotopeVector
std::ostringstream G4ExceptionDescription
static G4Element * GetElement(G4String name, G4bool warning=true)
static constexpr double perCent
const std::vector< G4String > & GetNistElementNames() const
G4int GetNbOfShellElectrons(G4int index) const
static constexpr double g
static G4NistManager * Instance()
G4int GetNistFirstIsotopeN(G4int Z) const
G4GLOB_DLL std::ostream G4cout
static size_t GetNumberOfElements()
static G4double GetBindingEnergy(G4int Z, G4int SubshellNb)
void AddIsotope(G4Isotope *isotope, G4double RelativeAbundance)
G4Element(const G4String &name, const G4String &symbol, G4double Zeff, G4double Aeff)
G4double GetIsotopeAbundance(G4int Z, G4int N) const
G4int GetNumberOfNistIsotopes(G4int Z) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double G4Log(G4double x)
static G4int GetNumberOfElectrons(G4int Z, G4int SubshellNb)
std::ostream & operator<<(std::ostream &, const BasicVector3D< float > &)
static constexpr double alpha_rcl2
G4double GetAtomicShell(G4int index) const
std::vector< G4Element * > G4ElementTable
const G4String & GetName() const
static constexpr double fine_structure_const
static G4ElementTable * GetElementTable()
static constexpr double mole
static G4int GetNumberOfShells(G4int Z)