Blame view

src/idl/dustem_create_ionfrac.pro 8.69 KB
041ca6b6   Annie Hughes   updated help
1
function dustem_create_ionfrac, key=key, val=val,help=help
427f1205   Jean-Michel Glorian   version 4.2 merged
2

041ca6b6   Annie Hughes   updated help
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
;+
; 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

  
427f1205   Jean-Michel Glorian   version 4.2 merged
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
;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

041ca6b6   Annie Hughes   updated help
273
the_end:
427f1205   Jean-Michel Glorian   version 4.2 merged
274
275
276
  return,0
  
end