File: C:\NOAA\NEMS_11731\src\atmos\gfs\phys\gloopr.f
1 subroutine gloopr
2
3 ( grid_fld, g3d_fld, &
4 & lats_nodes_r,global_lats_r, lonsperlar, phour, &
5 & xlon,xlat,coszdg,COSZEN, &
6 & SLMSK,SNWDPH,SNCOVR,SNOALB,ZORL,TSEA,HPRIME,SFALB, &
7 & ALVSF,ALNSF ,ALVWF ,ALNWF,FACSF ,FACWF,CV,CVT , &
8 & CVB ,SWH,HLW,SFCNSW,SFCDLW, &
9 & FICE ,TISFC, SFCDSW, sfcemis, &
10 & TSFLW,FLUXR, phy_f3d,slag,sdec,cdec,NBLCK,KDT, &
11 & global_times_r)
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 USE MACHINE , ONLY : kind_phys, kind_grid, &
28 & kind_evod
29 USE FUNCPHYS , ONLY : fpkap
30 USE PHYSCONS, fv => con_fvirt, rerth => con_rerth,
31 & rk => con_rocp
32
33 use module_radiation_driver, only : radinit, grrad
34 use module_radiation_astronomy,only : astronomy
35 USE gfs_phy_tracer_config, only : gfs_phy_tracer
36
37 use module_radsw_parameters, only : topfsw_type, sfcfsw_type
38 use module_radlw_parameters, only : topflw_type, sfcflw_type
39
40
41
42
43
44 use resol_def, ONLY: levs, levr, latr, lonr, lotgr, &
45 & g_t, g_p, g_q, g_dp, g_ps, &
46 & ntcw, ntoz, ncld, num_p3d, &
47 & nmtvr, ntrac, levp1, nfxr, g_dpdt,&
48 & lgocart
49 use layout1, ONLY: me, nodes, lats_node_r, &
50 & lats_node_r_max, ipt_lats_node_r
51 use gg_def, ONLY: coslat_r, sinlat_r
52 use date_def, ONLY: idate
53 use namelist_physics_def, ONLY: lsswr, iaer, lslwr, sashal, ras, &
54 & lssav, flgmin, ldiag3d, lggfs3d, &
55 & iovr_lw, iovr_sw, isol, iems, &
56 & ialb, fhlwr, fhswr, ico2, ngptc, &
57 & crick_proof, norad_precip, ccnorm,&
58 & ictm, isubc_sw, isubc_lw, fdaer
59 use d3d_def , ONLY: cldcov
60 use gfs_physics_gridgr_mod, ONLY: Grid_Var_Data
61 use gfs_physics_g3d_mod, ONLY: G3D_Var_Data
62 use mersenne_twister, only : random_setseed, random_index, &
63 & random_stat
64
65 implicit none
66
67 real (kind=kind_phys), parameter :: QMIN =1.0e-10 &
68 &, Typical_pgr = 95.0 &
69 &, cons0 = 0.0, cons2 = 2.0 &
70 &, pt00001=1.0e-5
71
72
73
74 integer, intent(in) :: lats_nodes_r(nodes)
75 integer, intent(in) :: global_lats_r(latr), lonsperlar(latr)
76
77
78
79 TYPE(Grid_Var_Data) :: grid_fld
80 TYPE(G3D_Var_Data) :: g3d_fld
81
82 integer, intent(in) :: NBLCK
83
84
85 real (kind=kind_phys), dimension(LONR,LATS_NODE_R), intent(in) :: &
86 & xlon, xlat, slmsk, snwdph, zorl, tsea, &
87 & alvsf, alnsf, alvwf, alnwf, facsf, facwf, &
88 & cv, cvt, cvb, FICE, tisfc, sncovr, snoalb
89
90 real (kind=kind_phys), intent(in) :: &
91 & hprime(NMTVR,LONR,LATS_NODE_R), phour, &
92 & phy_f3d(NGPTC,LEVS,NBLCK,LATS_NODE_R,NUM_P3D)
93
94
95 real (kind=kind_phys), intent(inout) :: &
96 & fluxr (NFXR,LONR,LATS_NODE_R)
97
98 integer, intent(in) :: KDT
99
100 real(kind=kind_evod), intent(out) :: &
101 & global_times_r(latr,NODES)
102
103 real (kind=kind_phys), intent(out) :: &
104 & swh(NGPTC,LEVS,NBLCK,LATS_NODE_R), &
105 & hlw(NGPTC,LEVS,NBLCK,LATS_NODE_R)
106
107 real (kind=kind_phys),dimension(LONR,LATS_NODE_R), intent(out) :: &
108 & coszdg, coszen, sfcnsw, sfcdlw, tsflw, &
109 & sfcdsw, SFALB, sfcemis
110
111 real (kind=kind_phys), intent(out) :: slag, sdec, cdec
112
113
114
115
116
117
118
119 real(kind=kind_phys) :: prsl(NGPTC,LEVS), prslk(NGPTC,LEVS), &
120 & prsi(NGPTC,LEVP1)
121
122
123 real (kind=kind_phys) :: si_loc(LEVR+1)
124
125 real (kind=kind_phys) :: &
126 & gt(NGPTC,LEVR), &
127 & gr(NGPTC,LEVR), gr1(NGPTC,LEVR,NTRAC-1)
128
129 real (kind=kind_phys) :: f_ice(NGPTC,LEVS), f_rain(NGPTC,LEVS), &
130 & r_rime(NGPTC,LEVS)
131
132 real (kind=kind_phys) :: cldcov_v(NGPTC,LEVS), hprime_v(NGPTC), &
133 & fluxr_v(NGPTC,NFXR), vvel(NGPTC,LEVS)
134 real (kind=kind_phys) :: flgmin_v(ngptc), work1, work2
135
136 real (kind=kind_phys) :: rinc(5), dtsw, dtlw, solcon, raddt
137
138 real (kind=kind_phys), save :: facoz
139
140 integer :: njeff, lon, lan, lat, iblk, lons_lat, kk
141 integer :: idat(8), jdat(8), DAYS(13), iday, imon, midmon, id
142
143
144
145 type (topfsw_type), dimension(NGPTC) :: topfsw
146 type (sfcfsw_type), dimension(NGPTC) :: sfcfsw
147
148 type (topflw_type), dimension(NGPTC) :: topflw
149 type (sfcflw_type), dimension(NGPTC) :: sfcflw
150
151
152 type (random_stat) :: stat
153 integer :: numrdm(LONR*LATR*2), ixseed(LONR,LATS_NODE_R,2)
154 integer :: ipseed, icsdlw(NGPTC), icsdsw(NGPTC)
155 integer, parameter :: ipsdlim = 1.0e8
156
157
158 integer, save :: icwp, k1oz, k2oz, midm, midp, ipsd0, iaerflg
159
160
161 data DAYS / 31,28,31,30,31,30,31,31,30,31,30,31,30 /
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235 integer, parameter :: IFLIP = 1
236
237
238
239 real (kind=kind_phys), parameter :: dxmax=-16.118095651, &
240 & dxmin=-9.800790154, &
241 & dxinv=1.0/(dxmax-dxmin)
242
243 integer :: ierr, dimg
244 integer :: i, j, k, n, item
245
246 logical :: change
247 logical, save :: first, sas_shal
248 data first / .true. /
249
250
251 real (kind=kind_phys) :: temlon, temlat, alon, alat
252 integer :: ipt
253 logical :: lprnt
254
255
256 real*8 :: rtc, timer1, timer2
257
258
259
260
261 integer kap,kar,kat,kau,kav,kdrlam
262 integer ksd,ksplam,kspphi,ksq,ksr,kst
263 integer ksu,ksv,ksz,node
264
265
266
267 = 0
268 idat(1) = idate(4)
269 idat(2) = idate(2)
270 idat(3) = idate(3)
271 idat(5) = idate(1)
272 rinc = 0.
273
274
275 (2) = phour
276
277
278 call w3movdat(rinc, idat, jdat)
279
280
281 if (ntoz .le. 0) then
282
283 if(me .eq. 0) WRITE (6,989) jdat(1),jdat(2),jdat(3),jdat(5)
284 989 FORMAT(' UPDATING OZONE FOR ', I4,I3,I3,I3)
285
286 = jdat(3)
287 IMON = jdat(2)
288 MIDMON = DAYS(IMON)/2 + 1
289 CHANGE = FIRST .OR.
290 & ( (IDAY .EQ. MIDMON) .AND. (jdat(5).EQ.0) )
291
292 IF (CHANGE) THEN
293 IF (IDAY .LT. MIDMON) THEN
294 K1OZ = MOD(IMON+10,12) + 1
295 MIDM = DAYS(K1OZ)/2 + 1
296 K2OZ = IMON
297 MIDP = DAYS(K1OZ) + MIDMON
298 ELSE
299 K1OZ = IMON
300 MIDM = MIDMON
301 K2OZ = MOD(IMON,12) + 1
302 MIDP = DAYS(K2OZ)/2 + 1 + DAYS(K1OZ)
303 ENDIF
304 ENDIF
305
306 IF (IDAY .LT. MIDMON) THEN
307 ID = IDAY + DAYS(K1OZ)
308 ELSE
309 ID = IDAY
310 ENDIF
311 FACOZ = real (ID-MIDM) / real (MIDP-MIDM)
312 endif
313
314 if (first) then
315 sas_shal = sashal .and. (.not. ras)
316
317 (1)=1.0
318 do k=1,levr-1
319
320 (k+1)=si_loc(k)-grid_fld%dp(1,1,k)/grid_fld%ps(1,1)
321 enddo
322 si_loc(levr+1)=0.0
323
324
325
326 = 0
327 if (NTCW > 0) icwp = 1
328
329
330
331 if ( ISUBC_LW==2 .or. ISUBC_SW==2 ) then
332 ipsd0 = 17*idate(1) + 43*idate(2) + 37*idate(3) + 23*idate(4)
333 if ( me == 0 ) then
334 print *,' Radiation sub-cloud initial seed =',ipsd0, &
335 & ' idate =',idate
336 endif
337 endif
338
339 iaerflg = max( mod(IAER,10), mod(IAER/10,10) )
340
341 = .false.
342
343 endif
344
345
346
347 = 3600.0 * fhswr
348 dtlw = 3600.0 * fhlwr
349
350 raddt = min(dtsw, dtlw)
351
352 call radinit &
353
354 ( si_loc, LEVR, IFLIP, idat, jdat, ICTM, ISOL, ICO2, &
355 & IAER, IALB, IEMS, ICWP, NUM_P3D, ISUBC_SW, ISUBC_LW, &
356 & IOVR_SW, IOVR_LW, me, raddt, fdaer )
357
358
359
360
361
362
363 call astronomy &
364
365 ( lonsperlar, global_lats_r, sinlat_r, coslat_r, xlon, &
366
367 , jdat, &
368 & LONR, LATS_NODE_R, LATR, IPT_LATS_NODE_R, lsswr, me, &
369
370 , slag, sdec, cdec, coszen, coszdg &
371 & )
372
373
374
375
376
377 if ( ISUBC_LW==2 .or. ISUBC_SW==2 ) then
378 ipseed = mod(nint(100.0*sqrt(phour*3600)), ipsdlim) + 1 + ipsd0
379
380 call random_setseed &
381
382 ( ipseed, &
383
384
385 )
386 call random_index &
387
388 ( ipsdlim, &
389
390 , stat &
391 & )
392
393 do k = 1, 2
394 do j = 1, lats_node_r
395 lat = global_lats_r(ipt_lats_node_r-1+j)
396 do i = 1, LONR
397 ixseed(i,j,k) = numrdm(i+(lat-1)*LONR+(k-1)*LATR)
398 enddo
399 enddo
400 enddo
401 endif
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432 CALL countperf(1,1,0.)
433
434
435
436
437 do lan=1,lats_node_r
438
439 = global_lats_r(ipt_lats_node_r-1+lan)
440
441 = lonsperlar(lat)
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459 DO lon=1,lons_lat,NGPTC
460
461 = MIN(NGPTC,lons_lat-lon+1)
462 iblk = (lon-1)/ngptc + 1
463
464
465
466
467 = 22.5
468 alat = -12.381
469 ipt = 0
470 do i = 1, njeff
471 item = lon + i - 1
472 temlon = xlon(item,lan) * 57.29578
473 if (temlon < 0.0) temlon = temlon + 360.0
474 temlat = xlat(item,lan) * 57.29578
475 lprnt = abs(temlon-alon) < 0.5 .and. abs(temlat-alat) < 0.5
476 & .and. kdt > 0
477 if ( lprnt ) then
478 ipt = i
479 print *,' ipt=',ipt,' lon=',lon,' lan=',lan
480 exit
481 endif
482 enddo
483
484
485
486
487 do i = 1, njeff
488
489
490 (i,1) = grid_fld%ps(lon+i-1,lan)
491 enddo
492 do k = 1, LEVS
493 do i = 1, njeff
494
495
496
497
498
499
500
501
502
503 = lon+i-1
504 gt(i,k) = grid_fld%t(item,lan,k)
505 gr(i,k) = max(qmin,grid_fld%tracers(1)%flds(item,lan,k))
506 prsl(i,k) = grid_fld%p(item,lan,k)
507 vvel(i,k) = grid_fld%dpdt(item,lan,k)
508 prsi(i,k+1) = prsi(i,k) - grid_fld%dp(item,lan,k)
509 enddo
510 enddo
511 do i = 1, njeff
512 prsi (i,levs+1) = 0.0
513
514 enddo
515
516
517
518
519
520
521
522
523
524
525 do n = 1, NTRAC-1
526
527 do k = 1, LEVS
528 do i = 1, njeff
529
530
531
532
533 (i,k,n) = grid_fld%tracers(n+1)%flds(lon+i-1,lan,k)
534 enddo
535 enddo
536 enddo
537
538
539
540 if (levr < levs) then
541 do i=1,njeff
542 prsi(i,levr+1) = prsi(i,levp1)
543 prsl(i,levr) = (prsi(i,levp1)+prsi(i,levr)) * 0.5
544
545
546
547 enddo
548 endif
549
550 if (ntoz <= 0 .or. iaerflg == 2) then
551 do k = 1, levs
552 do i = 1, njeff
553 prslk(i,k) = (prsl(i,k)*pt00001)**rk
554 enddo
555 enddo
556 endif
557
558 do i=1,njeff
559 hprime_v(i) = hprime(1,lon+i-1,lan)
560 enddo
561
562 do k=1,nfxr
563 do i=1,njeff
564 fluxr_v(i,k) = fluxr(k,lon+i-1,lan)
565 enddo
566 enddo
567 if (NUM_P3D == 3) then
568 do k = 1, LEVR
569 do i = 1, njeff
570 f_ice (i,k) = phy_f3d(i,k,iblk,lan,1)
571 f_rain(i,k) = phy_f3d(i,k,iblk,lan,2)
572 r_rime(i,k) = phy_f3d(i,k,iblk,lan,3)
573 enddo
574 enddo
575
576 work1 = (log(coslat_r(lat)/(lons_lat*latr)) - dxmin) * dxinv
577 work1 = max(0.0, min(1.0,work1))
578 work2 = flgmin(1)*work1 + flgmin(2)*(1.0-work1)
579 do i=1,njeff
580 flgmin_v(i) = work2
581 enddo
582 else
583 do i=1,njeff
584 flgmin_v(i) = 0.0
585 enddo
586 endif
587
588
589
590
591
592
593
594
595 if (lprnt) then
596
597 write(0,*)' calling grrad for me=',me,' lan=',lan,' lat=',lat
598 &,' num_p3d=',num_p3d,' snoalb=',snoalb(lon,lan),' lon=',lon
599 &,' tsea=',tsea(lon,lan),' sncovr=',sncovr(lon,lan),
600 &' snwdph=',snwdph(lon,lan),' ipt=',ipt,' njeff=',njeff
601 write(0,*) ' prsi in gloopr=',prsi(ipt,1:5)
602 write(0,*) ' gt in gloopr=',gt(ipt,1:5)
603 write(0,*) ' gr in gloopr=',gr(ipt,1:5)
604 endif
605
606
607
608 call grrad
609
610 ( prsi,prsl,prslk,gt,gr,gr1,vvel,slmsk(lon,lan), &
611 & xlon(lon,lan),xlat(lon,lan),tsea(lon,lan), &
612 & snwdph(lon,lan),sncovr(lon,lan),snoalb(lon,lan), &
613 & zorl(lon,lan),hprime_v, &
614 & alvsf(lon,lan),alnsf(lon,lan),alvwf(lon,lan), &
615 & alnwf(lon,lan),facsf(lon,lan),facwf(lon,lan), &
616 & fice(lon,lan),tisfc(lon,lan), &
617 & solcon,coszen(lon,lan),coszdg(lon,lan),k1oz,k2oz,facoz, &
618 & cv(lon,lan),cvt(lon,lan),cvb(lon,lan), &
619 & IOVR_SW,IOVR_LW,f_ice,f_rain,r_rime,flgmin_v, &
620 & icsdsw,icsdlw,NUM_P3D,NTCW-1,NCLD,NTOZ-1,NTRAC-1,NFXR, &
621 & dtlw,dtsw, lsswr,lslwr,lssav,sashal,norad_precip, &
622 & crick_proof, ccnorm, &
623 & NGPTC,njeff,LEVR,IFLIP, me, lprnt, ipt, kdt, &
624
625 swh(1,1,iblk,lan),topfsw,sfcfsw,sfalb(lon,lan), &
626 & hlw(1,1,iblk,lan),topflw,sfcflw,tsflw(lon,lan), &
627 & sfcemis(lon,lan),cldcov_v, &
628
629 fluxr_v &
630
631
632
633 )
634
635
636
637 if (lsswr) then
638 do i = 1, njeff
639 j = lon + i - 1
640 sfcdsw(j,lan) = sfcfsw(i)%dnfxc
641 sfcnsw(j,lan) = sfcfsw(i)%dnfxc - sfcfsw(i)%upfxc
642 enddo
643 endif
644 if (lslwr) then
645 do i = 1, njeff
646 j = lon + i - 1
647 sfcdlw(j,lan) = sfcflw(i)%dnfxc
648 enddo
649 endif
650
651 if (lprnt) then
652 write(0,*)' hlw=',hlw(ipt,1:10,iblk,lan),' lan=',lan,' ipt=',ipt,
653 &' njeff=',njeff
654 write(0,*)' swh=',swh(ipt,1:10,iblk,lan),' lan=',lan
655 endif
656
657
658
659
660
661 if (ldiag3d .or. lggfs3d) then
662 do k=1,levr
663 do i=1,njeff
664 item = lon+i-1
665 cldcov(k,item,lan) = cldcov(k,item,lan) &
666 & + cldcov_v(i,k) * raddt
667 enddo
668 enddo
669 endif
670 if (lgocart) then
671 do k=1,levr
672 do i=1,njeff
673 g3d_fld%fcld(lon+i-1,lan,k) = cldcov_v(i,k)
674 enddo
675 enddo
676 endif
677
678 do k=1,nfxr
679 do i=1,njeff
680 fluxr(k,lon+i-1,lan) = fluxr_v(i,k)
681 enddo
682 enddo
683 if (levr < levs) then
684 do k=levr+1,levs
685 do i=1,njeff
686 hlw(i,k,iblk,lan) = hlw(i,levr,iblk,lan)
687 swh(i,k,iblk,lan) = swh(i,levr,iblk,lan)
688 enddo
689 enddo
690 endif
691
692 c$$$ write(2900+lat,*) ' ilon = ',lon
693 c$$$ write(2900+lat,'("swh",T16,"hlw")')
694 c$$$ do k=1,levs
695 c$$$ write(2900+lat,
696 c$$$ . '(e10.3,T16,e10.3,T31,e10.3)')
697 c$$$ . swh(1,k,iblk,lan),hlw(1,k,iblk,lan)
698 c$$$ enddo
699
700
701 CALL countperf(1,12,0.)
702 ENDDO
703
704 enddo
705
706 call f_hpmstop(69)
707
708 CALL countperf(0,5,0.)
709 CALL synctime()
710 CALL countperf(1,5,0.)
711
712
713
714 return
715 end subroutine gloopr
716