 SUBROUTINE splitexbc(fileheader,nx,ny,nz) 1,5
  IMPLICIT NONE
  CHARACTER (LEN=80) :: fileheader
  INCLUDE 'mp.inc'
  INTEGER nx,ny,nz
  INTEGER :: nxlg, nylg, nzlg
!
!-----------------------------------------------------------------------
!
!  Misc. local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: lenstr
  CHARACTER (LEN=10) :: filetail
  CHARACTER (LEN=128) :: filename
  INTEGER :: fi, fj, i, j, k
  INTEGER :: nxin, nyin, nzin
  REAL :: dxin,dyin,dzin,ctrlatin,ctrlonin
  INTEGER :: ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
  INTEGER :: qcbcrd,qrbcrd,qibcrd,qsbcrd,qhbcrd,idummy
  INTEGER :: old_v
  CHARACTER (LEN=15) :: ctime
  REAL, ALLOCATABLE :: a3dlg(:,:,:), a3dsm(:,:,:)
  INTEGER, ALLOCATABLE :: ounit(:)
  INTEGER, ALLOCATABLE :: ffi(:), ffj(:)
  INTEGER :: ierr
  INTEGER :: nfields, fcnt
  INTEGER :: ii,jj,iiend
  INTEGER :: unit0, maxunit
  PARAMETER (unit0=110,maxunit=60)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  if ( mp_opt > 0 ) then
	write(6,*) 'splitexbc:  not MP ready'
	call arpsstop
SUBROUTINE splitexbc(fileheader,nx,ny,nz) 1,5
  IMPLICIT NONE
  CHARACTER (LEN=80) :: fileheader
  INCLUDE 'mp.inc'
  INTEGER nx,ny,nz
  INTEGER :: nxlg, nylg, nzlg
!
!-----------------------------------------------------------------------
!
!  Misc. local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: lenstr
  CHARACTER (LEN=10) :: filetail
  CHARACTER (LEN=128) :: filename
  INTEGER :: fi, fj, i, j, k
  INTEGER :: nxin, nyin, nzin
  REAL :: dxin,dyin,dzin,ctrlatin,ctrlonin
  INTEGER :: ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
  INTEGER :: qcbcrd,qrbcrd,qibcrd,qsbcrd,qhbcrd,idummy
  INTEGER :: old_v
  CHARACTER (LEN=15) :: ctime
  REAL, ALLOCATABLE :: a3dlg(:,:,:), a3dsm(:,:,:)
  INTEGER, ALLOCATABLE :: ounit(:)
  INTEGER, ALLOCATABLE :: ffi(:), ffj(:)
  INTEGER :: ierr
  INTEGER :: nfields, fcnt
  INTEGER :: ii,jj,iiend
  INTEGER :: unit0, maxunit
  PARAMETER (unit0=110,maxunit=60)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  if ( mp_opt > 0 ) then
	write(6,*) 'splitexbc:  not MP ready'
	call arpsstop ('splitexbc:   not MP ready', 1)
	return
  endif
  nxlg = (nx-3)*nproc_x+3
  nylg = (ny-3)*nproc_y+3
  nzlg = nz
  ALLOCATE(a3dlg(nxlg,nylg,nzlg))
  ALLOCATE(a3dsm(nx,ny,nz))
  ALLOCATE(ounit(nproc_x*nproc_y))
  ALLOCATE(ffi(nproc_x*nproc_y))
  ALLOCATE(ffj(nproc_x*nproc_y))
  lenstr = 0
  100   lenstr = lenstr + 1
  IF (fileheader(lenstr:lenstr) /= " ") GO TO 100
  lenstr = lenstr - 1
!
!-----------------------------------------------------------------------
!
!  Split the original data file into indivdual files for the
!  processors to read.
!
!-----------------------------------------------------------------------
!
  CALL asnctl
('splitexbc:   not MP ready', 1)
	return
  endif
  nxlg = (nx-3)*nproc_x+3
  nylg = (ny-3)*nproc_y+3
  nzlg = nz
  ALLOCATE(a3dlg(nxlg,nylg,nzlg))
  ALLOCATE(a3dsm(nx,ny,nz))
  ALLOCATE(ounit(nproc_x*nproc_y))
  ALLOCATE(ffi(nproc_x*nproc_y))
  ALLOCATE(ffj(nproc_x*nproc_y))
  lenstr = 0
  100   lenstr = lenstr + 1
  IF (fileheader(lenstr:lenstr) /= " ") GO TO 100
  lenstr = lenstr - 1
