!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE SPLITSOILINI               ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################


SUBROUTINE splitsoilini (fileheader,nx,ny,nzsoil,nstyps) 1,5

!------------------------------------------------------------------------
! HISTORY:
!
!     Yunheng Wang (09/06/2001)
!     Update with the new version ext2arps changed by Gene Bassett.
!     In general, a variable soiltyp was added in soil initial 
!     file (xxxxxx.soilvar.000000) by Gene.
!
!     Deallocate all the allocated variables
!
!     Yunheng Wang (07/15/2002)
!     Updated for new ARPS version (IHOP_3)
!
!-----------------------------------------------------------------------

  IMPLICIT NONE

  INCLUDE 'mp.inc'

  INTEGER :: nx,ny,nzsoil,nstyps

  CHARACTER (LEN=*) :: fileheader

!
!-----------------------------------------------------------------------
!
!  Misc. local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: nxlg, nylg

  INTEGER :: lenstr
  CHARACTER (LEN=256) :: filename
  INTEGER :: fi, fj, i, j
  INTEGER :: nxin, nyin
  INTEGER :: nzsoilin

!
! fmtver**: to label each data a version.
! intver**: an integer to allow faster comparison than fmtver??,
!           which are strings.
!
! Verion 5.00: significant change in soil variables since version 4.10.
!
  CHARACTER (LEN=40) :: fmtver,fmtver410,fmtver500
  INTEGER  :: intver,intver410,intver500

  PARAMETER (fmtver410='* 004.10 GrADS Soilvar Data',intver410=410)
  PARAMETER (fmtver500='* 005.00 GrADS Soilvar Data',intver500=500)

  CHARACTER (LEN=40) :: fmtverin

  INTEGER :: mprojin,tsoilin,qsoilin,wcanpin,stypin,zpsoilin
  INTEGER :: snowcin,snowdin,nstypin
  INTEGER :: idummy
  REAL :: dxin,dyin,ctrlonin,ctrlatin,trlat1in,trlat2in,trlonin,sclin
  REAL :: rdummy

  REAL, ALLOCATABLE :: a2dlg(:,:), a2dsm(:,:)
  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,*) 'splitsoilini:  not MP ready'
	call arpsstop('splitsoilini:   not MP ready', 1)
	return
  endif

  nxlg = (nx-3)*nproc_x+3
  nylg = (ny-3)*nproc_y+3

  ALLOCATE(a2dlg(nxlg,nylg))
  ALLOCATE(a2dsm(nx,ny))
  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

!
!-----------------------------------------------------------------------
!
!  Open the files.
!
!-----------------------------------------------------------------------
!
  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(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 data format string which was added since version IHOP_3
!
!---------------------------------------------------------------------

    READ (10,ERR=997) fmtverin  
                                !  To distinguish versions prior to 500. 

    WRITE(6,'(/1x,a,a/)') 'Incoming data format, fmtverin=',fmtverin

    IF (fmtverin == fmtver500) THEN
      intver=intver500
    ELSE
      WRITE(6,'(/1x,a/)')   & 
          'WARNING: Incoming data format are older than version 5.00!!! '
    END IF

    intver=intver410      ! there is no fmtverin prior to version 500
    fmtver=fmtver410

    GOTO 996 

997 WRITE(6,'(/1x,a/,a/)')   &
          'ERROR: Compatibility with previous verion soil data is still', &
          '       not ready for SPLITFILES.'

    CLOSE (10)
    STOP

996 CONTINUE

    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii)) fmtverin
    END DO
!
!-----------------------------------------------------------------------
!
!  Read/write the dimensions of data in the file and check against
!  the dimensions passed to this subroutine.
!
!-----------------------------------------------------------------------
!
    READ (10) nxin,nyin,nzsoilin

    IF ((nxin /= nxlg).OR.(nyin /= nylg).OR.(nzsoilin /= nzsoil)) THEN
      WRITE (*,*) "ERROR:  mismatch in sizes."
      WRITE (*,*) "nxin,nyin,nzsoilin",nxin,nyin,nzsoilin
      WRITE (*,*) "nxlg,nylg,nzsoil",nxlg,nylg,nzsoil
      call arpsstop("splitsoilini:  mismatch",1)
    END IF

    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii)) nx,ny,nzsoil
    END DO

!
!-----------------------------------------------------------------------
!
!  Read/write header info
!
!-----------------------------------------------------------------------

    READ (10)                mprojin,tsoilin,qsoilin,                   &
                             wcanpin,snowcin,snowdin,stypin,zpsoilin,   &
                             idummy,idummy,idummy,idummy,idummy,        &
                             idummy,idummy,idummy,idummy,nstypin
    DO ii=1+(jj-1)*maxunit,iiend

      WRITE (ounit(ii))      mprojin,tsoilin,qsoilin,                    &
                             wcanpin,snowcin,snowdin,stypin,zpsoilin,   &
                             idummy,idummy,idummy,idummy,idummy,        &
                             idummy,idummy,idummy,idummy,nstypin
    END DO

    READ (10)                dxin,dyin, ctrlonin,ctrlatin,trlat1in,     &
                             trlat2in,trlonin,sclin,rdummy,rdummy,      &
                             rdummy,rdummy,rdummy,rdummy,rdummy,        &
                             rdummy,rdummy,rdummy,rdummy,rdummy
    DO ii=1+(jj-1)*maxunit,iiend
      WRITE (ounit(ii))      dxin,dyin, ctrlonin,ctrlatin,trlat1in,     &
                             trlat2in,trlonin,sclin,rdummy,rdummy,      &
                             rdummy,rdummy,rdummy,rdummy,rdummy,        &
                             rdummy,rdummy,rdummy,rdummy,rdummy
    END DO

!
!-----------------------------------------------------------------------
!
!   Read in the global data, and write out appropriate sections into
!   each processors file.
!
!-----------------------------------------------------------------------
!
    nfields = 0

    IF (zpsoilin >0) nfields = nfields + nzsoilin
    IF (tsoilin > 0) nfields = nfields + nzsoilin*nstyps + nzsoil 
    IF (qsoilin > 0) nfields = nfields + nzsoilin*nstyps + nzsoil
    IF (wcanpin > 0) nfields = nfields + nstyps + 1
    IF (snowdin > 0) nfields = nfields + 1
    IF (stypin  > 0) nfields = nfields + nstyps


    DO fcnt = 1,nfields

        READ (10) ((a2dlg(i,j),i=1,nxlg),j=1,nylg)
      
        DO ii=1+(jj-1)*maxunit,iiend
          fi = ffi(ii)
          fj = ffj(ii)
          DO j = 1,ny
            DO i = 1,nx
              a2dsm(i,j) = a2dlg(i+(fi-1)*(nx-3),j+(fj-1)*(ny-3))
            END DO
          END DO

          WRITE (ounit(ii)) ((a2dsm(i,j),i=1,nx),j=1,ny)
        END DO

    END DO


  END DO     ! jj

  DEALLOCATE(a2dlg)
  DEALLOCATE(a2dsm)
  DEALLOCATE(ounit)
  DEALLOCATE(ffi)
  DEALLOCATE(ffj)

  RETURN

END SUBROUTINE splitsoilini