2005-11-11 12:35:21 +00:00

96 lines
2.5 KiB
Fortran

OPTIONS /EXTEND_SOURCE
SUBROUTINE chargeStateYields(E,masse,Yield_plus,Yield_zero)
c ===========================================================
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c Die Funktion sowie die Parameter sind uebernommen aus:
c
c M.Gonin, R.Kallenbach, P.Bochsler: 'Charge exchange of hydrogen atoms
c in carbon foils at 0.4 - 120 keV', Rev.Sci.Instrum. 65 (3), March 1994
c
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPLICIT NONE
real E ! kinetische Energie in keV
real masse ! in keV / c**2
real a_zero,a_minus
real k_Fermi,k_zero,k_minus
real zwo_k_Fermi
real k_Fermi_Quad,k_zero_Quad,k_minus_Quad
real vc_minus,vc_plus,v_Bohr,v_rel
parameter ( a_zero = 0.953, a_minus = 0.029 )
parameter ( k_Fermi = 1.178 ) ! [v_Bohr]
parameter ( k_Fermi_Quad = k_Fermi * k_Fermi )
parameter ( zwo_k_fermi = 2. * k_Fermi )
parameter ( k_zero = 0.991*k_Fermi ) ! [v_Bohr]
parameter ( k_zero_Quad = k_zero * k_zero )
parameter ( k_minus = 0.989*k_Fermi ) ! [v_Bohr]
parameter ( k_minus_Quad = k_minus * k_minus )
parameter ( vc_minus = 0.284, vc_plus = 0.193 ) ! [v_Bohr]
parameter ( v_Bohr = 7.2974E-3 ) ! [c]
real Q_zero,Q_minus,D
real Yield_minus,Yield_zero,Yield_plus
real help1,help2,help3
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (E.LT.0) then
write(*,*)
write(*,*) 'error in subroutine ''chargeStateYields'':'
write(*,*) 'E = ',E,' < 0!'
write(*,*) '-> STOP'
write(*,*)
STOP
endif
c Energie in Geschwindigkeit umrechnen (in Einheiten von v_Bohr):
c - klassisch:
v_rel = SQRT(2.*E/masse) / v_Bohr
c - relativistisch:
c help1 = 1. + E/masse
c v_rel = SQRT(1. - 1./(help1*help1)) / v_Bohr
c Die geladenen Anteile berechnen (vgl. obige Referenz):
help1 = v_rel*v_rel
help2 = zwo_k_Fermi*v_rel
Q_zero = 1. + (k_zero_Quad - k_Fermi_Quad - help1) / help2
Q_minus = 1. + (k_minus_Quad - k_Fermi_Quad - help1) / help2
help1 = a_zero * Q_zero
help2 = a_minus * Q_minus
help3 = (1.-Q_zero)*(1.-Q_minus)
D = help1*(help2 + (1.-Q_minus)) + help3
Yield_minus = help1*help2 / D
Yield_plus = help3 / D
Yield_minus = Yield_minus * exp(-vc_minus/v_rel)
Yield_plus = Yield_plus * exp(-vc_plus /v_rel)
Yield_zero = 1. - (Yield_minus + Yield_plus)
c write(6,*) 'E vrel Neutral Plus Minus'
c write(6,*) E, v_rel, yield_zero, yield_plus, yield_minus
END