dustem_create_ionfrac.pro
8.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
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
;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