function dustem_create_ionfrac, key=key, val=val,help=help ;+ ; NAME: ; dustem_create_ionfrac ; ; PURPOSE: ; Calculates the neutral/positive/negative PAH fractions for a given ; temperature, density and grain size distribution and writes it to ; the appropriate .DAT file (according to !run_ionfrac). Deprecated ; ; CATEGORY: ; DustEMWrap, Distributed, MidLevel, Deprecated ; ; CALLING SEQUENCE: ; ; INPUTS: ; key -- (1) gas temperature and (2) n_elec ; val -- values corresponding to parameters passed by key ; other physical parameters taken from the dust model as specified in ; the grain structure, i.e. (*!dustem_params).grains ; ; OPTIONAL INPUT PARAMETERS: ; ; OUTPUTS: ; ; OPTIONAL OUTPUT PARAMETERS: ; ; ACCEPTED KEY-WORDS: ; help = print this help ; ; COMMON BLOCKS: ; None ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; PROCEDURES AND SUBROUTINES USED: ; ; EXAMPLES ; ; MODIFICATION HISTORY: ; Written by NF 2007 ; Evolution details on the DustEMWrap gitlab. ; See http://dustemwrap.irap.omp.eu/ for FAQ and help. ;- if N_PARAMS() LT 1 or keyword_set(help) then begin doc_library,'dustem_create_ionfrac' goto, the_end end message,'Obsolete. Should not be run',/continue stop GOTO,the_end ;PURPOSE : ;-------- ; pour une Température et une densité donnée ; pour une liste de taille donnée (en nb de carbone ou angströms) ; donne les fractions de PAH neutre/cation/anion pour chaque taille ; ;INPUTS : ;------- ; gastemp = gas temperature ; sizes = PAHs size in Angstroms ; xe = electronic density relative to the hydrogen ; n_h = hydrogen density in cm-3 ; n_elec = electronic density in cm-3 ; file_isrf = ISRF file ; !run_ionfrac tells where to write the ionization fraction ; 1 : in MIX_xxx.DAT ; 2 : in SIZE_xxx.DAT ;Default values for the parameters gastemp = 100.d0 n_elec = 3.d-4 ;Check if these values have to be modified IF keyword_set(key) THEN BEGIN a=where(key EQ 1,count1) b=where(key EQ 2,count2) IF count1 NE 0 then gastemp=(val(a))(0) IF count2 NE 0 then n_elec=(val(b))(0) ENDIF ;=== GET SIZES === ;Check version of the model ... ; IF getenv('DUSTEM_WHICH') NE 'VERSTRAETE' THEN BEGIN IF !dustem_which NE 'VERSTRAETE' THEN BEGIN message, "YOU SHOULD BE USING THE NEW VERSION OF THE MODEL AND THE INPUT FILES" ; ... and identify PAH0 and PAH1 ENDIF ELSE BEGIN pah0 = (where(strmid((*!dustem_params).grains.type,0,4) eq 'PAH0'))(0) pah1 = (where(strmid((*!dustem_params).grains.type,0,4) eq 'PAH1'))(0) ENDELSE ;Get info on PAH0 and PAH1 sizes test_size = stregex( (*!dustem_params).keywords,'SIZE',/bool,/fold) ; ... either from the SIZE_xxx.DAT files IF test_size THEN BEGIN pah0_nsize = (*(*!dustem_params).size(pah0)).nsize pah1_nsize = (*(*!dustem_params).size(pah1)).nsize pah0_sizes = (*(*!dustem_params).size(pah0)).size_st.a pah1_sizes = (*(*!dustem_params).size(pah1)).size_st.a if pah0_sizes ne pah1_sizes then message, "PAH0 and PAH1 should have the same size distribution. Please correct." sizes = pah0_sizes ENDIF ELSE BEGIN ; ... or from the GRAIN.DAT pah0_nsize = (((*!dustem_params).grains.ndiscr)(pah0))(0) pah1_nsize = (((*!dustem_params).grains.ndiscr)(pah1))(0) alpha0 = (((*!dustem_params).grains.alpha)(pah0))(0) tmin0 = (((*!dustem_params).grains.tmin)(pah0))(0) tmax0 = (((*!dustem_params).grains.tmax)(pah0))(0) alpha1 = (((*!dustem_params).grains.alpha)(pah1))(0) tmin1 = (((*!dustem_params).grains.tmin)(pah1))(0) tmax1 = (((*!dustem_params).grains.tmax)(pah1))(0) if alpha0 ne alpha1 or tmin0 ne tmin1 or tmax0 ne tmax1 then message, "PAH0 and PAH1 should have the same size distribution. Please correct." sizes = fltarr(pah0_nsize) for i=0L,pah0_nsize-1 do begin sizes(i) = tmin0 * exp(i * alog(tmax0/tmin0) / (pah0_nsize-1)) * 1.d8 endfor ENDELSE ;Compute other parameters Nc = (sizes/0.9)^2. ;number of carbon atoms dim_n = pah0_nsize ;OUTPUT : ;-------- ; fn = fraction of neutral PAH ; fc = fraction of cation PAH ; fa = fraction of anion PAH ;----- ; ISRF ;----- lam_isrf = (*!dustem_params).isrf.lambisrf isrf = (*!dustem_params).isrf.isrf ;convert into microns-1 and sort x = 1./lam_isrf isrf=isrf[sort(x)] x=x[sort(x)] dim_l = (size(x))(1) ;-------------------------------------- ; absorption cross sections in UV (refer to L.Verstraete's HDR) ;-------------------------------------- sig_uv_pah = fltarr(dim_l) ;in Mbarn/C ;below 5.9 on = where(x lt 5.9) sig_uv_pah(on) = 6.6*(4.5/x(on)*(3.5*x(on))^2/((x(on)^2-4.5^2)^2+(3.5*x(on))^2)) ;between 5.9 and 10.84 on = where(x ge 5.9 and x lt 10.84) sig_uv_pah(on) = 6.6*(4.5/x(on)*(3.5*x(on))^2/((x(on)^2-4.5^2)^2+(3.5*x(on))^2)) + 0.85*(0.5392*(x(on)-5.9)^2+0.0564*(x(on)-5.9)^2) ;between 10.84 and 21.36 on = where(x ge 10.84 and x lt 21.36) sig_uv_pah(on) = 18.6*(13.4*x(on))^2/((x(on)^2-12.8^2)^2+(13.4*x(on))^2) ;above 21.36 on = where(x ge 21.36) sig_uv_pah(on) = 9.2*(21.36/x(on))^1.7 C = fltarr(dim_n,dim_l) Ec = 8.2/sqrt(Nc)*1./sqrt(1.-sqrt(6./Nc)+2./Nc) ;in eV xc = Ec*1.6/(6.626d-1*3.) ;cutoff frequency in microns-1 for j=0, dim_l-1 do begin for i=0, dim_n-1 do begin C(i,j) = 1./!pi*atan(1.d5*(x(j)/xc(i)-1.)^3) + .5 ;cutoff function endfor endfor sig_uv_pah_tab = fltarr(dim_n,dim_l) for j=0, dim_l-1 do begin for i=0, dim_n-1 do begin sig_uv_pah_tab(i,j) = sig_uv_pah(j) * C(i,j) * Nc(i) * 1.e6 ;in barn (good comparison with L.Verstraete's HDR) endfor endfor ;--------------------- ;ionization parameters ;--------------------- Icoronene = 7.3 ; eV Icoronene = Icoronene*1.6/(6.626d-1*3.) ; microns-1 Ipah_ev = fltarr(dim_n) Ipah_ev = 4.8+10.9/sizes ; eV Ipah = Ipah_ev*1.6/(6.626d-1*3.) ; microns-1 Yion = fltarr(dim_n,dim_l) for j=0, dim_l-1 do begin for i=0, dim_n-1 do begin Yion(i,j) = 0.8*exp(-0.00128*((12.-Icoronene)/(12.-Ipah(i))*(x(j)-12.))^4.) ; energies in microns-1 endfor endfor E_isrf = (6.626d-7*3.)*x*1.d6/1.6 ; lam_isrf in eV, sort in ascending order n_ph = isrf*1./6.626d-27/E_isrf ; photon density in s-1.cm-2.eV-1 sort in ascending order of E_isrf sig_ion = fltarr(dim_n,dim_l) for j=0, dim_l-1 do begin for i=0, dim_n-1 do begin sig_ion(i,j) = Yion(i,j) * sig_uv_pah_tab(i,j) * 1.d-24 ; cm2 endfor endfor f = fltarr(dim_n,dim_l) for j=0, dim_l-1 do begin for i=0, dim_n-1 do begin f(i,j) = (double(sig_ion(i,j)*n_ph(j))) endfor endfor ;----------------------------------- ;definition of reaction efficiencies ;----------------------------------- ;recombination in cm3/s krec = 1.e-6*sqrt(300./gastemp) ; cm3/s krec_s = krec*n_elec ; s-1 ;electronic attachement ke = fltarr(dim_n) ke = 1.e-7*(Nc)^(3./4.) ; cm3/s ke_s = ke*n_elec ; s-1 ;ionization kion = fltarr(dim_n) for i=0, dim_n-1 do begin on = where(E_isrf ge Ipah_ev(i) and E_isrf lt 13.6, count) kion(i) = int_tabulated(E_isrf(on), (f(i,*))(on)) ;BORNES !!!! endfor ;electronic photodetachement kp = fltarr(dim_n) Eae = 3 ;energie d'affinite electronique en eV on_eae = where(E_isrf ge 3 and E_isrf le 13.6) E_isrf2 = E_isrf(on_eae) ;energie isrf de 3 a 13.6 eV n_ph2 = (n_ph)(on_eae) ;densite de photon entre 3 et 13.6 eV Nph = int_tabulated(E_isrf2, n_ph2) ;nombre de photon d'energie comprise entre 3 et 13.6 eV ;kp = sig_uv_pah*Yion*Nc*Nph ;taux de photodetachement electronique sigion = 1.6d-18 kp = sigion * Nc * Nph k_str = {krec:0., ke:fltarr(dim_n), kion:fltarr(dim_n), kp:fltarr(dim_n)} k_str.krec = krec_s & k_str.ke = ke_s & k_str.kion = kion & k_str.kp = kp ;-------------------------------------------- ;fractions of PAH neutral, cations and anions ;-------------------------------------------- fn = (kp*krec*n_elec)/(kp*krec*n_elec+kp*kion+krec*ke*n_elec*n_elec) fc = (kp*kion)/(kp*krec*n_elec+kp*kion+krec*ke*n_elec*n_elec) fa = (krec*ke*n_elec*n_elec)/(kp*krec*n_elec+kp*kion+krec*ke*n_elec*n_elec) f0 = fn f1 = fa + fc ; WRITE RESULTS INTO PROPER "FILES" ; in MIX_xxx.DAT if abs(!run_ionfrac) eq 1. then begin (*(*!dustem_params).mix(pah0)).fmix = f0 (*(*!dustem_params).mix(pah1)).fmix = f1 ; dustem_write_mix, getenv('DUSTEM_DAT'), (*!dustem_params).mix dustem_write_mix, !dustem_dat, (*!dustem_params).mix endif ; in SIZE_xxx.DAT if abs(!run_ionfrac) eq 2. then begin (*(*!dustem_params).size(pah0)).size_st.f_mix = f0 (*(*!dustem_params).size(pah1)).size_st.f_mix = f1 ; dustem_write_size_lv, getenv('DUSTEM_DAT'), (*!dustem_params).size dustem_write_size_lv, !dustem_dat, (*!dustem_params).size endif the_end: RETURN,0 end