60 fMeanEnergyPerIon = 0.0;
66 fAdjustmentFactor = 1.0;
70 ComputeMeanParameters();
71 ComputeDensityEffect();
73 ComputeIonParameters();
82 : fMaterial(nullptr), fShellCorrectionVector(nullptr)
84 fMeanExcitationEnergy = 0.0;
85 fLogMeanExcEnergy = 0.0;
94 fAdjustmentFactor = 0.0;
98 fLogEnergy1fluct = 0.0;
100 fLogEnergy2fluct = 0.0;
102 fRateionexcfluct = 0.0;
108 fMeanEnergyPerIon = 0.0;
118 if (fShellCorrectionVector) {
delete [] fShellCorrectionVector; }
119 if (fDensityData) {
delete fDensityData; }
120 fDensityData =
nullptr;
121 fShellCorrectionVector =
nullptr;
126 void G4IonisParamMat::ComputeMeanParameters()
131 fMeanExcitationEnergy = 0.;
132 fLogMeanExcEnergy = 0.;
141 if(fMeanExcitationEnergy > 0.0) {
142 fLogMeanExcEnergy =
G4Log(fMeanExcitationEnergy);
146 for (
size_t i=0; i < nElements; i++) {
148 fLogMeanExcEnergy += nAtomsPerVolume[i]*elm->
GetZ()
152 fMeanExcitationEnergy =
G4Exp(fLogMeanExcEnergy);
155 fShellCorrectionVector =
new G4double[3];
157 for (
G4int j=0; j<=2; j++)
159 fShellCorrectionVector[j] = 0.;
161 for (
size_t k=0; k<nElements; k++) {
162 fShellCorrectionVector[j] += nAtomsPerVolume[k]
163 *(((*elmVector)[k])->GetIonisation()->GetShellCorrectionVector())[j];
178 void G4IonisParamMat::ComputeDensityEffect()
190 if(idx < 0 && 1 == nelm) {
201 if(dens <= 0.0) { idx = -1; }
208 if(std::abs(corr) > 1.0) { idx = -1; }
237 fX0density += corr/twoln10;
238 fX1density += corr/twoln10;
249 fCdensity = 1. + 2*
G4Log(fMeanExcitationEnergy/fPlasmaEnergy);
256 static const G4double ClimiS[] = {3.681 , 5.215 };
257 static const G4double X0valS[] = {1.0 , 1.5 };
258 static const G4double X1valS[] = {2.0 , 3.0 };
260 if(fMeanExcitationEnergy < E100eV) { icase = 0; }
263 if(fCdensity < ClimiS[icase]) { fX0density = 0.2; }
264 else { fX0density = 0.326*fCdensity - X0valS[icase]; }
266 fX1density = X1valS[icase]; fMdensity = 3.0;
269 if (1 == nelm && 1 == Z0) {
270 fX0density = 0.425; fX1density = 2.0; fMdensity = 5.949;
284 if(fCdensity < 10.) {
286 }
else if(fCdensity < 11.5) {
287 fX0density = 1.6 + 0.2*(fCdensity - 10.);
288 }
else if(fCdensity < 12.25) {
289 fX0density = 1.9 + (fCdensity - 11.5)/7.5;
290 }
else if(fCdensity < 13.804) {
292 fX1density = 4.0 + (fCdensity - 12.25)/1.554;
294 fX0density = 0.326*fCdensity-2.5; fX1density = 5.0;
298 if (1 == nelm && 1 == Z0) {
299 fX0density = 1.837; fX1density = 3.0; fMdensity = 4.754;
303 if (1 == nelm && 2 == Z0) {
304 fX0density = 2.191; fX1density = 3.0; fMdensity = 3.297;
323 fCdensity -= ParCorr;
324 fX0density -= ParCorr/twoln10;
325 fX1density -= ParCorr/twoln10;
329 if(0.0 == fD0density) {
331 fAdensity = twoln10*(Xa-fX0density)
332 /std::pow((fX1density-fX0density),fMdensity);
351 void G4IonisParamMat::ComputeFluctModel()
360 if (Zeff > 2.) { fF2fluct = 2./Zeff; }
361 else { fF2fluct = 0.; }
363 fF1fluct = 1. - fF2fluct;
364 fEnergy2fluct = 10.*Zeff*Zeff*
eV;
365 fLogEnergy2fluct =
G4Log(fEnergy2fluct);
366 fLogEnergy1fluct = (fLogMeanExcEnergy - fF2fluct*fLogEnergy2fluct)
368 fEnergy1fluct =
G4Exp(fLogEnergy1fluct);
369 fEnergy0fluct = 10.*
eV;
370 fRateionexcfluct = 0.4;
375 void G4IonisParamMat::ComputeIonParameters()
379 const G4double* theAtomicNumDensityVector =
385 G4double z(0.0), vF(0.0), lF(0.0), norm(0.0), a23(0.0);
388 if( 1 == NumberOfElements ) {
389 const G4Element* element = (*theElementVector)[0];
393 a23 = 1.0/g4pow->
A23(element->
GetN());
396 for (
G4int iel=0; iel<NumberOfElements; iel++)
398 const G4Element* element = (*theElementVector)[iel];
399 const G4double weight = theAtomicNumDensityVector[iel];
401 z += element->
GetZ() * weight;
404 a23 += weight/g4pow->
A23(element->
GetN());
413 fFermiEnergy = 25.*
keV*vF*vF;
421 if(value == fMeanExcitationEnergy || value <= 0.0) {
return; }
423 G4cout <<
"G4Material: Mean excitation energy is changed for "
425 <<
" Iold= " << fMeanExcitationEnergy/
eV
426 <<
"eV; Inew= " << value/
eV <<
" eV;"
430 fMeanExcitationEnergy =
value;
434 G4double corr = 2*(newlog - fLogMeanExcEnergy);
436 fX0density += corr/twoln10;
437 fX1density += corr/twoln10;
440 fLogMeanExcEnergy = newlog;
462 if(chFormula !=
"") {
467 "NH_3",
"C_4H_10",
"CO_2",
"C_2H_6",
"C_7H_16-Gas",
469 "C_6H_14-Gas",
"CH_4",
"NO",
"N_2O",
"C_8H_18-Gas",
471 "C_5H_12-Gas",
"C_3H_8",
"H_2O-Gas",
475 "C_3H_6O",
"C_6H_5NH_2",
"C_6H_6",
"C_4H_9OH",
"CCl_4",
477 "C_6H_5Cl",
"CHCl_3",
"C_6H_12",
"C_6H_4Cl_2",
"C_4Cl_2H_8O",
480 "C_2Cl_2H_4",
"(C_2H_5)_2O",
"C_2H_5OH",
"C_3H_5(OH)_3",
"C_7H_16",
482 "C_6H_14",
"CH_3OH",
"C_6H_5NO_2",
"C_5H_12",
"C_3H_7OH",
484 "C_5H_5N",
"C_8H_8",
"C_2Cl_4",
"C_7H_8",
"C_2Cl_3H",
490 "C_5H_5N_5",
"C_5H_5N_5O",
"(C_6H_11NO)-nylon",
"C_25H_52",
492 "(C_2H_4)-Polyethylene",
"(C_5H_8O_2)-Polymethil_Methacrylate",
494 "(C_8H_8)-Polystyrene",
"A-150-tissue",
"Al_2O_3",
"CaF_2",
496 "LiF",
"Photo_Emulsion",
"(C_2F_4)-Teflon",
"SiO_2"
502 53.7, 48.3, 85.0, 45.4, 49.2,
503 49.1, 41.7, 87.8, 84.9, 49.5,
506 64.2, 66.2, 63.4, 59.9, 166.3,
507 89.1, 156.0, 56.4, 106.5, 103.3,
508 111.9, 60.0, 62.9, 72.6, 54.4,
509 54.0, 67.6, 75.8, 53.6, 61.1,
510 66.2, 64.0, 159.2, 62.5, 148.1,
513 71.4, 75.0, 63.9, 48.3, 57.4,
514 74.0, 68.7, 65.1, 145.2, 166.,
515 94.0, 331.0, 99.1, 139.2
519 if(chFormula == name[i]) {
520 res = meanExcitation[i]*
eV;
G4double GetPressure() const
G4int GetIndex(const G4String &matName) const
static G4Pow * GetInstance()
G4double GetX0density(G4int idx) const
G4double GetTotNbOfElectPerVolume() const
std::vector< G4Element * > G4ElementVector
G4double GetMeanIonisationPotential(G4int idx) const
G4double GetX1density(G4int idx) const
G4double GetPlasmaEnergy(G4int idx) const
static const G4int numberOfMolecula
const G4String & GetChemicalFormula() const
G4double GetCdensity(G4int idx) const
void SetMeanExcitationEnergy(G4double value)
const G4String & GetName() const
G4int GetElementIndex(G4int Z, G4State mState) const
G4double GetDensity() const
G4IonisParamMat(const G4Material *)
G4double GetLFactor() const
const G4ElementVector * GetElementVector() const
static G4NistManager * Instance()
G4double GetDelta0density(G4int idx) const
G4double FindMeanExcitationEnergy(const G4Material *) const
G4double logZ(G4int Z) const
G4double GetFermiVelocity() const
const G4double * GetVecNbOfAtomsPerVolume() const
G4double GetMeanExcitationEnergy() const
G4double A23(G4double A) const
G4GLOB_DLL std::ostream G4cout
const XML_Char int const XML_Char * value
static constexpr double eV
const G4double * GetAtomicNumDensityVector() const
static G4DensityEffectData * GetDensityEffectData()
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double GetAdensity(G4int idx) const
G4double GetAdjustmentFactor(G4int idx) const
G4double GetMdensity(G4int idx) const
G4IonisParamElm * GetIonisation() const
const G4Material * GetBaseMaterial() const
static const G4double NTP_Temperature
G4double GetTemperature() const
static constexpr double pi
size_t GetNumberOfElements() const
G4double GetNominalDensity(G4int Z) const
const G4double * GetFractionVector() const
static constexpr double keV