source: trunk/LMDZ.MARS/libf/aeronomars/moldiffcoeff_red.F @ 815

Last change on this file since 815 was 710, checked in by emillour, 13 years ago

Mars GCM:

  • Decreased time step for molecular diffusion (diffusion.h) for better stability
  • Added test in moldiff_red.F90 to enforce that the system can't be stuck in an infinite loop.
  • The creation and output of coefficients in file 'coeffs.dat' in moldiff_red.F is now controled by an internal flag (by default set to false).

JYC + EM

File size: 8.7 KB
Line 
1      subroutine moldiffcoeff_red(dij,indic,gcmind,ncompdiff2)
2
3       IMPLICIT NONE
4c=======================================================================
5c   subject:
6c   --------
7c   Computing molecular diffusion coefficients
8c   following Nair 94 (pg 131)
9c   author:  MAC 2002
10c   ------
11c
12c=======================================================================
13#include "dimensions.h"
14#include "dimphys.h"
15#include "callkeys.h"
16#include "comdiurn.h"
17#include "chimiedata.h"
18#include "tracer.h"
19#include "conc.h"
20#include "diffusion.h"
21
22c-----------------------------------------------------------------------
23c    Input/Output
24c    ------------
25c       integer,parameter :: ncompmoldiff = 12
26        integer ncompdiff2
27        integer gcmind(ncompdiff2)
28      real dij(ncompdiff2,ncompdiff2)
29      integer indic(nqmx)
30
31c    Local variables:
32c    ---------------
33      INTEGER nq, n, nn, i,iq
34cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
35c     tracer numbering in the molecular diffusion
36cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
37
38      real :: dijh2co,dijh2n2,dijh2co2,dijh2o2,dijho,dijref
39!       integer :: i_h2,i_h,i_o
40        integer :: g_h2,g_h,g_o
41!      integer,parameter :: i_o   = 1
42!      integer,parameter :: i_n2   = 2
43!      integer,parameter :: i_co   = 3
44!      integer,parameter :: i_ar  = 4
45!      integer,parameter :: i_h2   = 5
46!      integer,parameter :: i_h    = 6
47!      integer,parameter :: i_o2   = 7
48!      integer,parameter :: i_oh  = 8
49!      integer,parameter :: i_ho2  = 9
50!      integer,parameter :: i_h2o = 10
51!      integer,parameter :: i_h2o2  = 11
52!      integer,parameter :: i_o1d   = 12
53!      integer,parameter :: i_o3   = 13
54!      integer,parameter :: i_n    = 13
55!      integer,parameter :: i_no   = 14
56!      integer,parameter :: i_no2  = 15
57!      integer,parameter :: i_n2d  = 17
58!      integer,parameter :: i_oplus = 18
59!      integer,parameter :: i_co2    = 16
60!      integer,parameter :: i_oplus = 17
61!      integer,parameter :: i_hplus = 18
62
63! Tracer indexes in the GCM:
64!      integer,save :: g_co2=0
65!      integer,save :: g_co=0
66!      integer,save :: g_o=0
67!      integer,save :: g_o1d=0
68!      integer,save :: g_o2=0
69!      integer,save :: g_o3=0
70!      integer,save :: g_h=0
71!      integer,save :: g_h2=0
72!      integer,save :: g_oh=0
73!      integer,save :: g_ho2=0
74!      integer,save :: g_h2o2=0
75!      integer,save :: g_n2=0
76!      integer,save :: g_ar=0
77!      integer,save :: g_h2o=0
78!      integer,save :: g_n=0
79!      integer,save :: g_no=0
80!      integer,save :: g_no2=0
81!      integer,save :: g_n2d=0
82!      integer,save :: g_oplus=0
83!      integer,save :: g_hplus=0
84
85!      integer,save :: gcmind(ncompdiff)
86
87      real dnh
88      logical,save :: firstcall=.true.
89      logical,parameter :: outputcoeffs=.false. ! to output 'coeffs.dat' file,
90                                                ! set outputcoeffs=.true.
91
92! Initializations at first call (and some sanity checks)
93      if (firstcall) then
94        ! identify the indexes of the tracers we'll need
95!        g_co2=igcm_co2
96!        if (g_co2.eq.0) then
97!          write(*,*) "moldiffcoeff: Error; no CO2 tracer !!!"
98!          stop
99!        endif
100!        g_n2=igcm_n2
101!        if (g_n2.eq.0) then
102!          write(*,*) "moldiffcoeff: Error; no N2 tracer !!!"
103!          stop
104!        endif
105!        g_ar=igcm_ar
106!        if (g_ar.eq.0) then
107!          write(*,*) "moldiffcoeff: Error; no Ar tracer !!!"
108!          stop
109!        endif       
110!        g_h2=igcm_h2
111!        if (g_h2.eq.0) then
112!          write(*,*) "moldiffcoeff: Error; no H2 tracer !!!"
113!          stop
114!        endif
115!        g_h=igcm_h
116!        if (g_h.eq.0) then
117!          write(*,*) "moldiffcoeff: Error; no H tracer !!!"
118!          stop
119!        endif
120!        g_co=igcm_co
121!        if (g_co.eq.0) then
122!          write(*,*) "moldiffcoeff: Error; no CO tracer !!!"
123!          stop
124!        endif
125!        g_o2=igcm_o2
126!        if (g_o2.eq.0) then
127!          write(*,*) "moldiffcoeff: Error; no O2 tracer !!!"
128!          stop
129!        endif
130!        g_oh=igcm_oh
131!        if (g_oh.eq.0) then
132!          write(*,*) "moldiffcoeff: Error; no OH tracer !!!"
133!          stop
134!        endif
135!        g_ho2=igcm_ho2
136!        if (g_ho2.eq.0) then
137!          write(*,*) "moldiffcoeff: Error; no HO2 tracer !!!"
138!          stop
139!        endif
140!        g_h2o=igcm_h2o_vap
141!        if (g_h2o.eq.0) then
142!          write(*,*) "moldiffcoeff: Error; no H2O tracer !!!"
143!          stop
144!        endif
145!        g_h2o2=igcm_h2o2
146!        if (g_h2o2.eq.0) then
147!          write(*,*) "moldiffcoeff: Error; no H2O2 tracer !!!"
148!          stop
149!        endif
150!        g_o1d=igcm_o1d
151!        if (g_h.eq.0) then
152!          write(*,*) "moldiffcoeff: Error; no O1d tracer !!!"
153!          stop
154!        endif
155!        g_o3=igcm_o3
156!        if (g_o3.eq.0) then
157!          write(*,*) "moldiffcoeff: Error; no O3 tracer !!!"
158!          stop
159!        endif
160!        g_n=igcm_n
161!        if (g_n.eq.0) then
162!          write(*,*) "moldiffcoeff: Error; no N tracer !!!"
163!          stop
164!        endif
165!        g_no=igcm_no
166!        if (g_no.eq.0) then
167!          write(*,*) "moldiffcoeff: Error; no NO tracer !!!"
168!          stop
169!        endif
170!        g_no2=igcm_no2
171!        if (g_no2.eq.0) then
172!          write(*,*) "moldiffcoeff: Error; no NO2 tracer !!!"
173!          stop
174!        endif
175!        g_n2d=igcm_n2d
176!        if (g_n2d.eq.0) then
177!          write(*,*) "moldiffcoeff: Error; no N2(D) tracer !!!"
178!          stop
179!        endif
180!        g_oplus=igcm_oplus
181!        if (g_oplus .eq. 0) then
182!        write(*,*) "moldiffcoeff: Error; no Oplus tracer !!!"
183!        stop
184!        endif
185!       g_hplus=igcm_hplus
186!        if (g_hplus .eq. 0) then
187!        write(*,*) "moldiffcoeff: Error; no Hplus tracer !!!"
188!        stop
189!        endif
190!        g_o=igcm_o
191!        if (g_o.eq.0) then
192!          write(*,*) "moldiffcoeff: Error; no O tracer !!!"
193!          stop
194!        endif
195       
196c
197cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
198c    fill array to relate local indexes to gcm indexes
199cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
200
201!        gcmind(i_co2)  =   g_co2
202!        gcmind(i_n2)  =   g_n2
203!        gcmind(i_ar)  =   g_ar
204!        gcmind(i_h2) =   g_h2
205!        gcmind(i_h)  =   g_h
206!        gcmind(i_co)   =   g_co
207!        gcmind(i_o2) =   g_o2
208!        gcmind(i_oh)=   g_oh
209!        gcmind(i_ho2)  =   g_ho2
210!        gcmind(i_h2o) = g_h2o
211!        gcmind(i_h2o2)= g_h2o2
212!        gcmind(i_o1d) = g_o1d
213!        gcmind(i_o3) = g_o3
214!        gcmind(i_n)= g_n
215!        gcmind(i_no) = g_no
216!        gcmind(i_no2) = g_no2
217!        gcmind(i_n2d) = g_n2d
218!        gcmind(i_oplus) =  g_oplus
219!        gcmind(i_hplus) = g_hplus
220!        gcmind(i_o)   =   g_o
221
222c
223cccccccccccccccccccccccccccccccccccccccccccccccccccccccc
224        firstcall= .false.
225      endif ! of if (firstcall)
226
227        dijh2co = 0.0000651
228        dijh2n2 = 0.0000674
229        dijh2o2 = 0.0000697
230        dijh2co2 = 0.0000550
231        dijho = 0.000114
232
233!      dij(i_h2,i_co)   = 0.0000651
234!      dij(i_h2,i_n2)   = 0.0000674
235!      dij(i_h2,i_o2)   = 0.0000697
236!      dij(i_h2,i_co2)  = 0.0000550
237!      dij(i_h2,i_h2)   = 0.0
238!      dij(i_h2,i_h)    = 0.0
239!      dij(i_h2,i_h2o)  = 0.0   !0003
240!      dij(i_h2,i_h2o2) = 0.0   !0003
241!      dij(i_h2,i_o3)   = 0.0   !0003
242!      dij(i_h2,i_o)    = 0.0
243!      dij(i_h2,i_ar)   = 0.0
244!      dij(i_h2,i_n)    = 0.0
245
246!c      dij(i_h,i_o)     = 0.0000144
247!      dij(i_h,i_o)     = 0.000114
248
249! find h2, h and o index in gcm
250! these species are used to define the diffusion coefficients
251
252        do n=1,nqmx
253        if (noms(n) .eq. 'h2') g_h2=n
254        if (noms(n) .eq. 'h') g_h=n
255        if (noms(n) .eq. 'o') g_o=n
256        enddo
257        print*,'moldiffcoeff_red: gh2',g_h2,g_h,g_o
258
259       print*,'moldiffcoeff_red: COEFF CALC'
260
261      do n=1,ncompdiff2
262        dijref=0.
263        if (noms(gcmind(n)) .eq. 'co') dijref=dijh2co
264        if (noms(gcmind(n)) .eq. 'n2') dijref=dijh2n2
265        if (noms(gcmind(n)) .eq. 'o2') dijref=dijh2o2
266        if (noms(gcmind(n)) .eq. 'co2') dijref=dijh2co2
267!       print*,'test',n,dijref
268        if (dijref .gt. 0.0) then
269          do nn=n,ncompdiff2
270            dij(nn,n)=dijref
271     &                  *sqrt(mmol(g_h2)/mmol(gcmind(nn)))
272            if(n.eq.nn) dij(nn,n)=1.0
273            dij(n,nn)=dij(nn,n)
274          enddo
275        endif
276        if (dijref .eq. 0.0) then
277        dijref=dijho
278          dnh=dijref*sqrt(mmol(g_o)/mmol(gcmind(n)))
279          do nn=n,ncompdiff2
280            dij(nn,n)=dnh*sqrt(mmol(g_h)/mmol(gcmind(nn)))
281            if(n.eq.nn) dij(nn,n)=1.0
282            dij(n,nn)=dij(nn,n)
283          enddo
284        endif
285      enddo
286
287      if (outputcoeffs) then
288       ! output coefficients in 'coeffs.dat' file
289       open(56,file='coeffs.dat',status='unknown')
290       do n=1,ncompdiff2
291        do nn=n,ncompdiff2
292          write(56,*) n,nn,dij(n,nn)    !*1.e5/1.381e-23/(273**1.75)
293        enddo
294       enddo
295       close(56)
296      endif
297
298
299      return   
300      end
301     
Note: See TracBrowser for help on using the repository browser.