18 INTEGER*4 :: sfcpress_id
22 INTEGER*4 :: thermodyn_id
23 REAL (KIND=8),
ALLOCATABLE :: iar14t(:,:,:)
24 REAL (KIND=8),
ALLOCATABLE :: iar15u(:,:,:)
25 REAL (KIND=8),
ALLOCATABLE :: iar16v(:,:,:)
26 REAL (KIND=8),
ALLOCATABLE :: iar17q(:,:,:)
27 REAL (KIND=8),
ALLOCATABLE :: iar12z(:,:)
28 REAL (KIND=8),
ALLOCATABLE :: iar13p(:,:)
29 REAL (KIND=8),
ALLOCATABLE :: iarpsi(:,:,:)
30 REAL (KIND=8),
ALLOCATABLE :: iarpsl(:,:,:)
31 REAL (KIND=8),
ALLOCATABLE :: iarpsd(:,:,:)
32 REAL (KIND=4),
ALLOCATABLE :: vcoord(:,:)
39 END MODULE gblevn_module
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 ',
922 COMMON /gbevdd/ errs(300,33,6)
932 READ(iunite,
'(1X,I3)',end=100) kx
935 READ(iunite,
'(1X,6E12.5)') (errs(kx,k,m),m=1,6)
941 print
'(" ##GBLEVENTS/GBLEVN01 - OBS. ERROR TABLE EMPTY OR ", 942 $ "DOES NOT EXIST - STOP 60")' 962 SUBROUTINE gblevn02(IUNITP,IUNITS,NEWTYP,subset)
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)
1684 REAL(8) OBS_8,QMS_8,BAK_8,SID_8
1688 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
1689 $ xob,yob,dhr,typ,nlev
1690 COMMON /gbevee/psg01,zsg01,tg01(500),ug01(500),vg01(500),
1691 x qg01(500),zint(500),pint(500),pintlog(500),plev(500),
1693 COMMON /gbevff/ bmiss
1696 DATA tzero / 273.15 /
1697 DATA betap / .0552 /
1698 DATA beta / .00650 /
1730 IF(pob.LE.0. .OR. pob.GE.bmiss)
GOTO 10
1737 if (poblog<=plevlog(k) .and. poblog>plevlog(k+1))
then 1744 wt = (poblog-plevlog(lb)) / (plevlog(la)-plevlog(lb))
1753 if (poblog<=pintlog(k) .and. poblog>pintlog(k+1))
then 1762 IF(cat.EQ.0 .AND. zob.LT.bmiss)
THEN 1763 ts = tg01(1) + (psg01-plev(1))*betap
1765 tm = ts - dz*beta*.5
1766 pfc = psg01*exp(-dz/(tm*rog))
1774 IF(qob.LT.bmiss.OR.tob.LT.bmiss.OR.typ.EQ.111)
THEN 1778 qob = qg01(lb) + (qg01(la)-qg01(lb))*wt
1784 IF(tob.LT.bmiss.OR.subset.EQ.
'VADWND '.OR.typ.EQ.111)
THEN 1789 IF(pob.GT.plev(1))
THEN 1790 tob = tg01(1) + (pob-plev(1))*betap
1792 tob = tg01(lb) + (tg01(la)-tg01(lb))*wt
1800 IF(zob.LT.bmiss)
THEN 1801 IF(pob.GT.plev(1))
THEN 1802 tm = tg01(1) + (.5*(pint(1)+pob)-plev(1))*betap
1803 zob = zint(1) - rog*tm*log(pob/pint(1))
1805 tm = tg01(lb) + (tg01(la)-tg01(lb))*wt
1806 zob = zint(li) - rog*tm*log(pob/pint(li))
1813 IF(uob.LT.bmiss .OR. vob.LT.bmiss)
THEN 1814 uob = ug01(lb) + (ug01(la)-ug01(lb))*wt
1815 vob = vg01(lb) + (vg01(la)-vg01(lb))*wt
1859 dimension oemin(2:6)
1860 REAL(8) OBS_8,QMS_8,BAK_8,SID_8
1863 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
1864 $ xob,yob,dhr,typ,nlev
1865 COMMON /gbevff/ bmiss
1867 DATA oemin /0.5,0.1,1.0,0.5,1.0/
1883 wob = max(obs_8(5,l),obs_8(6,l))
1891 IF(cat .EQ.0 ) bak_8( 1,l) =
oefg01(pob,typ,5,oemin(5))
1892 IF(qob .LT.bmiss) bak_8( 2,l) =
oefg01(pob,typ,3,oemin(3))
1893 IF(tob .LT.bmiss) bak_8( 3,l) =
oefg01(pob,typ,2,oemin(2))
1894 IF(wob .LT.bmiss) bak_8( 5,l) =
oefg01(pob,typ,4,oemin(4))
1895 IF(pwo .LT.bmiss) bak_8( 6,l) =
oefg01(pob,typ,6,oemin(6))
1896 IF(pw1o.LT.bmiss) bak_8( 7,l) =
oefg01(pob,typ,6,oemin(6))
1897 IF(pw2o.LT.bmiss) bak_8( 8,l) =
oefg01(pob,typ,6,oemin(6))
1898 IF(pw3o.LT.bmiss) bak_8( 9,l) =
oefg01(pob,typ,6,oemin(6))
1899 IF(pw4o.LT.bmiss) bak_8(10,l) =
oefg01(pob,typ,6,oemin(6))
1914 COMMON /gbevee/ psi,zsi,ti(500),ui(500),vi(500),qi(500),
1915 x zint(500),pint(500),pintlog(500),plev(500),plevlog(500)
1925 i1 = mod(i0,imax) + 1
1928 wy = (yob+90.)/dlat + 1.0
1960 p1 = iar14t(i0,j0,k)
1961 p2 = iar14t(i0,j1,k)
1962 p3 = iar14t(i1,j0,k)
1963 p4 = iar14t(i1,j1,k)
1966 ti(k) = p5+(p6-p5)*wx
1968 p1 = iar15u(i0,j0,k)
1969 p2 = iar15u(i0,j1,k)
1970 p3 = iar15u(i1,j0,k)
1971 p4 = iar15u(i1,j1,k)
1974 ui(k) = p5+(p6-p5)*wx
1976 p1 = iar16v(i0,j0,k)
1977 p2 = iar16v(i0,j1,k)
1978 p3 = iar16v(i1,j0,k)
1979 p4 = iar16v(i1,j1,k)
1982 vi(k) = p5+(p6-p5)*wx
1984 p1 = iar17q(i0,j0,k)
1985 p2 = iar17q(i0,j1,k)
1986 p3 = iar17q(i1,j0,k)
1987 p4 = iar17q(i1,j1,k)
1990 qi(k) = p5+(p6-p5)*wx
1995 p1 = iarpsl(i0,j0,k)
1996 p2 = iarpsl(i0,j1,k)
1997 p3 = iarpsl(i1,j0,k)
1998 p4 = iarpsl(i1,j1,k)
2001 plev(k) = p5+(p6-p5)*wx
2006 p1 = iarpsi(i0,j0,k+1)
2007 p2 = iarpsi(i0,j1,k+1)
2008 p3 = iarpsi(i1,j0,k+1)
2009 p4 = iarpsi(i1,j1,k+1)
2012 pint(k+1) = p5+(p6-p5)*wx
2021 pintlog(1) = log(pint(1))
2024 zint(k) = zint(k0) - rog*ti(k0)*log(pint(k)/pint(k0))
2025 pintlog(k) = log(pint(k))
2033 plevlog(k) = log(plev(k))
2080 FUNCTION oefg01(P,TYP,IE,OEMIN)
2084 COMMON /gbevdd/errs(300,33,6)
2085 COMMON /gbevff/ bmiss
2094 p = max(0.,min(p,2000.))
2096 IF(p.GE.errs(kx,1,1)) k1 = 1
2099 IF(p.GE.errs(kx,kl+1,1).AND.p.LE.errs(kx,kl,1)) k1 = kl
2102 IF(p.LE.errs(kx,33,1)) k1 = 5
2106 ediff = errs(kx,k2,1) - errs(kx,k1,1)
2107 IF(abs(ediff).GT.0.0)
THEN 2108 del = (p - errs(kx,k1,1))/ediff
2113 del = max(0.,min(del,1.0))
2115 oefg01 = ((1.0 - del) * errs(kx,k1,ie)) + (del * errs(kx,k2,ie))
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)
2499 SUBROUTINE gblevn10(IUNITF,IDATEP,IM,JM,IDRT)
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' 2948 subroutine gblevn11(imax,jmax,grid)
2951 real grid(imax,jmax)
2959 grid(i,j) = grid(i,jj)
2960 grid(i,jj) = temp(i)
2971 real(kind=8) grid(imax,jmax)
2972 real(kind=8) temp (imax)
2979 grid(i,j) = grid(i,jj)
2980 grid(i,jj) = temp(i)
3018 SUBROUTINE gblevn12(IUNITF,IDATEP,IM,JM,IDRT)
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'/)
3434 SUBROUTINE gblevn13(IUNITF,IDATEP,IMX,JMX,IDRT)
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'/)
3778 real,
allocatable :: slats(:)
3779 real(4) slat(jmax),wlat(jmax),rad2deg
3783 call splat(idrt,jmax,slat,wlat)
3784 rad2deg=180./acos(-1.)
3785 allocate(slats(jmax));
3786 rad2deg=180./acos(-1.)
3787 slats(:)=-asin(slat(:))*rad2deg
3788 dlat=180./float(jmax-1)
subroutine gblevn10(IUNITF, IDATEP, IM, JM, IDRT)
Do something.
subroutine gblevents(IDATEP, IUNITF, IUNITE, IUNITP, IUNITS, SUBSET, NEWTYP)
SUBPROGRAM: GBLEVENTS PRE/POST PROCESSING OF PREPBUFR EVENTS PRGMMR: DENNIS KEYSER ORG: EMC DATE: 201...
subroutine getlats(idrt)
get latitudes
subroutine gblevn03(SUBSET)
GBLEVN03 - INTERPOLATE MODEL DATA (FIRST GUESS OR ANALYSIS) TO OB LOCATIONS.
subroutine gblevn11d(imax, jmax, grid)
Does something.
subroutine gblevn13(IUNITF, IDATEP, IMX, JMX, IDRT)
NetCDF Input.
subroutine gblevn01(IUNITE)
Read observation error table.
subroutine gblevn06(XOB, YOB)
SUBROUTINE GBLEVN06 - 2D LINEAR HORIZONTAL INTERPOLATION.
subroutine gblevn12(IUNITF, IDATEP, IM, JM, IDRT)
Does something.
subroutine gblevn08(IUNITP, SUBSET)
SUBPROGRAM: GBLEVN08 PRGMMR: S.
subroutine gblevn04
Get observation error.
function oefg01(P, TYP, IE, OEMIN)
SUBPROGRAM: OEFG01 PRGMMR: D.
subroutine gblevn11(imax, jmax, grid)
North-south swap.
subroutine gblevn02(IUNITP, IUNITS, NEWTYP, subset)
Filter data.