source: trunk/LMDZ.MARS/libf/aeronomars/photochemist_B.F @ 226

Last change on this file since 226 was 38, checked in by emillour, 14 years ago

Ajout du modè Martien (mon LMDZ.MARS.BETA, du 28/01/2011) dans le rértoire mars, pour pouvoir suivre plus facilement les modifs.
EM

File size: 54.2 KB
Line 
1c*****************************************************************
2c
3c     Photochemical routines for Scheme B
4c
5c     Author: Franck Lefevre
6c     ------
7c
8c     update 12/06/2003: compatibility with dust and iceparty
9c        (S. Lebonnois)
10c     update sept. 2008: identify tracer indexes using tracer names
11c        (Ehouarn Millour)
12c
13c*****************************************************************
14c
15      subroutine photochemist_B(lswitch,zycol, sza, ptimestep, press,
16c     $                          temp, dens, dist_sol)
17     $                          temp, dens, dist_sol, jo3)
18c
19c
20      implicit none
21c
22#include "dimensions.h"
23#include "dimphys.h"
24#include "chimiedata.h"
25#include "callkeys.h"
26#include "tracer.h"
27c
28cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
29c     input/output:
30cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
31c     
32      real zycol(nlayermx,nqmx)  ! chemical species volume mixing ratio
33c if water, zycol(l,i_h2o_ice) is ice surface area (in microns^2/cm^3)
34c
35cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
36c     inputs:
37cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
38c     
39      real sza                   ! solar zenith angle (deg)
40      real ptimestep             ! physics timestep (s)
41      real press(nlayermx)       ! pressure (hpa)
42      real temp(nlayermx)        ! temperature (k)
43      real dens(nlayermx)        ! density (cm-3)
44      real dist_sol              ! sun distance (au)
45c
46cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
47c     output:
48cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
49c     
50      real jo3(nlayermx)  ! photodissociation rate O3 -> O1D
51c
52cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
53c     local:
54cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
55c
56      integer phychemrat         ! ratio physics timestep/chemistry timestep
57      integer istep
58      integer i_o3,lev,iq
59      integer nesp
60      integer lswitch
61c
62      parameter (nesp = 15)      ! number of species in the chemistry
63c
64      real ctimestep             ! chemistry timestep (s)
65      real rm(nlayermx,nesp)     ! species volume mixing ratio
66      real j(nlayermx,nd)        ! interpolated photolysis rates (s-1)
67      real icesurf(nlayermx)     ! ice surface area (cm^2/cm^3)
68      real rmo3(nlayermx)        ! ozone mixing ratio
69c
70c     reaction rates
71c
72      real a001(nlayermx), a002(nlayermx), a003(nlayermx)
73      real b001(nlayermx), b002(nlayermx), b003(nlayermx),
74     $     b004(nlayermx), b005(nlayermx), b006(nlayermx)
75      real c001(nlayermx), c002(nlayermx), c003(nlayermx),
76     $     c004(nlayermx), c005(nlayermx), c006(nlayermx),
77     $     c007(nlayermx), c008(nlayermx), c009(nlayermx),
78     $     c010(nlayermx), c011(nlayermx), c012(nlayermx),
79     $     c013(nlayermx), c014(nlayermx), c015(nlayermx),
80     $     c016(nlayermx), c017(nlayermx), c018(nlayermx)
81      real d001(nlayermx), d002(nlayermx), d003(nlayermx)
82      real e001(nlayermx), e002(nlayermx)
83      real h001(nlayermx), h002(nlayermx)
84
85      logical,save :: firstcall=.true.
86      integer,save :: i_h2o_ice=0 ! water ice tracer index
87
88! Initializations (at first call only)
89      if (firstcall) then
90        ! find index of water ice tracer
91        do iq=1,nqmx
92          if (noms(iq).eq."h2o_ice") then
93            i_h2o_ice=iq
94          endif
95        enddo
96        ! verify that it is the same index as the global one:
97        if (i_h2o_ice.ne.igcm_h2o_ice) then
98          write(*,*) "photochemist_B: Error ; found water ice tracer",
99     &               " index ",i_h2o_ice," does not match GCM index ",
100     &               " igcm_h2o_ice=",igcm_h2o_ice
101          stop
102        endif
103        ! also check that there indeed is an "h2o_ice" tracer
104        if (i_h2o_ice.eq.0) then
105          write(*,*) "photochemist_B: Error ; did not find",
106     &               " water ice tracer"
107          stop
108        endif
109        firstcall=.false.
110      endif
111
112c
113cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
114c     ctimestep : chemistry timestep (s)                         c
115cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
116c
117      ctimestep = 10.*60.
118c
119      phychemrat = int(ptimestep/ctimestep)
120c     print*,"PHYCHEMRAT = ",phychemrat
121c
122cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
123c     initialisation of chemical species and families            c
124cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
125c
126      call gcmtochim(zycol, lswitch, nesp, rm)
127c
128cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
129c     ice surface area for heterogenous chemistry
130cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
131c
132      if (water) then
133       do lev=1,lswitch-1
134!        icesurf(lev)= zycol(lev,nqmx-1)*1.e-8 ! microns^2 -> cm^2
135        icesurf(lev)= zycol(lev,i_h2o_ice)*1.e-8 ! microns^2 -> cm^2
136       enddo
137      else
138       do lev=1,lswitch-1
139        icesurf(lev)=0.0e0
140       enddo
141      endif
142c
143cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
144c     compute reaction rates                                     c
145cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
146c
147      call chemrates(lswitch, dens, press, temp, icesurf,
148     $               a001, a002, a003,
149     $               b001, b002, b003, b004, b005, b006,
150     $               c001, c002, c003, c004, c005, c006,
151     $               c007, c008, c009, c010, c011, c012,
152     $               c013, c014, c015, c016, c017, c018,
153     $               d001, d002, d003,
154     $               e001, e002,
155     $               h001, h002)
156c
157cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
158c     interpolation of photolysis rates in the lookup table      c
159cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
160c
161      i_o3 = 5
162c
163      do lev=1,lswitch-1
164        rmo3(lev)=rm(lev,i_o3)
165      enddo
166
167      call phot(lswitch, press, temp, sza, dist_sol, rmo3, j)
168c
169      do lev=1,lswitch-1
170        jo3(lev) = j(lev,5)
171      enddo
172
173cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
174c     loop over time within the physical timestep                c
175cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
176c
177      do istep = 1,phychemrat
178         call chimie_B(lswitch,nesp, rm, j, dens, ctimestep,
179     $                 press, temp, sza, dist_sol,
180     $                 a001, a002, a003,
181     $                 b001, b002, b003, b004, b005, b006,
182     $                 c001, c002, c003, c004, c005, c006,
183     $                 c007, c008, c009, c010, c011, c012,
184     $                 c013, c014, c015, c016, c017, c018,
185     $                 d001, d002, d003,
186     $                 e001, e002,
187     $                 h001, h002)
188c
189c        print*,'appel chimie ok iteration ', istep
190c
191      end do
192c
193cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
194c     save chemical species for the gcm                          c
195cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
196c
197      call chimtogcm(zycol, lswitch, nesp, rm)
198c
199      return
200      end
201c
202c*****************************************************************
203c
204      subroutine chimie_B(lswitch, nesp, rm, j, dens, dt,
205     $                    press, t, sza, dist_sol,
206     $                    a001, a002, a003,
207     $                    b001, b002, b003, b004, b005, b006,
208     $                    c001, c002, c003, c004, c005, c006,
209     $                    c007, c008, c009, c010, c011, c012,
210     $                    c013, c014, c015, c016, c017, c018,
211     $                    d001, d002, d003,
212     $                    e001, e002,
213     $                    h001, h002)
214c
215c*****************************************************************
216c
217      implicit none
218c
219#include "dimensions.h"
220#include "dimphys.h"
221#include "chimiedata.h"
222#include "callkeys.h"
223c
224cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
225c     input/output:
226cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
227c     
228      integer lswitch         ! interface level between chemistries
229      integer nesp            ! number of species
230c
231      real rm(nlayermx,nesp)  ! volume mixing ratios
232c
233cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
234c     inputs:
235cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
236c
237      real dens(nlayermx)     ! density (cm-3)
238      real dt                 ! chemistry timestep (s)
239      real j(nlayermx,nd)     ! interpolated photolysis rates (s-1)
240      real press(nlayermx)    ! pressure (hpa)
241      real t(nlayermx)        ! temperature (k)
242      real sza                ! solar zenith angle (deg)
243      real dist_sol           ! sun distance (au)
244c
245c     reaction rates
246c
247      real a001(nlayermx), a002(nlayermx), a003(nlayermx)
248      real b001(nlayermx), b002(nlayermx), b003(nlayermx),
249     $     b004(nlayermx), b005(nlayermx), b006(nlayermx)
250      real c001(nlayermx), c002(nlayermx), c003(nlayermx),
251     $     c004(nlayermx), c005(nlayermx), c006(nlayermx),
252     $     c007(nlayermx), c008(nlayermx), c009(nlayermx),
253     $     c010(nlayermx), c011(nlayermx), c012(nlayermx),
254     $     c013(nlayermx), c014(nlayermx), c015(nlayermx),
255     $     c016(nlayermx), c017(nlayermx), c018(nlayermx)
256      real d001(nlayermx), d002(nlayermx), d003(nlayermx)
257      real e001(nlayermx), e002(nlayermx)
258      real h001(nlayermx), h002(nlayermx)
259c
260cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
261c     local:
262cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
263c
264      integer HETERO
265      parameter (HETERO=0)
266
267      integer iesp, iter, l, niter
268      integer i_co2, i_co, i_o2, i_h2, i_h2o, i_h2o2, i_hox, i_ox,
269     $        i_o1d, i_o, i_o3, i_h, i_oh, i_ho2, i_n2
270      integer j_o2_o, j_o2_o1d, j_co2_o, j_co2_o1d,
271     $        j_o3_o1d, j_o3_o, j_h2o, j_hdo, j_h2o2,
272     $        j_ho2, j_no2
273c
274      parameter (niter = 5)          ! iterations in the chemical scheme
275c
276      real*8 cc0(nlayermx,nesp)        ! initial number density (cm-3)
277      real*8 cc(nlayermx,nesp)         ! final number density (cm-3)
278      real*8 co2(nlayermx)             ! co2 number density (cm-3)
279      real*8 nox(nlayermx)             ! nox number density (cm-3)
280      real*8 no(nlayermx)              ! no  number density (cm-3)
281      real*8 no2(nlayermx)             ! no2 number density (cm-3)
282      real*8 production(nlayermx,nesp) ! production rate
283      real*8 loss(nlayermx,nesp)       ! loss rate
284c
285      real c007h(nlayermx)           ! c007 rate modified
286c                                    ! by heterogenous reactions h001 and h002
287c
288      real ro_o3, rh_ho2, roh_ho2, rno2_no
289c
290cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
291c     tracer numbering in the chemistry
292cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
293c
294      i_co2    =  1
295      i_co     =  2
296      i_o      =  3
297      i_o1d    =  4
298      i_o2     =  5
299      i_o3     =  6
300      i_h      =  7
301      i_h2     =  8
302      i_oh     =  9
303      i_ho2    = 10
304      i_h2o2   = 11
305      i_h2o    = 12
306      i_n2     = 13
307      i_hox    = 14
308      i_ox     = 15
309c
310cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
311c     numbering of photolysis rates
312cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
313c
314      j_o2_o     =  1      ! o2 + hv   -> o + o
315      j_o2_o1d   =  2      ! o2 + hv   -> o + o(1d)
316      j_co2_o    =  3      ! co2 + hv  -> co + o
317      j_co2_o1d  =  4      ! co2 + hv  -> co + o(1d)
318      j_o3_o1d   =  5      ! o3 + hv   -> o2 + o(1d)
319      j_o3_o     =  6      ! o3 + hv   -> o2 + o
320      j_h2o      =  7      ! h2o + hv  -> h + oh
321      j_hdo      =  8      ! hdo + hv  -> d + oh
322      j_h2o2     =  9      ! h2o2 + hv -> oh + oh
323      j_ho2      =  10     ! ho2 + hv  -> oh + o
324      j_no2      =  11     ! no2 + hv  -> no + o
325c
326cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
327c     volume mixing ratio -> density conversion
328cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
329c
330      do iesp = 1,nesp
331         do l = 1,lswitch-1
332            cc0(l,iesp) = rm(l,iesp)*dens(l)
333            cc(l,iesp)  = cc0(l,iesp)
334         end do
335      end do
336c
337cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
338c     co2 and nox number densities (cm-3)   
339c     
340c     co2 mixing ratio: 0.953
341c     nox mixing ratio: 6.e-10 (yung and demore, 1999)
342cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
343c
344      do l = 1,lswitch-1
345         co2(l) = cc(l,i_co2)
346         nox(l) = 6.e-10*dens(l)
347      end do
348c
349cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
350c     loop over iterations in the chemical scheme
351cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
352c
353      do iter = 1,niter
354c
355cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
356c     modification of c007
357c        by heterogenous reactions h001 and h002
358cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
359c
360      if (HETERO.eq.1) then
361       do l = 1,lswitch-1
362         c007h(l) = c007(l)
363     $            + h001(l)/max(cc(l,i_oh), 1.d-30*dens(l))
364     $            + h002(l)/max(cc(l,i_ho2),1.d-30*dens(l))
365c         write(*,*) "C007 = ",c007(l)," / C007H = ",c007h(l)
366       end do
367      else
368       do l = 1,lswitch-1
369         c007h(l) = c007(l)
370       end do
371      endif
372c
373cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
374c        nox species
375cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
376c        no2/no
377cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
378c
379      do l = 1,lswitch-1
380c
381         rno2_no = (d002(l)*cc(l,i_o3) + d003(l)*cc(l,i_ho2))
382     $            /(j(l,j_no2) +
383     $              d001(l)*max(cc(l,i_o),1.d-30*dens(l)))
384c
385cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
386c        no
387cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
388c
389         no(l) = nox(l)/(1. + rno2_no)
390c
391cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
392c        no2
393cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
394c
395         no2(l) = no(l)*rno2_no
396c
397      end do
398c
399cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
400c        hox species
401cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
402c        photochemical equilibrium for oh and ho2
403cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
404c        h/ho2
405cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
406c
407      do l = 1,lswitch-1
408c
409         rh_ho2 = (c001(l)*cc(l,i_o)
410     $           + c004(l)*cc(l,i_h)
411     $           + c005(l)*cc(l,i_h)
412     $           + c006(l)*cc(l,i_h)
413     $           + c007h(l)*cc(l,i_oh)
414     $           + 2.*c008(l)*cc(l,i_ho2)
415     $           + c015(l)*cc(l,i_o3)
416     $           + 2.*c016(l)*cc(l,i_ho2)
417     $           + j(l,j_ho2))
418     $          /(c011(l)*cc(l,i_o2))
419c
420cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
421c        oh/ho2
422cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
423c
424         roh_ho2 = (c001(l)*cc(l,i_o)
425     $            + c003(l)*cc(l,i_o3)*rh_ho2
426     $            + 2.*c004(l)*cc(l,i_h)
427     $            + 2.*c008(l)*cc(l,i_ho2)
428     $            + c015(l)*cc(l,i_o3)
429     $            + d003(l)*no(l)
430     $            + j(l,j_ho2)
431     $            + j(l,j_h2o)*cc(l,i_h2o)
432     $             /max(cc(l,i_ho2),dens(l)*1.d-30))
433     $            /(c002(l)*cc(l,i_o)
434     $            + c007h(l)*cc(l,i_ho2)
435     $            + e001(l)*cc(l,i_co))
436c
437cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
438c        h
439cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
440c
441         cc(l,i_h) = cc(l,i_hox)
442     $                 /(1. + (1. + roh_ho2)/rh_ho2)
443c
444cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
445c        ho2
446cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
447c
448         cc(l,i_ho2) = cc(l,i_h)/rh_ho2
449c
450cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
451c        oh
452cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
453c
454         cc(l,i_oh) = cc(l,i_ho2)*roh_ho2
455c
456      end do
457c
458cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
459c     modification of c007
460c        by heterogenous reactions h001 and h002
461c           after update of cc(l,i_oh) and cc(l,i_ho2)
462cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
463c
464      if (HETERO.eq.1) then
465       do l = 1,lswitch-1
466         c007h(l) = c007(l)
467     $            + h001(l)/max(cc(l,i_oh), 1.d-30*dens(l))
468     $            + h002(l)/max(cc(l,i_ho2),1.d-30*dens(l))
469c         write(*,*) "C007 = ",c007(l)," / C007H = ",c007h(l)
470       end do
471      endif
472c
473cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
474c        ox species
475cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
476c        day:
477c        - o1d at photochemical equilibrium
478c        - o3 at photochemical equilibrium
479c        - continuity equation for ox
480c        night:
481c        - o1d = 0
482c        - continuity equation for o3
483c        - continuity equation for o
484cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
485c       
486      if (sza .le. 95.) then
487c
488         do l = 1,lswitch-1
489c
490cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
491c        o(1d)
492cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
493c
494            cc(l,i_o1d) = (j(l,j_co2_o1d)*co2(l)
495     $                   + j(l,j_o2_o1d)*cc(l,i_o2)
496     $                   + j(l,j_o3_o1d)*cc(l,i_o3))
497     $                   /( b001(l)*co2(l)
498     $                   + b002(l)*cc(l,i_h2o)
499     $                   + b003(l)*cc(l,i_h2)
500     $                   + b004(l)*cc(l,i_o2)
501     $                   + b005(l)*cc(l,i_o3)
502     $                   + b006(l)*cc(l,i_o3))
503c
504cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
505c        o/o3
506cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
507c
508            ro_o3 = (j(l,j_o3_o1d) + j(l,j_o3_o)
509     $              + a003(l)*cc(l,i_o)
510     $              + c003(l)*cc(l,i_h)
511     $              + c014(l)*cc(l,i_oh)
512     $              + c015(l)*cc(l,i_ho2))
513     $              /(a001(l)*cc(l,i_o2))
514c
515cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
516c        o3
517cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
518c
519            cc(l,i_o3) = cc(l,i_ox)/(1. + ro_o3)
520c
521cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
522c        o
523cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
524c
525            cc(l,i_o) = cc(l,i_o3)*ro_o3
526c
527cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
528c        ox = o + o3
529cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
530c
531            production(l,i_ox) =
532     $                   + j(l,j_co2_o)*co2(l)
533     $                   + j(l,j_co2_o1d)*co2(l)
534     $                   + j(l,j_ho2)*cc(l,i_ho2)
535     $                   + 2.*j(l,j_o2_o)*cc(l,i_o2)
536     $                   + 2.*j(l,j_o2_o1d)*cc(l,i_o2)
537     $                   + c006(l)*cc(l,i_h)*cc(l,i_ho2)
538     $                   + c013(l)*cc(l,i_oh)*cc(l,i_oh)
539     $                   + d003(l)*cc(l,i_ho2)*no(l)
540c
541            loss(l,i_ox) = 2.*a002(l)*cc(l,i_o)*cc(l,i_o)
542     $                   + 2.*a003(l)*cc(l,i_o)*cc(l,i_o3)
543     $                   + c001(l)*cc(l,i_ho2)*cc(l,i_o)
544     $                   + c002(l)*cc(l,i_oh)*cc(l,i_o)
545     $                   + c003(l)*cc(l,i_h)*cc(l,i_o3)
546     $                   + c012(l)*cc(l,i_o)*cc(l,i_h2o2)
547     $                   + c014(l)*cc(l,i_o3)*cc(l,i_oh)
548     $                   + c015(l)*cc(l,i_o3)*cc(l,i_ho2)
549     $                   + d001(l)*cc(l,i_o)*no2(l)
550     $                   + e002(l)*cc(l,i_o)*cc(l,i_co)
551c
552            loss(l,i_ox) = loss(l,i_ox)/cc(l,i_ox)
553c
554         end do
555c
556      else
557c
558         do l = 1,lswitch-1
559c
560cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
561c        o(1d)
562cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
563c
564            cc(l,i_o1d) = 0.
565c
566cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
567c        o3
568cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
569c
570            production(l,i_o3) = a001(l)*cc(l,i_o2)*cc(l,i_o)
571c
572            loss(l,i_o3) = a003(l)*cc(l,i_o)
573     $                   + c003(l)*cc(l,i_h)
574     $                   + c014(l)*cc(l,i_oh)
575     $                   + c015(l)*cc(l,i_ho2)
576c
577
578cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
579c        o
580cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
581c
582            production(l,i_o) = c006(l)*cc(l,i_h)*cc(l,i_ho2)
583     $                        + c013(l)*cc(l,i_oh)*cc(l,i_oh)
584c
585            loss(l,i_o)  =  a001(l)*cc(l,i_o2)
586     $                   + 2.*a002(l)*cc(l,i_o)
587     $                   + a003(l)*cc(l,i_o3)
588     $                   + c001(l)*cc(l,i_ho2)
589     $                   + c002(l)*cc(l,i_oh)
590     $                   + c012(l)*cc(l,i_h2o2)
591     $                   + e002(l)*cc(l,i_co)
592c
593         end do
594      end if
595c
596cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
597c     other species
598cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
599c
600      do l = 1,lswitch-1
601c
602cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
603c        co
604cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
605c
606         production(l,i_co) = j(l,j_co2_o)*co2(l)
607     $                      + j(l,j_co2_o1d)*co2(l)
608c
609         loss(l,i_co) = e001(l)*cc(l,i_oh)
610     $                + e002(l)*cc(l,i_o)
611c
612cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
613c        o2
614cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
615c
616         production(l,i_o2) =
617     $                  j(l,j_o3_o)*cc(l,i_o3)
618     $                + j(l,j_o3_o1d)*cc(l,i_o3)
619     $                + a002(l)*cc(l,i_o)*cc(l,i_o)
620     $                + 2.*a003(l)*cc(l,i_o)*cc(l,i_o3)
621     $                + 2.*b005(l)*cc(l,i_o1d)*cc(l,i_o3)
622     $                + b006(l)*cc(l,i_o1d)*cc(l,i_o3)
623     $                + c001(l)*cc(l,i_o)*cc(l,i_ho2)
624     $                + c002(l)*cc(l,i_o)*cc(l,i_oh)
625     $                + c003(l)*cc(l,i_h)*cc(l,i_o3)
626     $                + c005(l)*cc(l,i_h)*cc(l,i_ho2)
627     $                + c007h(l)*cc(l,i_oh)*cc(l,i_ho2)
628     $                + c008(l)*cc(l,i_ho2)*cc(l,i_ho2)
629     $                + c014(l)*cc(l,i_o3)*cc(l,i_oh)
630     $                + 2.*c015(l)*cc(l,i_o3)*cc(l,i_ho2)
631     $                + c016(l)*cc(l,i_ho2)*cc(l,i_ho2)
632     $                + d001(l)*cc(l,i_o)*no2(l)
633c
634         loss(l,i_o2) = j(l,j_o2_o)
635     $                + j(l,j_o2_o1d)
636     $                + a001(l)*cc(l,i_o)
637     $                + c011(l)*cc(l,i_h)
638c
639cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
640c        h2
641cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
642c
643         production(l,i_h2) = c005(l)*cc(l,i_h)*cc(l,i_ho2)
644     $                      + c018(l)*cc(l,i_h)*cc(l,i_h)
645c
646         loss(l,i_h2) = b003(l)*cc(l,i_o1d)
647     $                + c010(l)*cc(l,i_oh)
648c
649cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
650c        h2o
651cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
652c
653         production(l,i_h2o) =
654     $                   c006(l)*cc(l,i_h)*cc(l,i_ho2)
655     $                 + c007h(l)*cc(l,i_oh)*cc(l,i_ho2)
656     $                 + c009(l)*cc(l,i_oh)*cc(l,i_h2o2)
657     $                 + c010(l)*cc(l,i_oh)*cc(l,i_h2)
658     $                 + c013(l)*cc(l,i_oh)*cc(l,i_oh)
659c
660         loss(l,i_h2o) = j(l,j_h2o)
661     $                 + b002(l)*cc(l,i_o1d)
662c
663cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
664c        h2o2
665cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
666c
667         production(l,i_h2o2) =
668     $                    c008(l)*cc(l,i_ho2)*cc(l,i_ho2)
669     $                  + c016(l)*cc(l,i_ho2)*cc(l,i_ho2)
670     $                  + c017(l)*cc(l,i_oh)*cc(l,i_oh)
671c
672         loss(l,i_h2o2) = j(l,j_h2o2)
673     $                  + c009(l)*cc(l,i_oh)
674     $                  + c012(l)*cc(l,i_o)
675c
676cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
677c        hox = h + oh + ho2
678cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
679c
680         production(l,i_hox) =
681     $                   2.*j(l,j_h2o)*cc(l,i_h2o)
682     $                 + 2.*j(l,j_h2o2)*cc(l,i_h2o2)
683     $                 + 2.*b002(l)*cc(l,i_o1d)*cc(l,i_h2o)
684     $                 + 2.*b003(l)*cc(l,i_o1d)*cc(l,i_h2)
685     $                 + 2.*c012(l)*cc(l,i_o)*cc(l,i_h2o2)
686c
687         loss(l,i_hox) = 2.*c005(l)*cc(l,i_h)*cc(l,i_ho2)
688     $                 + 2.*c006(l)*cc(l,i_h)*cc(l,i_ho2)
689     $                 + 2.*c007h(l)*cc(l,i_oh)*cc(l,i_ho2)
690     $                 + 2.*c008(l)*cc(l,i_ho2)*cc(l,i_ho2)
691     $                 + 2.*c013(l)*cc(l,i_oh)*cc(l,i_oh)
692     $                 + 2.*c016(l)*cc(l,i_ho2)*cc(l,i_ho2)
693     $                 + 2.*c017(l)*cc(l,i_oh)*cc(l,i_oh)
694     $                 + 2.*c018(l)*cc(l,i_h)*cc(l,i_h)
695c
696         loss(l,i_hox) = loss(l,i_hox)/cc(l,i_hox)
697c
698      end do
699c
700cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
701c     update number densities
702cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
703c
704c     long-lived species
705c
706      do l = 1,lswitch-1
707         cc(l,i_co)  = (cc0(l,i_co) + production(l,i_co)*dt)
708     $              /(1. + loss(l,i_co)*dt)
709         cc(l,i_o2)  = (cc0(l,i_o2) + production(l,i_o2)*dt)
710     $              /(1. + loss(l,i_o2)*dt)
711         cc(l,i_h2)  = (cc0(l,i_h2) + production(l,i_h2)*dt)
712     $              /(1. + loss(l,i_h2)*dt)
713         cc(l,i_h2o2)= (cc0(l,i_h2o2) + production(l,i_h2o2)*dt)
714     $              /(1. + loss(l,i_h2o2)*dt)
715         cc(l,i_h2o) = (cc0(l,i_h2o) + production(l,i_h2o)*dt)
716     $              /(1. + loss(l,i_h2o)*dt)
717         cc(l,i_hox) = (cc0(l,i_hox) + production(l,i_hox)*dt)
718     $              /(1. + loss(l,i_hox)*dt)
719      end do
720c
721c     ox species
722c
723      if (sza .le. 95.) then
724         do l = 1,lswitch-1
725            cc(l,i_ox) = (cc0(l,i_ox) + production(l,i_ox)*dt)
726     $                   /(1. + loss(l,i_ox)*dt)
727         end do
728      else
729         do l = 1,lswitch-1
730            cc(l,i_o)  = (cc0(l,i_o) + production(l,i_o)*dt)
731     $                   /(1. + loss(l,i_o)*dt)
732            cc(l,i_o3) = (cc0(l,i_o3) + production(l,i_o3)*dt)
733     $                   /(1. + loss(l,i_o3)*dt)
734            cc(l,i_ox) = cc(l,i_o) + cc(l,i_o3)
735         end do
736      end if
737c
738cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
739c     end of loop over iterations
740cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
741c
742      end do
743c
744cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
745c     density -> volume mixing ratio conversion
746cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
747c
748      do iesp = 1,nesp
749         do l = 1,lswitch-1
750            rm(l,iesp) = max(cc(l,iesp)/dens(l), 1.d-30)
751         end do
752      end do
753c
754      return
755      end
756c
757c*****************************************************************
758c
759      subroutine phot(lswitch, press, temp, sza, dist_sol, rmo3, j)
760c
761c*****************************************************************
762c
763      implicit none
764c
765#include "dimensions.h"
766#include "dimphys.h"
767#include "chimiedata.h"
768c
769cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
770c     inputs:
771cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
772c       
773      integer lswitch         ! interface level between chemistries
774      real press(nlayermx)             ! pressure (hPa)
775      real temp(nlayermx)              ! temperature (K)
776      real sza                         ! solar zenith angle (deg)
777      real dist_sol                    ! sun distance (AU)
778      real rmo3(nlayermx)              ! ozone mixing ratio
779c
780cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
781c     output:
782cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
783c
784      real j(nlayermx,nd)              ! interpolated photolysis rates (s-1)
785c
786cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
787c     local:
788cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
789c
790      integer icol, ij, indsza, indcol, indozo, indtemp,
791     $        iozo, isza, it, iztop, l
792c
793      real col(nlayermx)               ! overhead air column   (molecule cm-2)
794      real colo3(nlayermx)             ! overhead ozone column (molecule cm-2)
795      real poids(2,2,2,2)              ! 4D interpolation weights
796      real tref                        ! temperature  at 1.9 hPa in the gcm (K)
797      real table_temp(ntemp)           ! temperatures at 1.9 hPa in jmars   (K)
798      real cinf, csup, cicol,
799     $     ciozo, cisza, citemp
800      real colo3min, dp, scaleh
801      real ratio_o3(nlayermx)
802c
803ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
804c     day/night criterion
805ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
806c
807      if (sza .le. 95.) then
808c
809ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
810c     temperatures at 1.9 hPa in jmars
811ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
812c     
813      table_temp(1) = 226.2
814      table_temp(2) = 206.2
815      table_temp(3) = 186.2
816      table_temp(4) = 169.8
817c
818ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
819c     interpolation in solar zenith angle
820ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
821c
822      indsza = nsza - 1
823      do isza = 1,nsza
824         if (szatab(isza) .ge. sza) then
825            indsza = min(indsza,isza - 1)
826            indsza = max(indsza, 1)
827         end if
828      end do
829      cisza = (sza - szatab(indsza))
830     $       /(szatab(indsza + 1) - szatab(indsza))
831c
832ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
833c     air and ozone columns
834ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
835c
836c     air column at model top: assign standard value
837c
838      scaleh = 10.
839      iztop = nint(scaleh*log(press(1)/press(lswitch-1)))
840      iztop = min(iztop,200)
841      col(lswitch-1) = colairtab(iztop)
842c
843c     ozone column at model top
844c
845      colo3(lswitch-1) = 0.
846c
847c     air and ozone columns for other levels
848c
849      do l = lswitch-2,1,-1
850         dp = (press(l) - press(l+1))*100.
851         col(l) = col(l+1) + factor*dp
852         col(l) = min(col(l), colairtab(0))
853         colo3(l) = colo3(l+1)
854     $            + factor*(rmo3(l+1) + rmo3(l))*0.5*dp
855      end do
856c
857c     ratio ozone column/minimal theoretical column (ro3 = 7.171e-10)
858c
859      do l = 1,lswitch-1
860         colo3min    = col(l)*7.171e-10
861         ratio_o3(l) = colo3(l)/colo3min
862         ratio_o3(l) = min(ratio_o3(l), table_ozo(nozo)*10.)
863         ratio_o3(l) = max(ratio_o3(l), table_ozo(1)*10.)
864      end do
865c
866ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
867c     temperature dependence
868ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
869c
870c     1) search for temperature at 1.9 hPa (tref): vertical interpolation
871c
872c      print*,'****** recherche de T a 1.9 hPa ******'
873      tref = temp(1)
874      do l = (lswitch-1)-1,1,-1
875         if (press(l) .gt. 1.9) then
876            cinf = (press(l) - 1.9)
877     $            /(press(l) - press(l+1))
878            csup = 1. - cinf
879            tref = cinf*temp(l+1) + csup*temp(l)
880c
881c            print*, press(l+1), temp(l+1)
882c            print*, press(l  ), temp(l  )
883c            print*, 'tref = ', tref
884            go to 10
885         end if
886      end do
887 10   continue
888c
889c     2) interpolation in temperature
890c
891      tref = min(tref,table_temp(1))
892      tref = max(tref,table_temp(ntemp))
893c
894      do it = 2, ntemp
895         if (table_temp(it) .le. tref) then
896            citemp = (log(tref) - log(table_temp(it)))
897     $              /(log(table_temp(it-1)) - log(table_temp(it)))
898            indtemp = it - 1
899c            print*,'interpolation entre ', table_temp(it), ' et ',
900c     $              table_temp(it-1)
901c            print*,'indtemp = ', indtemp, ' citemp = ', citemp
902            goto 20
903         end if
904      end do
905  20  continue
906c      print*,'****** fin interpolation en T ********'
907c
908ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
909c     loop over vertical levels
910ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
911c
912      do l = 1,lswitch-1
913c
914c     interpolation in air column
915c
916         do icol = 0,200
917            if (colairtab(icol) .lt. col(l)) then
918               cicol = (log(col(l)) - log(colairtab(icol)))
919     $                /(log(colairtab(icol-1)) - log(colairtab(icol)))
920               indcol = icol - 1
921               goto 30
922            end if
923         end do
924 30      continue
925c
926cc    interpolation in ozone column
927c
928         indozo = nozo - 1
929         do iozo = 1,nozo
930            if (table_ozo(iozo)*10. .ge. ratio_o3(l)) then
931               indozo = min(indozo, iozo - 1)
932               indozo = max(indozo, 1)
933            end if
934         end do
935         ciozo = (ratio_o3(l) - table_ozo(indozo)*10.)
936     $          /(table_ozo(indozo + 1)*10. - table_ozo(indozo)*10.)
937c
938c         write(6,'(i2,4e13.4,5f10.4)')
939c    $         l, press(l), col(l),
940c    $         colairtab(indcol), colairtab(indcol+1),
941c    $         colo3(l)/2.687e15,
942c    $         ratio_o3(l), table_ozo(indozo), table_ozo(indozo+1),
943c    $         ciozo
944c
945cc    4-dimensional interpolation weights
946c
947         poids(1,1,1,1) = citemp*(1.-cisza)*cicol*(1.-ciozo)
948         poids(1,1,1,2) = citemp*(1.-cisza)*cicol*ciozo
949         poids(1,1,2,1) = citemp*(1.-cisza)*(1.-cicol)*(1.-ciozo)
950         poids(1,1,2,2) = citemp*(1.-cisza)*(1.-cicol)*ciozo
951         poids(1,2,1,1) = citemp*cisza*cicol*(1.-ciozo)
952         poids(1,2,1,2) = citemp*cisza*cicol*ciozo
953         poids(1,2,2,1) = citemp*cisza*(1.-cicol)*(1.-ciozo)
954         poids(1,2,2,2) = citemp*cisza*(1.-cicol)*ciozo
955         poids(2,1,1,1) = (1.-citemp)*(1.-cisza)*cicol*(1.-ciozo)
956         poids(2,1,1,2) = (1.-citemp)*(1.-cisza)*cicol*ciozo
957         poids(2,1,2,1) = (1.-citemp)*(1.-cisza)*(1.-cicol)*(1.-ciozo)
958         poids(2,1,2,2) = (1.-citemp)*(1.-cisza)*(1.-cicol)*ciozo
959         poids(2,2,1,1) = (1.-citemp)*cisza*cicol*(1.-ciozo)
960         poids(2,2,1,2) = (1.-citemp)*cisza*cicol*ciozo
961         poids(2,2,2,1) = (1.-citemp)*cisza*(1.-cicol)*(1.-ciozo)
962         poids(2,2,2,2) = (1.-citemp)*cisza*(1.-cicol)*ciozo
963c
964cc    4-dimensional interpolation in the lookup table
965c
966         do ij = 1,nd
967           j(l,ij) =
968     $     poids(1,1,1,1)*jphot(indtemp,indsza,indcol,indozo,ij)
969     $   + poids(1,1,1,2)*jphot(indtemp,indsza,indcol,indozo+1,ij)
970     $   + poids(1,1,2,1)*jphot(indtemp,indsza,indcol+1,indozo,ij)
971     $   + poids(1,1,2,2)*jphot(indtemp,indsza,indcol+1,indozo+1,ij)
972     $   + poids(1,2,1,1)*jphot(indtemp,indsza+1,indcol,indozo,ij)
973     $   + poids(1,2,1,2)*jphot(indtemp,indsza+1,indcol,indozo+1,ij)
974     $   + poids(1,2,2,1)*jphot(indtemp,indsza+1,indcol+1,indozo,ij)
975     $   + poids(1,2,2,2)*jphot(indtemp,indsza+1,indcol+1,indozo+1,ij)
976     $   + poids(2,1,1,1)*jphot(indtemp+1,indsza,indcol,indozo,ij)
977     $   + poids(2,1,1,2)*jphot(indtemp+1,indsza,indcol,indozo+1,ij)
978     $   + poids(2,1,2,1)*jphot(indtemp+1,indsza,indcol+1,indozo,ij)
979     $   + poids(2,1,2,2)*jphot(indtemp+1,indsza,indcol+1,indozo+1,ij)
980     $   + poids(2,2,1,1)*jphot(indtemp+1,indsza+1,indcol,indozo,ij)
981     $   + poids(2,2,1,2)*jphot(indtemp+1,indsza+1,indcol,indozo+1,ij)
982     $   + poids(2,2,2,1)*jphot(indtemp+1,indsza+1,indcol+1,indozo,ij)
983     $   + poids(2,2,2,2)*jphot(indtemp+1,indsza+1,indcol+1,indozo+1,ij)
984         end do
985c
986cc    correction for sun distance
987c
988         do ij = 1,nd
989            j(l,ij) = j(l,ij)*(1.52/dist_sol)**2.
990         end do
991c
992ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
993c     end of loop over vertical levels
994ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
995c
996      end do
997c
998      else
999c
1000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1001c     night
1002ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1003c
1004      do ij = 1,nd
1005         do l = 1,lswitch-1
1006            j(l,ij) = 0.
1007         end do
1008      end do
1009c
1010      end if
1011c
1012      return
1013      end
1014c
1015c*****************************************************************
1016c
1017      subroutine gcmtochim(zycol, lswitch, nesp, rm)
1018c
1019c*****************************************************************
1020c
1021      implicit none
1022c
1023#include "dimensions.h"
1024#include "dimphys.h"
1025#include "callkeys.h"
1026#include "tracer.h"
1027c
1028cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1029c     inputs:
1030cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1031c     
1032      real zycol(nlayermx,nqmx)! species volume mixing ratio in the gcm
1033c
1034      integer nesp            ! number of species in the chemistry
1035      integer lswitch         ! interface level between chemistries
1036c
1037cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1038c     outputs:
1039cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1040c
1041      real rm(nlayermx,nesp)   ! species volume mixing ratio
1042c     
1043cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1044c     local:
1045cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1046c
1047      integer l,iq
1048      logical,save :: firstcall=.true.
1049     
1050! Tracer indexes in the GCM:
1051      integer,save :: g_co2=0
1052      integer,save :: g_co=0
1053      integer,save :: g_o=0
1054      integer,save :: g_o1d=0
1055      integer,save :: g_o2=0
1056      integer,save :: g_o3=0
1057      integer,save :: g_h=0
1058      integer,save :: g_h2=0
1059      integer,save :: g_oh=0
1060      integer,save :: g_ho2=0
1061      integer,save :: g_h2o2=0
1062      integer,save :: g_n2=0
1063      integer,save :: g_h2o_vap=0
1064! Tracer indexes in the chemistry:
1065      integer,parameter :: i_co2=1
1066      integer,parameter :: i_co=2
1067      integer,parameter :: i_o=3
1068      integer,parameter :: i_o1d=4
1069      integer,parameter :: i_o2=5
1070      integer,parameter :: i_o3=6
1071      integer,parameter :: i_h=7
1072      integer,parameter :: i_h2=8
1073      integer,parameter :: i_oh=9
1074      integer,parameter :: i_ho2=10
1075      integer,parameter :: i_h2o2=11
1076      integer,parameter :: i_h2o=12
1077      integer,parameter :: i_n2=13
1078      integer,parameter :: i_hox=14
1079      integer,parameter :: i_ox=15
1080cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1081c     tracers numbering in the gcm
1082cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1083c     co2      =  nqchem_min           
1084c     co       =  nqchem_min + 1         
1085c     o        =  nqchem_min + 2
1086c     o(1d)    =  nqchem_min + 3
1087c     o2       =  nqchem_min + 4
1088c     o3       =  nqchem_min + 5
1089c     h        =  nqchem_min + 6
1090c     h2       =  nqchem_min + 7
1091c     oh       =  nqchem_min + 8
1092c     ho2      =  nqchem_min + 9
1093c     h2o2     =  nqchem_min + 10
1094c     n2       =  nqchem_min + 11
1095c     ar       =  nqchem_min + 12
1096c     h2o      =  nqmx
1097c
1098
1099! Fist call initializations
1100      if (firstcall) then
1101        ! get the indexes of the tracers we'll need
1102        do iq=1,nqmx
1103          if (noms(iq).eq."co2") then
1104            g_co2=iq
1105          endif
1106          if (noms(iq).eq."co") then
1107            g_co=iq
1108          endif
1109          if (noms(iq).eq."o") then
1110            g_o=iq
1111          endif
1112          if (noms(iq).eq."o1d") then
1113            g_o1d=iq
1114          endif
1115          if (noms(iq).eq."o2") then
1116            g_o2=iq
1117          endif
1118          if (noms(iq).eq."o3") then
1119            g_o3=iq
1120          endif
1121          if (noms(iq).eq."h") then
1122            g_h=iq
1123          endif
1124          if (noms(iq).eq."h2") then
1125            g_h2=iq
1126          endif
1127          if (noms(iq).eq."oh") then
1128            g_oh=iq
1129          endif
1130          if (noms(iq).eq."ho2") then
1131            g_ho2=iq
1132          endif
1133          if (noms(iq).eq."h2o2") then
1134            g_h2o2=iq
1135          endif
1136          if (noms(iq).eq."n2") then
1137            g_n2=iq
1138          endif
1139          if (noms(iq).eq."h2o_vap") then
1140            g_h2o_vap=iq
1141          endif
1142        enddo
1143        firstcall=.false.
1144      endif ! of if (firstcall)
1145
1146cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1147c     initialise chemical species
1148cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1149c
1150      do l = 1,lswitch-1
1151       rm(l,i_co2)  = max(zycol(l, g_co2),     1.e-30)
1152       rm(l,i_co)   = max(zycol(l, g_co),      1.e-30)
1153       rm(l,i_o)    = max(zycol(l, g_o),       1.e-30)
1154       rm(l,i_o1d)  = max(zycol(l, g_o1d),     1.e-30)
1155       rm(l,i_o2)   = max(zycol(l, g_o2),      1.e-30)
1156       rm(l,i_o3)   = max(zycol(l, g_o3),      1.e-30)
1157       rm(l,i_h)    = max(zycol(l, g_h),       1.e-30)
1158       rm(l,i_h2)   = max(zycol(l, g_h2),      1.e-30)
1159       rm(l,i_oh)   = max(zycol(l, g_oh),      1.e-30)
1160       rm(l,i_ho2)  = max(zycol(l, g_ho2),     1.e-30)
1161       rm(l,i_h2o2) = max(zycol(l, g_h2o2),    1.e-30)
1162       rm(l,i_n2)   = max(zycol(l, g_n2),      1.e-30)
1163       rm(l,i_h2o)  = max(zycol(l, g_h2o_vap), 1.e-30)
1164c
1165      end do
1166c
1167cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1168c     initialise chemical families                     c
1169cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1170c
1171      do l = 1,lswitch-1
1172         rm(l,i_hox) = rm(l,i_h)
1173     $               + rm(l,i_oh)
1174     $               + rm(l,i_ho2)
1175         rm(l,i_ox)  = rm(l,i_o)
1176     $               + rm(l,i_o3)
1177      end do
1178c
1179      return
1180      end
1181c
1182c*****************************************************************
1183c
1184      subroutine chimtogcm(zycol, lswitch, nesp, rm)
1185c
1186c*****************************************************************
1187c
1188      implicit none
1189c
1190#include "dimensions.h"
1191#include "dimphys.h"
1192#include "callkeys.h"
1193#include"tracer.h"
1194c
1195cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1196c     inputs:
1197cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1198c
1199      integer nesp               ! number of species in the chemistry
1200      integer lswitch            ! interface level between chemistries
1201c     
1202      real rm(nlayermx,nesp)     ! species volume mixing ratio
1203c
1204cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1205c     output:
1206cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1207c     
1208      real zycol(nlayermx,nqmx)  ! species volume mixing ratio in the gcm
1209c
1210cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1211c     local:
1212cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1213c
1214      integer l,iq
1215      logical,save :: firstcall=.true.
1216     
1217! Tracer indexes in the GCM:
1218      integer,save :: g_co2=0
1219      integer,save :: g_co=0
1220      integer,save :: g_o=0
1221      integer,save :: g_o1d=0
1222      integer,save :: g_o2=0
1223      integer,save :: g_o3=0
1224      integer,save :: g_h=0
1225      integer,save :: g_h2=0
1226      integer,save :: g_oh=0
1227      integer,save :: g_ho2=0
1228      integer,save :: g_h2o2=0
1229      integer,save :: g_n2=0
1230      integer,save :: g_h2o_vap=0
1231! Tracer indexes in the chemistry:
1232      integer,parameter :: i_co2=1
1233      integer,parameter :: i_co=2
1234      integer,parameter :: i_o=3
1235      integer,parameter :: i_o1d=4
1236      integer,parameter :: i_o2=5
1237      integer,parameter :: i_o3=6
1238      integer,parameter :: i_h=7
1239      integer,parameter :: i_h2=8
1240      integer,parameter :: i_oh=9
1241      integer,parameter :: i_ho2=10
1242      integer,parameter :: i_h2o2=11
1243      integer,parameter :: i_h2o=12
1244      integer,parameter :: i_n2=13
1245      integer,parameter :: i_hox=14
1246      integer,parameter :: i_ox=15
1247cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1248c     tracers numbering in the gcm
1249cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1250c
1251c     co2      =  nqchem_min
1252c     co       =  nqchem_min + 1
1253c     o        =  nqchem_min + 2
1254c     o(1d)    =  nqchem_min + 3
1255c     o2       =  nqchem_min + 4
1256c     o3       =  nqchem_min + 5
1257c     h        =  nqchem_min + 6
1258c     h2       =  nqchem_min + 7
1259c     oh       =  nqchem_min + 8
1260c     ho2      =  nqchem_min + 9
1261c     h2o2     =  nqchem_min + 10
1262c     n2       =  nqchem_min + 11
1263c     ar       =  nqchem_min + 12
1264c     h2o      =  nqmx
1265c     
1266! Fist call initializations
1267      if (firstcall) then
1268        ! get the indexes of the tracers we'll need
1269        do iq=1,nqmx
1270          if (noms(iq).eq."co2") then
1271            g_co2=iq
1272          endif
1273          if (noms(iq).eq."co") then
1274            g_co=iq
1275          endif
1276          if (noms(iq).eq."o") then
1277            g_o=iq
1278          endif
1279          if (noms(iq).eq."o1d") then
1280            g_o1d=iq
1281          endif
1282          if (noms(iq).eq."o2") then
1283            g_o2=iq
1284          endif
1285          if (noms(iq).eq."o3") then
1286            g_o3=iq
1287          endif
1288          if (noms(iq).eq."h") then
1289            g_h=iq
1290          endif
1291          if (noms(iq).eq."h2") then
1292            g_h2=iq
1293          endif
1294          if (noms(iq).eq."oh") then
1295            g_oh=iq
1296          endif
1297          if (noms(iq).eq."ho2") then
1298            g_ho2=iq
1299          endif
1300          if (noms(iq).eq."h2o2") then
1301            g_h2o2=iq
1302          endif
1303          if (noms(iq).eq."n2") then
1304            g_n2=iq
1305          endif
1306          if (noms(iq).eq."h2o_vap") then
1307            g_h2o_vap=iq
1308          endif
1309        enddo
1310        firstcall=.false.
1311      endif ! of if (firstcall)
1312
1313cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1314c     save mixing ratios for the gcm
1315cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1316c
1317      do l = 1,lswitch-1
1318         zycol(l, g_co2)     = rm(l,i_co2)
1319         zycol(l, g_co)      = rm(l,i_co)
1320         zycol(l, g_o)       = rm(l,i_o)
1321         zycol(l, g_o1d)     = rm(l,i_o1d)
1322         zycol(l, g_o2)      = rm(l,i_o2)
1323         zycol(l, g_o3)      = rm(l,i_o3)
1324         zycol(l, g_h)       = rm(l,i_h) 
1325         zycol(l, g_h2)      = rm(l,i_h2)
1326         zycol(l, g_oh)      = rm(l,i_oh)
1327         zycol(l, g_ho2)     = rm(l,i_ho2)
1328         zycol(l, g_h2o2)    = rm(l,i_h2o2)
1329         zycol(l, g_n2)      = rm(l,i_n2)
1330         zycol(l, g_h2o_vap) = rm(l,i_h2o)
1331      end do
1332c
1333c  water ice: zycol(nqmx-1) has not been changed if iceparty on
1334! not an issue anymore since we now use tracer names ...
1335! and not relevant anymore as we removed iceparty: water=>iceparty
1336
1337      return
1338      end
1339c
1340c*****************************************************************
1341c
1342      subroutine chemrates(lswitch, dens, press, t, icesurf,
1343     $                     a001, a002, a003,
1344     $                     b001, b002, b003, b004, b005, b006,
1345     $                     c001, c002, c003, c004, c005, c006,
1346     $                     c007, c008, c009, c010, c011, c012,
1347     $                     c013, c014, c015, c016, c017, c018,
1348     $                     d001, d002, d003,
1349     $                     e001, e002,
1350     $                     h001, h002)
1351c
1352c*****************************************************************
1353c
1354      implicit none
1355c
1356#include "dimensions.h"
1357#include "dimphys.h"
1358c
1359cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1360c     inputs:                                                    c
1361cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1362c
1363      integer lswitch                  ! interface level between chemistries
1364
1365      real dens(nlayermx)              ! density (cm-3)
1366      real press(nlayermx)             ! pressure (hpa)
1367      real t(nlayermx)                 ! temperature (k)
1368      real icesurf(nlayermx)           ! ice surface area (cm^2/cm^3)
1369c
1370cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1371c     outputs:                                                   c
1372cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1373c
1374      real a001(nlayermx), a002(nlayermx), a003(nlayermx)
1375      real b001(nlayermx), b002(nlayermx), b003(nlayermx),
1376     $     b004(nlayermx), b005(nlayermx), b006(nlayermx)
1377      real c001(nlayermx), c002(nlayermx), c003(nlayermx),
1378     $     c004(nlayermx), c005(nlayermx), c006(nlayermx),
1379     $     c007(nlayermx), c008(nlayermx), c009(nlayermx),
1380     $     c010(nlayermx), c011(nlayermx), c012(nlayermx),
1381     $     c013(nlayermx), c014(nlayermx), c015(nlayermx),
1382     $     c016(nlayermx), c017(nlayermx), c018(nlayermx)
1383      real d001(nlayermx), d002(nlayermx), d003(nlayermx)
1384      real e001(nlayermx), e002(nlayermx)
1385      real h001(nlayermx), h002(nlayermx)
1386c
1387cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1388c     local:                                                     c
1389cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1390c
1391      real ak0, ak1, rate, xpo
1392c
1393      integer l
1394c
1395cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1396c     compute reaction rates from JPL 1997, otherwise mentioned
1397cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1398c
1399      do l = 1,lswitch-1
1400c
1401cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1402c        oxygen compounds
1403cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1404c
1405ccc      a001: o + o2 + co2 -> o3 + co2
1406c
1407c        jpl 2003
1408c
1409         a001(l) = 2.5
1410     $             *6.0e-34*(t(l)/300.)**(-2.4)*dens(l)
1411c
1412c        nair et al., 1994
1413c
1414c        a001(l) = 1.3e-34*exp(724./t(l))*dens(l)
1415c
1416ccc      a002: o + o + co2 -> o2 + co2
1417c
1418c        Tsang and Hampson, J. Chem. Phys. Ref. Data, 15, 1087, 1986
1419c
1420         a002(l) = 2.5*5.2e-35*exp(900./t(l))*dens(l)
1421c
1422c        Campbell and Gray, Chem. Phys. Lett., 18, 607, 1973
1423c
1424c        a002(l) = 1.2e-32*(300./t(l))**(2.0)*dens(l)
1425c
1426ccc      a003: o + o3 -> o2 + o2
1427c
1428c        jpl 2003
1429c
1430         a003(l) = 8.0e-12*exp(-2060./t(l))
1431c
1432cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1433c        reactions with o(1d)
1434cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1435c
1436ccc      b001: o(1d) + co2  -> o + co2
1437c
1438c        jpl 2003
1439c
1440         b001(l) = 7.4e-11*exp(120./t(l))
1441c
1442ccc      b002: o(1d) + h2o  -> oh + oh
1443c
1444c        jpl 2003
1445c
1446         b002(l) = 2.2e-10
1447c   
1448ccc      b003: o(1d) + h2  -> oh + h
1449c
1450c        jpl 2003
1451c
1452         b003(l) = 1.1e-10
1453c
1454c        nair et al., 1994
1455c
1456c        b003(l) = 1.0e-10
1457c   
1458ccc      b004: o(1d) + o2  -> o + o2
1459c
1460c        jpl 2003
1461c
1462         b004(l) = 3.2e-11*exp(70./t(l))
1463c   
1464ccc      b005: o(1d) + o3  -> o2 + o2
1465c
1466c        jpl 2003
1467c
1468         b005(l) = 1.2e-10
1469c   
1470ccc      b006: o(1d) + o3  -> o2 + o + o
1471c
1472c        jpl 2003
1473c
1474         b006(l) = 1.2e-10
1475c
1476cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1477c        hydrogen compounds   
1478cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1479c
1480ccc      c001: o + ho2 -> oh + o2
1481c
1482c        jpl 2003
1483c
1484         c001(l) = 3.0e-11*exp(200./t(l))
1485c        c001(l) = 0.75*3.0e-11*exp(200./t(l))
1486c
1487ccc      c002: o + oh -> o2 + h
1488c
1489c        jpl 2003
1490c
1491         c002(l) = 2.2e-11*exp(120./t(l))
1492c
1493ccc      c003: h + o3 -> oh + o2
1494c
1495c        jpl 2003
1496c
1497         c003(l) = 1.4e-10*exp(-470./t(l))
1498c
1499ccc      c004: h + ho2 -> oh + oh
1500c
1501c        jpl 2003
1502c
1503         c004(l) = 8.1e-11*0.90
1504c
1505ccc      c005: h + ho2 -> h2 + o2
1506c
1507c        jpl 2003
1508c
1509         c005(l) = 8.1e-11*0.08
1510c
1511ccc      c006: h + ho2 -> h2o + o
1512c
1513c        jpl 2003
1514c
1515         c006(l) = 8.1e-11*0.02
1516c
1517ccc      c007: oh + ho2 -> h2o + o2
1518c
1519c        jpl 2003
1520c
1521         c007(l) = 4.8e-11*exp(250./t(l))
1522c        c007(l) = 0.75*4.8e-11*exp(250./t(l))
1523c
1524ccc      c008: ho2 + ho2 -> h2o2 + o2
1525c
1526c        jpl 2003
1527c
1528c        c008(l) = 2.3e-13*exp(600./t(l))
1529c
1530c        christensen et al., grl, 13, 2002
1531c
1532         c008(l) = 1.5e-12*exp(19./t(l))
1533c
1534ccc      c009: oh + h2o2 -> h2o + ho2
1535c
1536c        jpl 2003
1537c
1538         c009(l) = 2.9e-12*exp(-160./t(l))
1539c
1540ccc      c010: oh + h2 -> h2o + h
1541c
1542c        jpl 2003
1543c
1544         c010(l) = 5.5e-12*exp(-2000./t(l))
1545c
1546ccc      c011: h + o2 + co2 -> ho2 + co2
1547c
1548c        jpl 2003
1549c
1550         ak0 = 2.5*5.7e-32*(t(l)/300.)**(-1.6)
1551         ak1 = 7.5e-11*(t(l)/300.)**(0.0)
1552c
1553         rate = (ak0*dens(l))/(1. + ak0*dens(l)/ak1)
1554         xpo = 1./(1. + alog10((ak0*dens(l))/ak1)**2)
1555         c011(l) = rate*0.6**xpo
1556c
1557ccc      c012: o + h2o2 -> oh + ho2
1558c
1559c        jpl 2003
1560c
1561         c012(l) = 1.4e-12*exp(-2000./t(l))
1562c
1563ccc      c013: oh + oh -> h2o + o
1564c
1565c        jpl 2003
1566c
1567         c013(l) = 4.2e-12*exp(-240./t(l))
1568c
1569ccc      c014: oh + o3 -> ho2 + o2
1570c
1571c        jpl 2003
1572c
1573         c014(l) = 1.7e-12*exp(-940./t(l))
1574c
1575c        jpl 2000
1576c
1577c        c014(l) = 1.5e-12*exp(-880./t(l))
1578c
1579c        nair et al., 1994 (jpl 1997)
1580c
1581c        c014(l) = 1.6e-12*exp(-940./t(l))
1582c
1583ccc      c015: ho2 + o3 -> oh + o2 + o2
1584c
1585c        jpl 2003
1586c
1587         c015(l) = 1.0e-14*exp(-490./t(l))
1588c
1589c        jpl 2000
1590c
1591c        c015(l) = 2.0e-14*exp(-680./t(l))
1592c
1593c        nair et al., 1994 (jpl 1997)
1594c
1595c        c015(l) = 1.1e-14*exp(-500./t(l))
1596c
1597ccc      c016: ho2 + ho2 + co2 -> h2o2 + o2 + co2
1598c
1599c        jpl 2003
1600c
1601         c016(l) = 2.5*1.7e-33
1602     $              *exp(1000./t(l))*dens(l)
1603c
1604ccc      c017: oh + oh + co2 -> h2o2 + co2
1605c
1606c        jpl 2003
1607c
1608         ak0 = 2.5*6.9e-31*(t(l)/300.)**(-1.0)
1609         ak1 = 2.6e-11*(t(l)/300.)**(0.0)
1610c
1611c        jpl 1997
1612c
1613c        ak0 = 2.5*6.2e-31*(t(l)/300.)**(-1.0)
1614c        ak1 = 2.6e-11*(t(l)/300.)**(0.0)
1615c
1616c        nair et al., 1994
1617c
1618c        ak0 = 2.5*7.1e-31*(t(l)/300.)**(-0.8)
1619c        ak1 = 1.5e-11*(t(l)/300.)**(0.0)
1620c
1621         rate = (ak0*dens(l))/(1. + ak0*dens(l)/ak1)
1622         xpo = 1./(1. + alog10((ak0*dens(l))/ak1)**2)
1623         c017(l) = rate*0.6**xpo
1624c
1625ccc      c018: h + h + co2 -> h2 + co2
1626c
1627c        baulch et al., 1992
1628c
1629         c018(l) = 2.5*8.85e-33*(t(l)/298.)**(-0.6)*dens(l)
1630c
1631cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1632c        nitrogen compounds
1633cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1634c
1635ccc      d001: no2 + o -> no + o2
1636c
1637c        jpl 2003
1638c
1639         d001(l) = 5.6e-12*exp(180./t(l))
1640c
1641ccc      d002: no + o3 -> no2 + o2
1642c
1643c        jpl 2003
1644c
1645         d002(l) = 3.0e-12*exp(-1500./t(l))
1646c
1647ccc      d003: no + ho2 -> no2 + oh
1648c
1649c        jpl 2003
1650c
1651         d003(l) = 3.5e-12*exp(250./t(l))
1652c
1653cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1654c        carbon compounds
1655cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1656c
1657ccc      e001: oh + co -> co2 + h
1658c
1659c        jpl 2003
1660c
1661c        e001(l) = 1.5e-13*(1 + 0.6*press(l)/1013.)
1662c
1663c        mccabe et al., grl, 28, 3135, 2001
1664c
1665         e001(l) = 1.57e-13 + 3.54e-33*dens(l)
1666c
1667ccc      e002: o + co + m -> co2 + m
1668c
1669c        tsang and hampson, 1986.
1670c
1671         e002(l) = 2.5*6.5e-33*exp(-2184./t(l))*dens(l)
1672c
1673c        baulch et al., butterworths, 1976.
1674c
1675c        e002(l) = 1.6e-32*exp(-2184./t(l))*dens(l)
1676c
1677cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1678c        heterogenous chemistry
1679cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1680c
1681ccc      h001: ho2 + ice surface -> (ho2)ads
1682ccc           (ho2)ads + oh -> h2o + o2
1683ccc      total : oh + ho2 -> h2o + o2, first order
1684ccc         K = h001*[ho2],
1685ccc      h001 = (S*v*gamma1)/4. (s-1), v=100*sqrt(3kT/m_ho2) (cm s-1)
1686c
1687c        cooper and abbatt, 1996
1688c
1689         h001(l) = icesurf(l) * 25.*sqrt(3*8.31*t(l)/33.) * 0.025
1690c         h001(l) = 0.0e0
1691c
1692ccc      h002: oh + ice surface -> (oh)ads
1693ccc           (oh)ads + ho2 -> h2o + o2
1694ccc      total : oh + ho2 -> h2o + o2, first order
1695ccc         K = h002*[oh],
1696ccc      h002 = (S*v*gamma2)/4. (s-1), v=100*sqrt(3kT/m_oh) (cm s-1)
1697c
1698c        cooper and abbatt, 1996
1699c
1700         h002(l) = icesurf(l) * 25.*sqrt(3*8.31*t(l)/17.) * 0.03
1701c         h002(l) = 0.0e0
1702c
1703c        write(*,*) "level ",l," / icesurf=",icesurf(l),
1704c     $       " / 0.25vg1=",(25.*sqrt(3*8.31*t(l)/33.) * 0.025),
1705c     $       " / 0.25vg2=",(25.*sqrt(3*8.31*t(l)/17.) * 0.03)
1706c
1707      end do
1708c
1709      return
1710      end
Note: See TracBrowser for help on using the repository browser.