File: C:\NOAA\NEMS_11731\src\atmos\gfs\dyn\gfidi_sig.f
1 subroutine gfidi_sig(lon_dim,lons_lat,lat,
2 1 dg,tg,zg,ug,vg,rqg,dphi,dlam,qg,zsphi,zslam,
3 1 rcl,del,rdel2,ci,tov,spdmax,deltim,sl,nvcn,xvcn,
4 2 dtdf,dtdl,drdf,drdl,dudl,dvdl,dudf,dvdf,
5 2 dqdt,dtdt,drdt,dudt,dvdt)
6
7 USE gfs_dyn_MACHINE , ONLY : kind_grid
8
9
10 use gfs_dyn_resol_def
11 use gfs_dyn_physcons, rerth => con_rerth
12 &, rd => con_rd, cp => con_cp
13 &, omega => con_omega
14 &, grav => con_g
15 implicit none
16
17 integer j,k,n,nvcn
18 real(kind=kind_evod) fnor,rcl,rcl2,rk,sinra,deltim,xvcn
19
20
21
22 integer lon_dim,lat
23 integer lons_lat
24
25 real(kind=kind_evod)
26 1 dg(lon_dim,levs),tg(lon_dim,levs), zg(lon_dim,levs),
27 2 ug(lon_dim,levs),vg(lon_dim,levs),rqg(lon_dim,levs,ntrac),
28 3 dphi(lon_dim),dlam(lon_dim),qg(lon_dim),
29 3 zsphi(lon_dim),zslam(lon_dim)
30
31 real(kind=kind_evod)
32 1 dtdf(lon_dim,levs),dtdl(lon_dim,levs),
33 1 drdf(lon_dim,levs,ntrac),drdl(lon_dim,levs,ntrac),
34 1 dudl(lon_dim,levs),dvdl(lon_dim,levs),
35 1 dudf(lon_dim,levs),dvdf(lon_dim,levs)
36
37
38
39 real(kind=kind_evod) spdmax(levs),
40 1 dudt(lon_dim,levs),dvdt(lon_dim,levs),
41 1 dtdt(lon_dim,levs),drdt(lon_dim,levs,ntrac),
42 1 dqdt(lon_dim)
43
44
45
46 real(kind=kind_evod)
47 1 sl(levs),
48 1 del(levs),rdel2(levs),
49 2 ci(levp1),tov(levs)
50
51
52
53 real(kind=kind_evod)
54 1 cg (lon_dim,levs), db(lon_dim,levs),cb(lon_dim,levs),
55 2 dot(lon_dim,levp1),dup(lon_dim,levs),dvp(lon_dim,levs),
56 3 dum(lon_dim,levs ),dvm(lon_dim,levs), ek(lon_dim,levs),
57 4 rmu(levs ),rnu(levs),rho(levs),si(levp1),
58 5 x1(levs ), x2(levs), x3(levs),x4(levs)
59
60 real(kind=kind_evod) cons0,cons0p5,cons1,cons2
61
62 = 0.d0
63 = 0.5d0
64 = 1.d0
65 = 2.d0
66
67 = rd /cp
68 sinra=sqrt(cons1-cons1/rcl)
69 =cons2*omega*sinra
70 =sinra/rerth
71
72 if(lat.gt.latg2) then
73 fnor=-fnor
74 sinra=-sinra
75 endif
76
77 (1)=cons1
78 do 4 k=1,levs
79 si(k+1)=si(k)-del(k)
80 4 continue
81
82 do 1 k=1,levm1
83 rho(k)= log(si(k)/si(k+1))
84 1 continue
85 rho(levs)=cons0
86
87 do 2 k=1,levs
88 rmu(k)=cons1-si(k+1)*rho(k)/del(k)
89 continue
90
91 do 3 k=1,levm1
92 rnu(k+1)=-cons1+si(k)*rho(k)/del(k)
93 continue
94 rnu(1)=cons0
95
96 do 20 k=1,levs
97 x1(k)=rmu(k)*(cons1-rk*rnu(k))/(rmu(k)+rnu(k))
98 (k)=cons1-x1(k)
99 (k)=(cons1+rk*rmu(k))/(cons1-rk*rnu(k))
100 (k)=cons1/x3(k)
101 continue
102
103 do 1234 k=1,levs
104 spdmax(k)=cons0
105 continue
106
107 =cons0p5*rcl
108
109 do 140 k=1,levs
110 do 140 j=1,lons_lat
111 ek(j,k)=(ug(j,k)*ug(j,k)+vg(j,k)*vg(j,k))*rcl
112 140 continue
113
114 do 10 k=1,levs
115 do 10 j=1,lons_lat
116 if (ek(j,k) .gt. spdmax(k)) spdmax(k)=ek(j,k)
117 10 continue
118
119
120
121 do 150 j=1,lons_lat
122 dphi(j)=dphi(j)*rcl
123 dlam(j)=dlam(j)*rcl
124 150 continue
125
126 do 180 k=1,levs
127 do 180 j=1,lons_lat
128 cg(j,k)=ug(j,k)*dlam(j)+vg(j,k)*dphi(j)
129 180 continue
130
131 do 190 j=1,lons_lat
132 db(j,1)=del(1)*dg(j,1)
133 cb(j,1)=del(1)*cg(j,1)
134 190 continue
135
136 do 210 k=1,levm1
137 do 210 j=1,lons_lat
138 db(j,k+1)=db(j,k)+del(k+1)*dg(j,k+1)
139 cb(j,k+1)=cb(j,k)+del(k+1)*cg(j,k+1)
140 210 continue
141
142
143
144 do 220 j=1,lons_lat
145 dqdt(j)= -cb(j,levs)
146 220 continue
147
148
149
150 do 230 j=1,lons_lat
151 dot(j,1)=cons0
152 (j,1)=cons0
153 (j,1)=cons0
154 dot(j,levp1)=cons0
155 (j,levs )=cons0
156 (j,levs )=cons0
157
158 continue
159
160 do 240 k=1,levm1
161 do 240 j=1,lons_lat
162 dot(j,k+1)=dot(j,k)+
163 1 del(k)*(db(j,levs)+cb(j,levs)-
164 2 dg(j,k)-cg(j,k))
165 240 continue
166
167
168
169
170
171 call vcnfil(lons_lat,lon_dim,levs,ntrac,
172 x deltim,del,sl,si,tov,dot(1,1),
173 x ug(1,1),vg(1,1),tg(1,1),rqg(1,1,1),nvcn,xvcn)
174
175 do 260 k=1,levm1
176 do 260 j=1,lons_lat
177 dvp(j,k )=vg(j,k+1)-vg(j,k)
178 dup(j,k )=ug(j,k+1)-ug(j,k)
179 dvm(j,k+1)=vg(j,k+1)-vg(j,k)
180 dum(j,k+1)=ug(j,k+1)-ug(j,k)
181 260 continue
182
183 do j=1,lons_lat
184 dphi(j)=dphi(j)/rcl
185 dlam(j)=dlam(j)/rcl
186 enddo
187
188 do k=1,levs
189 do j=1,lons_lat
190 dudt(j,k)=-ug(j,k)*dudl(j,k)-vg(j,k)*dudf(j,k)
191 1 -rdel2(k)*(dot(j,k+1)*dup(j,k)+dot(j,k)*dum(j,k))
192 2 -rd*tg(j,k)*dlam(j)
193
194 (j,k)=-ug(j,k)*dvdl(j,k)-vg(j,k)*dvdf(j,k)
195 1 -rdel2(k)*(dot(j,k+1)*dvp(j,k)+dot(j,k)*dvm(j,k))
196 2 -rd*tg(j,k)*dphi(j)
197 enddo
198 enddo
199
200 do k=1,levs
201 do j=1,lons_lat
202 dudt(j,k)=dudt(j,k)+vg(j,k)*fnor
203
204 (j,k)=dvdt(j,k)-ug(j,k)*fnor-sinra*ek(j,k)
205 enddo
206 enddo
207
208 do k=1,levs
209 do j=1,lons_lat
210 dudt(j,levs+1-k)=dudt(j,levs+1-k)-grav*zslam(j)
211 dvdt(j,levs+1-k)=dvdt(j,levs+1-k)-grav*zsphi(j)
212 enddo
213 enddo
214
215
216
217
218
219
220
221
222
223 do 280 k=1,levm1
224 do 280 j=1,lons_lat
225
226 (j,k )=tg(j,k+1)+tov(k+1)-tg(j,k)-tov(k)
227 x +cons2*rk*rnu(k+1)*(tg(j,k)+tov(k))
228
229 (j,k+1)=tg(j,k+1)+tov(k+1)-tg(j,k)-tov(k)
230 x +cons2*rk*rmu(k+1)*(tg(j,k+1)+tov(k+1))
231
232
233 continue
234
235
236 do k=1,levs
237 do j=1,lons_lat
238
239 (j,k)=-ug(j,k)*dtdl(j,k)-vg(j,k)*dtdf(j,k)
240 1 -rdel2(k)*(dot(j,k+1)*dup(j,k)+dot(j,k)*dum(j,k))
241 enddo
242 enddo
243
244 do k=1,levs
245 do j=1,lons_lat
246 dtdt(j,k)=dtdt(j,k)
247 1 +rk*(tov(k)+tg(j,k))*(cg(j,k)-cb(j,levs)-db(j,levs))
248 enddo
249 enddo
250
251 do 330 n=1,ntrac
252 do 300 k=1,levm1
253 do 300 j=1,lons_lat
254 dup(j,k )=rqg(j,k+1,n)-rqg(j,k,n)
255 dum(j,k+1)=rqg(j,k+1,n)-rqg(j,k,n)
256 300 continue
257
258 do 310 j=1,lons_lat
259 dup(j,levs)=cons0
260 continue
261
262 do 320 k=1,levs
263 do 320 j=1,lons_lat
264 drdt(j,k,n)=-ug(j,k)*drdl(j,k,n)-vg(j,k)*drdf(j,k,n)
265 1 -rdel2(k)*(dot(j,k+1)*dup(j,k)+dot(j,k)*dum(j,k))
266 320 continue
267 330 continue
268
269 return
270 end
271
272 subroutine vcnfil(im,ix,km,nt,deltim,del,sl,si,tov,dot,
273 & u,v,t,q,nvcn,xvcn)
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328 USE gfs_dyn_MACHINE , ONLY : kind_grid
329
330 use gfs_dyn_resol_def
331 use gfs_dyn_physcons, rerth => con_rerth, rocp => con_rocp
332 implicit none
333
334 integer i,im,ix,j,k,km,n,nt,nvcn
335 real(kind=kind_evod) cvcn,deli,deltim,rnu,t0term,t1term
336
337 real(kind=kind_evod) tterm,xvcn
338
339
340 parameter(cvcn=0.9d0)
341 real(kind=kind_evod) del(km),sl(km),si(km+1),tov(km)
342 real(kind=kind_evod) dot(ix,km+1)
343 real(kind=kind_evod) u(ix,km),v(ix,km),t(ix,km),q(ix,km,nt)
344 logical lvcn(im)
345 integer ivcn(im)
346 real(kind=kind_evod) vcn(ix,km-1)
347 real(kind=kind_evod) cm(ix,km),cu(ix,km-1),cl(ix,km-1)
348 real(kind=kind_evod) rr(ix,km,3+nt)
349
350 real(kind=kind_evod) cons0,cons0p5,cons1,cons4
351
352 = 0.d0
353 = 0.5d0
354 = 1.d0
355 = 4.d0
356
357
358
359 =0
360 xvcn=cons0
361 do i=1,im
362 lvcn(i)=.false.
363 enddo
364 do k=1,km-1
365 do i=1,im
366 deli=sl(k)-sl(k+1)
367 vcn(i,k)=abs(dot(i,k+1))*deltim/deli
368 lvcn(i)=lvcn(i).or.vcn(i,k).gt.cvcn
369 xvcn=max(xvcn,vcn(i,k))
370 enddo
371 enddo
372
373
374 if(xvcn.gt.cvcn) then
375 do i=1,im
376 if(lvcn(i)) then
377 ivcn(nvcn+1)=i
378 nvcn=nvcn+1
379 endif
380 enddo
381
382
383 do j=1,nvcn
384 cm(j,1)=cons1
385 enddo
386 do k=1,km-1
387 deli=sl(k)-sl(k+1)
388 do j=1,nvcn
389 i=ivcn(j)
390 if(vcn(i,k).gt.cvcn) then
391 rnu=(vcn(i,k)**2-cvcn**2)/cons4
392 (j,k)=-rnu*deli/del(k)
393 cl(j,k)=-rnu*deli/del(k+1)
394 cm(j,k)=cm(j,k)-cu(j,k)
395 cm(j,k+1)=cons1-cl(j,k)
396 else
397 cu(j,k)=cons0
398 (j,k)=cons0
399 (j,k+1)=cons1
400 endif
401 enddo
402 enddo
403
404
405 do k=1,km
406 do j=1,nvcn
407 i=ivcn(j)
408 rr(j,k,1)=u(i,k)
409 rr(j,k,2)=v(i,k)
410 rr(j,k,3)=t(i,k)+tov(k)
411 enddo
412 do n=1,nt
413 do j=1,nvcn
414 i=ivcn(j)
415 rr(j,k,3+n)=q(i,k,n)
416 enddo
417 enddo
418 enddo
419
420
421 do k=1,km-1
422 deli=sl(k)-sl(k+1)
423 t1term=cons0p5*rocp*deli/si(k+1)
424 =t1term*(tov(k)+tov(k+1))
425 do j=1,nvcn
426 i=ivcn(j)
427 tterm=t0term+t1term*(t(i,k)+t(i,k+1))
428 rr(j,k,3)=rr(j,k,3)-cu(j,k)*tterm
429 rr(j,k+1,3)=rr(j,k+1,3)+cl(j,k)*tterm
430 enddo
431 enddo
432
433
434 call tridim(nvcn,ix,km,km,3+nt,cl,cm,cu,rr,cu,rr)
435
436
437 do k=1,km
438 do j=1,nvcn
439 i=ivcn(j)
440 u(i,k)=rr(j,k,1)
441 v(i,k)=rr(j,k,2)
442 t(i,k)=rr(j,k,3)-tov(k)
443 enddo
444 do n=1,nt
445 do j=1,nvcn
446 i=ivcn(j)
447 q(i,k,n)=rr(j,k,3+n)
448 enddo
449 enddo
450 enddo
451 endif
452
453 end
454
455 subroutine tridim(l,lx,n,nx,m,cl,cm,cu,r,au,a)
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497 use gfs_dyn_machine
498 implicit none
499
500 integer i,j,k,l,lx,m,n,nx
501 real(kind=kind_evod) fk
502
503 real(kind=kind_evod) cl(lx,2:n),cm(lx,n),cu(lx,n-1),r(lx,nx,m),
504 & au(lx,n-1),a(lx,nx,m)
505
506 real(kind=kind_evod) cons1
507
508 = 1.d0
509
510
511 do i=1,l
512 fk=cons1/cm(i,1)
513 (i,1)=fk*cu(i,1)
514 enddo
515 do j=1,m
516 do i=1,l
517 fk=cons1/cm(i,1)
518 (i,1,j)=fk*r(i,1,j)
519 enddo
520 enddo
521 do k=2,n-1
522 do i=1,l
523 fk=cons1/(cm(i,k)-cl(i,k)*au(i,k-1))
524 (i,k)=fk*cu(i,k)
525 enddo
526 do j=1,m
527 do i=1,l
528 fk=cons1/(cm(i,k)-cl(i,k)*au(i,k-1))
529 (i,k,j)=fk*(r(i,k,j)-cl(i,k)*a(i,k-1,j))
530 enddo
531 enddo
532 enddo
533
534
535 do j=1,m
536 do i=1,l
537 fk=cons1/(cm(i,n)-cl(i,n)*au(i,n-1))
538 (i,n,j)=fk*(r(i,n,j)-cl(i,n)*a(i,n-1,j))
539 enddo
540 enddo
541 do k=n-1,1,-1
542 do j=1,m
543 do i=1,l
544 a(i,k,j)=a(i,k,j)-au(i,k)*a(i,k+1,j)
545 enddo
546 enddo
547 enddo
548
549 end
550