60 fMeanEnergyPerIon = 0.0;
66 fAdjustmentFactor = 1.0;
70 ComputeMeanParameters();
71 ComputeDensityEffect();
73 ComputeIonParameters();
82 : fMaterial(0), fShellCorrectionVector(0)
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;
116 if (fShellCorrectionVector) {
delete [] fShellCorrectionVector; }
117 if (fDensityData) {
delete fDensityData; }
119 fShellCorrectionVector = 0;
124void G4IonisParamMat::ComputeMeanParameters()
129 fMeanExcitationEnergy = 0.;
130 fLogMeanExcEnergy = 0.;
141 if(fMeanExcitationEnergy > 0.0) {
142 fLogMeanExcEnergy = std::log(fMeanExcitationEnergy);
146 for (
size_t i=0; i < nElements; i++) {
148 fLogMeanExcEnergy += nAtomsPerVolume[i]*elm->
GetZ()
152 fMeanExcitationEnergy = std::exp(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];
178void G4IonisParamMat::ComputeDensityEffect()
187 if(idx < 0 && 1 == nelm) {
214 fX0density += corr/twoln10;
215 fX1density += corr/twoln10;
220 const G4double Cd2 = 4*
pi*hbarc_squared*classic_electr_radius;
227 fCdensity = 1. + 2*std::log(fMeanExcitationEnergy/fPlasmaEnergy);
234 const G4double ClimiS[] = {3.681 , 5.215 };
235 const G4double X0valS[] = {1.0 , 1.5 };
236 const G4double X1valS[] = {2.0 , 3.0 };
238 if(fMeanExcitationEnergy < E100eV) { icase = 0; }
241 if(fCdensity < ClimiS[icase]) { fX0density = 0.2; }
242 else { fX0density = 0.326*fCdensity - X0valS[icase]; }
244 fX1density = X1valS[icase]; fMdensity = 3.0;
247 if (1 == nelm && 1 == Z0) {
248 fX0density = 0.425; fX1density = 2.0; fMdensity = 5.949;
256 const G4double ClimiG[] = { 10. , 10.5 , 11. , 11.5 , 12.25 , 13.804};
257 const G4double X0valG[] = { 1.6 , 1.7 , 1.8 , 1.9 , 2.0 , 2.0 };
258 const G4double X1valG[] = { 4.0 , 4.0 , 4.0 , 4.0 , 4.0 , 5.0 };
261 fX0density = 0.326*fCdensity-2.5 ; fX1density = 5.0 ; fMdensity = 3. ;
262 while((icase > 0)&&(fCdensity < ClimiG[icase])) { icase-- ; }
263 fX0density = X0valG[icase]; fX1density = X1valG[icase];
266 if (1 == nelm && 1 == Z0) {
267 fX0density = 1.837; fX1density = 3.0; fMdensity = 4.754;
271 if (1 == nelm && 2 == Z0) {
272 fX0density = 2.191; fX1density = 3.0; fMdensity = 3.297;
287 G4double DensitySTP = Density*STP_Pressure*Temp/(Pressure*STP_Temperature);
289 G4double ParCorr = std::log(Density/DensitySTP);
291 fCdensity -= ParCorr;
292 fX0density -= ParCorr/twoln10;
293 fX1density -= ParCorr/twoln10;
297 if(0.0 == fD0density) {
299 fAdensity = twoln10*(Xa-fX0density)
300 /std::pow((fX1density-fX0density),fMdensity);
318void G4IonisParamMat::ComputeFluctModel()
327 if (Zeff > 2.) { fF2fluct = 2./Zeff; }
328 else { fF2fluct = 0.; }
330 fF1fluct = 1. - fF2fluct;
331 fEnergy2fluct = 10.*Zeff*Zeff*eV;
332 fLogEnergy2fluct = std::log(fEnergy2fluct);
333 fLogEnergy1fluct = (fLogMeanExcEnergy - fF2fluct*fLogEnergy2fluct)
335 fEnergy1fluct = std::exp(fLogEnergy1fluct);
336 fEnergy0fluct = 10.*eV;
337 fRateionexcfluct = 0.4;
342void G4IonisParamMat::ComputeIonParameters()
346 const G4double* theAtomicNumDensityVector =
352 G4double z(0.0), vF(0.0), lF(0.0), norm(0.0), a23(0.0);
354 if( 1 == NumberOfElements ) {
355 const G4Element* element = (*theElementVector)[0];
362 for (
G4int iel=0; iel<NumberOfElements; iel++)
364 const G4Element* element = (*theElementVector)[iel];
365 const G4double weight = theAtomicNumDensityVector[iel];
367 z += element->
GetZ() * weight;
379 fFermiEnergy = 25.*keV*vF*vF;
387 if(value == fMeanExcitationEnergy || value <= 0.0) {
return; }
389 G4cout <<
"G4Material: Mean excitation energy is changed for "
391 <<
" Iold= " << fMeanExcitationEnergy/eV
392 <<
"eV; Inew= " << value/eV <<
" eV;"
396 fMeanExcitationEnergy = value;
400 G4double corr = 2*(newlog - fLogMeanExcEnergy);
402 fX0density += corr/twoln10;
403 fX1density += corr/twoln10;
406 fLogMeanExcEnergy = newlog;
418 const size_t numberOfMolecula = 54;
419 static G4String name[numberOfMolecula] = {
421 "NH_3",
"C_4H_10",
"CO_2",
"C_2H_6",
"C_7H_16",
422 "C_6H_14",
"CH_4",
"NO",
"N_2O",
"C_8H_18",
423 "C_5H_12",
"C_3H_8",
"H_2O-Gas",
426 "C_3H_6O",
"C_6H_5NH_2",
"C_6H_6",
"C_4H_9OH",
"CCl_4",
427 "C_6H_5Cl",
"CHCl_3",
"C_6H_12",
"C_6H_4Cl_2",
"C_4Cl_2H_8O",
428 "C_2Cl_2H_4",
"(C_2H_5)_2O",
"C_2H_5OH",
"C_3H_5(OH)_3",
"C_7H_16",
429 "C_6H_14",
"CH_3OH",
"C_6H_5NO_2",
"C_5H_12",
"C_3H_7OH",
430 "C_5H_5N",
"C_8H_8",
"C_2Cl_4",
"C_7H_8",
"C_2Cl_3H",
434 "C_5H_5N_5",
"C_5H_5N_5O",
"(C_6H_11NO)-nylon",
"C_25H_52",
435 "(C_2H_4)-Polyethylene",
"(C_5H_8O-2)-Polymethil_Methacrylate",
436 "(C_8H_8)-Polystyrene",
"A-150-tissue",
"Al_2O_3",
"CaF_2",
437 "LiF",
"Photo_Emulsion",
"(C_2F_4)-Teflon",
"SiO_2"
440 static G4double meanExcitation[numberOfMolecula] = {
442 53.7, 48.3, 85.0, 45.4, 49.2,
443 49.1, 41.7, 87.8, 84.9, 49.5,
446 64.2, 66.2, 63.4, 59.9, 166.3,
447 89.1, 156.0, 56.4, 106.5, 103.3,
448 111.9, 60.0, 62.9, 72.6, 54.4,
449 54.0, 67.6, 75.8, 53.6, 61.1,
450 66.2, 64.0, 159.2, 62.5, 148.1,
453 71.4, 75.0, 63.9, 48.3, 57.4,
454 74.0, 68.7, 65.1, 145.2, 166.,
455 94.0, 331.0, 99.1, 139.2
460 for(
size_t i=0; i<numberOfMolecula; i++) {
461 if(chFormula == name[i]) {
462 x = meanExcitation[i]*eV;
473 fShellCorrectionVector = 0;
484 fMaterial = right.fMaterial;
485 fMeanExcitationEnergy = right.fMeanExcitationEnergy;
486 fLogMeanExcEnergy = right.fLogMeanExcEnergy;
487 if(fShellCorrectionVector){
delete [] fShellCorrectionVector; }
488 fShellCorrectionVector =
new G4double[3];
489 fShellCorrectionVector[0] = right.fShellCorrectionVector[0];
490 fShellCorrectionVector[1] = right.fShellCorrectionVector[1];
491 fShellCorrectionVector[2] = right.fShellCorrectionVector[2];
493 fCdensity = right.fCdensity;
494 fMdensity = right.fMdensity;
495 fAdensity = right.fAdensity;
496 fX0density = right.fX0density;
497 fX1density = right.fX1density;
498 fD0density = right.fD0density;
499 fPlasmaEnergy = right.fPlasmaEnergy;
500 fAdjustmentFactor = right.fAdjustmentFactor;
501 fF1fluct = right.fF1fluct;
502 fF2fluct = right.fF2fluct;
503 fEnergy1fluct = right.fEnergy1fluct;
504 fLogEnergy1fluct = right.fLogEnergy1fluct;
505 fEnergy2fluct = right.fEnergy2fluct;
506 fLogEnergy2fluct = right.fLogEnergy2fluct;
507 fEnergy0fluct = right.fEnergy0fluct;
508 fRateionexcfluct = right.fRateionexcfluct;
510 fFermiEnergy = right.fFermiEnergy;
511 fLfactor = right.fLfactor;
512 fInvA23 = right.fInvA23;
513 fBirks = right.fBirks;
514 fMeanEnergyPerIon = right.fMeanEnergyPerIon;
515 fDensityData = right.fDensityData;
516 twoln10 = right.twoln10;
std::vector< G4Element * > G4ElementVector
G4DLLIMPORT std::ostream G4cout
G4double GetCdensity(G4int idx)
G4int GetIndex(const G4String &matName)
G4double GetPlasmaEnergy(G4int idx)
G4double GetX0density(G4int idx)
G4double GetAdjustmentFactor(G4int idx)
G4int GetElementIndex(G4int Z, G4State mState)
G4double GetMdensity(G4int idx)
G4double GetDelta0density(G4int idx)
G4double GetAdensity(G4int idx)
G4double GetX1density(G4int idx)
G4IonisParamElm * GetIonisation() const
G4double GetFermiVelocity() const
G4double GetLFactor() const
G4double GetMeanExcitationEnergy() const
G4IonisParamMat & operator=(const G4IonisParamMat &)
G4double FindMeanExcitationEnergy(const G4String &chFormula)
static G4DensityEffectData * GetDensityEffectData()
G4int operator==(const G4IonisParamMat &) const
virtual ~G4IonisParamMat()
void SetMeanExcitationEnergy(G4double value)
G4IonisParamMat(G4Material *)
G4int operator!=(const G4IonisParamMat &) const
G4double GetPressure() const
G4double GetDensity() const
const G4String & GetChemicalFormula() const
const G4ElementVector * GetElementVector() const
const G4Material * GetBaseMaterial() const
G4double GetTemperature() const
const G4double * GetFractionVector() const
G4double GetTotNbOfElectPerVolume() const
size_t GetNumberOfElements() const
const G4double * GetAtomicNumDensityVector() const
const G4double * GetVecNbOfAtomsPerVolume() const
const G4String & GetName() const
static G4NistManager * Instance()
static G4Pow * GetInstance()