Module PHYSAT ! Implicit None ! Private Public :: NUM_NUCLEUS, SET_NAN, INITIALIZATION, NUCLEUS, & LAMBDA_VAC, LAMBDA_AIR, Eion_multi Public :: h_cste, c_cste, q_cste, zero, nan Public :: Z,Ion,code,lbd_vac,lbd_air,Ei_eV,Ej_eV,Ei_cm,Ej_cm, & gi, gj, loggf, f, gam_rad, gam_Sta, gam_VdW, & config_i, config_j, ref, cELt, & Elt_multi, Z_multi ! Real, parameter :: h_cste = 6.62606957e-34 Real, parameter :: c_cste = 2.99792458e+08 Real, parameter :: q_cste = 1.602176565e-19 ! Real, parameter :: zero = 0.0 Real :: nan ! Integer, parameter :: N_NUC = 111 Character(len = 2), dimension(N_NUC), parameter :: NUCLEUS = (/& " H", "He", "Li", "Be", " B", " C", " N", " O", " F", "Ne", & "Na", "Mg", "Al", "Si", " P", " S", "Cl", "Ar", " K", "Ca", & "Sc", "Ti", " V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", & "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", " Y", "Zr", & "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", & "Sb", "Te", " I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", & "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", & "Lu", "Hf", "Ta", " W", "Re", "Os", "Ir", "Pt", "Au", "Hg", & "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", & "Pa", " U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", & "Md", "No", "Lw", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", & "Rg" /) ! Integer :: Z ! 1 for H, ... 26 for Fe etc. Integer :: Ion ! 1 for neutral, 2 for first ionized etc. Real :: code ! Ex 26.0 means Fe I, 26.1 means Fe II, etc. Real :: lbd_air ! wavelength in the air in Angstroem Real :: lbd_vac ! wavelenght in the vacuum in Angstroem Real :: Ei_eV, Ej_eV ! Energy levels in eV Real :: Ei_cm, Ej_cm ! Energy levels in cm⁻¹ Integer :: gi, gj ! Total momenta, Statistical weights Real :: loggf, f ! Oscillator strength Real :: gam_rad, gam_Sta, gam_VdW ! broadening parameters Character(len = 15) :: config_i, config_j ! Electronic configuration Character(len = 256) :: cElt Character(len=5) :: ref Integer, parameter :: nElt = 16 Character(len=2), dimension(nElt), parameter :: Elt_multi = (/ & " H", "HE", " C", " N", " O", "NE", "NA", "MG", "AL", "SI", & " S", " K", "CA", "CR", "FE", "NI" /) Integer, dimension(nElt), parameter :: Z_multi = (/ & 1, 2, 6, 7, 8, 10, 11, 12, 13, 14, 16, 19, 20, 24, 26, 28 /) ! CONTAINS ! !-------------------------------------------------------------------- ! Real Function Eion_multi(Z,Ion) Integer, intent(in) :: Z,Ion Select Case (Ion) Case (1) Select Case(Z) Case(01); Eion_multi = 13.595 ! H I Case(02); Eion_multi = 24.580 ! HE I Case(06); Eion_multi = 11.256 ! C I Case(07); Eion_multi = 14.529 ! N I Case(08); Eion_multi = 13.614 ! O I Case(10); Eion_multi = 21.559 ! NE I Case(11); Eion_multi = 5.138 ! NA I Case(12); Eion_multi = 7.644 ! MG I Case(13); Eion_multi = 5.984 ! AL I Case(14); Eion_multi = 8.149 ! SI I Case(16); Eion_multi = 10.357 ! S I Case(19); Eion_multi = 4.339 ! K I Case(20); Eion_multi = 6.111 ! CA I Case(24); Eion_multi = 6.763 ! CR I Case(26); Eion_multi = 7.896 ! FE I Case(28); Eion_multi = 7.633 ! NI I Case Default Eion_multi = 0.000 Write(*,*)"WARNING: EION_MULTI: ELEMENT NOT INCLUDED IN MULTI." End Select Case (2) Select Case(Z) Case(02); Eion_multi = 54.403 ! HE II Case(06); Eion_multi = 24.376 ! C II Case(07); Eion_multi = 29.593 ! N II Case(08); Eion_multi = 35.108 ! O II Case(10); Eion_multi = 41.071 ! NE II Case(11); Eion_multi = 47.290 ! NA II Case(12); Eion_multi = 15.031 ! MG II Case(13); Eion_multi = 18.823 ! AL II Case(14); Eion_multi = 16.339 ! SI II Case(16); Eion_multi = 23.405 ! S II Case(19); Eion_multi = 31.810 ! K II Case(20); Eion_multi = 11.868 ! CA II Case(24); Eion_multi = 16.493 ! CR II Case(26); Eion_multi = 16.178 ! FE II Case(28); Eion_multi = 18.147 ! NI II Case Default Eion_multi = 0.000 Write(*,*)"WARNING: EION_MULTI: ELEMENT NOT INCLUDED IN MULTI." End Select Case Default Eion_multi = 0.000 Write(*,*)"WARNING: EION_MULTI: IONIZATION STAGE NOT INCLUDED IN MULTI." End Select End Function Eion_multi ! !-------------------------------------------------------------------- ! Subroutine INITIALIZATION() ! Logical :: blabla = .FALSE. ! nan = SET_NAN(zero) ! If(blabla) Then Write(*, *) "Z, Ion, code" Write(*, *) Z, Ion, code End If ! Z = zero Ion = zero code = nan lbd_air = nan lbd_vac = nan Ei_eV = nan Ej_eV = nan Ei_cm = nan Ej_cm = nan gi = 0 gj = 0 loggf = nan gam_rad = nan gam_Sta = nan gam_VdW = nan config_i = '' config_j = '' ref = '' ! If(blabla) Then Write(*, *) "Z, Ion, code" Write(*, *) Z, Ion, code Write(*, *) End If ! End Subroutine INITIALIZATION ! !-------------------------------------------------------------------- ! Real Function SET_NAN(zero) Real, Intent(In) :: zero SET_NAN = zero / zero End Function SET_NAN ! !-------------------------------------------------------------------- ! Integer Function NUM_NUCLEUS(chain) Character(len = *), intent(in) :: chain Integer :: J Logical :: blabla = .FALSE. ! Do J = 1, N_NUC If (blabla) Write(*, *) "chain, NUCLEUS(J) = ", Trim(chain), NUCLEUS(J) If (Trim(chain) == Trim(Adjustl(NUCLEUS(J)))) EXIT End Do ! IF (J == N_NUC + 1) STOP "IN FUNCTION NUM_NUCLEUS: NUCLEUS UNKNOWN." ! NUM_NUCLEUS = J ! End Function NUM_NUCLEUS ! !-------------------------------------------------------------------- ! Double Precision Function LAMBDA_VAC(x) !Conversion des longueurs d'onde de l'air dans le vide en A !dans les conditions standards de température et de pression !IAU Morton (1991, ApJS, 77, 119) !http://www.sdss.org/DR6/products/spectra/vacwavelength.html ! Double Precision, intent(in) :: x ! in Angstroem LAMBDA_VAC = x * (1.0D0 + 2.735182D-4 + 131.4182D0 / x**2 + 2.76249D8 / x**4) ! End Function LAMBDA_VAC ! !-------------------------------------------------------------------- ! Double Precision Function LAMBDA_AIR(x) !Conversion des longueurs d'onde du vide dans l'air en A !dans les conditions standards de température et de pression !IAU Morton (1991, ApJS, 77, 119) !http://www.sdss.org/DR6/products/spectra/vacwavelength.html ! Double Precision, intent(in) :: x ! in Angstroem LAMBDA_AIR = x / (1.0D0 + 2.735182D-4 + 131.4182D0 / x**2 + 2.76249D8 / x**4) ! End Function LAMBDA_AIR End Module PHYSAT