!-----------------------------------------------------------------------
      MODULE BACIO_MODULE
!$$$  F90-MODULE DOCUMENTATION BLOCK
!
! F90-MODULE: BACIO_MODULE   BYTE-ADDRESSABLE I/O MODULE
!   PRGMMR: IREDELL          ORG: NP23        DATE: 98-06-04
!
! ABSTRACT: MODULE TO SHARE FILE DESCRIPTORS
!   IN THE BYTE-ADDESSABLE I/O PACKAGE.
!
! PROGRAM HISTORY LOG:
!   98-06-04  IREDELL
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      INTEGER,EXTERNAL:: BACIO,BACIOL
      INTEGER,PARAMETER :: FDDIM=9999
      INTEGER,DIMENSION(FDDIM),SAVE:: FD=FDDIM*0
      INTEGER,DIMENSION(20),SAVE:: BAOPTS=0
      INCLUDE 'baciof.h'
      END
!-----------------------------------------------------------------------
      SUBROUTINE BASETO(NOPT,VOPT)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BASETO         BYTE-ADDRESSABLE SET OPTIONS
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: SET OPTIONS FOR BYTE-ADDRESSABLE I/O.
!   ALL OPTIONS DEFAULT TO 0.
!   OPTION 1: BLOCKED READING OPTION
!             IF THE OPTION VALUE IS 1, THEN THE READING IS BLOCKED
!             INTO FOUR 4096-BYTE BUFFERS.  THIS MAY BE EFFICIENT IF
!             THE READS WILL BE REQUESTED IN MUCH SMALLER CHUNKS.
!             OTHERWISE, EACH CALL TO BAREAD INITIATES A PHYSICAL READ.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BASETO(NOPT,VOPT)
!   INPUT ARGUMENTS:
!     NOPT         INTEGER OPTION NUMBER
!     VOPT         INTEGER OPTION VALUE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      INTEGER NOPT,VOPT
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(NOPT.GE.1.AND.NOPT.LE.20) BAOPTS(NOPT)=VOPT
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BAOPEN(LU,CFN,IRET)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAOPEN         BYTE-ADDRESSABLE OPEN
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: OPEN A BYTE-ADDRESSABLE FILE.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BAOPEN(LU,CFN,IRET)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO OPEN
!     CFN          CHARACTER FILENAME TO OPEN
!                  (CONSISTING OF NONBLANK PRINTABLE CHARACTERS)
!   OUTPUT ARGUMENTS:
!     IRET         INTEGER RETURN CODE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      CHARACTER CFN*(*)
      integer(kind=8) IB,JB,NB,KA
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(LU.LT.001.OR.LU.GT.FDDIM) THEN
        IRET=6
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IRET=BACIOL(BACIO_OPENRW,IB,JB,1,NB,KA,FD(LU),CFN,A)
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BAOPENR(LU,CFN,IRET)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAOPENR        BYTE-ADDRESSABLE OPEN
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: OPEN A BYTE-ADDRESSABLE FILE FOR READ ONLY.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BAOPENR(LU,CFN,IRET)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO OPEN
!     CFN          CHARACTER FILENAME TO OPEN
!                  (CONSISTING OF NONBLANK PRINTABLE CHARACTERS)
!   OUTPUT ARGUMENTS:
!     IRET         INTEGER RETURN CODE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      CHARACTER CFN*(*)
      INTEGER LU,iret
      integer(kind=8) IB,JB,NB,KA
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(LU.LT.001.OR.LU.GT.FDDIM) THEN
        IRET=6
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IRET=BACIOL(BACIO_OPENR,IB,JB,1,NB,KA,FD(LU),CFN,A)
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BAOPENW(LU,CFN,IRET)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAOPENW        BYTE-ADDRESSABLE OPEN
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: OPEN A BYTE-ADDRESSABLE FILE FOR WRITE ONLY.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BAOPENW(LU,CFN,IRET)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO OPEN
!     CFN          CHARACTER FILENAME TO OPEN
!                  (CONSISTING OF NONBLANK PRINTABLE CHARACTERS)
!   OUTPUT ARGUMENTS:
!     IRET         INTEGER RETURN CODE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      CHARACTER CFN*(*)
      integer(kind=8) IB,JB,NB,KA
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(LU.LT.001.OR.LU.GT.FDDIM) THEN
        IRET=6
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IRET=BACIOL(BACIO_OPENW,IB,JB,1,NB,KA,FD(LU),CFN,A)
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BAOPENWT(LU,CFN,IRET)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAOPENWT       BYTE-ADDRESSABLE OPEN
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: OPEN A BYTE-ADDRESSABLE FILE FOR WRITE ONLY WITH TRUNCATION.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BAOPENWT(LU,CFN,IRET)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO OPEN
!     CFN          CHARACTER FILENAME TO OPEN
!                  (CONSISTING OF NONBLANK PRINTABLE CHARACTERS)
!   OUTPUT ARGUMENTS:
!     IRET         INTEGER RETURN CODE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      CHARACTER CFN*(*)
      integer(kind=8) IB,JB,NB,KA
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(LU.LT.001.OR.LU.GT.FDDIM) THEN
        IRET=6
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IRET=BACIOL(BACIO_OPENWT,IB,JB,1,NB,KA,FD(LU),CFN,A)
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BAOPENWA(LU,CFN,IRET)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAOPENWA       BYTE-ADDRESSABLE OPEN
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: OPEN A BYTE-ADDRESSABLE FILE FOR WRITE ONLY WITH APPEND.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BAOPENWA(LU,CFN,IRET)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO OPEN
!     CFN          CHARACTER FILENAME TO OPEN
!                  (CONSISTING OF NONBLANK PRINTABLE CHARACTERS)
!   OUTPUT ARGUMENTS:
!     IRET         INTEGER RETURN CODE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      CHARACTER CFN*(*)
      integer(kind=8) IB,JB,NB,KA
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(LU.LT.001.OR.LU.GT.FDDIM) THEN
        IRET=6
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IRET=BACIOL(BACIO_OPENWA,IB,JB,1,NB,KA,FD(LU),CFN,A)
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BACLOSE(LU,IRET)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BACLOSE        BYTE-ADDRESSABLE CLOSE
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: CLOSE A BYTE-ADDRESSABLE FILE.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!
! USAGE:    CALL BACLOSE(LU,IRET)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO CLOSE
!   OUTPUT ARGUMENTS:
!     IRET         INTEGER RETURN CODE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
      integer(kind=8) IB,JB,NB,KA
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(LU.LT.001.OR.LU.GT.FDDIM) THEN
        IRET=6
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IRET=BACIOL(BACIO_CLOSE,IB,JB,1,NB,KA,FD(LU),CHAR(0),A)
      IF(IRET.EQ.0) FD(LU)=0
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END
!-----------------------------------------------------------------------
      SUBROUTINE BAREAD(LU,IB,NB,KA,A)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAREAD         BYTE-ADDRESSABLE READ
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: THIS BAREAD IS CALLING BAREADL TO READ A GIVEN NUMBER OF 
!   BYTES FROM AN UNBLOCKED FILE,SKIPPING A GIVEN NUMBER OF BYTES.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!   2009-04-20  J. WANG
!
! USAGE:    CALL BAREAD(LU,IB,NB,KA,A)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO READ
!     IB           INTEGER NUMBER OF BYTES TO SKIP
!                  (IF IB<0, THEN THE FILE IS ACCESSED WITH NO SEEKING)
!     NB           INTEGER NUMBER OF BYTES TO READ
!   OUTPUT ARGUMENTS:
!     KA           INTEGER NUMBER OF BYTES ACTUALLY READ
!     A            CHARACTER*1 (NB) DATA READ
!
! SUBPROGRAMS CALLED:
!   BAREADL        BYTE-ADDRESSABLE READ SUBROUTINE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
!
        IMPLICIT NONE
        INTEGER,INTENT(IN) :: LU,IB,NB
        INTEGER,INTENT(OUT) :: KA
        CHARACTER,INTENT(OUT) :: A(NB)
        INTEGER(KIND=8) :: LONG_IB,LONG_NB,LONG_KA
