62 fMeanEnergyPerIon = 0.0;
68 fAdjustmentFactor = 1.0;
72 ComputeMeanParameters();
73 ComputeDensityEffect();
75 ComputeIonParameters();
84 : fMaterial(0), fShellCorrectionVector(0)
86 fMeanExcitationEnergy = 0.0;
87 fLogMeanExcEnergy = 0.0;
96 fAdjustmentFactor = 0.0;
100 fLogEnergy1fluct = 0.0;
102 fLogEnergy2fluct = 0.0;
104 fRateionexcfluct = 0.0;
110 fMeanEnergyPerIon = 0.0;
118 if (fShellCorrectionVector) {
delete [] fShellCorrectionVector; }
119 if (fDensityData) {
delete fDensityData; }
121 fShellCorrectionVector = 0;
126 void G4IonisParamMat::ComputeMeanParameters()
131 fMeanExcitationEnergy = 0.;
132 fLogMeanExcEnergy = 0.;
143 if(fMeanExcitationEnergy > 0.0) {
144 fLogMeanExcEnergy =
G4Log(fMeanExcitationEnergy);
148 for (
size_t i=0; i < nElements; i++) {
150 fLogMeanExcEnergy += nAtomsPerVolume[i]*elm->
GetZ()
154 fMeanExcitationEnergy =
G4Exp(fLogMeanExcEnergy);
157 fShellCorrectionVector =
new G4double[3];
159 for (
G4int j=0; j<=2; j++)
161 fShellCorrectionVector[j] = 0.;
163 for (
size_t k=0; k<nElements; k++) {
164 fShellCorrectionVector[j] += nAtomsPerVolume[k]
165 *(((*elmVector)[k])->GetIonisation()->GetShellCorrectionVector())[j];
180 void G4IonisParamMat::ComputeDensityEffect()
189 if(idx < 0 && 1 == nelm) {
216 fX0density += corr/twoln10;
217 fX1density += corr/twoln10;
229 fCdensity = 1. + 2*
G4Log(fMeanExcitationEnergy/fPlasmaEnergy);
236 static const G4double ClimiS[] = {3.681 , 5.215 };
237 static const G4double X0valS[] = {1.0 , 1.5 };
238 static const G4double X1valS[] = {2.0 , 3.0 };
240 if(fMeanExcitationEnergy < E100eV) { icase = 0; }
243 if(fCdensity < ClimiS[icase]) { fX0density = 0.2; }
244 else { fX0density = 0.326*fCdensity - X0valS[icase]; }
246 fX1density = X1valS[icase]; fMdensity = 3.0;
249 if (1 == nelm && 1 == Z0) {
250 fX0density = 0.425; fX1density = 2.0; fMdensity = 5.949;
264 if(fCdensity < 10.) {
266 }
else if(fCdensity < 11.5) {
267 fX0density = 1.6 + 0.2*(fCdensity - 10.);
268 }
else if(fCdensity < 12.25) {
269 fX0density = 1.9 + (fCdensity - 11.5)/7.5;
270 }
else if(fCdensity < 13.804) {
272 fX1density = 4.0 + (fCdensity - 12.25)/1.554;
274 fX0density = 0.326*fCdensity-2.5; fX1density = 5.0;
278 if (1 == nelm && 1 == Z0) {
279 fX0density = 1.837; fX1density = 3.0; fMdensity = 4.754;
283 if (1 == nelm && 2 == Z0) {
284 fX0density = 2.191; fX1density = 3.0; fMdensity = 3.297;
303 fCdensity -= ParCorr;
304 fX0density -= ParCorr/twoln10;
305 fX1density -= ParCorr/twoln10;
309 if(0.0 == fD0density) {
311 fAdensity = twoln10*(Xa-fX0density)
312 /std::pow((fX1density-fX0density),fMdensity);
330 void G4IonisParamMat::ComputeFluctModel()
339 if (Zeff > 2.) { fF2fluct = 2./Zeff; }
340 else { fF2fluct = 0.; }
342 fF1fluct = 1. - fF2fluct;
343 fEnergy2fluct = 10.*Zeff*Zeff*
eV;
344 fLogEnergy2fluct =
G4Log(fEnergy2fluct);
345 fLogEnergy1fluct = (fLogMeanExcEnergy - fF2fluct*fLogEnergy2fluct)
347 fEnergy1fluct =
G4Exp(fLogEnergy1fluct);
348 fEnergy0fluct = 10.*
eV;
349 fRateionexcfluct = 0.4;
354 void G4IonisParamMat::ComputeIonParameters()
358 const G4double* theAtomicNumDensityVector =
366 if( 1 == NumberOfElements ) {
367 const G4Element* element = (*theElementVector)[0];
374 for (
G4int iel=0; iel<NumberOfElements; iel++)
376 const G4Element* element = (*theElementVector)[iel];
391 fFermiEnergy = 25.*
keV*vF*vF;
399 if(value == fMeanExcitationEnergy || value <= 0.0) {
return; }
401 G4cout <<
"G4Material: Mean excitation energy is changed for "
403 <<
" Iold= " << fMeanExcitationEnergy/
eV
404 <<
"eV; Inew= " << value/
eV <<
" eV;"
408 fMeanExcitationEnergy =
value;
412 G4double corr = 2*(newlog - fLogMeanExcEnergy);
414 fX0density += corr/twoln10;
415 fX1density += corr/twoln10;
418 fLogMeanExcEnergy = newlog;
430 size_t numberOfMolecula = 54;
433 "NH_3",
"C_4H_10",
"CO_2",
"C_2H_6",
"C_7H_16-Gas",
435 "C_6H_14-Gas",
"CH_4",
"NO",
"N_2O",
"C_8H_18-Gas",
437 "C_5H_12-Gas",
"C_3H_8",
"H_2O-Gas",
441 "C_3H_6O",
"C_6H_5NH_2",
"C_6H_6",
"C_4H_9OH",
"CCl_4",
443 "C_6H_5Cl",
"CHCl_3",
"C_6H_12",
"C_6H_4Cl_2",
"C_4Cl_2H_8O",
445 "C_2Cl_2H_4",
"(C_2H_5)_2O",
"C_2H_5OH",
"C_3H_5(OH)_3",
"C_7H_16",
447 "C_6H_14",
"CH_3OH",
"C_6H_5NO_2",
"C_5H_12",
"C_3H_7OH",
449 "C_5H_5N",
"C_8H_8",
"C_2Cl_4",
"C_7H_8",
"C_2Cl_3H",
455 "C_5H_5N_5",
"C_5H_5N_5O",
"(C_6H_11NO)-nylon",
"C_25H_52",
457 "(C_2H_4)-Polyethylene",
"(C_5H_8O_2)-Polymethil_Methacrylate",
459 "(C_8H_8)-Polystyrene",
"A-150-tissue",
"Al_2O_3",
"CaF_2",
461 "LiF",
"Photo_Emulsion",
"(C_2F_4)-Teflon",
"SiO_2"
465 static const G4double meanExcitation[54] = {
467 53.7, 48.3, 85.0, 45.4, 49.2,
468 49.1, 41.7, 87.8, 84.9, 49.5,
471 64.2, 66.2, 63.4, 59.9, 166.3,
472 89.1, 156.0, 56.4, 106.5, 103.3,
473 111.9, 60.0, 62.9, 72.6, 54.4,
474 54.0, 67.6, 75.8, 53.6, 61.1,
475 66.2, 64.0, 159.2, 62.5, 148.1,
478 71.4, 75.0, 63.9, 48.3, 57.4,
479 74.0, 68.7, 65.1, 145.2, 166.,
480 94.0, 331.0, 99.1, 139.2
485 for(
size_t i=0; i<numberOfMolecula; i++) {
486 if(chFormula == name[i]) {
487 x = meanExcitation[i]*
eV;
498 fShellCorrectionVector = 0;
509 fMaterial = right.fMaterial;
510 fMeanExcitationEnergy = right.fMeanExcitationEnergy;
511 fLogMeanExcEnergy = right.fLogMeanExcEnergy;
512 if(fShellCorrectionVector){
delete [] fShellCorrectionVector; }
513 fShellCorrectionVector =
new G4double[3];
514 fShellCorrectionVector[0] = right.fShellCorrectionVector[0];
515 fShellCorrectionVector[1] = right.fShellCorrectionVector[1];
516 fShellCorrectionVector[2] = right.fShellCorrectionVector[2];
518 fCdensity = right.fCdensity;
519 fMdensity = right.fMdensity;
520 fAdensity = right.fAdensity;
521 fX0density = right.fX0density;
522 fX1density = right.fX1density;
523 fD0density = right.fD0density;
524 fPlasmaEnergy = right.fPlasmaEnergy;
525 fAdjustmentFactor = right.fAdjustmentFactor;
526 fF1fluct = right.fF1fluct;
527 fF2fluct = right.fF2fluct;
528 fEnergy1fluct = right.fEnergy1fluct;
529 fLogEnergy1fluct = right.fLogEnergy1fluct;
530 fEnergy2fluct = right.fEnergy2fluct;
531 fLogEnergy2fluct = right.fLogEnergy2fluct;
532 fEnergy0fluct = right.fEnergy0fluct;
533 fRateionexcfluct = right.fRateionexcfluct;
535 fFermiEnergy = right.fFermiEnergy;
536 fLfactor = right.fLfactor;
537 fInvA23 = right.fInvA23;
538 fBirks = right.fBirks;
539 fMeanEnergyPerIon = right.fMeanEnergyPerIon;
540 fDensityData = right.fDensityData;
541 twoln10 = right.twoln10;
G4double GetPressure() const
static G4Pow * GetInstance()
G4IonisParamMat & operator=(const G4IonisParamMat &)
G4double GetTotNbOfElectPerVolume() const
std::vector< G4Element * > G4ElementVector
G4int GetElementIndex(G4int Z, G4State mState)
G4double FindMeanExcitationEnergy(const G4String &chFormula)
const G4String & GetChemicalFormula() const
void SetMeanExcitationEnergy(G4double value)
const G4String & GetName() const
G4double GetDensity() const
G4double GetLFactor() const
const G4ElementVector * GetElementVector() const
static G4NistManager * Instance()
G4double logZ(G4int Z) const
G4double GetFermiVelocity() const
const G4double * GetVecNbOfAtomsPerVolume() const
G4double GetMeanExcitationEnergy() const
G4GLOB_DLL std::ostream G4cout
G4double GetX1density(G4int idx)
G4int GetIndex(const G4String &matName)
virtual ~G4IonisParamMat()
G4double GetPlasmaEnergy(G4int idx)
const G4double * GetAtomicNumDensityVector() const
static G4DensityEffectData * GetDensityEffectData()
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double GetAdensity(G4int idx)
G4IonisParamMat(G4Material *)
G4IonisParamElm * GetIonisation() const
const G4Material * GetBaseMaterial() const
G4double Z23(G4int Z) const
G4int operator!=(const G4IonisParamMat &) const
G4double GetCdensity(G4int idx)
G4double GetTemperature() const
const XML_Char int const XML_Char * value
G4double GetMdensity(G4int idx)
size_t GetNumberOfElements() const
G4double GetDelta0density(G4int idx)
const G4double * GetFractionVector() const
G4int operator==(const G4IonisParamMat &) const
G4double GetAdjustmentFactor(G4int idx)
G4double GetX0density(G4int idx)