551 SUBROUTINE gblevents(IDATEP,IUNITF,IUNITE,IUNITP,IUNITS,SUBSET,
562 INTEGER,
PARAMETER :: IM=384, jm=im/2+1
565 CHARACTER*80 HEADR,OBSTR,QMSTR,FCSTR,OESTR,ANSTR
567 REAL(8) OBS_8,QMS_8,BAK_8,SID_8,HDR_8(10)
568 REAL(8) BMISS,GETBMISS
569 LOGICAL DOVTMP,DOFCST,SOME_FCST,DOBERR,FCST,VIRT,DOANLS,
570 $ satmqc,adpupa_virt,recalc_q,doprev,dopmsl
572 INTEGER*4 IUNITF(2),ncid
575 TYPE(sigio_head) :: HEAD1
576 TYPE(nemsio_gfile) :: GFILE1
578 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
579 $ xob,yob,dhr,typ,nlev
580 COMMON /gbevbb/ pvcd,vtcd
581 COMMON /gbevcc/ dovtmp,dofcst,some_fcst,doberr,fcst,virt,
582 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
583 COMMON /gbevdd/ errs(300,33,6)
584 COMMON /gbevff/ bmiss
591 $
'SID XOB YOB DHR TYP '/
593 $
'POB QOB TOB ZOB UOB VOB PWO PW1O PW2O PW3O PW4O CAT PRSS '/
595 $
'PQM QQM TQM ZQM WQM PWQ PW1Q PW2Q PW3Q PW4Q NUL NUL '/
597 $
'PFC QFC TFC ZFC UFC VFC PWF PW1F PW2F PW3F PW4F NUL '/
599 $
'PAN QAN TAN ZAN UAN VAN PWA PW1A PW2A PW3A PW4A NUL '/
601 $
'POE QOE TOE ZOE WOE PWE PW1E PW2E PW3E PW4E NUL NUL '/
603 namelist /prevdata/dovtmp,dofcst,some_fcst,doberr,doanls,
604 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
617 700
FORMAT(/1x,100(
'#')/
' =====> SUBROUTINE GBLEVENTS INVOKED FOR ',
618 $
'THE FIRST TIME - VERSION LAST UPDATED 2017-02-22'/)
622 print *,
'BUFRLIB value for missing passed into GBLEVENTS ',
638 adpupa_virt = .false.
640 READ(5,prevdata,err=101,
END=102)
649 7013
FORMAT(/
' ##> GBLEVENTS: ERROR READING STANDARD INPUT DATA CARDS',
650 $
' -- DEFAULTS TO "POSTEVENTS" MODE'/)
661 7014
FORMAT(/
' ##> GBLEVENTS: STANDARD INPUT DATA CARDS DO NOT ',
662 $
'EXIST -- DEFAULTS TO "POSTEVENTS" MODE'/)
673 adpupa_virt = .false.
676 IF(dovtmp) recalc_q=.true.
688 IF(.NOT.dofcst.AND..NOT.some_fcst)
THEN
690 901
FORMAT(/
' --> GBLEVENTS: PREVENTS MODE - FIRST GUESS NOT READ ',
694 701
FORMAT(/
' --> GBLEVENTS: PREVENTS MODE - DATE CHECK AND ',
695 $
'TRANSFORM THE FIRST GUESS'/)
699 7701
FORMAT(/
' --> GBLEVENTS: POSTEVENTS MODE - DATE CHECK AND ',
700 $
'TRANSFORM THE ANALYSIS'/)
703 IF(dofcst .OR. some_fcst .OR. doanls)
THEN
704 WRITE(cfile1,
'("fort.",I2.2)') iunitf(1)
706 iret = nf90_open(trim(cfile1),nf90_nowrite,ncid)
708 print *,
' ===> GFS FCST/ANAL INPUT IS NETCDF'
709 CALL gblevn13(iunitf,idatep,im,jm,idrt)
711 CALL sigio_rropen(iunitf(1),cfile1,iret)
712 CALL sigio_srhead(iunitf(1),head1,iret1)
713 IF(iret == 0 .AND. iret1 == 0)
THEN
714 print *,
' ===> GLOBAL FCST/ANAL INPUT IS SIGIO'
715 CALL sigio_sclose(iunitf(1),iret)
716 CALL gblevn10(iunitf,idatep,im,jm,idrt)
718 CALL nemsio_open(gfile1,trim(cfile1),
'read',iret=iret)
720 CALL nemsio_close(gfile1,iret=iret)
721 print *,
' ===> GFS FCST/ANAL INPUT IS NEMSIO'
722 CALL gblevn12(iunitf,idatep,im,jm,idrt)
728 print*,
'after returning from GBLEVN10, GBLEVN12,',
729 $
' or GBLEVN13. idrt=',idrt
737 702
FORMAT(/
' --> GBLEVENTS: READ ERROR FILES'/)
744 IF(.NOT.doanls) print 3702
745 3702
FORMAT(/
' --> GBLEVENTS: OBS. ERROR NOT ENCODED IN PREPBUFR ',
753 CALL ufbqcd(iunitp,
'PREVENT',pvcd)
754 CALL ufbqcd(iunitp,
'VIRTMP ',vtcd)
757 703
FORMAT(/1x,100(
'#')/)
763 IF(.NOT.doanls)
WRITE(iunits,1701) idatep
764 1701
FORMAT(//130(
'#')//38x,
'*** "PREVENT" EVENTS DATA FILTERING ',
765 $
'SUMMARY ***'/35x,
'--> CENTER DATE FOR PREPBUFR FILE IS: ',i10,
775 IF(newtyp.EQ.1)
WRITE(iunits,1702) subset
776 1702
FORMAT(130(
'-')/39x,
'--> SUMMARY FOR TABLE A ENTRY "',a8,
'" <--'/)
778 IF(.NOT.dofcst .AND. some_fcst) fcst = (subset.EQ.
'ADPUPA '
779 $ .OR.subset.EQ.
'PROFLR '.OR.subset .EQ.
'AIRCFT '.OR.subset
780 $ .EQ.
'AIRCAR '.OR.subset .EQ.
'VADWND ')
789 virt = (recalc_q.AND.(subset.EQ.
'ADPSFC '.OR.
790 $ subset.EQ.
'SFCSHP '.OR.
791 $ subset.EQ.
'MSONET '.OR.
792 $ subset.EQ.
'RASSDA '.OR.
793 $ subset.EQ.
'SATEMP '.OR.
794 $ (subset.EQ.
'ADPUPA '.AND.adpupa_virt)))
797 IF(.NOT.(fcst.OR.doberr.OR.virt.OR.doprev))
THEN
798 IF(newtyp.EQ.1)
WRITE(iunits,1703)
799 1703
FORMAT(/
' ==> DATA FILTERING NOT PERFORMED FOR THIS TABLE A ',
800 $
'ENTRY -- FORECAST, OBS ERROR, "VIRTMP", "PREVENT" PROCESSING ',
814 CALL ufbint(-iunitp,obs_8,13,255,nlev,obstr)
815 CALL ufbint(-iunitp,qms_8,12,255,nlev,qmstr)
816 CALL ufbint(-iunitp,hdr_8,10, 1,iret,headr)
823 IF(fcst.OR.doanls)
THEN
836 CALL ufbint(iunitp,bak_8,12,nlev,iret,fcstr)
838 CALL ufbint(iunitp,bak_8,12,nlev,iret,anstr)
852 IF(newtyp.EQ.1)
WRITE(iunits,1710)
853 1710
FORMAT(/
' ==> OBS ERROR VALUES ARE ENCODED FOR THIS TABLE A ',
854 $
'ENTRY'//
' ==> FILTERING VIA MISSING OBS ERROR TEST IS ',
855 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE OBS ERROR VALUES ARE ',
856 $
'PROCESSED/STORED'/)
858 IF(nlev.GT.0)
CALL ufbint(iunitp,bak_8,12,nlev,iret,oestr)
860 IF(newtyp.EQ.1)
WRITE(iunits,1705)
861 1705
FORMAT(/
' ==> OBS ERROR VALUES NOT ENCODED FOR THIS TABLE A ',
862 $
'ENTRY'//
' ==> FILTERING VIA MISSING OBS ERROR TEST NOT ',
863 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE OBS ERROR VALUES NOT ',
864 $
'PROCESSED/STORED'/)
871 IF(newtyp.EQ.1)
WRITE(iunits,1704)
872 1704
FORMAT(/
' ==> FORECAST VALUES NOT ENCODED FOR THIS TABLE A ',
873 $
'ENTRY'//
' ==> FILTERING VIA POB VS. GESS PSFC TEST NOT ',
874 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE FORECAST VALUES NOT ',
875 $
'PROCESSED/STORED'/)
877 IF(newtyp.EQ.1)
WRITE(iunits,1708)
878 1708
FORMAT(/
' ==> FORECAST VALUES ARE ENCODED FOR THIS TABLE A ',
879 $
'ENTRY'//
' ==> FILTERING VIA POB VS. GESS PSFC TEST IS ',
880 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE FORECAST VALUES ARE ',
881 $
'PROCESSED/STORED'/)
885 IF(newtyp.EQ.1)
WRITE(iunits,1807)
886 1807
FORMAT(/
' ==> "PREVENT" EVENT PROCESSING IS PERFORMED FOR THIS',
888 CALL gblevn02(iunitp,iunits,newtyp,subset)
890 IF(newtyp.EQ.1)
WRITE(iunits,1806)
891 1806
FORMAT(/
' ==> "PREVENT" EVENT PROCESSING NOT PERFORMED FOR THIS',
899 IF(newtyp.EQ.1)
WRITE(iunits,1706)
900 1706
FORMAT(/
' ==> "VIRTMP" EVENT PROCESSING NOT PERFORMED FOR THIS ',
903 IF(newtyp.EQ.1)
WRITE(iunits,1707)
904 1707
FORMAT(/
' ==> "VIRTMP" EVENT PROCESSING IS PERFORMED FOR THIS ',
965 dimension nflgrt(100:299,12),oemin(2:6)
966 CHARACTER*8 STNID,subset
967 CHARACTER*40 PEVN,QEVN,TEVN,WEVN,PWVN,PW1VN,PW2VN,PW3VN,PW4VN
968 REAL(8) PEV_8(4,255),QEV_8(4,255),TEV_8(4,255),WEV_8(5,255),
969 $ pwv_8(4,255),pw1v_8(4,255),pw2v_8(4,255),
970 $ pw3v_8(4,255),pw4v_8(4,255),obs_8,qms_8,bak_8,sid_8,
972 LOGICAL FCST,REJP_PS,REJPS,REJT,REJQ,REJW,REJPW,REJPW1,
973 $ rejpw2,rejpw3,rejpw4,satmqc,satemp,soln60,sols60,
974 $ moerr_p,moerr_t,adpupa_virt,doberr,dofcst,some_fcst,
975 $ dovtmp,virt,recalc_q,doprev
978 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
979 $ xob,yob,dhr,typ,nlev
980 COMMON /gbevbb/ pvcd,vtcd
981 COMMON /gbevcc/ dovtmp,dofcst,some_fcst,doberr,fcst,virt,
982 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
983 COMMON /gbevee/psg01,zsg01,tg01(500),ug01(500),vg01(500),
984 x qg01(500),zint(500),pint(500),pintlog(500),plev(500),
986 COMMON /gbevff/ bmiss
988 equivalence(sid_8,stnid)
990 DATA pevn /
'POB PQM PPC PRC '/
991 DATA qevn /
'QOB QQM QPC QRC '/
992 DATA tevn /
'TOB TQM TPC TRC '/
993 DATA wevn /
'UOB VOB WQM WPC WRC '/
994 DATA pwvn /
'PWO PWQ PWP PWR '/
995 DATA pw1vn /
'PW1O PW1Q PW1P PW1R '/
996 DATA pw2vn /
'PW2O PW2Q PW2P PW2R '/
997 DATA pw3vn /
'PW3O PW3Q PW3P PW3R '/
998 DATA pw4vn /
'PW4O PW4Q PW4P PW4R '/
1002 DATA oemin /0.5,0.1,1.0,0.5,1.0/
1004 ni = mod((nint(typ)/10),10)
1006 IF(newtyp.EQ.1) nflgrt = 0
1011 satemp = ((typ.GE.160.AND.typ.LE.179).AND.satmqc)
1012 soln60 = ((typ.GE.160.AND.typ.LE.163).AND.yob.GE.-60.AND.satmqc)
1013 sols60 = ((typ.EQ.160.OR.typ.EQ.162.OR.typ.EQ.163).AND.yob.LT.-60
1085 IF(pob.LT.bmiss)
THEN
1086 IF(.NOT.fcst) psg01 = pob
1087 IF(pob-psg01.GE.100. .OR. pob.LE.0. .OR.
1088 $ ((pob.LE.450..OR.pob.GE.1100.) .AND. ni.EQ.8))
THEN
1089 IF(pob.LE.0..OR.pob.LE.450..OR.pob.GE.1100.)
THEN
1091 WRITE(iunits,302) stnid,nint(typ),yob,xob,pob
1092 302
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1093 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, FAILS SANITY ',
1096 WRITE(iunits,101) stnid,nint(typ),yob,xob,pob
1097 101
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1098 $
'E, REJECT ALL DATA ON LVL - POB=',f6.1,
' MB, FAILS SANITY CHECK')
1103 WRITE(iunits,303) stnid,nint(typ),yob,xob,pob,psg01
1104 303
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1105 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, > 100 MB ',
1106 $
'BELOW GES PSFC(=',f6.1,
'MB)')
1108 WRITE(iunits,102) stnid,nint(typ),yob,xob,pob,psg01
1109 102
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1110 $
'E, REJECT ALL DATA ON LVL - POB=',f6.1,
' MB, > 100 MB BELOW ',
1111 $
'GES PSFC(=',f6.1,
' MB)')
1143 IF(pob.LT.bmiss .AND. cat.EQ.0)
THEN
1144 IF(.NOT.fcst) psg01 = pob
1145 rejps =
oefg01(pob,typ,5,oemin(5)).GE.bmiss .OR.
1146 $ abs(pob-psg01).GE.100. .OR.
1149 IF(rejps.OR.rejp_ps)
THEN
1151 IF(.NOT.rejp_ps)
THEN
1152 IF(abs(pob-psg01).GE.100.)
THEN
1153 WRITE(iunits,104) stnid,nint(typ),yob,xob,pob,psg01
1154 104
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1155 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, > 100 MB ',
1156 $
'ABOVE GES PSFC(=',f6.1,
'MB)')
1158 ELSE IF(pob.LE.450..OR.pob.GE.1100.)
THEN
1159 WRITE(iunits,105) stnid,nint(typ),yob,xob,pob
1160 105
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1161 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, FAILS SANITY ',
1162 $
'CHECK - this should never be printed since test now made in ',
1166 IF(nflgrt(nint(typ),1).EQ.0)
THEN
1167 WRITE(iunits,201) nint(typ)
1168 201
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1169 $
'ALL DATA ON SURFACE LEVEL DUE TO MISSING SFC-P OBS ERROR'/)
1170 nflgrt(nint(typ),1) = 1
1181 IF(rcd.EQ.3) moerr_p = .true.
1182 IF(rej.EQ.9.AND.(pqm.GT.3.AND.pqm.LT.15))
THEN
1184 1401
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1185 $
'E, INPUT PQM =',f4.0,
' -- DO NOT APPLY PSFC QM=9 EVENT')
1220 IF(tob.LT.bmiss)
THEN
1221 rejt =
oefg01(pob,typ,2,oemin(2)).GE.bmiss .OR.
1222 $ (soln60.AND.nint(pob*10.).GE.1000) .OR.
1223 $ (sols60.AND.nint(pob*10.).GT.1000)
1224 IF(rejt.OR.rejp_ps)
THEN
1226 IF(.NOT.rejp_ps)
THEN
1227 IF(soln60.AND.nint(pob*10.).GE.1000)
THEN
1228 IF(nflgrt(nint(typ),6).EQ.0)
THEN
1229 WRITE(iunits,7304) nint(typ)
1230 7304
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1231 $
'TOB/QOB AT AND BELOW 100 MB IF REPORT IS NORTH OF 60S LATITUDE'/)
1232 nflgrt(nint(typ),6) = 1
1235 ELSE IF(sols60.AND.nint(pob*10.).GT.1000)
THEN
1236 IF(nflgrt(nint(typ),7).EQ.0)
THEN
1237 WRITE(iunits,7305) nint(typ)
1238 7305
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1239 $
'TOB/QOB BELOW 100 MB IF REPORT IS SOUTH OF 60S LATITUDE'/)
1240 nflgrt(nint(typ),7) = 1
1244 IF(nflgrt(nint(typ),2).EQ.0)
THEN
1246 WRITE(iunits,304) nint(typ)
1247 304
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1248 $
'TOB/QOB ON SFC LVL DUE TO MISSING OBS ERROR'/)
1250 WRITE(iunits,202) nint(typ)
1251 202
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1252 $
'TOB/QOB ON AT LEAST ONE LVL (IF AVAILABLE ON THAT LVL) DUE TO ',
1253 $
'MISSING OBS ERROR'/)
1255 nflgrt(nint(typ),2) = 1
1269 IF(rcd.EQ.3) moerr_t = .true.
1270 IF(rej.EQ.9.AND.(tqm.GT.3.AND.tqm.LT.15))
THEN
1272 1402
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1273 $
'E, INPUT TQM =',f4.0,
' -- DO NOT APPLY TEMP QM=9 EVENT')
1315 IF(qob.LT.bmiss)
THEN
1316 rejq =
oefg01(pob,typ,3,oemin(3)).GE.bmiss .OR.
1319 $ nint(pob * 10.).LT.nint(qtop_rej * 10.) .OR.
1323 IF(rejq.OR.rejp_ps)
THEN
1325 IF(.NOT.rejp_ps.AND..NOT.rejt)
THEN
1327 IF(nflgrt(nint(typ),8).EQ.0)
THEN
1328 WRITE(iunits,7306) nint(typ)
1329 7306
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1330 $
'QOB ON ALL LEVELS'/)
1331 nflgrt(nint(typ),8) = 1
1334 ELSE IF(qob.LE.0..OR.tob.GE.bmiss.OR.tob.LE.-150.)
THEN
1335 WRITE(iunits,111) stnid,nint(typ),yob,xob,
1337 111
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1338 $
'E, REJECT QOB ON LVL - QOB=',f6.3,
' G/KG, FAILS SANITY CHECK ',
1339 $
'(TOB=',f5.1,
' C)')
1341 ELSE IF(
oefg01(pob,typ,3,oemin(3)).GE.bmiss)
THEN
1342 IF(nflgrt(nint(typ),3).EQ.0)
THEN
1344 WRITE(iunits,305) nint(typ)
1345 305
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1346 $
'QOB ON SFC LVL DUE TO MISSING OBS ERROR'/)
1348 WRITE(iunits,203) nint(typ)
1349 203
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1350 $
'QOB ON AT LEAST ONE LEVEL (IF AVAILABLE ON THAT LEVEL) DUE TO ',
1351 $
'MISSING OBS ERROR'/)
1353 nflgrt(nint(typ),3) = 1
1361 WRITE(iunits,109) stnid,nint(typ),yob,xob,
1362 $ qob/1000.,qtop_rej,pob
1363 109
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1364 $
'E, REJECT QOB ON LVL - QOB=',f6.3,
' G/KG, ABOVE ',f6.1,
1365 $
'MB (POB=',f6.1,
' MB)')
1370 IF(moerr_p.OR.moerr_t)
THEN
1375 IF(rej.EQ.9.AND.(qqm.GT.3.AND.qqm.LT.15))
THEN
1377 1403
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1378 $
'E, INPUT QQM =',f4.0,
' -- DO NOT APPLY MSTR QM=9 EVENT')
1412 IF(min(uob,vob).LT.bmiss)
THEN
1413 rejw =
oefg01(pob,typ,4,oemin(4)).GE.bmiss
1414 IF(rejw.OR.rejp_ps)
THEN
1416 IF(.NOT.rejp_ps)
THEN
1417 IF(nflgrt(nint(typ),4).EQ.0)
THEN
1419 WRITE(iunits,1304) nint(typ)
1420 1304
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1421 $
'UOB/VOB ON SFC LVL DUE TO MISSING OBS ERROR'/)
1423 WRITE(iunits,204) nint(typ)
1424 204
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1425 $
'UOB/VOB ON AT LEAST ONE LVL (IF AVAILABLE ON THAT LVL) DUE TO ',
1426 $
'MISSING OBS ERROR'/)
1428 nflgrt(nint(typ),4) = 1
1443 IF(rej.EQ.9.AND.(wqm.GT.3.AND.wqm.LT.15))
THEN
1445 1404
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1446 $
'E, INPUT WQM =',f4.0,
' -- DO NOT APPLY WIND QM=9 EVENT')
1457 if(subset.eq.
"SFCSHP".and.uob.eq.0..and.vob.eq.0.)
then
1458 call ufbint(-iunitp,ufc_8,1,1,iret,
'UFC')
1459 call ufbint(-iunitp,vfc_8,1,1,iret,
'VFC')
1463 if(ibfms(ufc_8).eq.0.and.ibfms(vfc_8).eq.0)
then
1464 if(abs(ufc_8).ge.5..or.abs(vfc_8).ge.5.)
then
1466 write(iunits,1504) stnid,nint(typ),ufc_8,vfc_8
1467 1504
FORMAT(/
' --> ID ',a8,
', (RTP ',i3,
' UFC=',f5.2,
' VFC=',f5.2,
') ',
1468 $
'NEW WIND EVENT, UOB/VOB CALM (0 M/S) WHILE |UFC| AND/OR |VFC| ',
1469 $
'>= 5 M/S, QM SET TO 8'/)
1491 IF(pwo.LT.bmiss)
THEN
1492 rejpw =
oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1494 IF(nflgrt(nint(typ),5).EQ.0)
THEN
1495 WRITE(iunits,205) nint(typ)
1496 205
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1497 $
'PWO DUE TO MISSING OBS ERROR'/)
1498 nflgrt(nint(typ),5) = 1
1503 IF(pwq.GT.3.AND.pwq.LT.15)
THEN
1505 1405
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1506 $
'E, INPUT PWQ =',f4.0,
' -- DO NOT APPLY PWtO QM=9 EVENT')
1526 IF(pw1o.LT.bmiss)
THEN
1527 rejpw1 =
oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1529 IF(nflgrt(nint(typ),9).EQ.0)
THEN
1530 WRITE(iunits,206) nint(typ)
1531 206
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1532 $
'PW1O DUE TO MISSING OBS ERROR'/)
1533 nflgrt(nint(typ),9) = 1
1538 IF(pw1q.GT.3.AND.pw1q.LT.15)
THEN
1540 1406
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1541 $
'E, INPUT PW1Q =',f4.0,
' -- DO NOT APPLY PW1O QM=9 EVENT')
1561 IF(pw2o.LT.bmiss)
THEN
1562 rejpw2 =
oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1564 IF(nflgrt(nint(typ),10).EQ.0)
THEN
1565 WRITE(iunits,207) nint(typ)
1566 207
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1567 $
'PW2O DUE TO MISSING OBS ERROR'/)
1568 nflgrt(nint(typ),10) = 1
1573 IF(pw2q.GT.3.AND.pw2q.LT.15)
THEN
1575 1407
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1576 $
'E, INPUT PW2Q =',f4.0,
' -- DO NOT APPLY PW2O QM=9 EVENT')
1596 IF(pw3o.LT.bmiss)
THEN
1597 rejpw3 =
oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1599 IF(nflgrt(nint(typ),11).EQ.0)
THEN
1600 WRITE(iunits,208) nint(typ)
1601 208
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1602 $
'PW3O DUE TO MISSING OBS ERROR'/)
1603 nflgrt(nint(typ),11) = 1
1608 IF(pw3q.GT.3.AND.pw3q.LT.15)
THEN
1610 1408
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1611 $
'E, INPUT PW3Q =',f4.0,
' -- DO NOT APPLY PW3O QM=9 EVENT')
1631 IF(pw4o.LT.bmiss)
THEN
1632 rejpw4 =
oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1634 IF(nflgrt(nint(typ),12).EQ.0)
THEN
1635 WRITE(iunits,209) nint(typ)
1636 209
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1637 $
'PW4O DUE TO MISSING OBS ERROR'/)
1638 nflgrt(nint(typ),12) = 1
1643 IF(pw4q.GT.3.AND.pw4q.LT.15)
THEN
1645 1409
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1646 $
'E, INPUT PW4Q =',f4.0,
' -- DO NOT APPLY PW4O QM=9 EVENT')
1663 IF(maxpev .GT.0)
CALL ufbint(iunitp,pev_8, 4,maxpev, iret,pevn)
1664 IF(maxqev .GT.0)
CALL ufbint(iunitp,qev_8, 4,maxqev, iret,qevn)
1665 IF(maxtev .GT.0)
CALL ufbint(iunitp,tev_8, 4,maxtev, iret,tevn)
1666 IF(maxwev .GT.0)
CALL ufbint(iunitp,wev_8, 5,maxwev, iret,wevn)
1667 IF(maxpwv .GT.0)
CALL ufbint(iunitp,pwv_8, 4,maxpwv, iret,pwvn)
1668 IF(maxpw1v.GT.0)
CALL ufbint(iunitp,pw1v_8,4,maxpw1v,iret,pw1vn)
1669 IF(maxpw2v.GT.0)
CALL ufbint(iunitp,pw2v_8,4,maxpw2v,iret,pw2vn)
1670 IF(maxpw3v.GT.0)
CALL ufbint(iunitp,pw3v_8,4,maxpw3v,iret,pw3vn)
1671 IF(maxpw4v.GT.0)
CALL ufbint(iunitp,pw4v_8,4,maxpw4v,iret,pw4vn)
2229 parameter(rd=287.04, g=9.81)
2230 CHARACTER*80 EVNSTQ,EVNSTV,evnstp
2231 CHARACTER*8 SUBSET,stnid
2232 REAL(8) TDP_8(255),TQM_8(255),QQM_8(255),BAKQ_8(4,255),
2233 $ bakv_8(4,255),bakp_8(3),obs_8,qms_8,bak_8,
2235 real(8) pmo_8,zob_8,pmsl_8
2238 LOGICAL EVNQ,EVNV,DOVTMP,TROP,ADPUPA_VIRT,DOBERR,DOFCST,
2239 $ some_fcst,fcst,virt,satmqc,recalc_q,doprev,
2242 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
2243 $ xob,yob,dhr,typ,nlev
2244 COMMON /gbevbb/ pvcd,vtcd
2245 COMMON /gbevcc/ dovtmp,dofcst,some_fcst,doberr,fcst,virt,
2246 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
2247 COMMON /gbevff/ bmiss
2249 DATA evnstq /
'QOB QQM QPC QRC'/
2250 DATA evnstv /
'TOB TQM TPC TRC'/
2251 data evnstp /
'PMO PMQ PMIN'/
2253 equivalence(sid_8,stnid)
2258 es(t) = 6.1078*exp((17.269*(t - 273.16))/((t - 273.16)+237.3))
2259 qs(t,p) = (0.622*es(t))/(p-(0.378*es(t)))
2265 pmsl_fcn(p,tv,z) = p*exp((g*z)/(rd*tv))
2279 surf = (subset.eq.
'ADPSFC'.or.subset.eq.
'SFCSHP'.or.
2280 $ subset.eq.
'MSONET')
2287 CALL ufbint(-iunitp,tdp_8,1,255,nltd,
'TDO')
2288 CALL ufbint(-iunitp,qqm_8,1,255,nlqq,
'QQM')
2289 CALL ufbint(-iunitp,tqm_8,1,255,nltq,
'TQM')
2290 if(surf.and.dopmsl)
then
2291 call ufbint(-iunitp,pmo_8,1,1,nlpm,
'PMO')
2292 call ufbint(-iunitp,zob_8,1,1,nlzo,
'ZOB')
2293 call ufbint(-iunitp,pqm_8,1,1,nlpq,
'PQM')
2295 IF(subset.NE.
'RASSDA '.AND.subset.NE.
'SATEMP ')
THEN
2296 IF(nltd.EQ.0)
RETURN
2297 IF(nlqq.EQ.0)
RETURN
2299 IF(nltq.EQ.0)
RETURN
2300 IF(subset.NE.
'RASSDA '.AND.subset.NE.
'SATEMP ')
THEN
2301 IF(nltd.NE.nlev)
THEN
2302 print.NE.
'(" ##GBLEVENTS/GBLEVN08 - NLTD NLEV - STOP 61")'
2305 IF(nlqq.NE.nlev)
THEN
2306 print.NE.
'(" ##GBLEVENTS/GBLEVN08 - NLQQ NLEV - STOP 63")'
2310 IF(nltq.NE.nlev)
THEN
2311 print.NE.
'(" ##GBLEVENTS/GBLEVN08 - NLTQ NLEV - STOP 62")'
2327 IF(subset.EQ.
'RASSDA '.OR.subset.EQ.
'SATEMP ')
THEN
2328 IF(tob.LT.bmiss)
THEN
2330 bakv_8(2,l) = tqm_8(l)
2338 IF(pob.LT.bmiss .AND. tob.LT.bmiss
2339 $ .AND. tdo.LT.bmiss)
THEN
2340 IF(qqm_8(l).GT.3)
THEN
2346 IF(tdo.LT.-103.15 .OR. tdo.GT.46.83 .OR. pob.LT.0.1 .OR.
2347 $ pob.GT.1100.) cycle
2349 qob = qs(tdo+273.16,pob)
2357 IF(qob*1e6.LT.bmiss .AND. qob.GT.0.) bakq_8(1,l) = qob*1e6
2358 bakq_8(2,l) = qqm_8(l)
2368 trop = (subset.EQ.
'ADPUPA ' .AND.
2369 $ ((cat.EQ.5 .AND. pob.LT.500.) .OR. pob.LT. 80. .OR. trop))
2370 IF(dovtmp .AND. .NOT.trop)
THEN
2371 bakv_8(1,l) = (tob+273.16)*(1.+.61*qob)-273.16
2373 IF(subset.EQ.
'ADPUPA ')
THEN
2375 IF((qqm_8(l).LT.4.OR.qqm_8(l).EQ.9.OR.qqm_8(l).EQ.15)
2376 $ .OR. tqm_8(l).EQ.0 .OR. tqm_8(l).GT.3
2377 $ .OR. pob.LE.700.)
THEN
2378 bakv_8(2,l) = tqm_8(l)
2389 IF(qqm_8(l).LT.4)
THEN
2390 bakv_8(2,l) = tqm_8(l)
2393 ELSE IF((qqm_8(l).EQ.9.OR.qqm_8(l).EQ.15).AND.
2394 $ (tqm_8(l).LE.3.OR.tqm_8(l).GE.15.OR.
2395 $ tqm_8(l).EQ.9))
THEN
2423 if(ibfms(pmo_8).ne.0)
then
2424 tv = bakv_8(1,1) + 273.16
2426 pmsl_8=pmsl_fcn(pob,tv,zob)
2428 bakp_8(2) = max(3,int(pqm_8))
2431 4000
format(
'--> ID ',a8,
' Pmsl missing - derived from Pstn; ',
2432 $
'PMIN = ',f4.1,
' PMQ = ',f4.1,
'')
2435 if(pmsl_8.gt.1060)
then
2436 write(*,4001) stnid,pob,bakp_8(1)
2437 4001
format(
'--> ID ',a8,
' Derived PMSL unrealistic; FLAG; ',
2438 $
'POB = ',f7.2,
' PMO = ',f7.2,
'')
2454 IF(evnq)
CALL ufbint(iunitp,bakq_8,4,nlev,iret,evnstq)
2455 IF(evnv)
CALL ufbint(iunitp,bakv_8,4,nlev,iret,evnstv)
2456 if(nlev.eq.1.and.evnp)
2457 $
call ufbint(iunitp,bakp_8,3,nlev,iret,evnstp)
2506 INTEGER IUNITF(2), IDATEP, IM, JM, IDRT
2507 REAL,
PARAMETER :: PI180=.0174532
2508 INTEGER*4,
PARAMETER :: ONE=1, ten=10
2510 TYPE(sigio_head) :: HEAD(2)
2511 TYPE(sigio_dats) :: DATS
2512 TYPE(sigio_datm) :: DATM
2514 INTEGER*4 IRET,IRET1,IRETS,IMJM4,KM4,IDVM,NTRAC,IUNIT4(2)
2516 INTEGER KFILES,IFILE,JFILE,IDATGS_COR,JCAP,JCAP1,JCAP2,JCAP1X2,
2517 $ mdima,mdimb,mdimc,iromb,maxwv,idir,ns,i,j,k,l,ii,jj,ib,ie
2519 INTEGER IDATE(8,2),JDATE(8,2),KDATE(8,2),KINDX(2)
2521 CHARACTER*6 COORD(3)
2526 DATA coord /
'SIGMA ',
'HYBRID',
'GENHYB'/
2528 REAL,
ALLOCATABLE :: cofs(:,:), cofv(:,:,:)
2529 REAL,
ALLOCATABLE :: cofs_f(:,:,:), cofv_f(:,:,:,:)
2530 REAL (KIND=4),allocatable :: grds(:,:,:), grdv(:,:,:,:),
2531 $ wrk1(:,:), wrk2(:,:)
2536 iunit4(:) = iunitf(:)
2538 IF(mod(mod(idatep,100),3).EQ.0)
THEN
2541 print 331, mod(idatep,100)
2542 331
FORMAT(/
' --> GBLEVENTS: THE PREPBUFR CENTER HOUR (',i2.2,
2543 $
') IS A MULTIPLE OF 3 - ONLY ONE SIGIO (SIGMA OR HYBRID) ',
2544 $
'INPUT GLOBAL FILE IS READ,'/16x,
'NO TIME INTERPOLATION OF ',
2545 $
'SPECTRAL COEFFICIENTS IS PERFORMED'/)
2548 kindx(1) = mod(mod(idatep,100),3)
2549 kindx(2) = kindx(1) - 3
2550 print 332, mod(idatep,100)
2551 332
FORMAT(/
' --> GBLEVENTS: THE PREPBUFR CENTER HOUR (',i2.2,
2552 $
') IS NOT A MULTIPLE OF 3 - TWO SPANNING SIGIO (SIGMA OR ',
2553 $
'HYBRID) INPUT GLOBAL FILES'/16x,
'ARE READ AND THE SPECTRAL ',
2554 $
'COEFFICIENTS ARE INTERPOLATED TO THE PREPBUFR CENTER TIME'/)
2565 WRITE(cfile,
'("fort.",I2.2)') iunitf(ifile)
2567 CALL sigio_rropen(iunit4(ifile),cfile,iret)
2568 CALL sigio_rrhead(iunit4(ifile),head(ifile),iret1)
2569 print *,
' cfile_sig=',cfile,
'sigio_rropen: iret=',iret,
2570 $
'sigio_rrhead: iret1=',iret1
2572 IF(iret.NE.0)
GO TO 903
2573 IF(iret1.NE.0)
GO TO 904
2577 idate(1,ifile) = head(ifile)%IDATE(4)
2578 idate(2:3,ifile) = head(ifile)%IDATE(2:3)
2579 idate(5,ifile) = head(ifile)%IDATE(1)
2581 fhour = head(ifile)%FHOUR
2582 print
'(" idate=",I5,7I3.2," fhour=",F7.3)', idate(:,ifile),
2585 IF(idate(1,ifile).LT.100)
THEN
2593 print
'(" ##GBLEVENTS/GBLEVN10 - 2-DIGIT YEAR FOUND IN ",
2594 $ "SIGIO (SIGMA OR HYBRID) INPUT GLOBAL FILE ",I0,
2595 $ "; INITIAL DATE (YEAR IS: ",I0,")")', ifile,idate(1,ifile)
2596 print
'(" - USE WINDOWING TECHNIQUE TO OBTAIN 4-DIGIT",
2598 IF(idate(1,ifile).GT.20)
THEN
2599 idate(1,ifile) = 1900 + idate(1,ifile)
2601 idate(1,ifile) = 2000 + idate(1,ifile)
2603 print
'(" ##GBLEVENTS/GBLEVN10 - CORRECTED 4-DIGIT YEAR IS",
2604 $ " NOW: ",I0)', idate(1,ifile)
2608 CALL w3movdat(rinc,idate(:,ifile),jdate(:,ifile))
2610 print 1, ifile,head(ifile)%FHOUR,
2611 $ (idate(ii,ifile),ii=1,3),idate(5,ifile),(jdate(ii,ifile),
2612 $ ii=1,3),jdate(5,ifile)
2613 1
FORMAT(
' --> GBLEVENTS: SIGIO (SIGMA OR HYBRID) INPUT GLOBAL ',
2614 $
'FILE',i2,
' HERE IS A ',f5.1,
' HOUR FORECAST FROM ',i5.4,
2615 $ 3i3.2,
' VALID AT ',i5.4,3i3.2)
2617 kdate(:,ifile) = jdate(:,ifile)
2619 IF(kfiles.EQ.2)
THEN
2620 rinc(2) = real(kindx(ifile))
2621 CALL w3movdat(rinc,jdate(:,ifile),kdate(:,ifile))
2624 idatgs_cor = (kdate(1,ifile) * 1000000) + (kdate(2,ifile) *
2625 $ 10000) + (kdate(3,ifile) * 100) + kdate(5,ifile)
2630 IF(idatep.NE.idatgs_cor)
GO TO 901
2644 ntrac = head(1)%NTRAC
2645 nvcoord = head(1)%NVCOORD
2646 ALLOCATE (vcoord(kmax+1,nvcoord))
2648 vcoord = head(1)%VCOORD
2650 sfcpress_id = mod(head(1)%IDVM,ten)
2651 thermodyn_id = mod(head(1)%IDVM/ten,ten)
2652 IF(idvc == 3 .AND. thermodyn_id == 3)
THEN
2653 kmaxs = (ntrac+1)*kmax + 2
2659 ALLOCATE (iar12z(im,jm), iar13p(im,jm))
2660 ALLOCATE (iar14t(im,jm,kmax), iar15u(im,jm,kmax),
2661 $ iar16v(im,jm,kmax), iar17q(im,jm,kmax),
2662 $ iarpsl(im,jm,kmax), iarpsi(im,jm,kmax+1))
2665 if(idvc.eq.0) idvc = 1
2666 IF(idvc < 0 .or. idvc > 3)
THEN
2667 print *,
'##GBLEVENTS/GBLEVN10: INVALID VERT COORD ID (=',idvc
2678 mdimb = mdima/2+jcap1
2683 dlat = 180./(jmax-1)
2686 print 2, jcap,imax,jmax,kmax,kmaxs,dlat,dlon,coord(idvc)
2687 2
FORMAT(/
' --> GBLEVENTS: GLOBAL MODEL SPECS: T',i5,
' ',
2688 $ i5,
' x ',i5,
' GRID WITH ',i3,
' LEVELS ',i3,
2689 $
' SCALARS -------> ',f5.2,
' X ',f5.2,
' VERT. ',
2695 print 9901, jfile,(jdate(ii,jfile),ii=1,3),jdate(5,jfile),idatep
2696 9901
FORMAT(/
' ##GBLEVENTS/GBLEVN10 - SIGMA OR HYBRID FILE',i2,
' DATE',
2697 $
' (',i4.4,3(i2.2),
'), DOES NOT MATCH -OR SPAN- PREPBUFR FILE ',
2698 $
'CENTER DATE (',i10,
') -STOP 68'/)
2701 print 9903, jfile,iret
2702 9903
FORMAT(/
' ##GBLEVENTS/GBLEVN10 - SIGMA OR HYBRID FILE',i2,
2703 $
' RETURNED FROM SIGIO_RROPEN WITH R.C.',i3,
' -STOP 70'/)
2706 print 9904, jfile,iret1
2707 9904
FORMAT(/
' ##GBLEVENTS/GBLEVN10 - SIGMA OR HYBRID FILE',i2,
2708 $
' RETURNED FROM SIGIO_RRHEAD WITH R.C.',i3,
' -STOP 71'/)
2711 IF(kmax.GT.500)
then
2712 print
'(" ##GBLEVENTS/GBLEVN10 - KMAX TOO BIG = ",I0,
2713 $ " - UNABLE TO TRANSFORM GLOBAL SIGMA FILE(S) - STOP 69")',
2765 allocate (cofs_f(mdima,kmaxs,2), cofv_f(mdima,kmax,2,2))
2769 if (idrt < 0 .or. idrt > 256) idrt = 0
2772 IF(kindx(1).EQ.0)
THEN
2781 sfcpress_id = mod(head(1)%IDVM,ten)
2782 thermodyn_id = mod(head(1)%IDVM/ten,ten)
2784 print *,
'in sig sfcpress_id=',sfcpress_id,
' thermodyn_id=',
2785 $ thermodyn_id,
' ntrac=',ntrac
2786 print *,
' idvc=',idvc,
' idsl=',idsl,
' idvm=',idvm,
2787 $
' nvcoord=',nvcoord
2790 CALL sigio_aldats(head(ifile),dats,irets)
2791 CALL sigio_aldatm(head(ifile),one,km4,datm,irets)
2793 CALL sigio_rrdats(iunit4(ifile),head(ifile),dats,irets)
2796 print *,
' irets from sigio_rrdats = ', irets
2801 cofs_f(i,1,ifile) = dats%HS(i)
2802 cofs_f(i,2,ifile) = dats%PS(i)
2806 CALL sigio_rrdatm(iunit4(ifile),head(ifile),datm,irets)
2808 print *,
' irets from sigio_rrdatm = ', irets
2814 cofs_f(:,3:ie,ifile) = datm%T
2818 cofs_f(:,ib:ie,ifile) = datm%Q(:,1:kmax,i)
2820 cofv_f(:,:,1,ifile) = datm%D
2821 cofv_f(:,:,2,ifile) = datm%Z
2823 CALL sigio_axdats(dats,irets)
2824 CALL sigio_axdatm(datm,irets)
2829 ALLOCATE (cofs(mdima,kmaxs), cofv(mdima,kmax,2))
2830 ALLOCATE (grds(imax,jmax,kmaxs), grdv(imax,jmax,kmax,2))
2831 ALLOCATE (wrk1(imax*jmax,kmax), wrk2(imax*jmax,kmax+1))
2833 IF(kfiles.EQ.1)
THEN
2835 cofs(i,1:kmaxs) = cofs_f(i,1:kmaxs,1)
2836 cofv(i,1:kmax,1:2) = cofv_f(i,1:kmax,1:2,1)
2841 $ ((abs(kindx(2))*cofs_f(:,:,1)) +(kindx(1)*cofs_f(:,:,2)))/3.
2843 $ ((abs(kindx(2))*cofv_f(:,:,:,1))+(kindx(1)*cofv_f(:,:,:,2)))/3.
2846 DEALLOCATE (cofs_f, cofv_f)
2848 CALL sptezm(iromb,maxwv,idrt,imax,jmax,kmaxs,cofs,grds,idir)
2849 CALL sptezmv(iromb,maxwv,idrt,imax,jmax,kmax,
2850 & cofv(1,1,1),cofv(1,1,2),grdv(1,1,1,1),grdv(1,1,1,2),idir)
2852 IF( sfcpress_id == 2 )
THEN
2853 grds(:,:,2) = 1000.0*grds(:,:,2)
2855 grds(:,:,2) = 1000.0*exp(grds(:,:,2))
2859 CALL gblevn11(imax,jmax,grds(1,1,ns))
2863 iar12z(i,j) = grds(i,j,1)
2864 iar13p(i,j) = grds(i,j,2) * 0.01
2868 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN
2869 grds(:,:,3:2+kmax) = grds(:,:,3:2+kmax) / head(1)%CPI(1)
2870 print *,
' cpi(0)=',head(1)%cpi(1)
2872 CALL sigio_modpr(imjm4,imjm4,km4,nvcoord,idvc,idsl,vcoord,iret,
2873 $ grds(1,1,2),grds(1,1,3),pm=wrk1,pd=wrk2(1,2))
2878 wrk2(i+jj,1) = grds(i,j,2)
2882 wrk2(:,l+1) = wrk2(:,l) - wrk2(:,l+1)
2894 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN
2896 grds(:,:,3:2+kmax) = grds(:,:,3:2+kmax) * head(1)%CPI(1)
2897 CALL sigio_cnvtdv(imjm4,imjm4,km4,idvc,idvm,ntrac,iret,
2898 $ grds(1,1,3),grds(1,1,3+kmax),head(1)%CPI,1_4)
2900 grds(:,:,3:kmax+2) = grds(:,:,3:kmax+2) *
2901 $ (1.+(461.50/287.05-1)*grds(:,:,3+kmax:2+kmax*2))
2906 CALL gblevn11(imax,jmax,grdv(1,1,l,k))
2911 iar14t(i,j,l) = grds(i,j,2+l)
2912 iar15u(i,j,l) = grdv(i,j,l,1)
2913 iar16v(i,j,l) = grdv(i,j,l,2)
2915 iar17q(i,j,l) = max(0.0,grds(i,j,2+kmax+l)*1.0e6)
2916 iarpsl(i,j,l) = wrk1(i+jj,l)*0.01
2924 iarpsi(i,j,l) = wrk2(i+jj,l)*0.01
2937 DEALLOCATE (cofs, cofv)
2938 DEALLOCATE (grds, grdv, wrk1, wrk2)
2940 print *,
' RETURNING from GBLENV10'
3025 USE nemsio_openclose
3031 INTEGER IUNITF(2), IDATEP, IM, JM, IDRT
3032 REAL(KIND=8),parameter:: con_rv=4.6150e+2,con_rd=2.8705e+2,
3033 $ fv=con_rv/con_rd-1.,oner=1.0,qmin=1.0e-10
3034 INTEGER*4,
PARAMETER :: TEN=10
3037 INTEGER*4 IRET,IMJM4,KM4,IDVM,NTRAC
3039 INTEGER IDATGS_COR,JCAP,JCAP1,JCAP2,JCAP1X2,MDIMA,MDIMB,MDIMC,
3040 $ iromb,maxwv,idir,i,j,k,l,ii,jj
3042 INTEGER(4) IDATE7(7),JCAP4,IDVC4,DIMZ4,K4,IM4,JM4,KINDREAL,KINDINT
3043 INTEGER(4) NFHOUR,NFMINUTE,NFSECONDN,NFSECONDD,idsl4,idvm4
3045 REAL(4),
ALLOCATABLE :: VCOORD4(:,:,:),CPI(:)
3046 REAL,
ALLOCATABLE :: tmp(:)
3047 TYPE(nemsio_gfile) :: GFILE
3049 INTEGER IDATE(8),JDATE(8)
3052 REAL (KIND=4),allocatable :: psfc(:,:), tv(:,:,:),
3053 $ wrk1(:,:), wrk2(:,:)
3064 print 331, mod(idatep,100)
3065 331
format(/
' --> GBLEVENTS: ONLY ONE NEMSIO INPUT GLOBAL FILE IS ',
3066 $
'READ SINCE FILES ARE AVAILABLE EACH HOUR (NO NEED TO ',
3067 $
'INTERPOLATE'/16x,
'SPANNING FILES WHEN THE PREPBUFR CENTER HOUR',
3068 $
' (',i2.2,
') IS NOT A MULTIPLE OF 3)'/)
3076 WRITE(cfile2,
'("fort.",I2.2)') iunitf(1)
3078 CALL nemsio_open(gfile,trim(cfile2),
'read',iret=iret)
3079 print *,
' cfile_nems2=',cfile2,
'nemsio open,iret=',iret
3082 CALL nemsio_getfilehead(gfile,idate=idate7,
3083 & jcap=jcap4,dimx=im4,dimy=jm4,
3084 & dimz=dimz4,idvc=idvc4,ntrac=ntrac,idrt=idrtnems,
3085 & nfhour=nfhour,nfminute=nfminute,nfsecondn=nfsecondn,
3086 & nfsecondd=nfsecondd,idsl=idsl4,idvm=idvm4,iret=iret)
3094 if(idrt==-9999) idrt=4
3095 idate(1:3)=idate7(1:3)
3098 ALLOCATE(vcoord(kmax+1,3))
3101 IF(nfsecondd/=0.AND. nfsecondd/=-9999)
THEN
3102 fhour=real(nfhour,8)+real(nfminute/60.,8)+
3103 $ real(nfsecondn*1./(nfsecondd*360.),8)
3105 fhour=real(nfhour,8)+real(nfminute/60.,8)
3107 print
'(" idate=",I5,7I3.2," fhour=",F7.3)', idate,fhour
3109 ALLOCATE(vcoord4(kmax+1,3,2))
3110 CALL nemsio_getfilehead(gfile,vcoord=vcoord4,iret=iret)
3112 IF(maxval(vcoord4(:,3,1))==0..AND.minval(vcoord4(:,3,1))==0.)
THEN
3114 IF(maxval(vcoord4(:,2,1))==0..AND.minval(vcoord4(:,2,1))==0.)
3118 vcoord(1:kmax+1,1:nvcoord)=vcoord4(1:kmax+1,1:nvcoord,1)
3121 ALLOCATE(cpi(ntrac+1))
3122 CALL nemsio_getheadvar(gfile,
'CPI',cpi,iret=iret)
3125 CALL w3movdat(rinc,idate,jdate)
3127 print 1, fhour,(idate(ii),ii=1,3),idate(5),(jdate(ii),ii=1,3),
3129 1
FORMAT(
' --> GBLEVENTS: GLOBAL NEMSIO FILE: HERE IS A ',f5.1,
3130 $
' HOUR FORECAST FROM ',i5.4,3i3.2,
' VALID AT ',i5.4,3i3.2)
3132 idatgs_cor = (jdate(1) * 1000000) + (jdate(2) * 10000) +
3133 $ (jdate(3) * 100) + jdate(5)
3138 IF(idatep.NE.idatgs_cor)
GO TO 901
3142 sfcpress_id = mod(idvm,ten)
3143 thermodyn_id = mod(idvm/ten,ten)
3145 IF(idvc == 3 .AND. thermodyn_id == 3)
THEN
3146 kmaxs = (ntrac+1)*kmax + 2
3152 ALLOCATE (iar12z(imax,jmax), iar13p(imax,jmax))
3153 ALLOCATE (iar14t(imax,jmax,kmax), iar15u(imax,jmax,kmax),
3154 $ iar16v(imax,jmax,kmax), iar17q(imax,jmax,kmax),
3155 $ iarpsl(imax,jmax,kmax), iarpsi(imax,jmax,kmax+1),
3156 $ iarpsd(imax,jmax,kmax))
3159 if(idvc.eq.0) idvc = 1
3160 IF(idvc < 0 .or. idvc > 3)
THEN
3161 print *,
'##GBLEVENTS/GBLEVN12: INVALID VERT COORD ID (=',idvc
3172 mdimb = mdima/2+jcap1
3175 dlat = 180./(jmax-1)
3178 print 2, jcap,imax,jmax,kmax,kmaxs,dlat,dlon,idvc
3181 2
FORMAT(/
' --> GBLEVENTS: GLOBAL MODEL SPECS: T',i5,
' ',
3182 $ i5,
' x ',i5,
' GRID WITH ',i3,
' LEVELS ',i3,
3183 $
' SCALARS -------> ',f5.2,
' X ',f5.2,
' VERT. ',
3184 $
'COORD ID IS: ',i0,
' (not sure what this means!')
3190 if (idrt < 0 .or. idrt > 256) idrt = 0
3193 print *,
'in nem sfcpress_id=',sfcpress_id,
' thermodyn_id=',
3194 $ thermodyn_id,
' ntrac=',ntrac
3195 print *,
' idvc=',idvc,
' idsl=',idsl,
' idvm=',idvm,
' nvcoord=',
3198 call w3kind(kindreal,kindint)
3201 allocate(tmp(imax*jmax))
3205 if(kindreal==4)
then
3206 CALL nemsio_readrecvw34(gfile,
'hgt',
'sfc',k4,tmp,iret=iret)
3208 CALL nemsio_readrecv(gfile,
'hgt',
'sfc',k4,tmp,iret=iret)
3212 iar12z(:,:)=reshape(tmp,(/imax,jmax/))
3217 if(kindreal==4)
then
3218 CALL nemsio_readrecvw34(gfile,
'pres',
'sfc',k4,tmp,iret=iret)
3220 CALL nemsio_readrecv(gfile,
'pres',
'sfc',k4,tmp,iret=iret)
3224 iar13p(:,:)=reshape(tmp*0.01,(/imax,jmax/))
3259 if(kindreal==4)
then
3260 CALL nemsio_readrecvw34(gfile,
'tmp',
'mid layer',k4,tmp,
3263 CALL nemsio_readrecv(gfile,
'tmp',
'mid layer',k4,tmp,
3268 iar14t(:,:,k4)=reshape(tmp,(/imax,jmax/))
3269 call gblevn11d(imax,jmax,iar14t(1,1,k4))
3274 if(kindreal==4)
then
3275 CALL nemsio_readrecvw34(gfile,
'ugrd',
'mid layer',k4,tmp,
3278 CALL nemsio_readrecv(gfile,
'ugrd',
'mid layer',k4,tmp,
3283 iar15u(:,:,k4)=reshape(tmp,(/imax,jmax/))
3284 call gblevn11d(imax,jmax,iar15u(1,1,k4))
3295 if(kindreal==4)
then
3296 CALL nemsio_readrecvw34(gfile,
'vgrd',
'mid layer',k4,tmp,
3299 CALL nemsio_readrecv(gfile,
'vgrd',
'mid layer',k4,tmp,
3303 iar16v(:,:,k4)=reshape(tmp,(/imax,jmax/))
3304 call gblevn11d(imax,jmax,iar16v(1,1,k4))
3310 if(kindreal==4)
then
3311 CALL nemsio_readrecvw34(gfile,
'spfh',
'mid layer',k4,tmp,
3314 CALL nemsio_readrecv(gfile,
'spfh',
'mid layer',k4,tmp,
3318 iar17q(:,:,k4)=max(0.0,reshape(tmp*1.0e6,(/imax,jmax/)) )
3319 call gblevn11d(imax,jmax,iar17q(1,1,k4))
3326 CALL nemsio_close(gfile,iret=iret)
3336 tfac=oner+fv*max(iar17q(i,j,k)*1.0e-6,qmin)
3337 iar14t(i,j,k)=iar14t(i,j,k)*tfac
3345 ALLOCATE (psfc(imax,jmax), tv(imax,jmax,kmax))
3346 ALLOCATE (wrk1(imax*jmax,kmax), wrk2(imax*jmax,kmax+1))
3350 psfc(:,:) = iar13p(:,:)*100.
3351 tv(:,:,:) = iar14t(:,:,:)
3353 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN
3354 tv(:,:,:) = tv(:,:,:) / cpi(1)
3355 print *,
' cpi(1)=',cpi(1)
3358 CALL sigio_modpr(imjm4,imjm4,km4,nvcoord,idvc,idsl,vcoord,iret,
3359 $ psfc,tv,pm=wrk1,pd=wrk2(1,2))
3363 wrk2(i+jj,1) = psfc(i,j)
3367 wrk2(:,l+1) = wrk2(:,l) - wrk2(:,l+1)
3374 iarpsl(i,j,l) = wrk1(i+jj,l)*0.01
3382 iarpsi(i,j,l) = wrk2(i+jj,l)*0.01
3391 CALL nemsio_finalize()
3398 print 9901, (jdate(ii),ii=1,3),jdate(5),idatep
3399 9901
FORMAT(/
' ##GBLEVENTS/GBLEVN12 - NEMSIO INPUT GLOBAL FILE DATE',
3400 $
' (',i4.4,3(i2.2),
'), DOES NOT MATCH PREPBUFR FILE CENTER ',
3401 $
'DATE (',i10,
') -STOP 68'/)
3443 INTEGER IUNITF(2), IDATEP, IDRT,IMX,JMX
3444 INTEGER yyyy,mm,dd,hh
3446 integer*4 error, id_var, dimid, len
3447 integer*4 im,jm,km, lm,n, k,nargs
3448 REAL(KIND=8),parameter:: con_rv=4.6150e+2,con_rd=2.8705e+2,
3449 $ fv=con_rv/con_rd-1.,oner=1.0,qmin=1.0e-10
3450 INTEGER*4,
PARAMETER :: TEN=10
3452 INTEGER*4 IRET,IMJM4,KM4,IDVM,NTRAC
3454 INTEGER IDATGS_COR,JCAP,JCAP1,JCAP2,JCAP1X2,MDIMA,MDIMB,MDIMC,
3455 $ iromb,maxwv,idir,i,j,l,ii,jj
3457 INTEGER(4) IDATE7(7),JCAP4,IDVC4,DIMZ4,K4,IM4,JM4,KINDREAL,KINDINT
3458 INTEGER(4) NFHOUR,NFMINUTE,NFSECONDN,NFSECONDD,idsl4,idvm4,kr
3460 REAL(4),
ALLOCATABLE :: VCOORD4(:,:,:),CPI(:),ak(:),bk(:)
3461 REAL,
ALLOCATABLE :: temp(:,:), temp3d(:,:,:)
3463 character (len = 80) :: attone
3465 character(len=10) :: dim_nam, grid
3468 INTEGER(4) IDATE(8),JDATE(8)
3469 REAL(4) FHOUR,RINC(5)
3471 REAL (KIND=4),allocatable :: psfc(:,:), tv(:,:,:),
3472 $ wrk1(:,:), wrk2(:,:)
3482 print 331, mod(idatep,100)
3483 331
format(/
' --> GBLEVENTS: ONLY ONE NETCDF INPUT GLOBAL FILE IS ',
3484 $
'READ SINCE FILES ARE AVAILABLE EACH HOUR (NO NEED TO ',
3485 $
'INTERPOLATE'/16x,
'SPANNING FILES WHEN THE PREPBUFR CENTER HOUR',
3486 $
' (',i2.2,
') IS NOT A MULTIPLE OF 3)'/)
3491 WRITE(gfname,
'("fort.",I2.2)') iunitf(1)
3493 error=nf90_open(trim(gfname),nf90_nowrite,ncid)
3494 error=nf90_inq_dimid(ncid,
"grid_xt",dimid)
3495 error=nf90_inquire_dimension(ncid,dimid,dim_nam,im)
3496 error=nf90_inq_dimid(ncid,
"grid_yt",dimid)
3497 error=nf90_inquire_dimension(ncid,dimid,dim_nam,jm)
3498 error=nf90_inq_dimid(ncid,
"pfull",dimid)
3499 error=nf90_inquire_dimension(ncid,dimid,dim_nam,km)
3500 error=nf90_inq_dimid(ncid,
"phalf",dimid)
3501 error=nf90_inquire_dimension(ncid,dimid,dim_nam,lm)
3502 print*,
"im,jm,kmi,lm:",im,jm,km,lm
3503 print*,
"IMX, JMX:", imx, jmx
3504 IF (imx .NE. im .OR. jmx .NE. jm) print*,
"Different Resolutions"
3519 error=nf90_inq_varid(ncid,
"time", id_var)
3520 error=nf90_inquire_attribute(ncid, id_var,
"units", len=len)
3522 error=nf90_get_att(ncid, id_var,
"units", attone)
3523 read(attone(len-18:len-15),
'(i4)') yyyy
3524 read(attone(len-13:len-12),
'(i2)') mm
3525 read(attone(len-10:len-9),
'(i2)') dd
3526 read(attone(len-7:len-6),
'(i2)') hh
3527 IF(attone(1:5) .NE.
"hours")
THEN
3528 print*,
"checkout the time unit, not hourly",attone
3530 print*,
"base time", yyyy,mm,dd,hh
3533 error=nf90_get_var(ncid, id_var, time)
3545 CALL w3movdat(rinc,idate,jdate)
3547 print 1, fhour,(idate(ii),ii=1,3),idate(5),(jdate(ii),ii=1,3),
3549 1
FORMAT(
' --> GBLEVENTS: GLOBAL NEMSIO FILE: HERE IS A ',f5.1,
3550 $
' HOUR FORECAST FROM ',i5.4,3i3.2,
' VALID AT ',i5.4,3i3.2)
3552 idatgs_cor = (jdate(1) * 1000000) + (jdate(2) * 10000) +
3553 $ (jdate(3) * 100) + jdate(5)
3558 IF(idatep.NE.idatgs_cor)
GO TO 901
3562 ALLOCATE (iar12z(im,jm), iar13p(im,jm))
3563 ALLOCATE (iar14t(im,jm,km), iar15u(im,jm,km),
3564 $ iar16v(im,jm,km), iar17q(im,jm,km),
3565 $ iarpsl(im,jm,km), iarpsi(im,jm,km+1),
3568 error=nf90_get_att(ncid, nf90_global,
"grid", grid)
3569 IF (grid ==
"gaussian")
THEN
3579 sfcpress_id = mod(idvm,ten)
3580 thermodyn_id = mod(idvm/ten,ten)
3582 IF(idvc == 3 .AND. thermodyn_id == 3)
THEN
3583 kmaxs = (ntrac+1)*kmax + 2
3592 dlat = 180./(jmax-1)
3595 print 2, jcap,imax,jmax,kmax,kmaxs,dlat,dlon,idvc
3597 2
FORMAT(/
' --> GBLEVENTS: GLOBAL MODEL SPECS: T',i5,
' ',
3598 $ i5,
' x ',i5,
' GRID WITH ',i3,
' LEVELS ',i3,
3599 $
' SCALARS -------> ',f5.2,
' X ',f5.2,
' VERT. ',
3600 $
'COORD ID IS: ',i0)
3602 print *,
'in netcdf sfcpress_id=',sfcpress_id,
' thermodyn_id=',
3603 $ thermodyn_id,
' ntrac=',ntrac
3604 print *,
' idvc=',idvc,
' idsl=',idsl,
' idvm=',idvm,
' nvcoord=',
3607 ALLOCATE(vcoord(km+1,3))
3612 error=nf90_get_att(ncid, nf90_global,
"ak", ak)
3613 error=nf90_get_att(ncid, nf90_global,
"bk", bk)
3617 vcoord(k,1) = ak(kr)
3618 vcoord(k,2) = bk(kr)
3623 allocate(temp(im,jm))
3624 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
3625 error=nf90_get_var(ncid, id_var, temp)
3627 iar12z(:,:)=temp(:,:)
3631 error=nf90_inq_varid(ncid,
'pressfc', id_var)
3632 error=nf90_get_var(ncid, id_var, temp)
3634 iar13p(:,:)=temp(:,:)*0.01
3644 allocate(temp3d(im,jm,km))
3645 error=nf90_inq_varid(ncid,
'tmp', id_var)
3646 error=nf90_get_var(ncid, id_var, temp3d)
3649 iar14t(:,:,k4)=temp3d(:,:,kr)
3650 call gblevn11d(imax,jmax,iar14t(1,1,k4))
3655 error=nf90_inq_varid(ncid,
'ugrd', id_var)
3656 error=nf90_get_var(ncid, id_var, temp3d)
3659 iar15u(:,:,k4)=temp3d(:,:,kr)
3660 call gblevn11d(imax,jmax,iar15u(1,1,k4))
3665 error=nf90_inq_varid(ncid,
'vgrd', id_var)
3666 error=nf90_get_var(ncid, id_var, temp3d)
3669 iar16v(:,:,k4)=temp3d(:,:,kr)
3670 call gblevn11d(imax,jmax,iar16v(1,1,k4))
3675 error=nf90_inq_varid(ncid,
'spfh', id_var)
3676 error=nf90_get_var(ncid, id_var, temp3d)
3679 iar17q(:,:,k4)=max(0.0,temp3d(:,:,kr)*1.e6)
3680 call gblevn11d(imax,jmax,iar17q(1,1,k4))
3693 tfac=oner+fv*max(iar17q(i,j,k)*1.0e-6,qmin)
3694 iar14t(i,j,k)=iar14t(i,j,k)*tfac
3704 ALLOCATE (psfc(im,jm), tv(im,jm,km))
3705 ALLOCATE (wrk1(im*jm,km), wrk2(im*jm,km+1))
3709 psfc(:,:) = iar13p(:,:)*100.
3710 tv(:,:,:) = iar14t(:,:,:)
3712 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN
3713 tv(:,:,:) = tv(:,:,:) / cpi(1)
3714 print *,
' cpi(1)=',cpi(1)
3717 CALL sigio_modpr(imjm4,imjm4,km4,nvcoord,idvc,idsl,vcoord,iret,
3718 $ psfc,tv,pm=wrk1,pd=wrk2(1,2))
3722 wrk2(i+jj,1) = psfc(i,j)
3726 wrk2(:,l+1) = wrk2(:,l) - wrk2(:,l+1)
3733 iarpsl(i,j,l) = wrk1(i+jj,l)*0.01
3741 iarpsi(i,j,l) = wrk2(i+jj,l)*0.01
3747 error=nf90_close(ncid)
3757 print 9901, idatep,idatgs_cor
3758 9901
FORMAT(/
' ##GBLEVENTS/GBLEVN13 - NETCDF INPUT GLOBAL FILE DATE',
3759 $
' (',i4.4,3(i2.2),
'), DOES NOT MATCH PREPBUFR FILE CENTER ',
3760 $
'DATE (',i10,
') -STOP 68'/)