!
        if(NB<0 ) THEN
          print *,'WRONG: in BAREAD read data size NB < 0, STOP! '//&
         'Consider using BAREADL and long integer'
          KA=0
          return
        ENDIF
        LONG_IB=IB
        LONG_NB=NB
        CALL BAREADL(LU,LONG_IB,LONG_NB,LONG_KA,A)
        KA=LONG_KA

      END SUBROUTINE BAREAD
!-----------------------------------------------------------------------
      SUBROUTINE BAREADL(LU,IB,NB,KA,A)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAREAD         BYTE-ADDRESSABLE READ
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: THIS SUBROUYTINE IS USING UPDATED BACIOL I/O PACKAGE TO READ 
!   A GIVEN NUMBER OF BYTES FROM AN UNBLOCKED FILE, SKIPPING A GIVEN 
!   NUMBER OF BYTES. 
!   THE PHYSICAL I/O IS BLOCKED INTO FOUR 4096-BYTE BUFFERS
!   IF THE BYTE-ADDRESSABLE OPTION 1 HAS BEEN SET TO 1 BY BASETO.
!   THIS BUFFERED READING IS INCOMPATIBLE WITH NO-SEEK READING.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!   2009-04-20  J. WANG
!
! USAGE:    CALL BAREAD(LU,IB,NB,KA,A)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO READ
!     IB           INTEGER(8) NUMBER OF BYTES TO SKIP
!                  (IF IB<0, THEN THE FILE IS ACCESSED WITH NO SEEKING)
!     NB           INTEGER(8) NUMBER OF BYTES TO READ
!   OUTPUT ARGUMENTS:
!     KA           INTEGER(8) NUMBER OF BYTES ACTUALLY READ
!     A            CHARACTER*1 (NB) DATA READ
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIOL         BYTE-ADDRESSABLE I/O C PACKAGE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
!    
      IMPLICIT NONE
      INTEGER,intent(in)          :: LU
      INTEGER(kind=8),intent(in)  :: IB,NB
      INTEGER(kind=8),intent(out) :: KA
      CHARACTER,intent(out)       :: A(NB)
      integer(kind=8),PARAMETER :: NY=4096,MY=4
      INTEGER(KIND=8) NS(MY),NN(MY)
      INTEGER(kind=8) JB,LONG_0,KY,I,K,IY,JY,LUX
      INTEGER IRET
