9 INTEGER IMAX,JMAX,KMAX,KMAXS
10 INTEGER*4 IDVC,IDSL,NVCOORD,SFCPRESS_ID,THERMODYN_ID
11 REAL (KIND=8),
ALLOCATABLE :: IAR14T(:,:,:), IAR15U(:,:,:),
12 $ IAR16V(:,:,:), IAR17Q(:,:,:),
13 $ IAR12Z(:,:), IAR13P(:,:),
14 $ IARPSI(:,:,:), IARPSL(:,:,:),
16 REAL (KIND=4),
ALLOCATABLE :: VCOORD(:,:)
19 END MODULE gblevn_module
531 SUBROUTINE gblevents(IDATEP,IUNITF,IUNITE,IUNITP,IUNITS,SUBSET,
542 INTEGER,
PARAMETER :: IM=384, jm=im/2+1
545 CHARACTER*80 HEADR,OBSTR,QMSTR,FCSTR,OESTR,ANSTR
547 REAL(8) OBS_8,QMS_8,BAK_8,SID_8,HDR_8(10)
548 REAL(8) BMISS,GETBMISS
549 LOGICAL DOVTMP,DOFCST,SOME_FCST,DOBERR,FCST,VIRT,DOANLS,
550 $ satmqc,adpupa_virt,recalc_q,doprev,dopmsl
552 INTEGER*4 IUNITF(2),ncid
555 TYPE(SIGIO_HEAD) :: HEAD1
556 TYPE(NEMSIO_GFILE) :: GFILE1
558 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
559 $ xob,yob,dhr,typ,nlev
560 COMMON /gbevbb/ pvcd,vtcd
561 COMMON /gbevcc/ dovtmp,dofcst,some_fcst,doberr,fcst,virt,
562 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
563 COMMON /gbevdd/ errs(300,33,6)
564 COMMON /gbevff/ bmiss
571 $
'SID XOB YOB DHR TYP '/
573 $
'POB QOB TOB ZOB UOB VOB PWO PW1O PW2O PW3O PW4O CAT PRSS '/
575 $
'PQM QQM TQM ZQM WQM PWQ PW1Q PW2Q PW3Q PW4Q NUL NUL '/
577 $
'PFC QFC TFC ZFC UFC VFC PWF PW1F PW2F PW3F PW4F NUL '/
579 $
'PAN QAN TAN ZAN UAN VAN PWA PW1A PW2A PW3A PW4A NUL '/
581 $
'POE QOE TOE ZOE WOE PWE PW1E PW2E PW3E PW4E NUL NUL '/
583 namelist /prevdata/dovtmp,dofcst,some_fcst,doberr,doanls,
584 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
597 700
FORMAT(/1x,100(
'#')/
' =====> SUBROUTINE GBLEVENTS INVOKED FOR ',
598 $
'THE FIRST TIME - VERSION LAST UPDATED 2017-02-22'/)
602 print *,
'BUFRLIB value for missing passed into GBLEVENTS ',
618 adpupa_virt = .false.
620 READ(5,prevdata,err=101,end=102)
629 7013
FORMAT(/
' ##> GBLEVENTS: ERROR READING STANDARD INPUT DATA CARDS',
630 $
' -- DEFAULTS TO "POSTEVENTS" MODE'/)
641 7014
FORMAT(/
' ##> GBLEVENTS: STANDARD INPUT DATA CARDS DO NOT ',
642 $
'EXIST -- DEFAULTS TO "POSTEVENTS" MODE'/)
653 adpupa_virt = .false.
656 IF(dovtmp) recalc_q=.true.
668 IF(.NOT.dofcst.AND..NOT.some_fcst)
THEN 670 901
FORMAT(/
' --> GBLEVENTS: PREVENTS MODE - FIRST GUESS NOT READ ',
674 701
FORMAT(/
' --> GBLEVENTS: PREVENTS MODE - DATE CHECK AND ',
675 $
'TRANSFORM THE FIRST GUESS'/)
679 7701
FORMAT(/
' --> GBLEVENTS: POSTEVENTS MODE - DATE CHECK AND ',
680 $
'TRANSFORM THE ANALYSIS'/)
683 IF(dofcst .OR. some_fcst .OR. doanls)
THEN 684 WRITE(cfile1,
'("fort.",I2.2)') iunitf(1)
686 iret = nf90_open(trim(cfile1),nf90_nowrite,ncid)
688 print *,
' ===> GFS FCST/ANAL INPUT IS NETCDF' 689 CALL gblevn13(iunitf,idatep,im,jm,idrt)
691 CALL sigio_rropen(iunitf(1),cfile1,iret)
692 CALL sigio_srhead(iunitf(1),head1,iret1)
693 IF(iret == 0 .AND. iret1 == 0)
THEN 694 print *,
' ===> GLOBAL FCST/ANAL INPUT IS SIGIO' 695 CALL sigio_sclose(iunitf(1),iret)
696 CALL gblevn10(iunitf,idatep,im,jm,idrt)
698 CALL nemsio_open(gfile1,trim(cfile1),
'read',iret=iret)
700 CALL nemsio_close(gfile1,iret=iret)
701 print *,
' ===> GFS FCST/ANAL INPUT IS NEMSIO' 702 CALL gblevn12(iunitf,idatep,im,jm,idrt)
708 print*,
'after returning from GBLEVN10, GBLEVN12,',
709 $
' or GBLEVN13. idrt=',idrt
717 702
FORMAT(/
' --> GBLEVENTS: READ ERROR FILES'/)
719 CALL gblevn01(iunite)
724 IF(.NOT.doanls) print 3702
725 3702
FORMAT(/
' --> GBLEVENTS: OBS. ERROR NOT ENCODED IN PREPBUFR ',
733 CALL ufbqcd(iunitp,
'PREVENT',pvcd)
734 CALL ufbqcd(iunitp,
'VIRTMP ',vtcd)
737 703
FORMAT(/1x,100(
'#')/)
743 IF(.NOT.doanls)
WRITE(iunits,1701) idatep
744 1701
FORMAT(//130(
'#')//38x,
'*** "PREVENT" EVENTS DATA FILTERING ',
745 $
'SUMMARY ***'/35x,
'--> CENTER DATE FOR PREPBUFR FILE IS: ',i10,
755 IF(newtyp.EQ.1)
WRITE(iunits,1702) subset
756 1702
FORMAT(130(
'-')/39x,
'--> SUMMARY FOR TABLE A ENTRY "',a8,
'" <--'/)
758 IF(.NOT.dofcst .AND. some_fcst) fcst = (subset.EQ.
'ADPUPA ' 759 $ .OR.subset.EQ.
'PROFLR '.OR.subset .EQ.
'AIRCFT '.OR.subset
760 $ .EQ.
'AIRCAR '.OR.subset .EQ.
'VADWND ')
769 virt = (recalc_q.AND.(subset.EQ.
'ADPSFC '.OR.
770 $ subset.EQ.
'SFCSHP '.OR.
771 $ subset.EQ.
'MSONET '.OR.
772 $ subset.EQ.
'RASSDA '.OR.
773 $ subset.EQ.
'SATEMP '.OR.
774 $ (subset.EQ.
'ADPUPA '.AND.adpupa_virt)))
777 IF(.NOT.(fcst.OR.doberr.OR.virt.OR.doprev))
THEN 778 IF(newtyp.EQ.1)
WRITE(iunits,1703)
779 1703
FORMAT(/
' ==> DATA FILTERING NOT PERFORMED FOR THIS TABLE A ',
780 $
'ENTRY -- FORECAST, OBS ERROR, "VIRTMP", "PREVENT" PROCESSING ',
794 CALL ufbint(-iunitp,obs_8,13,255,nlev,obstr)
795 CALL ufbint(-iunitp,qms_8,12,255,nlev,qmstr)
796 CALL ufbint(-iunitp,hdr_8,10, 1,iret,headr)
803 IF(fcst.OR.doanls)
THEN 813 CALL gblevn03(subset)
816 CALL ufbint(iunitp,bak_8,12,nlev,iret,fcstr)
818 CALL ufbint(iunitp,bak_8,12,nlev,iret,anstr)
832 IF(newtyp.EQ.1)
WRITE(iunits,1710)
833 1710
FORMAT(/
' ==> OBS ERROR VALUES ARE ENCODED FOR THIS TABLE A ',
834 $
'ENTRY'//
' ==> FILTERING VIA MISSING OBS ERROR TEST IS ',
835 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE OBS ERROR VALUES ARE ',
836 $
'PROCESSED/STORED'/)
838 IF(nlev.GT.0)
CALL ufbint(iunitp,bak_8,12,nlev,iret,oestr)
840 IF(newtyp.EQ.1)
WRITE(iunits,1705)
841 1705
FORMAT(/
' ==> OBS ERROR VALUES NOT ENCODED FOR THIS TABLE A ',
842 $
'ENTRY'//
' ==> FILTERING VIA MISSING OBS ERROR TEST NOT ',
843 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE OBS ERROR VALUES NOT ',
844 $
'PROCESSED/STORED'/)
851 IF(newtyp.EQ.1)
WRITE(iunits,1704)
852 1704
FORMAT(/
' ==> FORECAST VALUES NOT ENCODED FOR THIS TABLE A ',
853 $
'ENTRY'//
' ==> FILTERING VIA POB VS. GESS PSFC TEST NOT ',
854 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE FORECAST VALUES NOT ',
855 $
'PROCESSED/STORED'/)
857 IF(newtyp.EQ.1)
WRITE(iunits,1708)
858 1708
FORMAT(/
' ==> FORECAST VALUES ARE ENCODED FOR THIS TABLE A ',
859 $
'ENTRY'//
' ==> FILTERING VIA POB VS. GESS PSFC TEST IS ',
860 $
'PERFORMED FOR THIS TABLE A ENTRY SINCE FORECAST VALUES ARE ',
861 $
'PROCESSED/STORED'/)
865 IF(newtyp.EQ.1)
WRITE(iunits,1807)
866 1807
FORMAT(/
' ==> "PREVENT" EVENT PROCESSING IS PERFORMED FOR THIS',
868 CALL gblevn02(iunitp,iunits,newtyp,subset)
870 IF(newtyp.EQ.1)
WRITE(iunits,1806)
871 1806
FORMAT(/
' ==> "PREVENT" EVENT PROCESSING NOT PERFORMED FOR THIS',
879 IF(newtyp.EQ.1)
WRITE(iunits,1706)
880 1706
FORMAT(/
' ==> "VIRTMP" EVENT PROCESSING NOT PERFORMED FOR THIS ',
883 IF(newtyp.EQ.1)
WRITE(iunits,1707)
884 1707
FORMAT(/
' ==> "VIRTMP" EVENT PROCESSING IS PERFORMED FOR THIS ',
886 CALL gblevn08(iunitp,subset)
900 SUBROUTINE gblevn01(IUNITE)
902 COMMON /gbevdd/ errs(300,33,6)
912 READ(iunite,
'(1X,I3)',end=100) kx
915 READ(iunite,
'(1X,6E12.5)') (errs(kx,k,m),m=1,6)
921 print
'(" ##GBLEVENTS/GBLEVN01 - OBS. ERROR TABLE EMPTY OR ", 922 $ "DOES NOT EXIST - STOP 60")' 942 SUBROUTINE gblevn02(IUNITP,IUNITS,NEWTYP,subset)
945 dimension nflgrt(100:299,12),oemin(2:6)
946 CHARACTER*8 STNID,subset
947 CHARACTER*40 PEVN,QEVN,TEVN,WEVN,PWVN,PW1VN,PW2VN,PW3VN,PW4VN
948 REAL(8) PEV_8(4,255),QEV_8(4,255),TEV_8(4,255),WEV_8(5,255),
949 $ pwv_8(4,255),pw1v_8(4,255),pw2v_8(4,255),
950 $ pw3v_8(4,255),pw4v_8(4,255),obs_8,qms_8,bak_8,sid_8,
952 LOGICAL FCST,REJP_PS,REJPS,REJT,REJQ,REJW,REJPW,REJPW1,
953 $ rejpw2,rejpw3,rejpw4,satmqc,satemp,soln60,sols60,
954 $ moerr_p,moerr_t,adpupa_virt,doberr,dofcst,some_fcst,
955 $ dovtmp,virt,recalc_q,doprev
958 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
959 $ xob,yob,dhr,typ,nlev
960 COMMON /gbevbb/ pvcd,vtcd
961 COMMON /gbevcc/ dovtmp,dofcst,some_fcst,doberr,fcst,virt,
962 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
963 COMMON /gbevee/psg01,zsg01,tg01(500),ug01(500),vg01(500),
964 x qg01(500),zint(500),pint(500),pintlog(500),plev(500),
966 COMMON /gbevff/ bmiss
968 equivalence(sid_8,stnid)
970 DATA pevn /
'POB PQM PPC PRC '/
971 DATA qevn /
'QOB QQM QPC QRC '/
972 DATA tevn /
'TOB TQM TPC TRC '/
973 DATA wevn /
'UOB VOB WQM WPC WRC '/
974 DATA pwvn /
'PWO PWQ PWP PWR '/
975 DATA pw1vn /
'PW1O PW1Q PW1P PW1R '/
976 DATA pw2vn /
'PW2O PW2Q PW2P PW2R '/
977 DATA pw3vn /
'PW3O PW3Q PW3P PW3R '/
978 DATA pw4vn /
'PW4O PW4Q PW4P PW4R '/
982 DATA oemin /0.5,0.1,1.0,0.5,1.0/
984 ni = mod((nint(typ)/10),10)
986 IF(newtyp.EQ.1) nflgrt = 0
991 satemp = ((typ.GE.160.AND.typ.LE.179).AND.satmqc)
992 soln60 = ((typ.GE.160.AND.typ.LE.163).AND.yob.GE.-60.AND.satmqc)
993 sols60 = ((typ.EQ.160.OR.typ.EQ.162.OR.typ.EQ.163).AND.yob.LT.-60
1065 IF(pob.LT.bmiss)
THEN 1066 IF(.NOT.fcst) psg01 = pob
1067 IF(pob-psg01.GE.100. .OR. pob.LE.0. .OR.
1068 $ ((pob.LE.450..OR.pob.GE.1100.) .AND. ni.EQ.8))
THEN 1069 IF(pob.LE.0..OR.pob.LE.450..OR.pob.GE.1100.)
THEN 1071 WRITE(iunits,302) stnid,nint(typ),yob,xob,pob
1072 302
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1073 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, FAILS SANITY ',
1076 WRITE(iunits,101) stnid,nint(typ),yob,xob,pob
1077 101
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1078 $
'E, REJECT ALL DATA ON LVL - POB=',f6.1,
' MB, FAILS SANITY CHECK')
1083 WRITE(iunits,303) stnid,nint(typ),yob,xob,pob,psg01
1084 303
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1085 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, > 100 MB ',
1086 $
'BELOW GES PSFC(=',f6.1,
'MB)')
1088 WRITE(iunits,102) stnid,nint(typ),yob,xob,pob,psg01
1089 102
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1090 $
'E, REJECT ALL DATA ON LVL - POB=',f6.1,
' MB, > 100 MB BELOW ',
1091 $
'GES PSFC(=',f6.1,
' MB)')
1123 IF(pob.LT.bmiss .AND. cat.EQ.0)
THEN 1124 IF(.NOT.fcst) psg01 = pob
1125 rejps = oefg01(pob,typ,5,oemin(5)).GE.bmiss .OR.
1126 $ abs(pob-psg01).GE.100. .OR.
1129 IF(rejps.OR.rejp_ps)
THEN 1131 IF(.NOT.rejp_ps)
THEN 1132 IF(abs(pob-psg01).GE.100.)
THEN 1133 WRITE(iunits,104) stnid,nint(typ),yob,xob,pob,psg01
1134 104
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1135 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, > 100 MB ',
1136 $
'ABOVE GES PSFC(=',f6.1,
'MB)')
1138 ELSE IF(pob.LE.450..OR.pob.GE.1100.)
THEN 1139 WRITE(iunits,105) stnid,nint(typ),yob,xob,pob
1140 105
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1141 $
'E, REJECT ALL DATA ON SFC LVL - POB=',f6.1,
' MB, FAILS SANITY ',
1142 $
'CHECK - this should never be printed since test now made in ',
1146 IF(nflgrt(nint(typ),1).EQ.0)
THEN 1147 WRITE(iunits,201) nint(typ)
1148 201
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1149 $
'ALL DATA ON SURFACE LEVEL DUE TO MISSING SFC-P OBS ERROR'/)
1150 nflgrt(nint(typ),1) = 1
1161 IF(rcd.EQ.3) moerr_p = .true.
1162 IF(rej.EQ.9.AND.(pqm.GT.3.AND.pqm.LT.15))
THEN 1164 1401
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1165 $
'E, INPUT PQM =',f4.0,
' -- DO NOT APPLY PSFC QM=9 EVENT')
1200 IF(tob.LT.bmiss)
THEN 1201 rejt = oefg01(pob,typ,2,oemin(2)).GE.bmiss .OR.
1202 $ (soln60.AND.nint(pob*10.).GE.1000) .OR.
1203 $ (sols60.AND.nint(pob*10.).GT.1000)
1204 IF(rejt.OR.rejp_ps)
THEN 1206 IF(.NOT.rejp_ps)
THEN 1207 IF(soln60.AND.nint(pob*10.).GE.1000)
THEN 1208 IF(nflgrt(nint(typ),6).EQ.0)
THEN 1209 WRITE(iunits,7304) nint(typ)
1210 7304
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1211 $
'TOB/QOB AT AND BELOW 100 MB IF REPORT IS NORTH OF 60S LATITUDE'/)
1212 nflgrt(nint(typ),6) = 1
1215 ELSE IF(sols60.AND.nint(pob*10.).GT.1000)
THEN 1216 IF(nflgrt(nint(typ),7).EQ.0)
THEN 1217 WRITE(iunits,7305) nint(typ)
1218 7305
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1219 $
'TOB/QOB BELOW 100 MB IF REPORT IS SOUTH OF 60S LATITUDE'/)
1220 nflgrt(nint(typ),7) = 1
1224 IF(nflgrt(nint(typ),2).EQ.0)
THEN 1226 WRITE(iunits,304) nint(typ)
1227 304
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1228 $
'TOB/QOB ON SFC LVL DUE TO MISSING OBS ERROR'/)
1230 WRITE(iunits,202) nint(typ)
1231 202
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1232 $
'TOB/QOB ON AT LEAST ONE LVL (IF AVAILABLE ON THAT LVL) DUE TO ',
1233 $
'MISSING OBS ERROR'/)
1235 nflgrt(nint(typ),2) = 1
1249 IF(rcd.EQ.3) moerr_t = .true.
1250 IF(rej.EQ.9.AND.(tqm.GT.3.AND.tqm.LT.15))
THEN 1252 1402
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1253 $
'E, INPUT TQM =',f4.0,
' -- DO NOT APPLY TEMP QM=9 EVENT')
1295 IF(qob.LT.bmiss)
THEN 1296 rejq = oefg01(pob,typ,3,oemin(3)).GE.bmiss .OR.
1299 $ nint(pob * 10.).LT.nint(qtop_rej * 10.) .OR.
1303 IF(rejq.OR.rejp_ps)
THEN 1305 IF(.NOT.rejp_ps.AND..NOT.rejt)
THEN 1307 IF(nflgrt(nint(typ),8).EQ.0)
THEN 1308 WRITE(iunits,7306) nint(typ)
1309 7306
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1310 $
'QOB ON ALL LEVELS'/)
1311 nflgrt(nint(typ),8) = 1
1314 ELSE IF(qob.LE.0..OR.tob.GE.bmiss.OR.tob.LE.-150.)
THEN 1315 WRITE(iunits,111) stnid,nint(typ),yob,xob,
1317 111
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1318 $
'E, REJECT QOB ON LVL - QOB=',f6.3,
' G/KG, FAILS SANITY CHECK ',
1319 $
'(TOB=',f5.1,
' C)')
1321 ELSE IF(oefg01(pob,typ,3,oemin(3)).GE.bmiss)
THEN 1322 IF(nflgrt(nint(typ),3).EQ.0)
THEN 1324 WRITE(iunits,305) nint(typ)
1325 305
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1326 $
'QOB ON SFC LVL DUE TO MISSING OBS ERROR'/)
1328 WRITE(iunits,203) nint(typ)
1329 203
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1330 $
'QOB ON AT LEAST ONE LEVEL (IF AVAILABLE ON THAT LEVEL) DUE TO ',
1331 $
'MISSING OBS ERROR'/)
1333 nflgrt(nint(typ),3) = 1
1341 WRITE(iunits,109) stnid,nint(typ),yob,xob,
1342 $ qob/1000.,qtop_rej,pob
1343 109
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1344 $
'E, REJECT QOB ON LVL - QOB=',f6.3,
' G/KG, ABOVE ',f6.1,
1345 $
'MB (POB=',f6.1,
' MB)')
1350 IF(moerr_p.OR.moerr_t)
THEN 1355 IF(rej.EQ.9.AND.(qqm.GT.3.AND.qqm.LT.15))
THEN 1357 1403
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1358 $
'E, INPUT QQM =',f4.0,
' -- DO NOT APPLY MSTR QM=9 EVENT')
1392 IF(min(uob,vob).LT.bmiss)
THEN 1393 rejw = oefg01(pob,typ,4,oemin(4)).GE.bmiss
1394 IF(rejw.OR.rejp_ps)
THEN 1396 IF(.NOT.rejp_ps)
THEN 1397 IF(nflgrt(nint(typ),4).EQ.0)
THEN 1399 WRITE(iunits,1304) nint(typ)
1400 1304
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1401 $
'UOB/VOB ON SFC LVL DUE TO MISSING OBS ERROR'/)
1403 WRITE(iunits,204) nint(typ)
1404 204
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1405 $
'UOB/VOB ON AT LEAST ONE LVL (IF AVAILABLE ON THAT LVL) DUE TO ',
1406 $
'MISSING OBS ERROR'/)
1408 nflgrt(nint(typ),4) = 1
1423 IF(rej.EQ.9.AND.(wqm.GT.3.AND.wqm.LT.15))
THEN 1425 1404
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1426 $
'E, INPUT WQM =',f4.0,
' -- DO NOT APPLY WIND QM=9 EVENT')
1437 if(subset.eq.
"SFCSHP".and.uob.eq.0..and.vob.eq.0.)
then 1438 call ufbint(-iunitp,ufc_8,1,1,iret,
'UFC')
1439 call ufbint(-iunitp,vfc_8,1,1,iret,
'VFC')
1443 if(ibfms(ufc_8).eq.0.and.ibfms(vfc_8).eq.0)
then 1444 if(abs(ufc_8).ge.5..or.abs(vfc_8).ge.5.)
then 1446 write(iunits,1504) stnid,nint(typ),ufc_8,vfc_8
1447 1504
FORMAT(/
' --> ID ',a8,
', (RTP ',i3,
' UFC=',f5.2,
' VFC=',f5.2,
') ',
1448 $
'NEW WIND EVENT, UOB/VOB CALM (0 M/S) WHILE |UFC| AND/OR |VFC| ',
1449 $
'>= 5 M/S, QM SET TO 8'/)
1471 IF(pwo.LT.bmiss)
THEN 1472 rejpw = oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1474 IF(nflgrt(nint(typ),5).EQ.0)
THEN 1475 WRITE(iunits,205) nint(typ)
1476 205
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1477 $
'PWO DUE TO MISSING OBS ERROR'/)
1478 nflgrt(nint(typ),5) = 1
1483 IF(pwq.GT.3.AND.pwq.LT.15)
THEN 1485 1405
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1486 $
'E, INPUT PWQ =',f4.0,
' -- DO NOT APPLY PWtO QM=9 EVENT')
1506 IF(pw1o.LT.bmiss)
THEN 1507 rejpw1 = oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1509 IF(nflgrt(nint(typ),9).EQ.0)
THEN 1510 WRITE(iunits,206) nint(typ)
1511 206
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1512 $
'PW1O DUE TO MISSING OBS ERROR'/)
1513 nflgrt(nint(typ),9) = 1
1518 IF(pw1q.GT.3.AND.pw1q.LT.15)
THEN 1520 1406
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1521 $
'E, INPUT PW1Q =',f4.0,
' -- DO NOT APPLY PW1O QM=9 EVENT')
1541 IF(pw2o.LT.bmiss)
THEN 1542 rejpw2 = oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1544 IF(nflgrt(nint(typ),10).EQ.0)
THEN 1545 WRITE(iunits,207) nint(typ)
1546 207
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1547 $
'PW2O DUE TO MISSING OBS ERROR'/)
1548 nflgrt(nint(typ),10) = 1
1553 IF(pw2q.GT.3.AND.pw2q.LT.15)
THEN 1555 1407
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1556 $
'E, INPUT PW2Q =',f4.0,
' -- DO NOT APPLY PW2O QM=9 EVENT')
1576 IF(pw3o.LT.bmiss)
THEN 1577 rejpw3 = oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1579 IF(nflgrt(nint(typ),11).EQ.0)
THEN 1580 WRITE(iunits,208) nint(typ)
1581 208
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1582 $
'PW3O DUE TO MISSING OBS ERROR'/)
1583 nflgrt(nint(typ),11) = 1
1588 IF(pw3q.GT.3.AND.pw3q.LT.15)
THEN 1590 1408
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1591 $
'E, INPUT PW3Q =',f4.0,
' -- DO NOT APPLY PW3O QM=9 EVENT')
1611 IF(pw4o.LT.bmiss)
THEN 1612 rejpw4 = oefg01(prss*0.01,typ,6,oemin(6)).GE.bmiss
1614 IF(nflgrt(nint(typ),12).EQ.0)
THEN 1615 WRITE(iunits,209) nint(typ)
1616 209
FORMAT(/
' --> FOR ALL REPORTS WITH REPORT TYPE ',i3,
', REJECT ',
1617 $
'PW4O DUE TO MISSING OBS ERROR'/)
1618 nflgrt(nint(typ),12) = 1
1623 IF(pw4q.GT.3.AND.pw4q.LT.15)
THEN 1625 1409
FORMAT(
' ~~> ID ',a8,
' (RTP ',i3,
'), LAT=',f6.2,
'N, LON=',f6.2,
1626 $
'E, INPUT PW4Q =',f4.0,
' -- DO NOT APPLY PW4O QM=9 EVENT')
1643 IF(maxpev .GT.0)
CALL ufbint(iunitp,pev_8, 4,maxpev, iret,pevn)
1644 IF(maxqev .GT.0)
CALL ufbint(iunitp,qev_8, 4,maxqev, iret,qevn)
1645 IF(maxtev .GT.0)
CALL ufbint(iunitp,tev_8, 4,maxtev, iret,tevn)
1646 IF(maxwev .GT.0)
CALL ufbint(iunitp,wev_8, 5,maxwev, iret,wevn)
1647 IF(maxpwv .GT.0)
CALL ufbint(iunitp,pwv_8, 4,maxpwv, iret,pwvn)
1648 IF(maxpw1v.GT.0)
CALL ufbint(iunitp,pw1v_8,4,maxpw1v,iret,pw1vn)
1649 IF(maxpw2v.GT.0)
CALL ufbint(iunitp,pw2v_8,4,maxpw2v,iret,pw2vn)
1650 IF(maxpw3v.GT.0)
CALL ufbint(iunitp,pw3v_8,4,maxpw3v,iret,pw3vn)
1651 IF(maxpw4v.GT.0)
CALL ufbint(iunitp,pw4v_8,4,maxpw4v,iret,pw4vn)
1660 SUBROUTINE gblevn03(SUBSET)
1664 REAL(8) OBS_8,QMS_8,BAK_8,SID_8
1668 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
1669 $ xob,yob,dhr,typ,nlev
1670 COMMON /gbevee/psg01,zsg01,tg01(500),ug01(500),vg01(500),
1671 x qg01(500),zint(500),pint(500),pintlog(500),plev(500),
1673 COMMON /gbevff/ bmiss
1676 DATA tzero / 273.15 /
1677 DATA betap / .0552 /
1678 DATA beta / .00650 /
1688 CALL gblevn06(xob,yob)
1710 IF(pob.LE.0. .OR. pob.GE.bmiss)
GOTO 10
1717 if (poblog<=plevlog(k) .and. poblog>plevlog(k+1))
then 1724 wt = (poblog-plevlog(lb)) / (plevlog(la)-plevlog(lb))
1733 if (poblog<=pintlog(k) .and. poblog>pintlog(k+1))
then 1742 IF(cat.EQ.0 .AND. zob.LT.bmiss)
THEN 1743 ts = tg01(1) + (psg01-plev(1))*betap
1745 tm = ts - dz*beta*.5
1746 pfc = psg01*exp(-dz/(tm*rog))
1754 IF(qob.LT.bmiss.OR.tob.LT.bmiss.OR.typ.EQ.111)
THEN 1758 qob = qg01(lb) + (qg01(la)-qg01(lb))*wt
1764 IF(tob.LT.bmiss.OR.subset.EQ.
'VADWND '.OR.typ.EQ.111)
THEN 1769 IF(pob.GT.plev(1))
THEN 1770 tob = tg01(1) + (pob-plev(1))*betap
1772 tob = tg01(lb) + (tg01(la)-tg01(lb))*wt
1780 IF(zob.LT.bmiss)
THEN 1781 IF(pob.GT.plev(1))
THEN 1782 tm = tg01(1) + (.5*(pint(1)+pob)-plev(1))*betap
1783 zob = zint(1) - rog*tm*log(pob/pint(1))
1785 tm = tg01(lb) + (tg01(la)-tg01(lb))*wt
1786 zob = zint(li) - rog*tm*log(pob/pint(li))
1793 IF(uob.LT.bmiss .OR. vob.LT.bmiss)
THEN 1794 uob = ug01(lb) + (ug01(la)-ug01(lb))*wt
1795 vob = vg01(lb) + (vg01(la)-vg01(lb))*wt
1839 dimension oemin(2:6)
1840 REAL(8) OBS_8,QMS_8,BAK_8,SID_8
1843 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
1844 $ xob,yob,dhr,typ,nlev
1845 COMMON /gbevff/ bmiss
1847 DATA oemin /0.5,0.1,1.0,0.5,1.0/
1863 wob = max(obs_8(5,l),obs_8(6,l))
1871 IF(cat .EQ.0 ) bak_8( 1,l) = oefg01(pob,typ,5,oemin(5))
1872 IF(qob .LT.bmiss) bak_8( 2,l) = oefg01(pob,typ,3,oemin(3))
1873 IF(tob .LT.bmiss) bak_8( 3,l) = oefg01(pob,typ,2,oemin(2))
1874 IF(wob .LT.bmiss) bak_8( 5,l) = oefg01(pob,typ,4,oemin(4))
1875 IF(pwo .LT.bmiss) bak_8( 6,l) = oefg01(pob,typ,6,oemin(6))
1876 IF(pw1o.LT.bmiss) bak_8( 7,l) = oefg01(pob,typ,6,oemin(6))
1877 IF(pw2o.LT.bmiss) bak_8( 8,l) = oefg01(pob,typ,6,oemin(6))
1878 IF(pw3o.LT.bmiss) bak_8( 9,l) = oefg01(pob,typ,6,oemin(6))
1879 IF(pw4o.LT.bmiss) bak_8(10,l) = oefg01(pob,typ,6,oemin(6))
1890 SUBROUTINE gblevn06(XOB,YOB)
1894 COMMON /gbevee/ psi,zsi,ti(500),ui(500),vi(500),qi(500),
1895 x zint(500),pint(500),pintlog(500),plev(500),plevlog(500)
1905 i1 = mod(i0,imax) + 1
1908 wy = (yob+90.)/dlat + 1.0
1940 p1 = iar14t(i0,j0,k)
1941 p2 = iar14t(i0,j1,k)
1942 p3 = iar14t(i1,j0,k)
1943 p4 = iar14t(i1,j1,k)
1946 ti(k) = p5+(p6-p5)*wx
1948 p1 = iar15u(i0,j0,k)
1949 p2 = iar15u(i0,j1,k)
1950 p3 = iar15u(i1,j0,k)
1951 p4 = iar15u(i1,j1,k)
1954 ui(k) = p5+(p6-p5)*wx
1956 p1 = iar16v(i0,j0,k)
1957 p2 = iar16v(i0,j1,k)
1958 p3 = iar16v(i1,j0,k)
1959 p4 = iar16v(i1,j1,k)
1962 vi(k) = p5+(p6-p5)*wx
1964 p1 = iar17q(i0,j0,k)
1965 p2 = iar17q(i0,j1,k)
1966 p3 = iar17q(i1,j0,k)
1967 p4 = iar17q(i1,j1,k)
1970 qi(k) = p5+(p6-p5)*wx
1975 p1 = iarpsl(i0,j0,k)
1976 p2 = iarpsl(i0,j1,k)
1977 p3 = iarpsl(i1,j0,k)
1978 p4 = iarpsl(i1,j1,k)
1981 plev(k) = p5+(p6-p5)*wx
1986 p1 = iarpsi(i0,j0,k+1)
1987 p2 = iarpsi(i0,j1,k+1)
1988 p3 = iarpsi(i1,j0,k+1)
1989 p4 = iarpsi(i1,j1,k+1)
1992 pint(k+1) = p5+(p6-p5)*wx
2001 pintlog(1) = log(pint(1))
2004 zint(k) = zint(k0) - rog*ti(k0)*log(pint(k)/pint(k0))
2005 pintlog(k) = log(pint(k))
2013 plevlog(k) = log(plev(k))
2059 FUNCTION oefg01(P,TYP,IE,OEMIN)
2063 COMMON /gbevdd/errs(300,33,6)
2064 COMMON /gbevff/ bmiss
2073 p = max(0.,min(p,2000.))
2075 IF(p.GE.errs(kx,1,1)) k1 = 1
2078 IF(p.GE.errs(kx,kl+1,1).AND.p.LE.errs(kx,kl,1)) k1 = kl
2081 IF(p.LE.errs(kx,33,1)) k1 = 5
2085 ediff = errs(kx,k2,1) - errs(kx,k1,1)
2086 IF(abs(ediff).GT.0.0)
THEN 2087 del = (p - errs(kx,k1,1))/ediff
2092 del = max(0.,min(del,1.0))
2094 oefg01 = ((1.0 - del) * errs(kx,k1,ie)) + (del * errs(kx,k2,ie))
2095 oefg01 = max(oefg01,oemin)
2100 IF(oefg01.GE.5e5) oefg01 = bmiss
2206 SUBROUTINE gblevn08(IUNITP,SUBSET)
2208 parameter(rd=287.04, g=9.81)
2209 CHARACTER*80 EVNSTQ,EVNSTV,evnstp
2210 CHARACTER*8 SUBSET,stnid
2211 REAL(8) TDP_8(255),TQM_8(255),QQM_8(255),BAKQ_8(4,255),
2212 $ bakv_8(4,255),bakp_8(3),obs_8,qms_8,bak_8,
2214 real(8) pmo_8,zob_8,pmsl_8
2217 LOGICAL EVNQ,EVNV,DOVTMP,TROP,ADPUPA_VIRT,DOBERR,DOFCST,
2218 $ some_fcst,fcst,virt,satmqc,recalc_q,doprev,
2221 COMMON /gbevaa/ sid_8,obs_8(13,255),qms_8(12,255),bak_8(12,255),
2222 $ xob,yob,dhr,typ,nlev
2223 COMMON /gbevbb/ pvcd,vtcd
2224 COMMON /gbevcc/ dovtmp,dofcst,some_fcst,doberr,fcst,virt,
2225 $ qtop_rej,satmqc,adpupa_virt,recalc_q,doprev,dopmsl
2226 COMMON /gbevff/ bmiss
2228 DATA evnstq /
'QOB QQM QPC QRC'/
2229 DATA evnstv /
'TOB TQM TPC TRC'/
2230 data evnstp /
'PMO PMQ PMIN'/
2232 equivalence(sid_8,stnid)
2237 es(t) = 6.1078*exp((17.269*(t - 273.16))/((t - 273.16)+237.3))
2238 qs(t,p) = (0.622*es(t))/(p-(0.378*es(t)))
2244 pmsl_fcn(p,tv,z) = p*exp((g*z)/(rd*tv))
2258 surf = (subset.eq.
'ADPSFC'.or.subset.eq.
'SFCSHP'.or.
2259 $ subset.eq.
'MSONET')
2266 CALL ufbint(-iunitp,tdp_8,1,255,nltd,
'TDO')
2267 CALL ufbint(-iunitp,qqm_8,1,255,nlqq,
'QQM')
2268 CALL ufbint(-iunitp,tqm_8,1,255,nltq,
'TQM')
2269 if(surf.and.dopmsl)
then 2270 call ufbint(-iunitp,pmo_8,1,1,nlpm,
'PMO')
2271 call ufbint(-iunitp,zob_8,1,1,nlzo,
'ZOB')
2272 call ufbint(-iunitp,pqm_8,1,1,nlpq,
'PQM')
2274 IF(subset.NE.
'RASSDA '.AND.subset.NE.
'SATEMP ')
THEN 2275 IF(nltd.EQ.0)
RETURN 2276 IF(nlqq.EQ.0)
RETURN 2278 IF(nltq.EQ.0)
RETURN 2279 IF(subset.NE.
'RASSDA '.AND.subset.NE.
'SATEMP ')
THEN 2280 IF(nltd.NE.nlev)
THEN 2281 print.NE.
'(" ##GBLEVENTS/GBLEVN08 - NLTD NLEV - STOP 61")' 2284 IF(nlqq.NE.nlev)
THEN 2285 print.NE.
'(" ##GBLEVENTS/GBLEVN08 - NLQQ NLEV - STOP 63")' 2289 IF(nltq.NE.nlev)
THEN 2290 print.NE.
'(" ##GBLEVENTS/GBLEVN08 - NLTQ NLEV - STOP 62")' 2306 IF(subset.EQ.
'RASSDA '.OR.subset.EQ.
'SATEMP ')
THEN 2307 IF(tob.LT.bmiss)
THEN 2309 bakv_8(2,l) = tqm_8(l)
2317 IF(pob.LT.bmiss .AND. tob.LT.bmiss
2318 $ .AND. tdo.LT.bmiss)
THEN 2319 IF(qqm_8(l).GT.3)
THEN 2325 IF(tdo.LT.-103.15 .OR. tdo.GT.46.83 .OR. pob.LT.0.1 .OR.
2326 $ pob.GT.1100.) cycle
2328 qob = qs(tdo+273.16,pob)
2336 IF(qob*1e6.LT.bmiss .AND. qob.GT.0.) bakq_8(1,l) = qob*1e6
2337 bakq_8(2,l) = qqm_8(l)
2347 trop = (subset.EQ.
'ADPUPA ' .AND.
2348 $ ((cat.EQ.5 .AND. pob.LT.500.) .OR. pob.LT. 80. .OR. trop))
2349 IF(dovtmp .AND. .NOT.trop)
THEN 2350 bakv_8(1,l) = (tob+273.16)*(1.+.61*qob)-273.16
2352 IF(subset.EQ.
'ADPUPA ')
THEN 2354 IF((qqm_8(l).LT.4.OR.qqm_8(l).EQ.9.OR.qqm_8(l).EQ.15)
2355 $ .OR. tqm_8(l).EQ.0 .OR. tqm_8(l).GT.3
2356 $ .OR. pob.LE.700.)
THEN 2357 bakv_8(2,l) = tqm_8(l)
2368 IF(qqm_8(l).LT.4)
THEN 2369 bakv_8(2,l) = tqm_8(l)
2372 ELSE IF((qqm_8(l).EQ.9.OR.qqm_8(l).EQ.15).AND.
2373 $ (tqm_8(l).LE.3.OR.tqm_8(l).GE.15.OR.
2374 $ tqm_8(l).EQ.9))
THEN 2402 if(ibfms(pmo_8).ne.0)
then 2403 tv = bakv_8(1,1) + 273.16
2405 pmsl_8=pmsl_fcn(pob,tv,zob)
2407 bakp_8(2) = max(3,int(pqm_8))
2410 4000
format(
'--> ID ',a8,
' Pmsl missing - derived from Pstn; ',
2411 $
'PMIN = ',f4.1,
' PMQ = ',f4.1,
'')
2414 if(pmsl_8.gt.1060)
then 2415 write(*,4001) stnid,pob,bakp_8(1)
2416 4001
format(
'--> ID ',a8,
' Derived PMSL unrealistic; FLAG; ',
2417 $
'POB = ',f7.2,
' PMO = ',f7.2,
'')
2433 IF(evnq)
CALL ufbint(iunitp,bakq_8,4,nlev,iret,evnstq)
2434 IF(evnv)
CALL ufbint(iunitp,bakv_8,4,nlev,iret,evnstv)
2435 if(nlev.eq.1.and.evnp)
2436 $
call ufbint(iunitp,bakp_8,3,nlev,iret,evnstp)
2478 SUBROUTINE gblevn10(IUNITF,IDATEP,IM,JM,IDRT)
2485 INTEGER IUNITF(2), IDATEP, IM, JM, IDRT
2486 REAL,
PARAMETER :: PI180=.0174532
2487 INTEGER*4,
PARAMETER :: ONE=1, ten=10
2489 TYPE(SIGIO_HEAD) :: HEAD(2)
2490 TYPE(SIGIO_DATS) :: DATS
2491 TYPE(SIGIO_DATM) :: DATM
2493 INTEGER*4 IRET,IRET1,IRETS,IMJM4,KM4,IDVM,NTRAC,IUNIT4(2)
2495 INTEGER KFILES,IFILE,JFILE,IDATGS_COR,JCAP,JCAP1,JCAP2,JCAP1X2,
2496 $ mdima,mdimb,mdimc,iromb,maxwv,idir,ns,i,j,k,l,ii,jj,ib,ie
2498 INTEGER IDATE(8,2),JDATE(8,2),KDATE(8,2),KINDX(2)
2500 CHARACTER*6 COORD(3)
2505 DATA coord /
'SIGMA ',
'HYBRID',
'GENHYB'/
2507 REAL,
ALLOCATABLE :: cofs(:,:), cofv(:,:,:)
2508 REAL,
ALLOCATABLE :: cofs_f(:,:,:), cofv_f(:,:,:,:)
2509 REAL (KIND=4),
ALLOCATABLE :: grds(:,:,:), grdv(:,:,:,:),
2510 $ wrk1(:,:), wrk2(:,:)
2515 iunit4(:) = iunitf(:)
2517 IF(mod(mod(idatep,100),3).EQ.0)
THEN 2520 print 331, mod(idatep,100)
2521 331
FORMAT(/
' --> GBLEVENTS: THE PREPBUFR CENTER HOUR (',i2.2,
2522 $
') IS A MULTIPLE OF 3 - ONLY ONE SIGIO (SIGMA OR HYBRID) ',
2523 $
'INPUT GLOBAL FILE IS READ,'/16x,
'NO TIME INTERPOLATION OF ',
2524 $
'SPECTRAL COEFFICIENTS IS PERFORMED'/)
2527 kindx(1) = mod(mod(idatep,100),3)
2528 kindx(2) = kindx(1) - 3
2529 print 332, mod(idatep,100)
2530 332
FORMAT(/
' --> GBLEVENTS: THE PREPBUFR CENTER HOUR (',i2.2,
2531 $
') IS NOT A MULTIPLE OF 3 - TWO SPANNING SIGIO (SIGMA OR ',
2532 $
'HYBRID) INPUT GLOBAL FILES'/16x,
'ARE READ AND THE SPECTRAL ',
2533 $
'COEFFICIENTS ARE INTERPOLATED TO THE PREPBUFR CENTER TIME'/)
2544 WRITE(cfile,
'("fort.",I2.2)') iunitf(ifile)
2546 CALL sigio_rropen(iunit4(ifile),cfile,iret)
2547 CALL sigio_rrhead(iunit4(ifile),head(ifile),iret1)
2548 print *,
' cfile_sig=',cfile,
'sigio_rropen: iret=',iret,
2549 $
'sigio_rrhead: iret1=',iret1
2551 IF(iret.NE.0)
GO TO 903
2552 IF(iret1.NE.0)
GO TO 904
2556 idate(1,ifile) = head(ifile)%IDATE(4)
2557 idate(2:3,ifile) = head(ifile)%IDATE(2:3)
2558 idate(5,ifile) = head(ifile)%IDATE(1)
2560 fhour = head(ifile)%FHOUR
2561 print
'(" idate=",I5,7I3.2," fhour=",F7.3)', idate(:,ifile),
2564 IF(idate(1,ifile).LT.100)
THEN 2572 print
'(" ##GBLEVENTS/GBLEVN10 - 2-DIGIT YEAR FOUND IN ", 2573 $ "SIGIO (SIGMA OR HYBRID) INPUT GLOBAL FILE ",I0, 2574 $ "; INITIAL DATE (YEAR IS: ",I0,")")', ifile,idate(1,ifile)
2575 print
'(" - USE WINDOWING TECHNIQUE TO OBTAIN 4-DIGIT", 2577 IF(idate(1,ifile).GT.20)
THEN 2578 idate(1,ifile) = 1900 + idate(1,ifile)
2580 idate(1,ifile) = 2000 + idate(1,ifile)
2582 print
'(" ##GBLEVENTS/GBLEVN10 - CORRECTED 4-DIGIT YEAR IS", 2583 $ " NOW: ",I0)', idate(1,ifile)
2587 CALL w3movdat(rinc,idate(:,ifile),jdate(:,ifile))
2589 print 1, ifile,head(ifile)%FHOUR,
2590 $ (idate(ii,ifile),ii=1,3),idate(5,ifile),(jdate(ii,ifile),
2591 $ ii=1,3),jdate(5,ifile)
2592 1
FORMAT(
' --> GBLEVENTS: SIGIO (SIGMA OR HYBRID) INPUT GLOBAL ',
2593 $
'FILE',i2,
' HERE IS A ',f5.1,
' HOUR FORECAST FROM ',i5.4,
2594 $ 3i3.2,
' VALID AT ',i5.4,3i3.2)
2596 kdate(:,ifile) = jdate(:,ifile)
2598 IF(kfiles.EQ.2)
THEN 2599 rinc(2) =
REAL(KINDX(IFILE))
2600 CALL w3movdat(rinc,jdate(:,ifile),kdate(:,ifile))
2603 idatgs_cor = (kdate(1,ifile) * 1000000) + (kdate(2,ifile) *
2604 $ 10000) + (kdate(3,ifile) * 100) + kdate(5,ifile)
2609 IF(idatep.NE.idatgs_cor)
GO TO 901
2623 ntrac = head(1)%NTRAC
2624 nvcoord = head(1)%NVCOORD
2625 ALLOCATE (vcoord(kmax+1,nvcoord))
2627 vcoord = head(1)%VCOORD
2629 sfcpress_id = mod(head(1)%IDVM,ten)
2630 thermodyn_id = mod(head(1)%IDVM/ten,ten)
2631 IF(idvc == 3 .AND. thermodyn_id == 3)
THEN 2632 kmaxs = (ntrac+1)*kmax + 2
2638 ALLOCATE (iar12z(im,jm), iar13p(im,jm))
2639 ALLOCATE (iar14t(im,jm,kmax), iar15u(im,jm,kmax),
2640 $ iar16v(im,jm,kmax), iar17q(im,jm,kmax),
2641 $ iarpsl(im,jm,kmax), iarpsi(im,jm,kmax+1))
2644 if(idvc.eq.0) idvc = 1
2645 IF(idvc < 0 .or. idvc > 3)
THEN 2646 print *,
'##GBLEVENTS/GBLEVN10: INVALID VERT COORD ID (=',idvc
2657 mdimb = mdima/2+jcap1
2662 dlat = 180./(jmax-1)
2665 print 2, jcap,imax,jmax,kmax,kmaxs,dlat,dlon,coord(idvc)
2666 2
FORMAT(/
' --> GBLEVENTS: GLOBAL MODEL SPECS: T',i5,
' ',
2667 $ i5,
' x ',i5,
' GRID WITH ',i3,
' LEVELS ',i3,
2668 $
' SCALARS -------> ',f5.2,
' X ',f5.2,
' VERT. ',
2674 print 9901, jfile,(jdate(ii,jfile),ii=1,3),jdate(5,jfile),idatep
2675 9901
FORMAT(/
' ##GBLEVENTS/GBLEVN10 - SIGMA OR HYBRID FILE',i2,
' DATE',
2676 $
' (',i4.4,3(i2.2),
'), DOES NOT MATCH -OR SPAN- PREPBUFR FILE ',
2677 $
'CENTER DATE (',i10,
') -STOP 68'/)
2680 print 9903, jfile,iret
2681 9903
FORMAT(/
' ##GBLEVENTS/GBLEVN10 - SIGMA OR HYBRID FILE',i2,
2682 $
' RETURNED FROM SIGIO_RROPEN WITH R.C.',i3,
' -STOP 70'/)
2685 print 9904, jfile,iret1
2686 9904
FORMAT(/
' ##GBLEVENTS/GBLEVN10 - SIGMA OR HYBRID FILE',i2,
2687 $
' RETURNED FROM SIGIO_RRHEAD WITH R.C.',i3,
' -STOP 71'/)
2690 IF(kmax.GT.500)
then 2691 print
'(" ##GBLEVENTS/GBLEVN10 - KMAX TOO BIG = ",I0, 2692 $ " - UNABLE TO TRANSFORM GLOBAL SIGMA FILE(S) - STOP 69")',
2744 allocate (cofs_f(mdima,kmaxs,2), cofv_f(mdima,kmax,2,2))
2748 if (idrt < 0 .or. idrt > 256) idrt = 0
2751 IF(kindx(1).EQ.0)
THEN 2760 sfcpress_id = mod(head(1)%IDVM,ten)
2761 thermodyn_id = mod(head(1)%IDVM/ten,ten)
2763 print *,
'in sig sfcpress_id=',sfcpress_id,
' thermodyn_id=',
2764 $ thermodyn_id,
' ntrac=',ntrac
2765 print *,
' idvc=',idvc,
' idsl=',idsl,
' idvm=',idvm,
2766 $
' nvcoord=',nvcoord
2769 CALL sigio_aldats(head(ifile),dats,irets)
2770 CALL sigio_aldatm(head(ifile),one,km4,datm,irets)
2772 CALL sigio_rrdats(iunit4(ifile),head(ifile),dats,irets)
2775 print *,
' irets from sigio_rrdats = ', irets
2780 cofs_f(i,1,ifile) = dats%HS(i)
2781 cofs_f(i,2,ifile) = dats%PS(i)
2785 CALL sigio_rrdatm(iunit4(ifile),head(ifile),datm,irets)
2787 print *,
' irets from sigio_rrdatm = ', irets
2793 cofs_f(:,3:ie,ifile) = datm%T
2797 cofs_f(:,ib:ie,ifile) = datm%Q(:,1:kmax,i)
2799 cofv_f(:,:,1,ifile) = datm%D
2800 cofv_f(:,:,2,ifile) = datm%Z
2802 CALL sigio_axdats(dats,irets)
2803 CALL sigio_axdatm(datm,irets)
2808 ALLOCATE (cofs(mdima,kmaxs), cofv(mdima,kmax,2))
2809 ALLOCATE (grds(imax,jmax,kmaxs), grdv(imax,jmax,kmax,2))
2810 ALLOCATE (wrk1(imax*jmax,kmax), wrk2(imax*jmax,kmax+1))
2812 IF(kfiles.EQ.1)
THEN 2814 cofs(i,1:kmaxs) = cofs_f(i,1:kmaxs,1)
2815 cofv(i,1:kmax,1:2) = cofv_f(i,1:kmax,1:2,1)
2820 $ ((abs(kindx(2))*cofs_f(:,:,1)) +(kindx(1)*cofs_f(:,:,2)))/3.
2822 $ ((abs(kindx(2))*cofv_f(:,:,:,1))+(kindx(1)*cofv_f(:,:,:,2)))/3.
2825 DEALLOCATE (cofs_f, cofv_f)
2827 CALL sptezm(iromb,maxwv,idrt,imax,jmax,kmaxs,cofs,grds,idir)
2828 CALL sptezmv(iromb,maxwv,idrt,imax,jmax,kmax,
2829 & cofv(1,1,1),cofv(1,1,2),grdv(1,1,1,1),grdv(1,1,1,2),idir)
2831 IF( sfcpress_id == 2 )
THEN 2832 grds(:,:,2) = 1000.0*grds(:,:,2)
2834 grds(:,:,2) = 1000.0*exp(grds(:,:,2))
2838 CALL gblevn11(imax,jmax,grds(1,1,ns))
2842 iar12z(i,j) = grds(i,j,1)
2843 iar13p(i,j) = grds(i,j,2) * 0.01
2847 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN 2848 grds(:,:,3:2+kmax) = grds(:,:,3:2+kmax) / head(1)%CPI(1)
2849 print *,
' cpi(0)=',head(1)%cpi(1)
2851 CALL sigio_modpr(imjm4,imjm4,km4,nvcoord,idvc,idsl,vcoord,iret,
2852 $ grds(1,1,2),grds(1,1,3),pm=wrk1,pd=wrk2(1,2))
2857 wrk2(i+jj,1) = grds(i,j,2)
2861 wrk2(:,l+1) = wrk2(:,l) - wrk2(:,l+1)
2873 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN 2875 grds(:,:,3:2+kmax) = grds(:,:,3:2+kmax) * head(1)%CPI(1)
2876 CALL sigio_cnvtdv(imjm4,imjm4,km4,idvc,idvm,ntrac,iret,
2877 $ grds(1,1,3),grds(1,1,3+kmax),head(1)%CPI,1_4)
2879 grds(:,:,3:kmax+2) = grds(:,:,3:kmax+2) *
2880 $ (1.+(461.50/287.05-1)*grds(:,:,3+kmax:2+kmax*2))
2885 CALL gblevn11(imax,jmax,grdv(1,1,l,k))
2890 iar14t(i,j,l) = grds(i,j,2+l)
2891 iar15u(i,j,l) = grdv(i,j,l,1)
2892 iar16v(i,j,l) = grdv(i,j,l,2)
2894 iar17q(i,j,l) = max(0.0,grds(i,j,2+kmax+l)*1.0e6)
2895 iarpsl(i,j,l) = wrk1(i+jj,l)*0.01
2903 iarpsi(i,j,l) = wrk2(i+jj,l)*0.01
2916 DEALLOCATE (cofs, cofv)
2917 DEALLOCATE (grds, grdv, wrk1, wrk2)
2919 print *,
' RETURNING from GBLENV10' 2927 subroutine gblevn11(imax,jmax,grid)
2930 real grid(imax,jmax)
2938 grid(i,j) = grid(i,jj)
2939 grid(i,jj) = temp(i)
2950 real(kind=8) grid(imax,jmax)
2951 real(kind=8) temp (imax)
2958 grid(i,j) = grid(i,jj)
2959 grid(i,jj) = temp(i)
2997 SUBROUTINE gblevn12(IUNITF,IDATEP,IM,JM,IDRT)
3004 USE nemsio_openclose
3010 INTEGER IUNITF(2), IDATEP, IM, JM, IDRT
3011 REAL(KIND=8),
PARAMETER:: CON_RV=4.6150e+2,con_rd=2.8705e+2,
3012 $ fv=con_rv/con_rd-1.,oner=1.0,qmin=1.0e-10
3013 INTEGER*4,
PARAMETER :: TEN=10
3016 INTEGER*4 IRET,IMJM4,KM4,IDVM,NTRAC
3018 INTEGER IDATGS_COR,JCAP,JCAP1,JCAP2,JCAP1X2,MDIMA,MDIMB,MDIMC,
3019 $ iromb,maxwv,idir,i,j,k,l,ii,jj
3021 INTEGER(4) IDATE7(7),JCAP4,IDVC4,DIMZ4,K4,IM4,JM4,KINDREAL,KINDINT
3022 INTEGER(4) NFHOUR,NFMINUTE,NFSECONDN,NFSECONDD,idsl4,idvm4
3024 REAL(4),
ALLOCATABLE :: VCOORD4(:,:,:),CPI(:)
3025 REAL,
ALLOCATABLE :: tmp(:)
3026 TYPE(NEMSIO_GFILE) :: GFILE
3028 INTEGER IDATE(8),JDATE(8)
3031 REAL (KIND=4),
ALLOCATABLE :: psfc(:,:), tv(:,:,:),
3032 $ wrk1(:,:), wrk2(:,:)
3043 print 331, mod(idatep,100)
3044 331
format(/
' --> GBLEVENTS: ONLY ONE NEMSIO INPUT GLOBAL FILE IS ',
3045 $
'READ SINCE FILES ARE AVAILABLE EACH HOUR (NO NEED TO ',
3046 $
'INTERPOLATE'/16x,
'SPANNING FILES WHEN THE PREPBUFR CENTER HOUR',
3047 $
' (',i2.2,
') IS NOT A MULTIPLE OF 3)'/)
3055 WRITE(cfile2,
'("fort.",I2.2)') iunitf(1)
3057 CALL nemsio_open(gfile,trim(cfile2),
'read',iret=iret)
3058 print *,
' cfile_nems2=',cfile2,
'nemsio open,iret=',iret
3061 CALL nemsio_getfilehead(gfile,idate=idate7,
3062 & jcap=jcap4,dimx=im4,dimy=jm4,
3063 & dimz=dimz4,idvc=idvc4,ntrac=ntrac,idrt=idrtnems,
3064 & nfhour=nfhour,nfminute=nfminute,nfsecondn=nfsecondn,
3065 & nfsecondd=nfsecondd,idsl=idsl4,idvm=idvm4,iret=iret)
3073 if(idrt==-9999) idrt=4
3074 idate(1:3)=idate7(1:3)
3077 ALLOCATE(vcoord(kmax+1,3))
3080 IF(nfsecondd/=0.AND. nfsecondd/=-9999)
THEN 3081 fhour=
REAL(NFHOUR,8)+
REAL(NFMINUTE/60.,8)+
3082 $
REAL(NFSECONDN*1./(NFSECONDD*360.),8)
3084 fhour=
REAL(NFHOUR,8)+
REAL(NFMINUTE/60.,8)
3086 print
'(" idate=",I5,7I3.2," fhour=",F7.3)', idate,fhour
3088 ALLOCATE(vcoord4(kmax+1,3,2))
3089 CALL nemsio_getfilehead(gfile,vcoord=vcoord4,iret=iret)
3091 IF(maxval(vcoord4(:,3,1))==0..AND.minval(vcoord4(:,3,1))==0.)
THEN 3093 IF(maxval(vcoord4(:,2,1))==0..AND.minval(vcoord4(:,2,1))==0.)
3097 vcoord(1:kmax+1,1:nvcoord)=vcoord4(1:kmax+1,1:nvcoord,1)
3100 ALLOCATE(cpi(ntrac+1))
3101 CALL nemsio_getheadvar(gfile,
'CPI',cpi,iret=iret)
3104 CALL w3movdat(rinc,idate,jdate)
3106 print 1, fhour,(idate(ii),ii=1,3),idate(5),(jdate(ii),ii=1,3),
3108 1
FORMAT(
' --> GBLEVENTS: GLOBAL NEMSIO FILE: HERE IS A ',f5.1,
3109 $
' HOUR FORECAST FROM ',i5.4,3i3.2,
' VALID AT ',i5.4,3i3.2)
3111 idatgs_cor = (jdate(1) * 1000000) + (jdate(2) * 10000) +
3112 $ (jdate(3) * 100) + jdate(5)
3117 IF(idatep.NE.idatgs_cor)
GO TO 901
3121 sfcpress_id = mod(idvm,ten)
3122 thermodyn_id = mod(idvm/ten,ten)
3124 IF(idvc == 3 .AND. thermodyn_id == 3)
THEN 3125 kmaxs = (ntrac+1)*kmax + 2
3131 ALLOCATE (iar12z(imax,jmax), iar13p(imax,jmax))
3132 ALLOCATE (iar14t(imax,jmax,kmax), iar15u(imax,jmax,kmax),
3133 $ iar16v(imax,jmax,kmax), iar17q(imax,jmax,kmax),
3134 $ iarpsl(imax,jmax,kmax), iarpsi(imax,jmax,kmax+1),
3135 $ iarpsd(imax,jmax,kmax))
3138 if(idvc.eq.0) idvc = 1
3139 IF(idvc < 0 .or. idvc > 3)
THEN 3140 print *,
'##GBLEVENTS/GBLEVN12: INVALID VERT COORD ID (=',idvc
3151 mdimb = mdima/2+jcap1
3154 dlat = 180./(jmax-1)
3157 print 2, jcap,imax,jmax,kmax,kmaxs,dlat,dlon,idvc
3160 2
FORMAT(/
' --> GBLEVENTS: GLOBAL MODEL SPECS: T',i5,
' ',
3161 $ i5,
' x ',i5,
' GRID WITH ',i3,
' LEVELS ',i3,
3162 $
' SCALARS -------> ',f5.2,
' X ',f5.2,
' VERT. ',
3163 $
'COORD ID IS: ',i0,
' (not sure what this means!')
3169 if (idrt < 0 .or. idrt > 256) idrt = 0
3172 print *,
'in nem sfcpress_id=',sfcpress_id,
' thermodyn_id=',
3173 $ thermodyn_id,
' ntrac=',ntrac
3174 print *,
' idvc=',idvc,
' idsl=',idsl,
' idvm=',idvm,
' nvcoord=',
3177 call w3kind(kindreal,kindint)
3180 allocate(tmp(imax*jmax))
3184 if(kindreal==4)
then 3185 CALL nemsio_readrecvw34(gfile,
'hgt',
'sfc',k4,tmp,iret=iret)
3187 CALL nemsio_readrecv(gfile,
'hgt',
'sfc',k4,tmp,iret=iret)
3191 iar12z(:,:)=reshape(tmp,(/imax,jmax/))
3196 if(kindreal==4)
then 3197 CALL nemsio_readrecvw34(gfile,
'pres',
'sfc',k4,tmp,iret=iret)
3199 CALL nemsio_readrecv(gfile,
'pres',
'sfc',k4,tmp,iret=iret)
3203 iar13p(:,:)=reshape(tmp*0.01,(/imax,jmax/))
3238 if(kindreal==4)
then 3239 CALL nemsio_readrecvw34(gfile,
'tmp',
'mid layer',k4,tmp,
3242 CALL nemsio_readrecv(gfile,
'tmp',
'mid layer',k4,tmp,
3247 iar14t(:,:,k4)=reshape(tmp,(/imax,jmax/))
3248 call gblevn11d(imax,jmax,iar14t(1,1,k4))
3253 if(kindreal==4)
then 3254 CALL nemsio_readrecvw34(gfile,
'ugrd',
'mid layer',k4,tmp,
3257 CALL nemsio_readrecv(gfile,
'ugrd',
'mid layer',k4,tmp,
3262 iar15u(:,:,k4)=reshape(tmp,(/imax,jmax/))
3263 call gblevn11d(imax,jmax,iar15u(1,1,k4))
3274 if(kindreal==4)
then 3275 CALL nemsio_readrecvw34(gfile,
'vgrd',
'mid layer',k4,tmp,
3278 CALL nemsio_readrecv(gfile,
'vgrd',
'mid layer',k4,tmp,
3282 iar16v(:,:,k4)=reshape(tmp,(/imax,jmax/))
3283 call gblevn11d(imax,jmax,iar16v(1,1,k4))
3289 if(kindreal==4)
then 3290 CALL nemsio_readrecvw34(gfile,
'spfh',
'mid layer',k4,tmp,
3293 CALL nemsio_readrecv(gfile,
'spfh',
'mid layer',k4,tmp,
3297 iar17q(:,:,k4)=max(0.0,reshape(tmp*1.0e6,(/imax,jmax/)) )
3298 call gblevn11d(imax,jmax,iar17q(1,1,k4))
3305 CALL nemsio_close(gfile,iret=iret)
3315 tfac=oner+fv*max(iar17q(i,j,k)*1.0e-6,qmin)
3316 iar14t(i,j,k)=iar14t(i,j,k)*tfac
3324 ALLOCATE (psfc(imax,jmax), tv(imax,jmax,kmax))
3325 ALLOCATE (wrk1(imax*jmax,kmax), wrk2(imax*jmax,kmax+1))
3329 psfc(:,:) = iar13p(:,:)*100.
3330 tv(:,:,:) = iar14t(:,:,:)
3332 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN 3333 tv(:,:,:) = tv(:,:,:) / cpi(1)
3334 print *,
' cpi(1)=',cpi(1)
3337 CALL sigio_modpr(imjm4,imjm4,km4,nvcoord,idvc,idsl,vcoord,iret,
3338 $ psfc,tv,pm=wrk1,pd=wrk2(1,2))
3342 wrk2(i+jj,1) = psfc(i,j)
3346 wrk2(:,l+1) = wrk2(:,l) - wrk2(:,l+1)
3353 iarpsl(i,j,l) = wrk1(i+jj,l)*0.01
3361 iarpsi(i,j,l) = wrk2(i+jj,l)*0.01
3370 CALL nemsio_finalize()
3377 print 9901, (jdate(ii),ii=1,3),jdate(5),idatep
3378 9901
FORMAT(/
' ##GBLEVENTS/GBLEVN12 - NEMSIO INPUT GLOBAL FILE DATE',
3379 $
' (',i4.4,3(i2.2),
'), DOES NOT MATCH PREPBUFR FILE CENTER ',
3380 $
'DATE (',i10,
') -STOP 68'/)
3413 SUBROUTINE gblevn13(IUNITF,IDATEP,IMX,JMX,IDRT)
3422 INTEGER IUNITF(2), IDATEP, IDRT,IMX,JMX
3423 INTEGER yyyy,mm,dd,hh
3425 integer*4 error, id_var, dimid, len
3426 integer*4 im,jm,km, lm,n, k,nargs
3427 REAL(KIND=8),
PARAMETER:: CON_RV=4.6150e+2,con_rd=2.8705e+2,
3428 $ fv=con_rv/con_rd-1.,oner=1.0,qmin=1.0e-10
3429 INTEGER*4,
PARAMETER :: TEN=10
3431 INTEGER*4 IRET,IMJM4,KM4,IDVM,NTRAC
3433 INTEGER IDATGS_COR,JCAP,JCAP1,JCAP2,JCAP1X2,MDIMA,MDIMB,MDIMC,
3434 $ iromb,maxwv,idir,i,j,l,ii,jj
3436 INTEGER(4) IDATE7(7),JCAP4,IDVC4,DIMZ4,K4,IM4,JM4,KINDREAL,KINDINT
3437 INTEGER(4) NFHOUR,NFMINUTE,NFSECONDN,NFSECONDD,idsl4,idvm4,kr
3439 REAL(4),
ALLOCATABLE :: VCOORD4(:,:,:),CPI(:),ak(:),bk(:)
3440 REAL,
ALLOCATABLE :: temp(:,:), temp3d(:,:,:)
3442 character (len = 80) :: attone
3444 character(len=10) :: dim_nam, grid
3447 INTEGER(4) IDATE(8),JDATE(8)
3448 REAL(4) FHOUR,RINC(5)
3450 REAL (KIND=4),
ALLOCATABLE :: psfc(:,:), tv(:,:,:),
3451 $ wrk1(:,:), wrk2(:,:)
3461 print 331, mod(idatep,100)
3462 331
format(/
' --> GBLEVENTS: ONLY ONE NETCDF INPUT GLOBAL FILE IS ',
3463 $
'READ SINCE FILES ARE AVAILABLE EACH HOUR (NO NEED TO ',
3464 $
'INTERPOLATE'/16x,
'SPANNING FILES WHEN THE PREPBUFR CENTER HOUR',
3465 $
' (',i2.2,
') IS NOT A MULTIPLE OF 3)'/)
3470 WRITE(gfname,
'("fort.",I2.2)') iunitf(1)
3472 error=nf90_open(trim(gfname),nf90_nowrite,ncid)
3473 error=nf90_inq_dimid(ncid,
"grid_xt",dimid)
3474 error=nf90_inquire_dimension(ncid,dimid,dim_nam,im)
3475 error=nf90_inq_dimid(ncid,
"grid_yt",dimid)
3476 error=nf90_inquire_dimension(ncid,dimid,dim_nam,jm)
3477 error=nf90_inq_dimid(ncid,
"pfull",dimid)
3478 error=nf90_inquire_dimension(ncid,dimid,dim_nam,km)
3479 error=nf90_inq_dimid(ncid,
"phalf",dimid)
3480 error=nf90_inquire_dimension(ncid,dimid,dim_nam,lm)
3481 print*,
"im,jm,kmi,lm:",im,jm,km,lm
3482 print*,
"IMX, JMX:", imx, jmx
3483 IF (imx .NE. im .OR. jmx .NE. jm) print*,
"Different Resolutions" 3498 error=nf90_inq_varid(ncid,
"time", id_var)
3499 error=nf90_inquire_attribute(ncid, id_var,
"units", len=len)
3501 error=nf90_get_att(ncid, id_var,
"units", attone)
3502 read(attone(len-18:len-15),
'(i4)') yyyy
3503 read(attone(len-13:len-12),
'(i2)') mm
3504 read(attone(len-10:len-9),
'(i2)') dd
3505 read(attone(len-7:len-6),
'(i2)') hh
3506 IF(attone(1:5) .NE.
"hours")
THEN 3507 print*,
"checkout the time unit, not hourly",attone
3509 print*,
"base time", yyyy,mm,dd,hh
3512 error=nf90_get_var(ncid, id_var, time)
3524 CALL w3movdat(rinc,idate,jdate)
3526 print 1, fhour,(idate(ii),ii=1,3),idate(5),(jdate(ii),ii=1,3),
3528 1
FORMAT(
' --> GBLEVENTS: GLOBAL NEMSIO FILE: HERE IS A ',f5.1,
3529 $
' HOUR FORECAST FROM ',i5.4,3i3.2,
' VALID AT ',i5.4,3i3.2)
3531 idatgs_cor = (jdate(1) * 1000000) + (jdate(2) * 10000) +
3532 $ (jdate(3) * 100) + jdate(5)
3537 IF(idatep.NE.idatgs_cor)
GO TO 901
3541 ALLOCATE (iar12z(im,jm), iar13p(im,jm))
3542 ALLOCATE (iar14t(im,jm,km), iar15u(im,jm,km),
3543 $ iar16v(im,jm,km), iar17q(im,jm,km),
3544 $ iarpsl(im,jm,km), iarpsi(im,jm,km+1),
3547 error=nf90_get_att(ncid, nf90_global,
"grid", grid)
3548 IF (grid ==
"gaussian")
THEN 3558 sfcpress_id = mod(idvm,ten)
3559 thermodyn_id = mod(idvm/ten,ten)
3561 IF(idvc == 3 .AND. thermodyn_id == 3)
THEN 3562 kmaxs = (ntrac+1)*kmax + 2
3571 dlat = 180./(jmax-1)
3574 print 2, jcap,imax,jmax,kmax,kmaxs,dlat,dlon,idvc
3576 2
FORMAT(/
' --> GBLEVENTS: GLOBAL MODEL SPECS: T',i5,
' ',
3577 $ i5,
' x ',i5,
' GRID WITH ',i3,
' LEVELS ',i3,
3578 $
' SCALARS -------> ',f5.2,
' X ',f5.2,
' VERT. ',
3579 $
'COORD ID IS: ',i0)
3581 print *,
'in netcdf sfcpress_id=',sfcpress_id,
' thermodyn_id=',
3582 $ thermodyn_id,
' ntrac=',ntrac
3583 print *,
' idvc=',idvc,
' idsl=',idsl,
' idvm=',idvm,
' nvcoord=',
3586 ALLOCATE(vcoord(km+1,3))
3591 error=nf90_get_att(ncid, nf90_global,
"ak", ak)
3592 error=nf90_get_att(ncid, nf90_global,
"bk", bk)
3596 vcoord(k,1) = ak(kr)
3597 vcoord(k,2) = bk(kr)
3602 allocate(temp(im,jm))
3603 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
3604 error=nf90_get_var(ncid, id_var, temp)
3606 iar12z(:,:)=temp(:,:)
3610 error=nf90_inq_varid(ncid,
'pressfc', id_var)
3611 error=nf90_get_var(ncid, id_var, temp)
3613 iar13p(:,:)=temp(:,:)*0.01
3623 allocate(temp3d(im,jm,km))
3624 error=nf90_inq_varid(ncid,
'tmp', id_var)
3625 error=nf90_get_var(ncid, id_var, temp3d)
3628 iar14t(:,:,k4)=temp3d(:,:,kr)
3629 call gblevn11d(imax,jmax,iar14t(1,1,k4))
3634 error=nf90_inq_varid(ncid,
'ugrd', id_var)
3635 error=nf90_get_var(ncid, id_var, temp3d)
3638 iar15u(:,:,k4)=temp3d(:,:,kr)
3639 call gblevn11d(imax,jmax,iar15u(1,1,k4))
3644 error=nf90_inq_varid(ncid,
'vgrd', id_var)
3645 error=nf90_get_var(ncid, id_var, temp3d)
3648 iar16v(:,:,k4)=temp3d(:,:,kr)
3649 call gblevn11d(imax,jmax,iar16v(1,1,k4))
3654 error=nf90_inq_varid(ncid,
'spfh', id_var)
3655 error=nf90_get_var(ncid, id_var, temp3d)
3658 iar17q(:,:,k4)=max(0.0,temp3d(:,:,kr)*1.e6)
3659 call gblevn11d(imax,jmax,iar17q(1,1,k4))
3672 tfac=oner+fv*max(iar17q(i,j,k)*1.0e-6,qmin)
3673 iar14t(i,j,k)=iar14t(i,j,k)*tfac
3683 ALLOCATE (psfc(im,jm), tv(im,jm,km))
3684 ALLOCATE (wrk1(im*jm,km), wrk2(im*jm,km+1))
3688 psfc(:,:) = iar13p(:,:)*100.
3689 tv(:,:,:) = iar14t(:,:,:)
3691 IF(thermodyn_id == 3 .AND. idvc == 3)
THEN 3692 tv(:,:,:) = tv(:,:,:) / cpi(1)
3693 print *,
' cpi(1)=',cpi(1)
3696 CALL sigio_modpr(imjm4,imjm4,km4,nvcoord,idvc,idsl,vcoord,iret,
3697 $ psfc,tv,pm=wrk1,pd=wrk2(1,2))
3701 wrk2(i+jj,1) = psfc(i,j)
3705 wrk2(:,l+1) = wrk2(:,l) - wrk2(:,l+1)
3712 iarpsl(i,j,l) = wrk1(i+jj,l)*0.01
3720 iarpsi(i,j,l) = wrk2(i+jj,l)*0.01
3726 error=nf90_close(ncid)
3736 print 9901, idatep,idatgs_cor
3737 9901
FORMAT(/
' ##GBLEVENTS/GBLEVN13 - NETCDF INPUT GLOBAL FILE DATE',
3738 $
' (',i4.4,3(i2.2),
'), DOES NOT MATCH PREPBUFR FILE CENTER ',
3739 $
'DATE (',i10,
') -STOP 68'/)
3757 real,
allocatable :: slats(:)
3758 real(4) slat(jmax),wlat(jmax),rad2deg
3762 call splat(idrt,jmax,slat,wlat)
3763 rad2deg=180./acos(-1.)
3764 allocate(slats(jmax));
3765 rad2deg=180./acos(-1.)
3766 slats(:)=-asin(slat(:))*rad2deg
3767 dlat=180./float(jmax-1)
subroutine getlats(idrt)
get latitudes
subroutine gblevn11d(imax, jmax, grid)
Does something.
subroutine gblevn11(imax, jmax, grid)
North-south swap.