!
!-----------------------------------------------------------------------
!
!  Split the original data file into indivdual files for the
!  processors to read.
!
!-----------------------------------------------------------------------
!
  CALL asnctl ('NEWLOCAL', 1, ierr)
  DO fj=1,nproc_y
    DO fi=1,nproc_x
      ii = fi+nproc_x*(fj-1)
      ffi(ii) = fi
      ffj(ii) = fj
      ounit(ii) = unit0 + ii
    END DO
  END DO
  DO jj = 1,1+(nproc_x*nproc_y-1)/maxunit
    iiend = MIN(jj*maxunit,nproc_x*nproc_y)
    DO ii=1+(jj-1)*maxunit,iiend
!
!-----------------------------------------------------------------------
!
!  Since T3D processors only support COS and IEEE double precision
!  format, we have to translate the files into COS format.
!
!-----------------------------------------------------------------------
!
      WRITE (filename, '(a,a,2i2.2)')                                   &
            fileheader(1:lenstr),'_',ffi(ii),ffj(ii)
      CALL asnfile
 ('NEWLOCAL', 1, ierr)
  DO fj=1,nproc_y
    DO fi=1,nproc_x
      ii = fi+nproc_x*(fj-1)
      ffi(ii) = fi
      ffj(ii) = fj
      ounit(ii) = unit0 + ii
    END DO
  END DO
  DO jj = 1,1+(nproc_x*nproc_y-1)/maxunit
    iiend = MIN(jj*maxunit,nproc_x*nproc_y)
    DO ii=1+(jj-1)*maxunit,iiend
!
!-----------------------------------------------------------------------
!
!  Since T3D processors only support COS and IEEE double precision
!  format, we have to translate the files into COS format.
!
!-----------------------------------------------------------------------
!
      WRITE (filename, '(a,a,2i2.2)')                                   &
            fileheader(1:lenstr),'_',ffi(ii),ffj(ii)
      CALL asnfile (filename, '-F f77 -N ieee', ierr)
      OPEN (UNIT=ounit(ii), FILE=filename, FORM='unformatted')
    END DO
    CALL asnfile
(filename, '-F f77 -N ieee', ierr)
      OPEN (UNIT=ounit(ii), FILE=filename, FORM='unformatted')
    END DO
    CALL asnfile (fileheader(1:lenstr), '-F f77 -N ieee', ierr)
    OPEN (UNIT=10, FILE=fileheader(1:lenstr), FORM='unformatted')
!
!-----------------------------------------------------------------------
!
!  Read/write the dimensions of data in the file and check against
!  the dimensions passed to this subroutine.
!
!-----------------------------------------------------------------------
!
    READ (10)                                                           &
          nxin,nyin,nzin,dxin,dyin,dzin,ctrlatin,ctrlonin
    IF ((nxin /= nxlg).OR.(nyin /= nylg).OR.(nzin /= nzlg)) THEN
      WRITE (*,*) "ERROR:  mismatch in sizes."
      WRITE (*,*) "nxin,nyin,nzin: ",nxin,nyin,nzin
      WRITE (*,*) "nxlg,nylg,nzlg: ",nxlg,nylg,nzlg
      call arpsstop
(fileheader(1:lenstr), '-F f77 -N ieee', ierr)
    OPEN (UNIT=10, FILE=fileheader(1:lenstr), FORM='unformatted')
!
!-----------------------------------------------------------------------
!
!  Read/write the dimensions of data in the file and check against
!  the dimensions passed to this subroutine.
!
!-----------------------------------------------------------------------
!
    READ (10)                                                           &
          nxin,nyin,nzin,dxin,dyin,dzin,ctrlatin,ctrlonin
    IF ((nxin /= nxlg).OR.(nyin /= nylg).OR.(nzin /= nzlg)) THEN
      WRITE (*,*) "ERROR:  mismatch in sizes."
      WRITE (*,*) "nxin,nyin,nzin: ",nxin,nyin,nzin
      WRITE (*,*) "nxlg,nylg,nzlg: ",nxlg,nylg,nzlg
      call arpsstop ("splitexbc:  mismatch", 1)
    END IF
    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii))                                                 &
               nx,ny,nz,dxin,dyin,dzin,ctrlatin,ctrlonin
    END DO
