C-----------------------------------------------------------------------
      SUBROUTINE IPSECTOR(I1,I2,J1,J2,NF,M,KGDS,L,F,MS,
     &                    KGDSS,LS,FS,IRET)
C$$$  SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM:  IPSECTOR   CREATE A SUBSECTOR OF A GRID
C   PRGMMR: IREDELL       ORG: W/NMC23       DATE: 1998-04-08
C
C ABSTRACT: THIS SUBPROGRAM CREATES A SUBSECTOR OF A GRID,
C           COMPUTING A NEW GRID DEFINITION SECTION AND COPYING DATA
C           FROM THE ORIGINAL GRID DATA.
C
C PROGRAM HISTORY LOG:
C 1999-04-08  IREDELL
C 2012-06-05  GAYNO   CORRECTED ARRAY INDEXING PROBLEM BETWEEN THE
C                     THE ORIGINAL AND SUBSECTOR GRIDS.
C
C USAGE:    CALL IPSECTOR(I1,I2,J1,J2,NF,M,KGDS,L,F,MS,
C    &                    KGDSS,LS,FS,IRET)
C
C   INPUT ARGUMENT LIST:
C     I1       - INTEGER FIRST X POINT OF THE SECTOR
C                OR IF 0<=I2<I1,
C                THE TOTAL NUMBER OF NON-OVERLAPPING X SECTORS
C                OR IF 0<=I2<-I1,
C                THE NEGATIVE TOTAL NUMBER OF OVERLAPPING X SECTORS.
C     I2       - INTEGER LAST X POINT OF THE SECTOR
C                OR IF 0<=I2<ABS(I1), THE SECTOR NUMBER.
C     J1       - INTEGER FIRST Y POINT OF THE SECTOR
C                OR IF 0<=J2<J1,
C                THE TOTAL NUMBER OF NON-OVERLAPPING Y SECTORS
C                OR IF 0<=J2<-J1,
C                THE NEGATIVE TOTAL NUMBER OF OVERLAPPING Y SECTORS.
C     J2       - INTEGER LAST Y POINT OF THE SECTOR
C                OR IF 0<=J2<ABS(J1), THE SECTOR NUMBER.
C     NF       - INTEGER NUMBER OF FIELDS TO CUT
C     M        - INTEGER FIRST DIMENSION OF INPUT FIELD ARRAYS
C     KGDS     - INTEGER (200) INPUT GDS PARAMETERS AS DECODED BY W3FI63
C     L        - LOGICAL(1) (M,NF) BITMAP FOR INPUT FIELD
C     F        - REAL (M,NF) DATA FOR INPUT FIELD
C     MS       - INTEGER FIRST DIMENSION OF OUTPUT FIELD ARRAYS
C
C   OUTPUT ARGUMENT LIST:
C     KGDSS    - INTEGER (200) OUTPUT GDS PARAMETERS
C     LS       - LOGICAL(1) (MS,NF) BITMAP FOR OUTPUT FIELD
C     FS       - REAL (MS,NF) DATA FOR OUTPUT FIELD
C     IRET     - INTEGER RETURN CODE
C                (0 IF SUCCESSFUL;
C                 71 IF UNSUPPORTED PROJECTION;
C                 72 IF INVALID SECTOR SPECIFICATION)
C
C ATTRIBUTES:
C   LANGUAGE: FORTRAN 90
C
C$$$
      INTEGER I1,I2,J1,J2,NF,M,MS
      INTEGER KGDS(200)
      LOGICAL(1) L(M,NF)
      REAL F(M,NF)
      INTEGER KGDSS(200)
      LOGICAL(1) LS(MS,NF)
      REAL FS(MS,NF)
      INTEGER IRET
      REAL XPTS(2),YPTS(2),RLON(2),RLAT(2)
      REAL CROT(2),SROT(2)
      INTEGER I1A,I2A,INA,J1A,J2A,JNA,K,KS,NS,NSCAN
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C  COMPUTE ACTUAL SECTOR BOUNDARIES
      IF((KGDS(1).NE.0.AND.KGDS(1).NE.1.AND.KGDS(1).NE.3.AND.
     &   KGDS(1).NE.4.AND.KGDS(1).NE.5).OR.KGDS(20).NE.255) THEN
        IRET=71
        RETURN
      ENDIF
      I1A=I1
      I2A=I2
      J1A=J1
      J2A=J2
      IF(I2.GE.0.AND.I1.GT.I2) THEN
        I1A=MIN(I2*((KGDS(2)-1)/I1+1)+1,KGDS(2)+1)
        I2A=MIN((I2+1)*((KGDS(2)-1)/I1+1),KGDS(2))
      ELSEIF(I2.GE.0.AND.-I1.GT.I2) THEN
        I1A=MIN(I2*((KGDS(2)-2)/(-I1)+1)+1,KGDS(2)+1)
        I2A=MIN((I2+1)*((KGDS(2)-2)/(-I1)+1)+1,KGDS(2))
      ENDIF
      IF(J2.GE.0.AND.J1.GT.J2) THEN
        J1A=MIN(J2*((KGDS(3)-1)/J1+1)+1,KGDS(3)+1)
        J2A=MIN((J2+1)*((KGDS(3)-1)/J1+1),KGDS(3))
      ELSEIF(J2.GE.0.AND.-J1.GT.J2) THEN
        J1A=MIN(J2*((KGDS(3)-2)/(-J1)+1)+1,KGDS(3)+1)
        J2A=MIN((J2+1)*((KGDS(3)-2)/(-J1)+1)+1,KGDS(3))
      ENDIF
      IF(I1A.LT.1.OR.I2A.GT.KGDS(2).OR.I1A.GT.I2A.OR.
     &   J1A.LT.1.OR.J2A.GT.KGDS(3).OR.J1A.GT.J2A) THEN
        IRET=72
        RETURN
      ENDIF
      INA=I2A-I1A+1
      JNA=J2A-J1A+1
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C  COMPUTE NEW GRID DEFINITION SECTION PARAMETERS
      KGDSS=KGDS
      XPTS(1)=I1A
      YPTS(1)=J1A
      XPTS(2)=I2A
      YPTS(2)=J2A
      CALL GDSWIZ(KGDS,1,2,-9999.,XPTS,YPTS,RLON,RLAT,NRET,0,CROT,SROT)
      KGDSS(2)=INA
      KGDSS(3)=JNA
      KGDSS(4)=NINT(1.E3*RLAT(1))
      KGDSS(5)=NINT(1.E3*RLON(1))
      IF(KGDS(1).EQ.0.OR.KGDS(1).EQ.1.OR.KGDS(1).EQ.4) THEN
        IF(MOD(KGDS(6),2).EQ.0) KGDSS(6)=KGDS(6)+1
        KGDSS(7)=NINT(1.E3*RLAT(2))
        KGDSS(8)=NINT(1.E3*RLON(2))
      ENDIF
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C  COPY BITMAPS AND DATA
      NS=INA*JNA
      NSCAN=MOD(KGDS(11)/32,2)
      DO N=1,NF
        DO KS=1,NS
          IF(NSCAN.EQ.0) THEN
            K=((KS-1)/INA+J1A-1)*KGDS(2)+MOD(KS-1,INA)+I1A
          ELSE
            K=((KS-1)/JNA+I1A-1)*KGDS(3)+MOD(KS-1,JNA)+J1A
          ENDIF
          LS(KS,N)=L(K,N)
          FS(KS,N)=F(K,N)
        ENDDO
      ENDDO
      IRET=0
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END