/[MITgcm]/MITgcm_contrib/jscott/igsm/src_chem/chemadv.F
ViewVC logotype

Annotation of /MITgcm_contrib/jscott/igsm/src_chem/chemadv.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Thu Sep 17 17:40:32 2009 UTC (15 years, 10 months ago) by jscott
Branch: MAIN
CVS Tags: HEAD
chem module archive

1 jscott 1.1
2     #include "ctrparam.h"
3    
4     ! ============================================================
5     !
6     ! CHEMADV.F: Calculating advection and eddy
7     ! transport of chemical species
8     !
9     ! chemadv0
10     ! chemadv
11     ! chemadv2
12     !
13     ! ------------------------------------------------------------
14     !
15     ! Author: Chien Wang
16     ! MIT Joint Program on Science and Policy
17     ! of Global Change
18     !
19     ! ----------------------------------------------------------
20     !
21     ! Revision History:
22     !
23     ! When Who What
24     ! ---- ---------- -------
25     ! 062298 Chien Wang rev.
26     ! 080200 Chien Wang repack based on CliChem3 & add cpp
27     ! 101800 Chien Wang replaced if_3gases with cpp
28     ! 092001 Chien Wang add bc and oc
29     ! 051804 Chien Wang rev. for 46x11
30     !
31     ! ==========================================================
32    
33     ! =======================
34     subroutine chemadv0 (dt)
35     ! =======================
36    
37    
38     #include "chem_para"
39     #include "chem_com"
40    
41     dimension tracert(nlon,nlat,nlev)
42    
43    
44     #if ( defined CPL_CHEM )
45     c
46     c-----------------------------------
47     c Calculating advection and eddy diffusion:
48     c
49    
50     c
51     c CFC11:
52     c
53    
54     do i=1,n3d
55     tracert(i,1,1)=cfc11(i,1,1)
56     enddo
57    
58     call chemadv(8,
59     & tracert,cfc11,cfc110,dt,ddepref)
60     c
61     c CFC12:
62     c
63     do i=1,n3d
64     tracert(i,1,1) = cfc12(i,1,1)
65     enddo
66    
67     call chemadv(8,
68     & tracert,cfc12,cfc12,dt,ddepref)
69     c
70     c N2O:
71     c
72     do i=1,n3d
73     tracert(i,1,1) = xn2o(i,1,1)
74     enddo
75    
76     call chemadv(8,
77     & tracert,xn2o,xn2o,dt,ddepref)
78    
79     ! === if hfc, pfc, and sf6 are included:
80     #if ( defined INC_3GASES )
81    
82     ! === 032698
83     ! === HFC134a:
84     ! ===
85    
86     do i=1,n3d
87     tracert(i,1,1) = hfc134a(i,1,1)
88     enddo
89    
90     call chemadv(8,
91     & tracert,hfc134a,hfc134a,dt,ddepref)
92    
93     ! ===
94     ! === PFC:
95     ! ===
96    
97     do i=1,n3d
98     tracert(i,1,1) = pfc(i,1,1)
99     enddo
100    
101     call chemadv(8,
102     & tracert,pfc,pfc,dt,ddepref)
103    
104     ! ===
105     ! === SF6:
106     ! ===
107    
108     do i=1,n3d
109     tracert(i,1,1) = sf6(i,1,1)
110     enddo
111    
112     call chemadv(8,
113     & tracert,sf6,sf6,dt,ddepref)
114    
115     #endif
116    
117     !
118     ! === Black Carbon:
119     !
120    
121     do i=1,n3d
122     tracert(i,1,1) = bcarbon(i,1,1)
123     enddo
124    
125     call chemadv(8,
126     & tracert,bcarbon,bcarbon,dt,ddepbc)
127    
128     !
129     ! === Organic Carbon:
130     !
131    
132     do i=1,n3d
133     tracert(i,1,1) = ocarbon(i,1,1)
134     enddo
135    
136     call chemadv(8,
137     & tracert,ocarbon,ocarbon,dt,ddepoc)
138    
139    
140     ! ===
141    
142     c
143     c O3:
144     c
145     do i=1,n3d
146     tracert(i,1,1) = o3(i,1,1)
147     enddo
148    
149     c 051295 use chemadv2 with different top vbc:
150    
151     call chemadv2(8,
152     & tracert,o3,o3,dt,ddepo3)
153     c call chemadv(tracert,o3,o3,dt)
154    
155     c 051698 use prescribed top o3:
156    
157     do k=n_tropopause+1,nlev
158     do j=1,nlat
159     o3(1,j,k) = o3top(j,k-n_tropopause,mymonth)
160     end do
161     end do
162     c
163     c CO:
164     c
165     do i=1,n3d
166     tracert(i,1,1) = co(i,1,1)
167     enddo
168    
169     call chemadv(8,
170     & tracert,co,co,dt,ddepref)
171    
172     c
173     c CO2:
174     c
175     do i=1,n3d
176     tracert(i,1,1) = zco2(i,1,1)
177     enddo
178    
179     call chemadv(8,
180     & tracert,zco2,zco2,dt,ddepref)
181    
182     c
183     c NO:
184     c
185     do i=1,n3d
186     tracert(i,1,1) = xno(i,1,1)
187     enddo
188    
189     call chemadv(8,
190     & tracert,xno,xno,dt,ddepno)
191    
192     c
193     c NO2:
194     c
195     do i=1,n3d
196     tracert(i,1,1) = xno2(i,1,1)
197     enddo
198    
199     call chemadv(8,
200     & tracert,xno2,xno2,dt,ddepno2)
201    
202     c
203     c N2O5:
204     c
205     do i=1,n3d
206     tracert(i,1,1) = xn2o5(i,1,1)
207     enddo
208    
209     call chemadv(8,
210     & tracert,xn2o5,xn2o5,dt,ddepn2o5)
211    
212     c
213     c HNO3:
214     c
215     do i=1,n3d
216     tracert(i,1,1) = hno3(i,1,1)
217     enddo
218    
219     call chemadv(8,
220     & tracert,hno3,hno3,dt,ddephno3)
221    
222     c
223     c CH4:
224     c
225     do i=1,n3d
226     tracert(i,1,1) = ch4(i,1,1)
227     enddo
228    
229     call chemadv(8,
230     & tracert,ch4,ch4,dt,ddepref)
231    
232     c
233     c CH2O:
234     c
235     do i=1,n3d
236     tracert(i,1,1) = ch2o(i,1,1)
237     enddo
238    
239     call chemadv(8,
240     & tracert,ch2o,ch2o,dt,ddepref)
241    
242     c
243     c SO2:
244     c
245     do i=1,n3d
246     tracert(i,1,1) = so2(i,1,1)
247     enddo
248    
249     call chemadv(8,
250     & tracert,so2,so2,dt,ddepref)
251    
252     c
253     c H2SO4:
254     c
255     do i=1,n3d
256     tracert(i,1,1) = h2so4(i,1,1)
257     enddo
258    
259     call chemadv(8,
260     & tracert,h2so4,h2so4,dt,ddepref)
261    
262     #endif
263    
264     return
265     end
266    
267    
268     c =====================================================
269     Subroutine chemadv(ifdiff,
270     & x00,x11,xinit,dt1,ddepspd)
271     c =====================================================
272    
273     c==================================================================c
274     c c
275     c CHEMADV.F: Subroutine for calculating advection and eddy c
276     c transport of MIT Global Chemistry Model c
277     c ------------------------------------------------- c
278     c Author: Chien Wang c
279     c MIT Joint Program on Science and Policy c
280     c of Global Change c
281     c Last Revised on: January 30, 1996 c
282     c c
283     c==================================================================c
284    
285     parameter(xxx1 = 1./6., xxx2 = 4.0*xxx1)
286     parameter(yyy3 = 1./36.,yyy2 =10.0*yyy3, yyy1 =25.0*yyy3)
287    
288     #include "chem_para"
289     #include "chem_com"
290     #include "BD2G04.COM"
291    
292     common /WORK1/pit(nlon,nlat),sd(nlon,nlat,nlev1)
293    
294     dimension x00 (nlon,nlat,nlev)
295     dimension x11 (nlon,nlat,nlev)
296     dimension xinit(nlon,nlat,nlev)
297    
298     c 062095 dry deposition speed, in sigma/second and positive
299     c speed is updraft
300     c
301     dimension ddepspd(nlon,nlat)
302    
303     dimension c(nlat+1),x(nlat),w1(4,2),w2(nlat,3),
304     & w4(nlat,5),ww(nlat+1,5),ww2(nlat+1,5)
305    
306     ! ---------------------------------------------------------
307    
308     #if ( defined CPL_CHEM )
309    
310     c-------------------------------------------------------
311     c Definitions of parameters:
312     c
313     c Basic time step for advection
314     c dta =dt1*3.0 ! dta=1 hr.
315     dta =dt1 ! dt1=20 min in GISS therefore here
316     c
317     c 111596:
318     c
319     dt1hr = dta*3.0
320    
321     dt2 =dta*0.5
322    
323     istart=1
324     iend =nlon
325    
326     c-------------------------------
327     c Start do loop for tracers:
328    
329     do 1000 ntime=1,3
330    
331     c-------------------------------------------------------
332     c Scaling mixing ratio with PAI:
333     c
334     do 1 k=1,nlev
335     do 1 i=1,n2dh
336     x00(i,1,k)=x00(i,1,k)*p00(i,1)
337     1 continue
338    
339     do 11 k=1,nlev
340     pvv(1,1,k)=0.0
341     11 continue
342    
343     do 12 j=1,nlat
344     pww(1,j,1)=0.0
345     12 continue
346    
347     c-------------------------------------------------------
348     c Calculating meridional advection:
349     c
350     i = 1
351     do 61 k=1,nlev
352     c do 61 i=istart,iend
353    
354     c c(1)=0.0
355     c(1)= c(2)
356     do 62 j=2,nlat
357     c(j) =pvv(i,j,k)/dyv(j)*dta
358     62 continue
359     c c(nlat+1)=0.0
360     c(nlat+1)= c(nlat)
361    
362     call pdadv1(c,w4,w2,w1,nlat)
363    
364     do 63 j=1,nlat
365     x(j)=x00(i,j,k)
366     63 continue
367    
368     call pdadv2(c,x,w4,w2,w1,ww,ww2,nlat,1)
369    
370     c---------------------------
371     c Lateral BC:
372     c
373     c South pole:
374     c
375     fluxl=pvv(i,2,k)*(x00(i,2,k)+x00(i,1,k))/dyv(2)
376     & *dta*0.5
377    
378     fluxl=max(-x00(i,2,k),
379     & min( x00(i,1,k),fluxl))
380    
381     fluxr=pvv(i,3,k)*(x00(i,3,k)+x00(i,2,k))/dyv(3)
382     & *dta*0.5
383    
384     fluxr=max(-x00(i,3,k),
385     & min( x00(i,2,k),fluxr))
386    
387     x00(i,2,k)=x00(i,2,k)
388     & -(fluxr-fluxl)
389    
390     fluxlbc =
391     & -min(0.0,pvv(i,2,k))
392     & *(x11(i,2,k)-x11(i,1,k))/dyv(2)
393     & *(p00(i,2)+p00(i,1))*0.5
394     & *dta
395     fluxlbc =
396     & max(-x00(i,1,k),
397     & min( x00(i,2,k),fluxlbc))
398    
399     x00(i,1,k)=x00(i,1,k)
400     & +fluxlbc
401    
402     c
403     c North pole:
404     c
405     fluxl=pvv(i,nlat1,k)*(x00(i,nlat1,k)
406     & +x00(i,nlat2,k))/dyv(nlat1)
407     & *dta*0.5
408    
409     fluxl=max(-x00(i,nlat1,k),
410     & min( x00(i,nlat2,k),fluxl))
411    
412     fluxr=pvv(i,nlat, k)*(x00(i,nlat, k)
413     & +x00(i,nlat1,k))/dyv(nlat)
414     & *dta*0.5
415    
416     fluxr=
417     & max(-x00(i,nlat, k),
418     & min( x00(i,nlat1,k),fluxr))
419    
420     x00(i,nlat1,k)=x00(i,nlat1,k)
421     & -(fluxr-fluxl)
422    
423     fluxlbc =
424     & -max(0.0,pvv(i,nlat,k))
425     & *(x11(i,nlat,k)-x11(i,nlat1,k))/dyv(nlat)
426     & *(p00(i,nlat)+p00(i,nlat1))*0.5
427     & *dta
428     fluxlbc =
429     & max(-x00(i,nlat,k),
430     & min( x00(i,nlat1,k),fluxlbc))
431    
432     x00(i,nlat,k) =x00(i,nlat,k)
433     & +fluxlbc
434    
435     c---
436     c Adjustment of momentum equation
437     c
438     c do 64 j=2,nlat1
439     do 64 j=3,nlat2
440     if(k.ne.1
441     & .and.k.ne.nlev
442     & )then
443     deltac = max(-1.0,
444     & min(+1.0,c(j+1)-c(j)))
445     x00(i,j,k)=x(j)
446     & +x00(i,j,k)*deltac
447     endif
448     64 continue
449    
450     c 051595:
451    
452     if( k.ne.1
453     & .and.k.ne.nlev
454     & )then
455     x00(i,2,k)=x00(i,2,k)
456     & *(1.0+(pvv(i,3,k)/dyv(3)
457     & -pvv(i,2,k)/dyv(2))*dta)
458     x00(i,1,k)=x00(i,1,k)
459     & *(1.0+pvv(i,2,k)/dyv(2)
460     & *dta)
461     x00(i,nlat1,k)=x00(i,nlat1,k)
462     & *(1.0+(pvv(i,nlat, k)/dyv(nlat)
463     & -pvv(i,nlat1,k)/dyv(nlat1))*dta)
464     x00(i,nlat,k) =x00(i,nlat,k)
465     & *(1.0-pvv(i,nlat,k)/dyv(nlat)
466     & *dta)
467     endif
468     c=====
469    
470     61 continue
471    
472     c-------------------------------------------------------
473     c Calculating vertical advection:
474     c
475     c do 66 i=istart,iend
476     i = 1
477     do 66 j=1,nlat
478     c do 66 j=2,nlat1
479    
480     c(1) =0.0
481     do 67 k=2,nlev1
482     c(k) =-pww(i,j,k)/dsig(k)*dta
483     67 continue
484     c(nlev) =-pww(i,j,nlev1)/dsig(nlev1)*dta
485     c(nlev+1)=0.0
486    
487     call pdadv1(c,w4,w2,w1,nlev)
488    
489     do 68 k=1,nlev
490     x(k)=x00(i,j,k)
491     68 continue
492    
493     call pdadv2(c,x,w4,w2,w1,ww,ww2,nlev,1)
494    
495     c---
496     c VBC:
497     c
498     fluxt=pww(i,j,3)*(x00(i,j,3)+x00(i,j,2))
499     & /dsig(3)
500     & *dta*0.5
501    
502     c 112596:
503     c fluxt=-max(-x00(i,j,3),
504     c & min( x00(i,j,2),-fluxt))
505     fluxt=-max(-x00(i,j,3)*0.5,
506     & min( x00(i,j,2)*0.5,-fluxt))
507    
508     fluxb=pww(i,j,2)*(x00(i,j,2)+x00(i,j,1))
509     & /dsig(2)
510     & *dta*0.5
511    
512     c 112596:
513     c fluxb=-max(-x00(i,j,2),
514     c & min( x00(i,j,1),-fluxb))
515     fluxb=-max(-x00(i,j,2)*0.5,
516     & min( x00(i,j,1)*0.5,-fluxb))
517    
518     x00(i,j,2)=x00(i,j,2)
519     & +(fluxt-fluxb)
520    
521     x00(i,j,1)=x00(i,j,1)
522     cc & +fluxb
523     c & +pww(i,j,2)
524     c 062095 add dry deposition:
525     ! & +max(0.0,pww(i,j,2)-ddepspd(i,j))
526     & +(pww(i,j,2)-ddepspd(i,j))
527     & *(x11(i,j,2)-x11(i,j,1))/dsig(1)
528     & *p00(i,j)
529     & *dta
530    
531     fluxt=pww(i,j,nlev)*(x00(i,j,nlev)
532     & +x00(i,j,nlev1))
533     & /dsig(nlev)
534     & *dta*0.5
535    
536     c 112596:
537     c fluxt=-max(-x00(i,j,nlev),
538     c & min( x00(i,j,nlev1),-fluxt))
539     fluxt=-max(-x00(i,j,nlev)*0.5,
540     & min( x00(i,j,nlev1)*0.5,-fluxt))
541    
542     fluxb=pww(i,j,nlev1)*(x00(i,j,nlev1)
543     & +x00(i,j,nlev2))
544     & /dsig(nlev1)
545     & *dta*0.5
546    
547     c 112596
548     c fluxb=-max(-x00(i,j,nlev1),
549     c & min( x00(i,j,nlev2),-fluxb))
550     fluxb=-max(-x00(i,j,nlev1)*0.5,
551     & min( x00(i,j,nlev2)*0.5,-fluxb))
552    
553     x00(i,j,nlev1)=x00(i,j,nlev1)
554     & +(fluxt-fluxb)
555    
556     x00(i,j,nlev)=x00(i,j,nlev)
557     c & -fluxb
558     & +min(0.0,pww(i,j,nlev))
559     & *(x11(i,j,nlev)-x11(i,j,nlev1))/dsig(nlev)
560     & *p00(i,j)
561     & *dta
562    
563     c---
564     c
565     c do 69 k=2,nlev1
566     do 69 k=3,nlev2
567     if(j.ne.1.and.j.ne.nlat)then
568     deltac = max(-1.0,
569     & min(+1.0,c(k+1)-c(k)))
570     x00(i,j,k)=x(k)
571     & +x00(i,j,k)*deltac
572     endif
573     69 continue
574    
575     c 051595:
576    
577     if( j.ne.1.and.j.ne.nlat
578     c & .and.j.ne.2.and.j.ne.nlat1
579     & )then
580     c ===
581     c === 081295: set limitation of xyz
582     c ===
583     xyz = (pww(i,j,3)/dsig(3)
584     & -pww(i,j,2)/dsig(2))*dta
585     xyz = min( 1.0,
586     & max(-1.0 ,xyz))
587    
588     x00(i,j,2)=x00(i,j,2)
589     & *(1.0-xyz)
590    
591     xyz = (pww(i,j,nlev) /dsig(nlev)
592     & -pww(i,j,nlev1)/dsig(nlev1))*dta
593     xyz = min( 1.0,
594     & max(-1.0 ,xyz))
595    
596     x00(i,j,nlev1)=x00(i,j,nlev1)
597     & *(1.0-xyz)
598     endif
599     c=====
600    
601     66 continue
602    
603     c goto 2001
604     c9000 continue
605    
606     c--------------------------------------------------------
607     c Rescaling mixing ratio with PAI:
608     c
609    
610     do 200 k=1,nlev
611     do 200 i=1,n2dh
612     x00(i,1,k)=x00(i,1,k)/p11(i,1)
613    
614     c 012797: limit error
615     deltazu =1.2*x11(i,1,k)
616     deltazl =0.8*x11(i,1,k)
617     x00(i,1,k) = max(deltazl, min(deltazu, x00(i,1,k)))
618    
619     deltax =abs(x00(i,1,k)-x11(i,1,k))
620     deltay =1.e-10*x11(i,1,k)
621     if(deltax.gt.deltay)then
622     x11(i,1,k)=x00(i,1,k)
623     else
624     x00(i,1,k)=x11(i,1,k)
625     endif
626     200 continue
627    
628     c----------------------------------------------------
629     c Corner points:
630     c
631    
632     x00(1,1,1) = xxx1*(x00(1,1,2) + x00(1,2,1))
633     & + xxx2* x00(1,1,1)
634     x11(1,1,1) = x00(1,1,1)
635    
636     x00(1,nlat,1) = xxx1*(x00(1,nlat,2) + x00(1,nlat1,1))
637     & + xxx2* x00(1,nlat,1)
638     x11(1,nlat,1) = x00(1,nlat,1)
639    
640     x00(1,1,nlev) = xxx1*(x00(1,1,nlev1) + x00(1,2,nlev))
641     & + xxx2* x00(1,1,nlev)
642     x11(1,1,nlev) = x00(1,1,nlev)
643    
644     x00(1,nlat,nlev) = xxx1*(x00(1,nlat,nlev1) + x00(1,nlat1,nlev))
645     & + xxx2* x00(1,nlat,nlev)
646     x11(1,nlat,nlev) = x00(1,nlat,nlev)
647    
648     c-----------------------------------------------------
649     c LBC smoothing:
650     c
651    
652     do k=1,nlev
653     c x00(1,2,k) = xxx1*(x00(1,1,k) + x00(1,3,k))
654     c & + xxx2* x00(1,2,k)
655    
656     c x00(1,nlat1,k) = xxx1*(x00(1,nlat2,k) + x00(1,nlat,k))
657     c & + xxx2* x00(1,nlat1,k)
658    
659     x00(1,1,k) = yyy1*x00(1,1,k) + yyy2*x00(1,2,k)
660     & + yyy3*x00(1,3,k)
661    
662     x00(1,nlat,k) = yyy1*x00(1,nlat,k) + yyy2*x00(1,nlat1,k)
663     & + yyy3*x00(1,nlat2,k)
664    
665     x11(1,1,k) = x00(1,1,k)
666     c x11(1,2,k) = x00(1,2,k)
667     x11(1,nlat,k) = x00(1,nlat,k)
668     c x11(1,nlat1,k) = x00(1,nlat1,k)
669    
670     enddo
671    
672     c------------------------
673     c Artificial diffusion
674     c for top two levels:
675     c
676     atfk=1.e-3
677    
678     i=1
679     k=nlev1
680     do 606 j=1,nlat
681     x00(i,j,k)=x00(i,j,k)
682     & +atfk
683     & *(x00(i,j,k+1)+x00(i,j,k-1)-2.0*x00(i,j,k))
684     x11(i,j,k)=x00(i,j,k)
685     606 continue
686    
687     k=nlev
688     do 607 j=1,nlat
689     x00(i,j,k)=x00(i,j,k)
690     & +atfk
691     & *min(0.0,(x00(i,j,k-1)-x00(i,j,k)))
692     x11(i,j,k)=x00(i,j,k)
693     607 continue
694    
695     c-------------------------
696     c Artificial diffusion
697     c for bottom two levels:
698     c
699     atfk = 1.e-6 !1.e-5 !1.e-4
700    
701     c k=2
702     c do 616 j=1,nlat
703     c x00(i,j,k)=x00(i,j,k)
704     c & +atfk
705     c & *(x00(i,j,k+1)+x00(i,j,k-1)-2.0*x00(i,j,k))
706     c x11(i,j,k)=x00(i,j,k)
707     c616 continue
708     c
709     c k=1
710     c do 617 j=1,nlat
711     c x00(i,j,k)=x00(i,j,k)
712     c & +atfk
713     c & *(x00(i,j,k+1)-x00(i,j,k))
714     c x11(i,j,k)=x00(i,j,k)
715     c617 continue
716    
717     1000 continue
718    
719     c-----------------------
720     c Calculate eddy diffusion
721     c and re-scale mass:
722     c
723     do 501 k=1,nlev
724     do 501 i=1,n2dh
725     x00(i,1,k)=x00(i,1,k)*p00(i,1)
726     501 continue
727    
728     c 111596:
729     c
730     dteddy = dt1hr !GISS model calculate eddy diffusion
731     !at every 1 hr in new version
732    
733     if(meddy1.eq.1) call chemeddy(ifdiff,x00,x11,dteddy)
734    
735     do 502 k=1,nlev
736     do 502 i=1,n2dh
737     x00(i,1,k)=x00(i,1,k)
738     & +x11(i,1,k)*(p11(i,1)-p00(i,1))
739     x00(i,1,k)=x00(i,1,k)/p11(i,1)
740    
741     c 012797: limit error
742     deltazu =1.2*x11(i,1,k)
743     deltazl =0.8*x11(i,1,k)
744     x00(i,1,k) = max(deltazl, min(deltazu, x00(i,1,k)))
745    
746     x11(i,1,k)=x00(i,1,k)
747     502 continue
748    
749     c
750     c-----------------------
751    
752     #endif
753    
754     return
755     end
756    
757    
758     c ======================================================
759     Subroutine chemadv2(ifdiff,
760     & x00,x11,xinit,dt1,ddepspd)
761     c ======================================================
762    
763     c==================================================================c
764     c c
765     c CHEMADV.F: Subroutine for calculating advection and eddy c
766     c transport of MIT Global Chemistry Model c
767     c ------------------------------------------------- c
768     c Author: Chien Wang c
769     c MIT Joint Program on Science and Policy c
770     c of Global Change c
771     c Last Revised on: January 30, 1996 c
772     c c
773     c==================================================================c
774    
775     parameter(xxx1 = 1./6., xxx2 = 4.0*xxx1)
776     parameter(yyy3 = 1./36.,yyy2 =10.0*yyy3, yyy1 =25.0*yyy3)
777    
778     #include "chem_para"
779     #include "chem_com"
780     #include "BD2G04.COM"
781    
782     common /WORK1/pit(nlon,nlat),sd(nlon,nlat,nlev1)
783    
784     dimension x00 (nlon,nlat,nlev)
785     dimension x11 (nlon,nlat,nlev)
786     dimension xinit(nlon,nlat,nlev)
787    
788     c 062095 dry deposition speed, in sigma/second and positive
789     c speed is updraft
790     c
791     dimension ddepspd(nlon,nlat)
792    
793     dimension c(nlat+1),x(nlat),w1(4,2),w2(nlat,3),
794     & w4(nlat,5),ww(nlat+1,5),ww2(nlat+1,5)
795    
796     ! ---------------------------------------------------------
797    
798     #if ( defined CPL_CHEM )
799    
800     c-------------------------------------------------------
801     c Definitions of parameters:
802     c
803     c Basic time step for advection
804     c dta =dt1*3.0 ! dta=1 hr.
805     dta =dt1 ! dt1=20 min in GISS therefore here
806     c
807     c 111596:
808     c
809     dt1hr = dta*3.0
810    
811     dt2 =dta*0.5
812    
813     istart=1
814     iend =nlon
815    
816     c-------------------------------
817     c Start do loop for tracers:
818    
819     do 1000 ntime=1,3
820    
821     c-------------------------------------------------------
822     c Scaling mixing ratio with PAI:
823     c
824     do 1 k=1,nlev
825     do 1 i=1,n2dh
826     x00(i,1,k)=x00(i,1,k)*p00(i,1)
827     1 continue
828    
829     do 11 k=1,nlev
830     pvv(1,1,k)=0.0
831     11 continue
832    
833     do 12 j=1,nlat
834     pww(1,j,1)=0.0
835     12 continue
836    
837     c-------------------------------------------------------
838     c Calculating meridional advection:
839     c
840     i = 1
841     do 61 k=1,nlev
842     c do 61 i=istart,iend
843    
844     c c(1)=0.0
845     c(1)= c(2)
846     do 62 j=2,nlat
847     c(j) =pvv(i,j,k)/dyv(j)*dta
848     62 continue
849     c c(nlat+1)=0.0
850     c(nlat+1)= c(nlat)
851    
852     call pdadv1(c,w4,w2,w1,nlat)
853    
854     do 63 j=1,nlat
855     x(j)=x00(i,j,k)
856     63 continue
857    
858     call pdadv2(c,x,w4,w2,w1,ww,ww2,nlat,1)
859    
860     c---------------------------
861     c Lateral BC:
862     c
863     c South pole:
864     c
865     fluxl=pvv(i,2,k)*(x00(i,2,k)+x00(i,1,k))/dyv(2)
866     & *dta*0.5
867    
868     fluxl=max(-x00(i,2,k),
869     & min( x00(i,1,k),fluxl))
870    
871     fluxr=pvv(i,3,k)*(x00(i,3,k)+x00(i,2,k))/dyv(3)
872     & *dta*0.5
873    
874     fluxr=max(-x00(i,3,k),
875     & min( x00(i,2,k),fluxr))
876    
877     x00(i,2,k)=x00(i,2,k)
878     & -(fluxr-fluxl)
879    
880     fluxlbc =
881     & -min(0.0,pvv(i,2,k))
882     & *(x11(i,2,k)-x11(i,1,k))/dyv(2)
883     & *(p00(i,2)+p00(i,1))*0.5
884     & *dta
885     fluxlbc =
886     & max(-x00(i,1,k),
887     & min( x00(i,2,k),fluxlbc))
888    
889     x00(i,1,k)=x00(i,1,k)
890     & +fluxlbc
891    
892     c
893     c North pole:
894     c
895     fluxl=pvv(i,nlat1,k)*(x00(i,nlat1,k)
896     & +x00(i,nlat2,k))/dyv(nlat1)
897     & *dta*0.5
898    
899     fluxl=max(-x00(i,nlat1,k),
900     & min( x00(i,nlat2,k),fluxl))
901    
902     fluxr=pvv(i,nlat, k)*(x00(i,nlat, k)
903     & +x00(i,nlat1,k))/dyv(nlat)
904     & *dta*0.5
905    
906     fluxr=
907     & max(-x00(i,nlat, k),
908     & min( x00(i,nlat1,k),fluxr))
909    
910     x00(i,nlat1,k)=x00(i,nlat1,k)
911     & -(fluxr-fluxl)
912    
913     fluxlbc =
914     & -max(0.0,pvv(i,nlat,k))
915     & *(x11(i,nlat,k)-x11(i,nlat1,k))/dyv(nlat)
916     & *(p00(i,nlat)+p00(i,nlat1))*0.5
917     & *dta
918     fluxlbc =
919     & max(-x00(i,nlat,k),
920     & min( x00(i,nlat1,k),fluxlbc))
921    
922     x00(i,nlat,k) =x00(i,nlat,k)
923     & +fluxlbc
924    
925     c---
926     c Adjustment of momentum equation
927     c
928     c do 64 j=2,nlat1
929     do 64 j=3,nlat2
930     if(k.ne.1
931     & .and.k.ne.nlev
932     & )then
933     deltac = max(-1.0,
934     & min(+1.0,c(j+1)-c(j)))
935     x00(i,j,k)=x(j)
936     & +x00(i,j,k)*deltac
937     endif
938     64 continue
939    
940     c 051595:
941    
942     if( k.ne.1
943     & .and.k.ne.nlev
944     & )then
945     x00(i,2,k)=x00(i,2,k)
946     & *(1.0+(pvv(i,3,k)/dyv(3)
947     & -pvv(i,2,k)/dyv(2))*dta)
948     x00(i,1,k)=x00(i,1,k)
949     & *(1.0+pvv(i,2,k)/dyv(2)
950     & *dta)
951     x00(i,nlat1,k)=x00(i,nlat1,k)
952     & *(1.0+(pvv(i,nlat, k)/dyv(nlat)
953     & -pvv(i,nlat1,k)/dyv(nlat1))*dta)
954     x00(i,nlat,k) =x00(i,nlat,k)
955     & *(1.0-pvv(i,nlat,k)/dyv(nlat)
956     & *dta)
957     endif
958     c=====
959    
960     61 continue
961    
962     c-------------------------------------------------------
963     c Calculating vertical advection:
964     c
965     c do 66 i=istart,iend
966     i = 1
967     do 66 j=1,nlat
968     c do 66 j=2,nlat1
969    
970     c(1) =0.0
971     do 67 k=2,nlev1
972     c(k) =-pww(i,j,k)/dsig(k)*dta
973     67 continue
974     c(nlev) =-pww(i,j,nlev1)/dsig(nlev1)*dta
975     c(nlev+1)=0.0
976    
977     call pdadv1(c,w4,w2,w1,nlev)
978    
979     do 68 k=1,nlev
980     x(k)=x00(i,j,k)
981     68 continue
982    
983     call pdadv2(c,x,w4,w2,w1,ww,ww2,nlev,1)
984    
985     c---
986     c VBC:
987     c
988     fluxt=pww(i,j,3)*(x00(i,j,3)+x00(i,j,2))
989     & /dsig(3)
990     & *dta*0.5
991    
992     c 112796
993     c fluxt=-max(-x00(i,j,3),
994     c & min( x00(i,j,2),-fluxt))
995     fluxt=-max(-x00(i,j,3)*0.5,
996     & min( x00(i,j,2)*0.5,-fluxt))
997    
998     fluxb=pww(i,j,2)*(x00(i,j,2)+x00(i,j,1))
999     & /dsig(2)
1000     & *dta*0.5
1001    
1002     c 112796
1003     c fluxb=-max(-x00(i,j,2),
1004     c & min( x00(i,j,1),-fluxb))
1005     fluxb=-max(-x00(i,j,2)*0.5,
1006     & min( x00(i,j,1)*0.5,-fluxb))
1007    
1008     x00(i,j,2)=x00(i,j,2)
1009     & +(fluxt-fluxb)
1010    
1011     x00(i,j,1)=x00(i,j,1)
1012     cc & +fluxb
1013     c & +pww(i,j,2)
1014     c 062095 add dry deposition:
1015     ! & +max(0.0,pww(i,j,2)-ddepspd(i,j))
1016     & +(pww(i,j,2)-ddepspd(i,j))
1017     & *(x11(i,j,2)-x11(i,j,1))/dsig(1)
1018     & *p00(i,j)
1019     & *dta
1020    
1021     fluxt=pww(i,j,nlev)*(x00(i,j,nlev)
1022     & +x00(i,j,nlev1))
1023     & /dsig(nlev)
1024     & *dta*0.5
1025    
1026     c 112796
1027     c fluxt=-max(-x00(i,j,nlev),
1028     c & min( x00(i,j,nlev1),-fluxt))
1029     fluxt=-max(-x00(i,j,nlev)*0.5,
1030     & min( x00(i,j,nlev1)*0.5,-fluxt))
1031    
1032     fluxb=pww(i,j,nlev1)*(x00(i,j,nlev1)
1033     & +x00(i,j,nlev2))
1034     & /dsig(nlev1)
1035     & *dta*0.5
1036    
1037     c 112796
1038     c fluxb=-max(-x00(i,j,nlev1),
1039     c & min( x00(i,j,nlev2),-fluxb))
1040     fluxb=-max(-x00(i,j,nlev1)*0.5,
1041     & min( x00(i,j,nlev2)*0.5,-fluxb))
1042    
1043     x00(i,j,nlev1)=x00(i,j,nlev1)
1044     & +(fluxt-fluxb)
1045    
1046     x00(i,j,nlev)=x00(i,j,nlev)
1047     c & -fluxb
1048     & +min(0.0,pww(i,j,nlev))
1049     & *(x11(i,j,nlev)-x11(i,j,nlev1))/dsig(nlev)
1050     & *p00(i,j)
1051     & *dta
1052    
1053    
1054     c---
1055     c
1056     c do 69 k=2,nlev1
1057     do 69 k=3,nlev2
1058     if(j.ne.1.and.j.ne.nlat)then
1059     deltac = max(-1.0,
1060     & min(+1.0,c(k+1)-c(k)))
1061     x00(i,j,k)=x(k)
1062     & +x00(i,j,k)*deltac
1063     endif
1064     69 continue
1065    
1066     c 051595:
1067    
1068     if( j.ne.1.and.j.ne.nlat
1069     c & .and.j.ne.2.and.j.ne.nlat1
1070     & )then
1071     c ===
1072     c === 081295: set limitation of xyz
1073     c ===
1074     xyz = (pww(i,j,3)/dsig(3)
1075     & -pww(i,j,2)/dsig(2))*dta
1076     xyz = min( 1.0,
1077     & max(-1.0 ,xyz))
1078    
1079     x00(i,j,2)=x00(i,j,2)
1080     & *(1.0-xyz)
1081    
1082     xyz = (pww(i,j,nlev) /dsig(nlev)
1083     & -pww(i,j,nlev1)/dsig(nlev1))*dta
1084     xyz = min( 1.0,
1085     & max(-1.0 ,xyz))
1086    
1087     x00(i,j,nlev1)=x00(i,j,nlev1)
1088     & *(1.0-xyz)
1089     endif
1090     c=====
1091    
1092     66 continue
1093    
1094     c goto 2001
1095     c9000 continue
1096    
1097     c--------------------------------------------------------
1098     c Rescaling mixing ratio with PAI:
1099     c
1100    
1101     do 200 k=1,nlev
1102     do 200 i=1,n2dh
1103     x00(i,1,k)=x00(i,1,k)/p11(i,1)
1104    
1105     c 012797: limit error
1106     deltazu =1.2*x11(i,1,k)
1107     deltazl =0.8*x11(i,1,k)
1108     x00(i,1,k) = max(deltazl, min(deltazu, x00(i,1,k)))
1109    
1110     deltax =abs(x00(i,1,k)-x11(i,1,k))
1111     deltay =1.e-10*x11(i,1,k)
1112     if(deltax.gt.deltay)then
1113     x11(i,1,k)=x00(i,1,k)
1114     else
1115     x00(i,1,k)=x11(i,1,k)
1116     endif
1117     200 continue
1118    
1119     c----------------------------------------------------
1120     c Corner points:
1121     c
1122    
1123     x00(1,1,1) = xxx1*(x00(1,1,2) + x00(1,2,1))
1124     & + xxx2* x00(1,1,1)
1125     x11(1,1,1) = x00(1,1,1)
1126    
1127     x00(1,nlat,1) = xxx1*(x00(1,nlat,2) + x00(1,nlat1,1))
1128     & + xxx2* x00(1,nlat,1)
1129     x11(1,nlat,1) = x00(1,nlat,1)
1130    
1131     x00(1,1,nlev) = xxx1*(x00(1,1,nlev1) + x00(1,2,nlev))
1132     & + xxx2* x00(1,1,nlev)
1133     x11(1,1,nlev) = x00(1,1,nlev)
1134    
1135     x00(1,nlat,nlev) = xxx1*(x00(1,nlat,nlev1) + x00(1,nlat1,nlev))
1136     & + xxx2* x00(1,nlat,nlev)
1137     x11(1,nlat,nlev) = x00(1,nlat,nlev)
1138    
1139     c-----------------------------------------------------
1140     c LBC smoothing:
1141     c
1142    
1143     do k=1,nlev
1144     c x00(1,2,k) = xxx1*(x00(1,1,k) + x00(1,3,k))
1145     c & + xxx2* x00(1,2,k)
1146    
1147     c x00(1,nlat1,k) = xxx1*(x00(1,nlat2,k) + x00(1,nlat,k))
1148     c & + xxx2* x00(1,nlat1,k)
1149    
1150     x00(1,1,k) = yyy1*x00(1,1,k) + yyy2*x00(1,2,k)
1151     & + yyy3*x00(1,3,k)
1152    
1153     x00(1,nlat,k) = yyy1*x00(1,nlat,k) + yyy2*x00(1,nlat1,k)
1154     & + yyy3*x00(1,nlat2,k)
1155    
1156     x11(1,1,k) = x00(1,1,k)
1157     c x11(1,2,k) = x00(1,2,k)
1158     x11(1,nlat,k) = x00(1,nlat,k)
1159     c x11(1,nlat1,k) = x00(1,nlat1,k)
1160    
1161     enddo
1162    
1163     c------------------------
1164     c Artificial diffusion
1165     c for top two levels:
1166     c
1167     c ===== 091495:
1168     c atfk=1.e-4 !138 d
1169     c atfk=2.e-5 !690 d
1170     atfk= 1.e-10 !1.e-6 better - 031696 !20*690 d
1171    
1172     i=1
1173     k=nlev1
1174     do 606 j=1,nlat
1175     x00(i,j,k)=x00(i,j,k)
1176     & +atfk
1177     & *(x00(i,j,k+1)+x00(i,j,k-1)-2.0*x00(i,j,k))
1178     x11(i,j,k)=x00(i,j,k)
1179     606 continue
1180    
1181     c k=nlev
1182     c do 607 j=1,nlat
1183     c x00(i,j,k)=x00(i,j,k)
1184     c & +atfk
1185     c & *min(0.0,(x00(i,j,k-1)-x00(i,j,k)))
1186     c x11(i,j,k)=x00(i,j,k)
1187     c607 continue
1188    
1189     c-------------------------
1190     c Artificial diffusion
1191     c for bottom two levels:
1192     c
1193     atfk = 1.e-6 !1.e-5 !1.e-4
1194    
1195     c k=2
1196     c do 616 j=1,nlat
1197     c x00(i,j,k)=x00(i,j,k)
1198     c & +atfk
1199     c & *(x00(i,j,k+1)+x00(i,j,k-1)-2.0*x00(i,j,k))
1200     c x11(i,j,k)=x00(i,j,k)
1201     c616 continue
1202     c
1203     c k=1
1204     c do 617 j=1,nlat
1205     c x00(i,j,k)=x00(i,j,k)
1206     c & +atfk
1207     c & *(x00(i,j,k+1)-x00(i,j,k))
1208     c x11(i,j,k)=x00(i,j,k)
1209     c617 continue
1210    
1211     1000 continue
1212    
1213     c-----------------------
1214     c Calculate eddy diffusion
1215     c and re-scale mass:
1216     c
1217     do 501 k=1,nlev
1218     do 501 i=1,n2dh
1219     x00(i,1,k)=x00(i,1,k)*p00(i,1)
1220     501 continue
1221    
1222     c 111596:
1223     c
1224     dteddy = dt1hr !GISS model calculate eddy diffusion
1225     !at every 1 hr in new version
1226    
1227     if(meddy1.eq.1) call chemeddy(ifdiff,x00,x11,dteddy)
1228    
1229     do 502 k=1,nlev
1230     do 502 i=1,n2dh
1231     x00(i,1,k)=x00(i,1,k)
1232     & +x11(i,1,k)*(p11(i,1)-p00(i,1))
1233     x00(i,1,k)=x00(i,1,k)/p11(i,1)
1234    
1235     c 012797: limit error
1236     deltazu =1.2*x11(i,1,k)
1237     deltazl =0.8*x11(i,1,k)
1238     x00(i,1,k) = max(deltazl, min(deltazu, x00(i,1,k)))
1239    
1240     x11(i,1,k)=x00(i,1,k)
1241     502 continue
1242    
1243     c
1244     c-----------------------
1245     #endif
1246    
1247     return
1248     end
1249    

  ViewVC Help
Powered by ViewVC 1.1.22