!
!-----------------------------------------------------------------------
!
!  Read/write header info.
!
!-----------------------------------------------------------------------
!
    READ (10) ctime
    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii)) ctime
    END DO
    old_v = 0 ! In case that the EXBC files are of an earlier
              ! version that does not contain water and ice variables,
              ! set old_v to 1. Otherwise, set it to 0.
    IF( old_v == 1 ) THEN
      READ (10) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
      DO ii=1+(jj-1)*maxunit,iiend
        WRITE (ounit(ii)) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
      END DO
      qcbcrd = 0
      qrbcrd = 0
      qibcrd = 0
      qsbcrd = 0
      qhbcrd = 0
    ELSE
      READ (10)   ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,                      &
                  qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd,                   &
                  qhbcrd,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy
      DO ii=1+(jj-1)*maxunit,iiend
        WRITE (ounit(ii))                                               &
                  ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,                      &
                  qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd,                   &
                  qhbcrd,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy
      END DO
    END IF
    nfields = 6
    IF (qcbcrd > 0) nfields = nfields + 1
    IF (qrbcrd > 0) nfields = nfields + 1
    IF (qibcrd > 0) nfields = nfields + 1
    IF (qsbcrd > 0) nfields = nfields + 1
    IF (qhbcrd > 0) nfields = nfields + 1
!
!-----------------------------------------------------------------------
!
!  Read in the global data, and write out appropriate sections into
!  each processors file.
!
!-----------------------------------------------------------------------
!
    DO fcnt = 1,nfields
      READ (10) a3dlg
      DO ii=1+(jj-1)*maxunit,iiend
        fi = ffi(ii)
        fj = ffj(ii)
        DO k = 1,nz
          DO j = 1,ny
            DO i = 1,nx
              a3dsm(i,j,k) =                                            &
                  a3dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), k)
            END DO
          END DO
        END DO
        WRITE (ounit(ii)) a3dsm
      END DO
    END DO
    CLOSE (10)
    DO ii=1+(jj-1)*maxunit,iiend
      CLOSE (ounit(ii))
    END DO
  END DO    ! jj
  RETURN
END SUBROUTINE splitexbc
("splitexbc:  mismatch", 1)
    END IF
    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii))                                                 &
               nx,ny,nz,dxin,dyin,dzin,ctrlatin,ctrlonin
    END DO
!
!-----------------------------------------------------------------------
!
!  Read/write header info.
!
!-----------------------------------------------------------------------
!
    READ (10) ctime
    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii)) ctime
    END DO
    old_v = 0 ! In case that the EXBC files are of an earlier
              ! version that does not contain water and ice variables,
              ! set old_v to 1. Otherwise, set it to 0.
    IF( old_v == 1 ) THEN
      READ (10) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
      DO ii=1+(jj-1)*maxunit,iiend
        WRITE (ounit(ii)) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd
      END DO
      qcbcrd = 0
      qrbcrd = 0
      qibcrd = 0
      qsbcrd = 0
      qhbcrd = 0
    ELSE
      READ (10)   ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,                      &
                  qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd,                   &
                  qhbcrd,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy
      DO ii=1+(jj-1)*maxunit,iiend
        WRITE (ounit(ii))                                               &
                  ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,                      &
                  qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd,                   &
                  qhbcrd,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy,                   &
                  idummy,idummy,idummy,idummy,idummy
      END DO
    END IF
    nfields = 6
    IF (qcbcrd > 0) nfields = nfields + 1
    IF (qrbcrd > 0) nfields = nfields + 1
    IF (qibcrd > 0) nfields = nfields + 1
    IF (qsbcrd > 0) nfields = nfields + 1
    IF (qhbcrd > 0) nfields = nfields + 1
!
!-----------------------------------------------------------------------
!
!  Read in the global data, and write out appropriate sections into
!  each processors file.
!
!-----------------------------------------------------------------------
!
    DO fcnt = 1,nfields
      READ (10) a3dlg
      DO ii=1+(jj-1)*maxunit,iiend
        fi = ffi(ii)
        fj = ffj(ii)
        DO k = 1,nz
          DO j = 1,ny
            DO i = 1,nx
              a3dsm(i,j,k) =                                            &
                  a3dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), k)
            END DO
          END DO
        END DO
        WRITE (ounit(ii)) a3dsm
      END DO
    END DO
    CLOSE (10)
    DO ii=1+(jj-1)*maxunit,iiend
      CLOSE (ounit(ii))
    END DO
  END DO    ! jj
  RETURN
END SUBROUTINE splitexbc