!      INTEGER LU,IB,NB,KA
      CHARACTER Y(NY,MY)
      DATA LUX/0/
      SAVE JY,NS,NN,Y,LUX
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(FD(LU).LE.0) THEN
        KA=0
        RETURN
      ENDIF
      IF(IB.LT.0.AND.BAOPTS(1).EQ.1) THEN
        KA=0
        RETURN
      ENDIF
      IF(NB.LE.0) THEN
        KA=0
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      LONG_0=0                                                         
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
!  UNBUFFERED I/O
      IF(BAOPTS(1).NE.1) THEN
        KA=0
        IF(IB.GE.0) THEN
          IRET=BACIOL(BACIO_READ,IB,JB,1,NB,KA,FD(LU),CHAR(0),A)
        ELSE
          IRET=BACIOL(BACIO_READ+BACIO_NOSEEK,LONG_0,JB,1,NB,KA,&
                      FD(LU),CHAR(0),A)
        ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
!  BUFFERED I/O
!  GET DATA FROM PREVIOUS CALL IF POSSIBLE
      ELSE
        KA=0
        IF(LUX.NE.LU) THEN
          JY=0
          NS=0
          NN=0
        ELSE
          DO I=1,MY
            IY=MOD(JY+I-1,MY)+1
            KY=IB+KA-NS(IY)
            IF(KA.LT.NB.AND.KY.GE.LONG_0.AND.KY.LT.NN(IY)) THEN
              K=MIN(NB-KA,NN(IY)-KY)
              A(KA+1:KA+K)=Y(KY+1:KY+K,IY)
              KA=KA+K
            ENDIF
          ENDDO
        ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
!  SET POSITION AND READ BUFFER AND GET DATA
        IF(KA.LT.NB) THEN
          LUX=ABS(LU)
          JY=MOD(JY,MY)+1
          NS(JY)=IB+KA
          IRET=BACIOL(BACIO_READ,NS(JY),JB,1,NY,NN(JY),&
                     FD(LUX),CHAR(0),Y(1,JY))
          IF(NN(JY).GT.0) THEN
            K=MIN(NB-KA,NN(JY))
            A(KA+1:KA+K)=Y(1:K,JY)
            KA=KA+K
          ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
