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

Contents 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 - (show 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
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