!----------------------------------------------------------------------- SUBROUTINE INTGRIB1(K1F,KGDS1F,K2F,KGDS2F,MRL,MRO, & & IV,IP,IPOPT,KGDS1,K1,IB1,L1,F1,G1,KGDS2,K2, & & IB2,L2,F2,G2,IRET) !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! ! SUBPROGRAM: INTGRIB1 INTERPOLATE FIELD ! PRGMMR: IREDELL ORG: W/NMC23 DATE: 96-07-19 ! ! ABSTRACT: INTERPOLATE FIELD. ! ! PROGRAM HISTORY LOG: ! 96-07-19 IREDELL ! ! USAGE: CALL INTGRIB1(K1F,KGDS1F,K2F,KGDS2F,MRL,MRO, ! & IV,IP,IPOPT,KGDS1,K1,IB1,L1,F1,G1,KGDS2,K2, ! & IB2,L2,F2,G2,IRET) ! INPUT ARGUMENTS: ! K1F INTEGER REGULARIZED INPUT DIMENSION ! KGDS1F INTEGER (200) REGULARIZED INPUT GRID PARAMETERS ! K2F INTEGER REGULARIZED OUTPUT DIMENSION ! KGDS2F INTEGER (200) REGULARIZED OUTPUT GRID PARAMETERS ! MRL INTEGER DIMENSION OF RLAT AND RLON ! MRO INTEGER DIMENSION OF CROT AND SROT ! IV INTEGER VECTOR FLAG ! IP INTEGER INTERPOLATION TYPE ! IPOPT INTEGER (20) INTERPOLATION OPTIONS ! KGDS1 INTEGER (200) INPUT GRID PARAMETERS ! K1 INTEGER INPUT DIMENSION ! IB1 INTEGER INPUT BITMAP FLAG ! L1 LOGICAL*1 (K1) INPUT BITMAP IF IB1=1 ! F1 REAL (K1) INPUT FIELD ! G1 REAL (K1) INPUT Y-COMPONENT IF IV=1 ! KGDS2 INTEGER (200) OUTPUT GRID PARAMETERS ! K2 INTEGER OUTPUT DIMENSION ! IB2 INTEGER OUTPUT BITMAP FLAG ! L2 LOGICAL*1 (K2) OUTPUT BITMAP ! F2 REAL (K2) OUTPUT FIELD ! G2 REAL (K2) OUTPUT Y-COMPONENT IF IV=1 ! ! SUBPROGRAMS CALLED: ! IPOLATES ! IPOLATEV ! IPXWAFS2 ! IPXWAFS3 ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN ! !$$$ IMPLICIT NONE INTEGER :: K1,K2,K1F,K2F,MRL,MRO,IP,IB1,IV,KI,IB2,IRET,IB1F INTEGER :: IB2F INTEGER IPOPT(20) INTEGER KGDS1(200),KGDS2(200) LOGICAL*1 L1(K1),L2(K2) REAL F1(K1),F2(K2),G1(K1),G2(K2) INTEGER KGDS1F(200),KGDS2F(200) LOGICAL*1 L1F(K1F),L2F(K2F) REAL F1F(K1F),F2F(K2F),G1F(K1F),G2F(K2F) REAL RLAT(MRL),RLON(MRL),CROT(MRO),SROT(MRO) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! REGLR TO REGLR SCALAR BIGIF: IF(K1F.EQ.1.AND.K2F.EQ.1.AND.IV.EQ.0) THEN CALL IPOLATES(IP,IPOPT,KGDS1,KGDS2,K1,K2,1,IB1,L1,F1, & & KI,RLAT,RLON,IB2,L2,F2,IRET) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! IRREG TO REGLR SCALAR ELSEIF(K1F.NE.1.AND.K2F.EQ.1.AND.IV.EQ.0) THEN stop 10 IF(IP.EQ.2) THEN CALL IPXWAFS3(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) ELSE CALL IPXWAFS2(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) ENDIF IF(IRET.EQ.0) THEN CALL IPOLATES(IP,IPOPT,KGDS1F,KGDS2,K1F,K2,1,IB1F,L1F,F1F, & & KI,RLAT,RLON,IB2,L2,F2,IRET) ENDIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! REGLR TO IRREG SCALAR ELSEIF(K1F.EQ.1.AND.K2F.NE.1.AND.IV.EQ.0) THEN stop 11 CALL IPOLATES(IP,IPOPT,KGDS1,KGDS2F,K1,K2F,1,IB1,L1,F1, & & KI,RLAT,RLON,IB2F,L2F,F2F,IRET) IF(IRET.EQ.0) THEN IF(IP.EQ.2) THEN CALL IPXWAFS3(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) ELSE CALL IPXWAFS2(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) ENDIF ENDIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! IRREG TO IRREG SCALAR ELSEIF(K1F.NE.1.AND.K2F.NE.1.AND.IV.EQ.0) THEN stop 12 IF(IP.EQ.2) THEN CALL IPXWAFS3(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) ELSE CALL IPXWAFS2(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) ENDIF IF(IRET.EQ.0) THEN CALL IPOLATES(IP,IPOPT,KGDS1F,KGDS2F,K1F,K2F,1,IB1F,L1F,F1F, & & KI,RLAT,RLON,IB2F,L2F,F2F,IRET) IF(IRET.EQ.0) THEN IF(IP.EQ.2) THEN CALL IPXWAFS3(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) ELSE CALL IPXWAFS2(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) ENDIF ENDIF ENDIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! REGLR TO REGLR VECTOR ELSEIF(K1F.EQ.1.AND.K2F.EQ.1.AND.IV.NE.0) THEN CALL IPOLATEV(IP,IPOPT,KGDS1,KGDS2,K1,K2,1,IB1,L1,F1,G1, & & KI,RLAT,RLON,CROT,SROT,IB2,L2,F2,G2,IRET) IF(IRET.EQ.0.AND.KI.EQ.K2-1) THEN F2(K2)=0 G2(K2)=0 ENDIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! IRREG TO REGLR VECTOR ELSEIF(K1F.NE.1.AND.K2F.EQ.1.AND.IV.NE.0) THEN IF(IP.EQ.2) THEN CALL IPXWAFS3(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) CALL IPXWAFS3(1,K1,K1F,1, & & KGDS1,IB1,L1,G1,KGDS1F,IB1F,L1F,G1F,IRET) ELSE CALL IPXWAFS2(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) CALL IPXWAFS2(1,K1,K1F,1, & & KGDS1,IB1,L1,G1,KGDS1F,IB1F,L1F,G1F,IRET) ENDIF IF(IRET.EQ.0) THEN CALL IPOLATEV(IP,IPOPT,KGDS1F,KGDS2,K1F,K2,1, & & IB1F,L1F,F1F,G1F, & & KI,RLAT,RLON,CROT,SROT,IB2,L2,F2,G2,IRET) IF(IRET.EQ.0.AND.KI.EQ.K2-1) THEN F2(K2)=0 G2(K2)=0 ENDIF ENDIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! REGLR TO IRREG VECTOR ELSEIF(K1F.EQ.1.AND.K2F.NE.1.AND.IV.NE.0) THEN stop 13 CALL IPOLATEV(IP,IPOPT,KGDS1,KGDS2F,K1,K2F,1,IB1,L1,F1,G1, & & KI,RLAT,RLON,CROT,SROT,IB2F,L2F,F2F,G2F,IRET) IF(IRET.EQ.0) THEN IF(IP.EQ.2) THEN CALL IPXWAFS3(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) CALL IPXWAFS3(-1,K2,K2F,1, & & KGDS2,IB2,L2,G2,KGDS2F,IB2F,L2F,G2F,IRET) ELSE CALL IPXWAFS2(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) CALL IPXWAFS2(-1,K2,K2F,1, & & KGDS2,IB2,L2,G2,KGDS2F,IB2F,L2F,G2F,IRET) ENDIF ENDIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! IRREG TO IRREG VECTOR ELSEIF(K1F.NE.1.AND.K2F.NE.1.AND.IV.NE.0) THEN stop 14 IF(IP.EQ.2) THEN CALL IPXWAFS3(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) CALL IPXWAFS3(1,K1,K1F,1, & & KGDS1,IB1,L1,G1,KGDS1F,IB1F,L1F,G1F,IRET) ELSE CALL IPXWAFS2(1,K1,K1F,1, & & KGDS1,IB1,L1,F1,KGDS1F,IB1F,L1F,F1F,IRET) CALL IPXWAFS2(1,K1,K1F,1, & & KGDS1,IB1,L1,G1,KGDS1F,IB1F,L1F,G1F,IRET) ENDIF IF(IRET.EQ.0) THEN CALL IPOLATEV(IP,IPOPT,KGDS1F,KGDS2F,K1F,K2F,1, & & IB1F,L1F,F1F,G1F, & & KI,RLAT,RLON,CROT,SROT,IB2F,L2F,F2F,G2F,IRET) IF(IRET.EQ.0) THEN IF(IP.EQ.2) THEN CALL IPXWAFS3(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) CALL IPXWAFS3(-1,K2,K2F,1, & & KGDS2,IB2,L2,G2,KGDS2F,IB2F,L2F,G2F,IRET) ELSE CALL IPXWAFS2(-1,K2,K2F,1, & & KGDS2,IB2,L2,F2,KGDS2F,IB2F,L2F,F2F,IRET) CALL IPXWAFS2(-1,K2,K2F,1, & & KGDS2,IB2,L2,G2,KGDS2F,IB2F,L2F,G2F,IRET) ENDIF ENDIF ENDIF ENDIF BIGIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - END SUBROUTINE INTGRIB1 !----------------------------------------------------------------------- INTEGER FUNCTION LENGDSF(KGDS,KGDSF) !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! ! SUBPROGRAM: LENGDSF RETURN THE LENGTH OF A FILLED GRID ! PRGMMR: IREDELL ORG: W/NMC23 DATE: 96-07-19 ! ! ABSTRACT: GIVEN A GRID DESCRIPTION SECTION (IN W3FI63 FORMAT), ! RETURN THE GRID DESCRIPTION SECTION AND SIZE OF ITS REGULARIZED ! COUNTERPART. THAT IS, IF THE INPUT GRID IS REGULAR, THEN ITSELF ! IS RETURNED ALONG WITH ITS GRID SIZE; HOWEVER IF THE INPUT GRID IS ! ONLY QUASI-REGULAR (SUCH AS THE WAFS GRIDS), THEN ITS FILLED REGULAR ! VERSION IS RETURNED ALONG WITH ITS FILLED GRID SIZE. ! ! PROGRAM HISTORY LOG: ! 96-07-19 IREDELL ! ! USAGE: CALL LENGDSF(KGDS,KGDSF) ! INPUT ARGUMENTS: ! KGDS INTEGER (200) GDS PARAMETERS IN W3FI63 FORMAT ! OUTPUT ARGUMENTS: ! KGDSF INTEGER (200) REGULAR GDS PARAMETERS IN W3FI63 FORMAT ! LENGDSF INTEGER SIZE OF REGULARIZED GRID ! ! SUBPROGRAMS CALLED: ! IPXWAFS ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN ! !$$$ IMPLICIT NONE INTEGER KGDS(200),KGDSF(200),DUM,IRET,DUMF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BIGIF: IF(KGDS(1).EQ.201) THEN KGDSF=KGDS LENGDSF=KGDS(7)*KGDS(8)-KGDS(8)/2 ELSEIF(KGDS(1).EQ.202) THEN KGDSF=KGDS LENGDSF=KGDS(7)*KGDS(8) ELSEIF(KGDS(19).EQ.0.AND.KGDS(20).NE.255) THEN CALL IPXWAFS(1,1,1,0,KGDS,DUM,KGDSF,DUMF,IRET) IF(IRET.EQ.0) THEN LENGDSF=KGDSF(2)*KGDSF(3) ELSE LENGDSF=0 ENDIF ELSE KGDSF=KGDS LENGDSF=KGDS(2)*KGDS(3) ENDIF BIGIF ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - END FUNCTION LENGDSF