!  CONTINUE TO READ BUFFER AND GET DATA
          DO WHILE(NN(JY).EQ.NY.AND.KA.LT.NB)
            JY=MOD(JY,MY)+1
            NS(JY)=NS(JY)+NN(JY)
            IRET=BACIOL(BACIO_READ+BACIO_NOSEEK,NS(JY),JB,1,NY,NN(JY),&
                        FD(LUX),CHAR(0),Y(1,JY))
            IF(NN(JY).GT.0) THEN
              K=MIN(NB-KA,NN(JY))
              A(KA+1:KA+K)=Y(1:K,JY)
              KA=KA+K
            ENDIF
          ENDDO
        ENDIF
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END SUBROUTINE BAREADL
!-----------------------------------------------------------------------
      SUBROUTINE BAWRITE(LU,IB,NB,KA,A)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAWRITE        BYTE-ADDRESSABLE WRITE
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: THIS PROGRAM IS CALLING BAWRITEL TO WRITE A GIVEN NUMBER OF 
!   BYTES TO AN UNBLOCKED FILE,SKIPPING A GIVEN NUMBER OF BYTES.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!   2009-04-20  J. WANG
!
! USAGE:    CALL BAWRITE(LU,IB,NB,KA,A)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO WRITE
!     IB           INTEGER NUMBER OF BYTES TO SKIP
!                  (IF IB<0, THEN THE FILE IS ACCESSED WITH NO SEEKING)
!     NB           INTEGER NUMBER OF BYTES TO WRITE
!     A            CHARACTER*1 (NB) DATA TO WRITE
!   OUTPUT ARGUMENTS:
!     KA           INTEGER NUMBER OF BYTES ACTUALLY WRITTEN
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
!
        IMPLICIT NONE
        INTEGER,INTENT(IN) :: LU,IB,NB
        INTEGER,INTENT(OUT) :: KA
        CHARACTER,INTENT(IN) :: A(NB)
        INTEGER(KIND=8) :: LONG_IB,LONG_NB,LONG_KA
!
        if(NB<0 ) THEN
          print *,'WRONG: in BAWRITE read data size NB <0, STOP! '//&
          'Consider using BAWRITEL and long integer'
          KA=0
          return
        ENDIF
!
        LONG_IB=IB
        LONG_NB=NB
        CALL BAWRITEL(LU,LONG_IB,LONG_NB,LONG_KA,A)
        KA=LONG_KA         

      END SUBROUTINE BAWRITE
!-----------------------------------------------------------------------
      SUBROUTINE BAWRITEL(LU,IB,NB,KA,A)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: BAWRITEL       BYTE-ADDRESSABLE WRITE
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: THIS SUBROUYTINE IS USING UPDATED BACIOL I/O PACKAGE TO WRITE
!   A GIVEN NUMBER OF BYTES TO AN UNBLOCKED FILE, SKIPPING A GIVEN NUMBER
!   OF BYTES.
!
! PROGRAM HISTORY LOG:
!   1998-06-04  IREDELL
!   2009-04-20  J. WANG
!
! USAGE:    CALL BAWRITEL(LU,IB,NB,KA,A)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO WRITE
!     IB           INTEGER(8) NUMBER OF BYTES TO SKIP
!                  (IF IB<0, THEN THE FILE IS ACCESSED WITH NO SEEKING)
!     NB           INTEGER(8) NUMBER OF BYTES TO WRITE
!     A            CHARACTER*1 (NB) DATA TO WRITE
!   OUTPUT ARGUMENTS:
!     KA           INTEGER(8) NUMBER OF BYTES ACTUALLY WRITTEN
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIOL         BYTE-ADDRESSABLE I/O C PACKAGE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
!
      IMPLICIT NONE
!
      INTEGER,intent(in)         :: LU
      INTEGER(kind=8),intent(in) :: IB,NB
      INTEGER(kind=8),intent(out):: KA
      CHARACTER,intent(in) ::  A(NB)
