File: C:\NOAA\NEMS_11731\src\atmos\gfs\dyn\gfidi_hyb_gc_h.f
1 subroutine gfidi_hyb_gc_h(lon_dim,lons_lat,lat,
2 & dg,hg,zg,ug,vg,rqg,dphi,dlam,ps,zsphi,zslam,
3 & rcl,spdmax,deltim,nvcn,xvcn,
4 & dhdf,dhdl,drqdf,drqdl,dudl,dvdl,dudf,dvdf,
5 & dpsdt,dhdt,drqdt,dudt,dvdt,szdrqdt,zfirst)
6
7
8
9
10
11
12
13
14
15 use gfs_dyn_machine , only : kind_grid
16
17 use gfs_dyn_resol_def
18 use namelist_dynamics_def
19 use gfs_dyn_coordinate_def
20 use gfs_dyn_tracer_const
21 use gfs_dyn_physcons, rerth => con_rerth
22 &, rd => con_rd, cpd => con_cp
23 &, omega => con_omega, kappa => con_rocp
24 &, grav => con_g
25 implicit none
26
27 real (kind=kind_grid), parameter :: rkappa=1.0/kappa
28 integer lon_dim,lons_lat
29 integer i,k,kk,n,nvcn,ifirst,lat
30 real coriol,rcl,sinra,deltim,xvcn,sinlat
31 real det,hkrt0,wmkm1,wmkp1
32 real
33 1 dg(lon_dim,levs), hg(lon_dim,levs), zg(lon_dim,levs),
34 2 ug(lon_dim,levs), vg(lon_dim,levs),
35 2 rqg(lon_dim,levs,ntrac),
36 3 dphi(lon_dim), dlam(lon_dim), ps(lon_dim),
37 3 zsphi(lon_dim),zslam(lon_dim)
38 real
39 1 dhdf(lon_dim,levs), dhdl(lon_dim,levs),
40 1 dudf(lon_dim,levs), dudl(lon_dim,levs),
41 1 dvdf(lon_dim,levs), dvdl(lon_dim,levs),
42 1 drqdf(lon_dim,levs,ntrac), drqdl(lon_dim,levs,ntrac)
43 real
44 1 dudt(lon_dim,levs), dvdt(lon_dim,levs),
45 1 dpsdt(lon_dim),
46 1 dhdt(lon_dim,levs),
47 1 drqdt(lon_dim,levs,ntrac), spdmax(levs)
48 real dpdti(lon_dim,levs+1)
49
50 real drdf (lon_dim,levs), drdl (lon_dim,levs)
51 real dcpdf(lon_dim,levs), dcpdl(lon_dim,levs)
52 real dkhdf(lon_dim,levs), dkhdl(lon_dim,levs)
53
54
55
56 real fs(lons_lat),rm2(lons_lat),xm2(lons_lat)
57 real rdelp2(lons_lat,levs)
58 real xr(lons_lat,levs),xcp(lons_lat,levs)
59 real xkappa(lons_lat,levs)
60 real cg(lons_lat,levs),ek(lons_lat,levs)
61 real fb(lons_lat,levs+1),fg(lons_lat,levs)
62 real dpxi(lons_lat,levs+1),dpyi(lons_lat,levs+1)
63 real ppi(lons_lat,levs+1), ppl(lons_lat,levs)
64 real hki (lons_lat,levs+1),hkci(lons_lat,levs+1)
65 real dpp(lons_lat,levs),rpp(lons_lat,levs)
66 real dlnpx(lons_lat,levs),dlnpy(lons_lat,levs)
67 real dphix (lons_lat,levs),dphiy (lons_lat,levs)
68 real dphixk(lons_lat,levs),dphiyk(lons_lat,levs)
69 real wf(lons_lat,levs+1),wf1(lons_lat,levs+1)
70 real wflx(lons_lat,levs+1)
71 real wml(lons_lat,levs),wmm(lons_lat,levs),wmu(lons_lat,levs)
72 real work(lons_lat,levs)
73 real dup(lons_lat,levs),dum(lons_lat,levs)
74 real alpha(lons_lat,levs),betta(lons_lat,levs)
75 real gamma(lons_lat,levs),delta(lons_lat,levs)
76 real zadv(lons_lat,levs,3+ntrac)
77 real sumdf(lons_lat,levs), sumdl(lons_lat,levs)
78 real sumrq(lons_lat,levs)
79
80 real, parameter :: cons0=0.0, cons1=1.0, cons2=2.0, cons0p5=0.5
81 real rdt2
82 logical adjusted
83 integer levsb
84 integer irc
85
86 real szdrqdt(lon_dim,levs,ntrac)
87 real rqg_half(lons_lat,0:levs,ntrac), rqg_d(lons_lat,0:levs,ntrac)
88 real rrkp,rrk1m,phkp,phk1m,bb,cc,tmpdrqdt
89 logical zfirst
90
91
92
93
94 = cons1/(cons2*deltim)
95
96 sinra = sqrt(cons1-cons1/rcl)
97 coriol = cons2*omega*sinra
98 sinra = sinra/rerth
99
100 if(lat.gt.latg2) then
101 coriol = -coriol
102 sinra = -sinra
103 endif
104
105
106
107 = cons0
108 do k=1,levs
109 do i=1,lons_lat
110 ek(i,k) = ( ug(i,k)*ug(i,k)+vg(i,k)*vg(i,k) ) * rcl
111 spdmax(k) = max( ek(i,k),spdmax(k) )
112 enddo
113 enddo
114
115
116
117 = cons0
118 drdl = cons0
119 drdf = cons0
120 xcp = cons0
121 dcpdl = cons0
122 dcpdf = cons0
123 sumdl = cons0
124 sumdf = cons0
125 sumrq = cons0
126
127 do n=1,ntrac
128 if( ri(n) .ne. cons0 .and. cpi(n) .ne. cons0 ) then
129 do k=1,levs
130 do i=1,lons_lat
131 xr (i,k) = xr (i,k) + rqg (i,k,n)*ri(n)
132 drdl (i,k) = drdl (i,k) + drqdl(i,k,n)*ri(n)
133 drdf (i,k) = drdf (i,k) + drqdf(i,k,n)*ri(n)
134
135 (i,k) = xcp (i,k) + rqg (i,k,n)*cpi(n)
136 dcpdl(i,k) = dcpdl(i,k) + drqdl(i,k,n)*cpi(n)
137 dcpdf(i,k) = dcpdf(i,k) + drqdf(i,k,n)*cpi(n)
138
139 (i,k) = sumrq(i,k) + rqg (i,k,n)
140 sumdl(i,k) = sumdl(i,k) + drqdl(i,k,n)
141 sumdf(i,k) = sumdf(i,k) + drqdf(i,k,n)
142 enddo
143 enddo
144 endif
145 enddo
146 do k=1,levs
147 do i=1,lons_lat
148 drdl (i,k) = drdl (i,k) - ri(0) *sumdl(i,k)
149 drdf (i,k) = drdf (i,k) - ri(0) *sumdf(i,k)
150 xr (i,k) = ( cons1 - sumrq(i,k) )*ri(0) + xr (i,k)
151
152 (i,k) = dcpdl(i,k) - cpi(0)*sumdl(i,k)
153 dcpdf(i,k) = dcpdf(i,k) - cpi(0)*sumdf(i,k)
154 xcp(i,k) = ( cons1 - sumrq(i,k) )*cpi(0) + xcp(i,k)
155 xkappa(i,k) = xr(i,k) / xcp(i,k)
156 enddo
157 enddo
158
159
160
161 (:,1) = cons0
162 hkci(:,1) = cons0
163 hki(:,levs+1) = cons0
164 hkci(:,levs+1) = cons0
165 do k=2,levs
166 do i=1,lons_lat
167 hkrt0 = (hg(i,k-1)+hg(i,k))/(thref(k-1)+thref(k))
168 hki (i,k) = ck5(k)*hkrt0**rkappa
169 hkci(i,k) = hki(i,k)*rkappa/(hg(i,k-1)+hg(i,k))
170 enddo
171 enddo
172 do k=1,levs+1
173 do i=1,lons_lat
174 ppi(i,k) = ak5(k ) + bk5(k )*ps(i) + hki(i,k)
175 enddo
176 enddo
177
178 do k=1,levs
179 do i=1,lons_lat
180 ppl(i,k) = cons0p5 * ( ppi(i,k) + ppi(i,k+1) )
181 rpp(i,k)=1./(ppi(i,k)+ppi(i,k+1))
182 dpp(i,k)=ppi(i,k)-ppi(i,k+1)
183 rdelp2(i,k) = cons0p5/dpp(i,k)
184 if( dpp(i,k) .lt. cons0 ) then
185 print *,' ----- dpp < 0 in gfidi at i k ',i,k
186 endif
187 enddo
188 enddo
189
190
191
192 do k=1,levs+1
193 do i=1,lons_lat
194 dpxi(i,k)=bk5(k)*dlam(i)*rcl
195 dpyi(i,k)=bk5(k)*dphi(i)*rcl
196 enddo
197 enddo
198 do k=2,levs
199 do i=1,lons_lat
200 dpxi(i,k)=dpxi(i,k)+hkci(i,k)*(dhdl(i,k-1)+dhdl(i,k))
201 dpyi(i,k)=dpyi(i,k)+hkci(i,k)*(dhdf(i,k-1)+dhdf(i,k))
202 enddo
203 enddo
204
205 (:,levs)=cons0
206 betta(:,1 )=cons0
207 do k=2,levs
208 do i=1,lons_lat
209 alpha(i,k-1)=(ppi(i,k-1)+ppi(i,k))**xkappa(i,k-1)
210 alpha(i,k-1)=(ppi(i,k)+ppi(i,k+1))**xkappa(i,k)/alpha(i,k-1)
211 enddo
212 enddo
213 do k=1,levs-1
214 do i=1,lons_lat
215 betta(i,k+1)=(ppi(i,k+1)+ppi(i,k+2))**xkappa(i,k+1)
216 betta(i,k+1)=(ppi(i,k )+ppi(i,k+1))**xkappa(i,k)/betta(i,k+1)
217 enddo
218 enddo
219 do k=1,levs
220 do i=1,lons_lat
221 gamma(i,k)=cons1-xkappa(i,k)*dpp(i,k)*rpp(i,k)*cons2
222 delta(i,k)=cons1+xkappa(i,k)*dpp(i,k)*rpp(i,k)*cons2
223 enddo
224 enddo
225
226
227
228 do k=1,levs
229 do i=1,lons_lat
230 fg(i,k)=ug(i,k)*(dpxi(i,k)-dpxi(i,k+1))
231 & +vg(i,k)*(dpyi(i,k)-dpyi(i,k+1))
232 & +dpp(i,k)*dg(i,k)
233 cg(i,k)=ug(i,k)*(dpxi(i,k)+dpxi(i,k+1))
234 & +vg(i,k)*(dpyi(i,k)+dpyi(i,k+1))
235 enddo
236 enddo
237
238 do i=1,lons_lat
239 fb(i,levs+1)=cons0
240 enddo
241 do k=levs,1,-1
242 do i=1,lons_lat
243 fb(i,k)=fb(i,k+1)+fg(i,k)
244 enddo
245 enddo
246
247
248
249 do i=1,lons_lat
250 dpsdt(i) = - fb(i,1)
251 enddo
252
253
254
255
256 do k=1,levs
257 do i=1,lons_lat
258 dlnpx(i,k)=rpp(i,k)*(dpxi(i,k)+dpxi(i,k+1))/rcl
259 dlnpy(i,k)=rpp(i,k)*(dpyi(i,k)+dpyi(i,k+1))/rcl
260 enddo
261 enddo
262
263
264
265 do k=1,levs
266 do i=1,lons_lat
267 dkhdl(i,k)=( xr(i,k)*dhdl(i,k)+hg(i,k)*drdl(i,k)
268 & -xkappa(i,k)*hg(i,k)*dcpdl(i,k) )/xcp(i,k)
269 dkhdf(i,k)=( xr(i,k)*dhdf(i,k)+hg(i,k)*drdf(i,k)
270 & -xkappa(i,k)*hg(i,k)*dcpdf(i,k) )/xcp(i,k)
271 enddo
272 enddo
273 do k=1,levs
274 do i=1,lons_lat
275 dphixk(i,k)= rpp(i,k)*( dpp(i,k)*dkhdl(i,k)
276 & +xkappa(i,k)*hg(i,k)*( (dpxi(i,k)-dpxi(i,k+1))
277 & -rpp(i,k)*dpp(i,k)*(dpxi(i,k)+dpxi(i,k+1)) ) )
278 dphiyk(i,k)= rpp(i,k)*( dpp(i,k)*dkhdf(i,k)
279 & +xkappa(i,k)*hg(i,k)*( (dpyi(i,k)-dpyi(i,k+1))
280 & -rpp(i,k)*dpp(i,k)*(dpyi(i,k)+dpyi(i,k+1)) ) )
281 enddo
282 enddo
283 do i=1,lons_lat
284 dphix(i,1)= cons0
285 dphiy(i,1)= cons0
286 enddo
287 do k=1,levs-1
288 do i=1,lons_lat
289 dphix(i,k )= dphix(i,k)+dphixk(i,k)
290 dphix(i,k+1)= dphix(i,k)+dphixk(i,k)
291 dphiy(i,k )= dphiy(i,k)+dphiyk(i,k)
292 dphiy(i,k+1)= dphiy(i,k)+dphiyk(i,k)
293 enddo
294 enddo
295 do i=1,lons_lat
296 dphix(i,levs)= dphix(i,levs)+dphixk(i,levs)
297 dphiy(i,levs)= dphiy(i,levs)+dphiyk(i,levs)
298 enddo
299 do k=1,levs
300 do i=1,lons_lat
301 dphix(i,k)= dphix(i,k) / rcl
302 dphiy(i,k)= dphiy(i,k) / rcl
303 enddo
304 enddo
305
306
307
308 do k=1,levs
309 do i=1,lons_lat
310 dudt(i,k)=
311 & - xkappa(i,k) *hg(i,k)*dlnpx(i,k)
312 & - dphix(i,k) -grav*zslam(i)
313 & + vg(i,k)*coriol
314 dvdt(i,k)=
315 & - xkappa(i,k) *hg(i,k)*dlnpy(i,k)
316 & - dphiy(i,k) -grav*zsphi(i)
317 & - ug(i,k)*coriol
318 & - ek(i,k) * sinra
319 enddo
320 enddo
321
322
323
324
325 do k=1,levs
326 do i=1,lons_lat
327 dhdt(i,k)=
328 & +xkappa(i,k)*hg(i,k)*rpp(i,k)*
329 & (cg(i,k)-fb(i,k)-fb(i,k+1))
330 enddo
331 enddo
332
333
334
335
336
337
338 do k=1,levs
339 do i=1,lons_lat
340 dudt(i,k)=dudt(i,k)
341 & -ug(i,k)*dudl(i,k)-vg(i,k)*dudf(i,k)
342 dvdt(i,k)=dvdt(i,k)
343 & -ug(i,k)*dvdl(i,k)-vg(i,k)*dvdf(i,k)
344 dhdt(i,k)=dhdt(i,k)
345 & -ug(i,k)*dhdl(i,k)-vg(i,k)*dhdf(i,k)
346 enddo
347 enddo
348
349 do n=1,ntrac
350 do k=1,levs
351 do i=1,lons_lat
352 drqdt(i,k,n)=
353 & -ug(i,k)*drqdl(i,k,n)-vg(i,k)*drqdf(i,k,n)
354 enddo
355 enddo
356 enddo
357
358
359
360 do i=1,lons_lat
361 dup(i,levs)=cons0
362 dum(i,1 )=cons0
363 enddo
364 do k=1,levs-1
365 do i=1,lons_lat
366 dup(i,k )=delta(i,k)*hg(i,k)-betta(i,k+1)*hg(i,k+1)
367 dum(i,k+1)=alpha(i,k)*hg(i,k)-gamma(i,k+1)*hg(i,k+1)
368 enddo
369 enddo
370
371 =levs
372 do k=levs,2,-1
373 if( ak5(k).eq.cons0 .and. bk5(k).eq.cons0
374 & .and. ck5(k).ne.cons0 ) levsb=k-1
375 enddo
376 k=2
377 do i=1,lons_lat
378 wmkm1=hkci(i,k)*rdelp2(i,k-1)
379 wmkp1=hkci(i,k)*rdelp2(i, k)
380 wmm(i,k-1)=wmkm1*dup(i,k-1)+wmkp1*dum(i,k)-cons1
381 wmu(i,k-1)=wmkp1*dup(i,k)
382 enddo
383 do k=3,levs-1
384 do i=1,lons_lat
385 wmkm1=hkci(i,k)*rdelp2(i,k-1)
386 wmkp1=hkci(i,k)*rdelp2(i, k)
387 wml(i,k-2)=wmkm1*dum(i,k-1)
388 wmm(i,k-1)=wmkm1*dup(i,k-1)+wmkp1*dum(i,k)-cons1
389 wmu(i,k-1)=wmkp1*dup(i,k)
390 enddo
391 enddo
392 k=levs
393 do i=1,lons_lat
394 wmkm1=hkci(i,k)*rdelp2(i,k-1)
395 wmkp1=hkci(i,k)*rdelp2(i, k)
396 wml(i,k-2)=wmkm1*dum(i,k-1)
397 wmm(i,k-1)=wmkm1*dup(i,k-1)+wmkp1*dum(i,k)-cons1
398 enddo
399
400
401 (:,levsb:levs+1)=cons0
402 do k=2,levsb
403 do i=1,lons_lat
404
405 (i,k-1)=bk5(k)*dpsdt(i)+fb(i,k)
406 & +hkci(i,k)*(dhdt(i,k-1)+dhdt(i,k))
407 enddo
408 enddo
409
410 call tridim_hyb_gc_h(lons_lat,lons_lat,levsb-1,levs+1,1,
411 & wml,wmm,wmu,wf,work,wf1)
412
413 wflx(:,1 )=cons0
414 wflx(:,levs+1)=cons0
415
416 (:,levsb+1:levs+1)=cons0
417 do k=2,levsb
418 do i=1,lons_lat
419 wflx(i,k)=wf1(i,k-1)
420 enddo
421 enddo
422
423
424
425
426
427
428
429
430 do k=1,levs
431 do i=1,lons_lat
432 zadv(i,k,3)=-rdelp2(i,k)*
433 & (wflx(i,k)*dum(i,k)+wflx(i,k+1)*dup(i,k))
434 enddo
435 enddo
436
437
438
439
440
441 do k=1,levs-1
442 do i=1,lons_lat
443 dup(i,k )=ug(i,k)-ug(i,k+1)
444 dum(i,k+1)=ug(i,k)-ug(i,k+1)
445 enddo
446 enddo
447
448 do k=1,levs
449 do i=1,lons_lat
450 zadv(i,k,1)=-rdelp2(i,k)*
451 & (wflx(i,k)*dum(i,k)+wflx(i,k+1)*dup(i,k))
452 enddo
453 enddo
454
455
456
457
458
459
460 do k=1,levs-1
461 do i=1,lons_lat
462 dup(i,k )=vg(i,k)-vg(i,k+1)
463 dum(i,k+1)=vg(i,k)-vg(i,k+1)
464 enddo
465 enddo
466 do k=1,levs
467 do i=1,lons_lat
468 zadv(i,k,2)=-rdelp2(i,k)*
469 & (wflx(i,k)*dum(i,k)+wflx(i,k+1)*dup(i,k))
470 enddo
471 enddo
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492 if(zflxtvd) then
493
494 do n=1,ntrac
495 do i=1,lons_lat
496 do k=1,levs-1
497 (i,k,n)=cons0p5*(rqg(i,k,n)+rqg(i,k+1,n))
498 enddo
499 rqg_half(i,0,n)=rqg(i,1,n)
500 rqg_half(i,levs,n)=rqg(i,levs,n)
501
502
503 do k=1,levs-1
504 (i,k,n)=rqg(i,k,n)-rqg(i,k+1,n)
505 enddo
506 if(rqg(i,levs,n).ge.cons0) then
507 rqg_d(i,levs,n)=rqg(i,levs,n)-
508 1 max(cons0,cons2*rqg(i,levs,n)-rqg(i,levs-1,n))
509 else
510 rqg_d(i,levs,n)=rqg(i,levs,n)-
511 1 min(cons0,cons2*rqg(i,levs,n)-rqg(i,levs-1,n))
512 endif
513 if(rqg(i,1,n).ge.cons0) then
514 rqg_d(i,0,n)=max(cons0,cons2*rqg(i,1,n)-rqg(i,2,n))-
515 1 rqg(i,1,n)
516 else
517 rqg_d(i,0,n)=min(cons0,cons2*rqg(i,1,n)-rqg(i,2,n))-
518 1 rqg(i,1,n)
519 endif
520 enddo
521
522
523 do i=1,lons_lat
524 do k=1,levs-1
525 if(wflx(i,k+1).gt.cons0) then
526 =cons0
527 if(rqg_d(i,k,n).ne.cons0) rrkp=rqg_d(i,k+1,n)/rqg_d(i,k,n)
528 phkp=(rrkp+abs(rrkp))/(1+abs(rrkp))
529 rqg_half(i,k,n)=rqg(i,k+1,n)+
530 1 phkp*(rqg_half(i,k,n)-rqg(i,k+1,n))
531 else
532 rrk1m=cons0
533 if(rqg_d(i,k,n).ne.cons0) rrk1m=rqg_d(i,k-1,n)/rqg_d(i,k,n)
534 phk1m=(rrk1m+abs(rrk1m))/(1+abs(rrk1m))
535 rqg_half(i,k,n)=rqg(i,k,n)+
536 1 phk1m*(rqg_half(i,k,n)-rqg(i,k,n))
537 endif
538 enddo
539 enddo
540
541 do i=1,lons_lat
542 do k=1,levs
543 bb=rqg_half(i,k-1,n)*wflx(i,k)-rqg_half(i,k,n)*wflx(i,k+1)
544 cc=-rqg(i,k,n)*(wflx(i,k)-wflx(i,k+1))
545 tmpdrqdt=-rdelp2(i,k)*2.0*(bb+cc)
546 if(zfirst) then
547 zadv(i,k,3+n)=tmpdrqdt
548 else
549 zadv(i,k,3+n)=cons0p5*(tmpdrqdt+szdrqdt(i,k,n))
550 endif
551 szdrqdt(i,k,n)=tmpdrqdt
552 enddo
553 enddo
554 enddo
555
556 else
557
558 do n=1,ntrac
559 do k=1,levs-1
560 do i=1,lons_lat
561 dup(i,k )=rqg(i,k,n)-rqg(i,k+1,n)
562 dum(i,k+1)=rqg(i,k,n)-rqg(i,k+1,n)
563 enddo
564 enddo
565 do k=1,levs
566 do i=1,lons_lat
567 zadv(i,k,3+n)=-rdelp2(i,k)*
568 & (wflx(i,k)*dum(i,k)+wflx(i,k+1)*dup(i,k))
569 enddo
570 enddo
571
572 enddo
573
574 endif
575
576
577
578 call vcnhyb_gc_h(lons_lat,levs,3+ntrac,deltim,
579 & ppi,ppl,wflx,zadv,nvcn,xvcn)
580 if( nvcn.gt.0 ) print *,' ---- nvcn =',nvcn,' xvcn=',xvcn
581
582
583 do k=1,levs
584 do i=1,lons_lat
585 dudt(i,k)=dudt(i,k)+zadv(i,k,1)
586 dvdt(i,k)=dvdt(i,k)+zadv(i,k,2)
587 dhdt(i,k)=dhdt(i,k)+zadv(i,k,3)
588 enddo
589 enddo
590
591 do n=1,ntrac
592 do k=1,levs
593 do i=1,lons_lat
594 drqdt(i,k,n)=drqdt(i,k,n)+zadv(i,k,3+n)
595 enddo
596 enddo
597 enddo
598
599
600
601
602
603 return
604 end
605
606 subroutine mymaxmin(a,im,ix,kx,ch)
607 real a(ix,kx)
608 character*(*) ch
609 do k=1,kx
610 fmin=a(1,k)
611 fmax=a(1,k)
612 do i=1,im
613 fmin=min(fmin,a(i,k))
614 fmax=max(fmax,a(i,k))
615 enddo
616 print *,' max=',fmax,' min=',fmin,' at k=',k,' for ',ch
617 enddo
618 return
619 end
620
621
622 subroutine vcnhyb_gc_h(im,km,nm,dt,zint,zmid,zdot,zadv,nvcn,xvcn)
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661 implicit none
662 integer,intent(in):: im,km,nm
663 real,intent(in):: dt,zint(im,km+1),zmid(im,km),zdot(im,km+1)
664 real,intent(inout):: zadv(im,km,nm)
665 integer,intent(out):: nvcn
666 real,intent(out):: xvcn
667 integer i,j,k,n,ivcn(im),kk
668 logical lvcn(im)
669 real zdm,zda,zdb,vcn(im,km-1)
670 real rnu,cm(im,km),cu(im,km-1),cl(im,km-1)
671 real rr(im,km,nm)
672
673
674
675 =0
676 xvcn=0.
677 lvcn=.false.
678 do k=1,km-1
679 do i=1,im
680 zdm=abs(zint(i,k)-zint(i,k+1))
681 zdm=min( zdm, abs(zint(i,k+1)-zint(i,k+2)) )
682 vcn(i,k)=abs(zdot(i,k+1)*dt/zdm)*1.1
683 lvcn(i)=lvcn(i).or.vcn(i,k).gt.1.0
684 xvcn=max(xvcn,vcn(i,k))
685
686
687
688
689
690
691
692
693
694
695 enddo
696 enddo
697
698
699 if(xvcn.gt.1.0) then
700 do i=1,im
701 if(lvcn(i)) then
702 ivcn(nvcn+1)=i
703 nvcn=nvcn+1
704 endif
705 enddo
706
707
708 do j=1,nvcn
709 cm(j,1)=1
710 enddo
711 do k=1,km-1
712 do j=1,nvcn
713 i=ivcn(j)
714 if(vcn(i,k).gt.1.0) then
715 zdm=zmid(i,k)-zmid(i,k+1)
716 zda=zint(i,k+1)-zint(i,k+2)
717 zdb=zint(i,k)-zint(i,k+1)
718 rnu=(vcn(i,k)**2-1.0)/4.0
719 cu(j,k)=-rnu*zdm/zdb
720 cl(j,k)=-rnu*zdm/zda
721 cm(j,k)=cm(j,k)-cu(j,k)
722 cm(j,k+1)=1-cl(j,k)
723 else
724 cu(j,k)=0.0
725 cl(j,k)=0.0
726 cm(j,k+1)=1.0
727 endif
728 enddo
729 enddo
730
731
732 do n=1,nm
733 do k=1,km
734 do j=1,nvcn
735 i=ivcn(j)
736 rr(j,k,n)=zadv(i,k,n)
737 enddo
738 enddo
739 enddo
740
741
742 call tridim_hyb_gc_h(nvcn,im,km,km,nm,cl,cm,cu,rr,cu,rr)
743
744
745 do n=1,nm
746 do k=1,km
747 do j=1,nvcn
748 i=ivcn(j)
749 zadv(i,k,n)=rr(j,k,n)
750 enddo
751 enddo
752 enddo
753 endif
754
755 end
756
757 subroutine tridim_hyb_gc_h(l,lx,n,nx,m,cl,cm,cu,r,au,a)
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795 real cl(lx,2:n),cm(lx,n),cu(lx,n-1),r(lx,nx,m),
796 & au(lx,n-1),a(lx,nx,m)
797
798
799 do i=1,l
800 fk=1./cm(i,1)
801 au(i,1)=fk*cu(i,1)
802 enddo
803 do j=1,m
804 do i=1,l
805 fk=1./cm(i,1)
806 a(i,1,j)=fk*r(i,1,j)
807 enddo
808 enddo
809 do k=2,n-1
810 do i=1,l
811 fk=1./(cm(i,k)-cl(i,k)*au(i,k-1))
812 au(i,k)=fk*cu(i,k)
813 enddo
814 do j=1,m
815 do i=1,l
816 fk=1./(cm(i,k)-cl(i,k)*au(i,k-1))
817 a(i,k,j)=fk*(r(i,k,j)-cl(i,k)*a(i,k-1,j))
818 enddo
819 enddo
820 enddo
821
822
823 do j=1,m
824 do i=1,l
825 fk=1./(cm(i,n)-cl(i,n)*au(i,n-1))
826 a(i,n,j)=fk*(r(i,n,j)-cl(i,n)*a(i,n-1,j))
827 enddo
828 enddo
829 do k=n-1,1,-1
830 do j=1,m
831 do i=1,l
832 a(i,k,j)=a(i,k,j)-au(i,k)*a(i,k+1,j)
833 enddo
834 enddo
835 enddo
836
837 return
838 end
839