!
      INTEGER(kind=8) :: JB,LONG_0
      INTEGER :: IRET
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(FD(LU).LE.0) THEN
        KA=0
        RETURN
      ENDIF
      IF(NB.LE.0) THEN
        KA=0
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      LONG_0=0
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(IB.GE.0) THEN
        KA=0
        IRET=BACIOL(BACIO_WRITE,IB,JB,1,NB,KA,FD(LU),CHAR(0),A)
      ELSE
        KA=0
        IRET=BACIOL(BACIO_WRITE+BACIO_NOSEEK,LONG_0,JB,1,NB,KA,&
                    FD(LU),CHAR(0),A)
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      END SUBROUTINE  BAWRITEL
!-----------------------------------------------------------------------
      SUBROUTINE WRYTE(LU,NB,A)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: WRYTE          WRITE DATA OUT BY BYTES
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: THSI SUBROUTINE IS CALLING WRYTEL TO WRITE A GIVEN NUMBER OF 
!   BYTES TO AN UNBLOCKED FILE.
!
! PROGRAM HISTORY LOG:
!   92-10-31  IREDELL
!   95-10-31  IREDELL     WORKSTATION VERSION
!   1998-06-04  IREDELL   BACIO VERSION
!   2009-04-20  J. WANG  WRYTEL VERSION
!
! USAGE:    CALL WRYTE(LU,NB,A)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO WHICH TO WRITE
!     NB           INTEGER(4) NUMBER OF BYTES TO WRITE
!     A            CHARACTER*1 (NB) DATA TO WRITE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIO          BYTE-ADDRESSABLE I/O C PACKAGE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
!
      USE BACIO_MODULE
!
      IMPLICIT NONE
!
      INTEGER,intent(in) :: LU
      INTEGER,intent(in) :: NB
      CHARACTER,intent(in) ::  A(NB)
      INTEGER(kind=8) :: LONG_NB
!
      IF(NB<0) THEN
       PRINT *,'WRONG: NB: the number of bytes to write  <0, STOP!'
       RETURN
      ENDIF
      LONG_NB=NB
      CALL WRYTEL(LU,LONG_NB,A)
!
      END SUBROUTINE WRYTE
!-----------------------------------------------------------------------
      SUBROUTINE WRYTEL(LU,NB,A)
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!
! SUBPROGRAM: WRYTE          WRITE DATA OUT BY BYTES
!   PRGMMR: IREDELL          ORG: W/NMC23     DATE: 1998-06-04
!
! ABSTRACT: WRITE A GIVEN NUMBER OF BYTES TO AN UNBLOCKED FILE.
!
! PROGRAM HISTORY LOG:
!   92-10-31  IREDELL
!   95-10-31  IREDELL     WORKSTATION VERSION
!   1998-06-04  IREDELL   BACIO VERSION
!   2009-04-20  J. WANG   BACIOL VERSION
!
! USAGE:    CALL WRYTE(LU,NB,A)
!   INPUT ARGUMENTS:
!     LU           INTEGER UNIT TO WHICH TO WRITE
!     NB           INTEGER(8) NUMBER OF BYTES TO WRITE
!     A            CHARACTER*1 (NB) DATA TO WRITE
!
! MODULES USED:
!   BACIO_MODULE   BYTE-ADDRESSABLE I/O FORTRAN INTERFACE
!
! SUBPROGRAMS CALLED:
!   BACIOL         BYTE-ADDRESSABLE I/O C PACKAGE
!
! REMARKS:  A BAOPEN MUST HAVE ALREADY BEEN CALLED.
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!
!$$$
      USE BACIO_MODULE
!
      IMPLICIT NONE
      INTEGER,intent(in) :: LU
      INTEGER(kind=8),intent(in) :: NB
      CHARACTER,INTENT(in)       :: A(NB)
      INTEGER(kind=8) :: LONG_0,JB,KA
      INTEGER :: IRET
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      IF(FD(LU).LE.0) THEN
        RETURN
      ENDIF
      IF(NB.LE.0) THEN
        RETURN
      ENDIF
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      LONG_0=0
      KA=0
      JB=0
      IRET=BACIOL(BACIO_WRITE+BACIO_NOSEEK,LONG_0,JB,1,NB,KA,&
                  FD(LU),CHAR(0),A)
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      RETURN
      END