!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE JOINBIN2HDF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE joinbin2hdf (fileheader,nx,ny,nz,nstyp,hdfcompr) 1,66
!
!-----------------------------------------------------------------------
!
! To join together a set of ARPS history or data files produced by the
! processors of MPP machines with message passing.
!
! Input data file is in binary format and the output is in HDF4 format
!
!-----------------------------------------------------------------------
!
! AUTHOR:
! Yunheng Wang (05/16/2002)
! based on joindumps.f90
!
! MODIFICATION HISTORY.
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc'
!
!--------------------------------------------------------------------
!
! PARAMETERS
!
!--------------------------------------------------------------------
CHARACTER (LEN=*) :: fileheader
INTEGER :: nx,ny,nz,nstyp
INTEGER :: hdfcompr
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
CHARACTER(LEN=40), PARAMETER :: fmtverbin='004.10 Binary Data'
CHARACTER(LEN=40), PARAMETER :: fmtverhdf='004.10 HDF4 Coded Data'
INTEGER :: nxlg, nylg, nzlg
INTEGER :: nxin, nyin, nzin
CHARACTER (LEN=128) :: filename
CHARACTER (LEN=128) :: outfile
CHARACTER (LEN=128) :: outfile_old
INTEGER, PARAMETER :: unit0=110, maxunit=60
INTEGER, PARAMETER :: junit0=11
INTEGER :: sd_ido, stg_dim
INTEGER :: lenstr, joff
INTEGER :: fi, fj, i, j, k
INTEGER :: ii,jj,iiend
CHARACTER (LEN=40) :: fmtver
CHARACTER (LEN=80) :: runname
CHARACTER (LEN=10) :: tmunit
CHARACTER (LEN=12) :: label
CHARACTER (LEN=10) :: varname
INTEGER :: nocmnt
CHARACTER (LEN=80), ALLOCATABLE :: cmnt(:)
REAL :: curtim
INTEGER :: i01, i02, i03, i04, i05, i06, i07, i08, i09, i10
INTEGER :: i11, i12, i13, i14, i15, i16, i17, i18, i19, i20
REAL :: r01, r02, r03, r04, r05, r06, r07, r08, r09, r10
REAL :: r11, r12, r13, r14, r15, r16, r17, r18, r19, r20
REAL, ALLOCATABLE :: xlg(:), ylg(:), z(:)
REAL, ALLOCATABLE :: xsm(:), ysm(:)
REAL, ALLOCATABLE :: a3dlg(:,:,:), a3dsm(:,:,:)
REAL, ALLOCATABLE :: a2dlg(:,:), a2dsm(:,:)
REAL, ALLOCATABLE :: tsfc(:,:,:), tsoil(:,:,:), wetsfc(:,:,:), &
wetdp(:,:,:), wetcanp(:,:,:)
REAL, AlLOCATABLE :: stypfrct(:,:,:)
INTEGER, ALLOCATABLE :: soiltyp(:,:,:)
INTEGER, ALLOCATABLE :: ai2dlg(:,:), ai2dsm(:,:)
INTEGER, ALLOCATABLE :: i0(:,:), j0(:,:)
INTEGER, ALLOCATABLE :: iunit(:)
INTEGER, ALLOCATABLE :: ffi(:), ffj(:)
INTEGER :: ierr, istat
LOGICAL :: fexist
INTEGER :: landflg, sfcflg
INTEGER :: is, nstypvar
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmp(:,:,:)
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmp2d(:,:)
REAL, ALLOCATABLE :: hmax(:), hmin(:)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
nxlg = nproc_x*(nx-3)+3
nylg = nproc_y*(ny-3)+3
nzlg = nz
ALLOCATE(xlg(nxlg))
ALLOCATE(ylg(nylg))
ALLOCATE( ALLOCATE(xsm(nx))
ALLOCATE(ysm(ny))
ALLOCATE(a3dlg(nxlg,nylg,nzlg))
ALLOCATE(a3dsm(nx,ny,nz))
ALLOCATE(a2dlg(nxlg,nylg))
ALLOCATE(a2dsm(nx,ny))
ALLOCATE(ai2dlg(nxlg,nylg))
ALLOCATE(ai2dsm(nx,ny))
ALLOCATE(i0(nproc_x,nproc_y))
ALLOCATE(j0(nproc_x,nproc_y))
ALLOCATE(iunit(nproc_x*nproc_y))
ALLOCATE(ffi(nproc_x*nproc_y))
ALLOCATE(ffj(nproc_x*nproc_y))
ALLOCATE(itmp(nxlg, nylg, nz))
ALLOCATE(itmp2d(nxlg, nylg))
ALLOCATE(hmax(nz))
ALLOCATE(hmin(nz))
joff = 0
lenstr = 0
100 lenstr = lenstr + 1
IF (fileheader(lenstr:lenstr) /= " ") GO TO 100
lenstr = lenstr - 1
!
!-----------------------------------------------------------------------
!
! Open the split files.
!
!-----------------------------------------------------------------------
!
CALL asnctl
('NEWLOCAL', 1, ierr)
DO fj = 1,nproc_y
DO fi = 1,nproc_x
IF (fi == 1) THEN
i0(fi,fj) = 1
ELSE
i0(fi,fj) = 2
END IF
IF (fj == 1) THEN
j0(fi,fj) = 1
ELSE
j0(fi,fj) = 2
END IF
ii = fi+nproc_x*(fj-1)
ffi(ii) = fi
ffj(ii) = fj
iunit(ii) = unit0 + ii
END DO
END DO
a3dlg = 0.0
a2dlg = 0.0
ai2dlg = 0
DO jj = 1,1+(nproc_x*nproc_y-1)/maxunit
nstyp = 0
is = 0
nstypvar = 0
iiend = MIN(jj*maxunit,nproc_x*nproc_y)
DO ii=1+(jj-1)*maxunit,iiend
!
!-----------------------------------------------------------------------
!
! For compatibility with the Cray data formats. The processors
! read their data in COS format.
!
!-----------------------------------------------------------------------
!
WRITE(filename, '(a,a,2i2.2)') &
fileheader(1:lenstr),'_',ffi(ii),ffj(ii)
INQUIRE (FILE=filename, EXIST=fexist)
IF ( .NOT. fexist) THEN
WRITE (6,*) 'Parts of ',fileheader,' were not found'
WRITE (6,*) 'No file joining is done for this time.'
WRITE (6,*) 'Program continues.'
WRITE (6,*)
RETURN
END IF
CALL asnfile
(filename, '-F f77 -N ieee', ierr)
OPEN (UNIT=iunit(ii),FILE=trim(filename),FORM='unformatted')
END DO
outfile_old(1:128) = outfile(1:128)
IF ( iiend == nproc_x*nproc_y ) THEN
WRITE(outfile, '(a)') fileheader(1:lenstr)
ELSE
WRITE(outfile, '(a,a,i3.3)') &
fileheader(1:lenstr),'_tmp',iiend
END IF
CALL asnfile
(outfile, '-F f77 -N ieee', ierr)
IF (iiend == nproc_x*nproc_y) THEN
i = index(outfile, 'bin', .TRUE.)
IF (i <=0 .OR. i == 3) THEN
WRITE(6,*) "WARNING: Are you sure the input data file is in binary format?"
WRITE(6,*) "Filename ", outfile, " may be consturcted incorrectly."
ELSE
WRITE(outfile,'(a)') outfile(1:i-1)//'hdf'//outfile(i+3:LEN_TRIM(outfile))
END IF
CALL hdfopen
(outfile,2,sd_ido)
IF (sd_ido < 0) THEN
WRITE (6,*) "JOINBIN2HDF: ERROR creating HDF4 file: ", outfile
CALL arpsstop
('arpsstop called from JOINBIN2HDF',1)
END IF
ELSE
OPEN (UNIT=junit0+joff,FILE=outfile,FORM='unformatted')
END IF
IF (joff > 0 ) &
OPEN (UNIT=junit0+joff-1,FILE=outfile_old,FORM='unformatted')
!
!-----------------------------------------------------------------------
!
! Read/write header info
!
!-----------------------------------------------------------------------
!
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) fmtver
END DO
IF (fmtver /= fmtverbin) THEN
WRITE(*,*) "ERROR: Data format mismatch."
WRITE(*,*) " Expected is ", fmtverbin, "Read in from file", &
filename, " is ", fmtver
CALL arpsstop
("Dat format incompatible", 1)
END IF
IF (iiend == nproc_x*nproc_y) &
CALL hdfwrtc
(sd_ido, 40, 'fmtver', fmtverhdf, istat)
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) runname
END DO
IF (iiend == nproc_x*nproc_y) &
CALL hdfwrtc
(sd_ido, 40, 'runname', runname, istat)
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) nocmnt
END DO
IF (iiend == nproc_x*nproc_y) &
CALL hdfwrti
(sd_ido, 'nocmnt', nocmnt, istat)
IF (jj == 1) ALLOCATE (cmnt(nocmnt))
IF ( nocmnt > 0 ) THEN
DO i=1,nocmnt
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) cmnt(i)
END DO
END DO
IF (iiend == nproc_x*nproc_y) &
CALL hdfwrtc
(sd_ido, 80*nocmnt, 'cmnt', cmnt, istat)
END IF
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) curtim,tmunit
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrtc
(sd_ido, 7, 'tmunit', tmunit, istat)
CALL hdfwrtr
(sd_ido, 'time', curtim, istat)
END IF
!
!-----------------------------------------------------------------------
!
! Read/write dimensions of data in binary file and check against
! the dimensions passed to JOINBIN2HDF
!
!-----------------------------------------------------------------------
!
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) nxin,nyin,nzin
END DO
IF ((nxin /= nx).OR.(nyin /= ny).OR.(nzin /= nz)) THEN
WRITE (*,*) "ERROR: missmatch in sizes."
WRITE (*,*) "nxin,nyin,nzin",nxin,nyin,nzin
WRITE (*,*) "nx,ny,nz",nx,ny,nz
STOP
END IF
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrti
(sd_ido, 'nx', nxlg, istat)
CALL hdfwrti
(sd_ido, 'ny', nylg, istat)
CALL hdfwrti
(sd_ido, 'nz', nzlg, istat)
END IF
!
!-----------------------------------------------------------------------
!
! Read/write flags for different data groups.
!
!-----------------------------------------------------------------------
!
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) &
i01, i02, i03, i04, i05, &
i06, i07, i08, i09, i10, &
i11, i12, i13, i14, i15, &
i16, i17, i18, i19, i20
END DO
landflg = i09
sfcflg = i07
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrti
(sd_ido, 'grdflg', i01, istat)
CALL hdfwrti
(sd_ido, 'basflg', i02, istat)
CALL hdfwrti
(sd_ido, 'varflg', i03, istat)
CALL hdfwrti
(sd_ido, 'mstflg', i04, istat)
CALL hdfwrti
(sd_ido, 'iceflg', i05, istat)
CALL hdfwrti
(sd_ido, 'trbflg', i06, istat)
CALL hdfwrti
(sd_ido, 'sfcflg', i07, istat)
CALL hdfwrti
(sd_ido, 'rainflg',i08, istat)
CALL hdfwrti
(sd_ido, 'landflg',i09, istat)
CALL hdfwrti
(sd_ido, 'totflg', i10, istat)
CALL hdfwrti
(sd_ido, 'tkeflg', i11, istat)
CALL hdfwrti
(sd_ido, 'mapproj', i14, istat)
CALL hdfwrti
(sd_ido, 'month', i15, istat)
CALL hdfwrti
(sd_ido, 'day', i16, istat)
CALL hdfwrti
(sd_ido, 'year', i17, istat)
CALL hdfwrti
(sd_ido, 'hour', i18, istat)
CALL hdfwrti
(sd_ido, 'minute',i19, istat)
CALL hdfwrti
(sd_ido, 'second',i20, istat)
END IF
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) &
r01, r02, r03, r04, r05, &
r06, r07, r08, r09, r10, &
r11, r12, r13, r14, r15, &
r16, r17, r18, r19, r20
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrtr
(sd_ido, 'umove', r01, istat)
CALL hdfwrtr
(sd_ido, 'vmove', r02, istat)
CALL hdfwrtr
(sd_ido, 'xgrdorg', r03, istat)
CALL hdfwrtr
(sd_ido, 'ygrdorg', r04, istat)
CALL hdfwrtr
(sd_ido, 'trulat1', r05, istat)
CALL hdfwrtr
(sd_ido, 'trulat2', r06, istat)
CALL hdfwrtr
(sd_ido, 'trulon', r07, istat)
CALL hdfwrtr
(sd_ido, 'sclfct', r08, istat)
CALL hdfwrtr
(sd_ido, 'tstop', r16, istat)
CALL hdfwrtr
(sd_ido, 'thisdmp', r17, istat)
CALL hdfwrtr
(sd_ido, 'latitud', r18, istat)
CALL hdfwrtr
(sd_ido, 'ctrlat', r19, istat)
CALL hdfwrtr
(sd_ido, 'ctrlon', r20, istat)
END IF
IF (i10 == 1) THEN
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) &
i01, i02, i03, i04, i05, &
i06, i07, i08, i09, i10, &
i11, i12, i13, i14, i15, &
i16, i17, i18, i19, i20
END DO
nstyp = i01
IF (nstyp < 1) nstyp = 1
IF (jj == 1) THEN
ALLOCATE(soiltyp(nxlg, nylg, nstyp))
AlLOCATE(stypfrct(nxlg,nylg, nstyp))
ALLOCATE(tsfc( nxlg, nylg, 0:nstyp))
tsfc = 0.0
ALLOCATE(tsoil( nxlg, nylg, 0:nstyp))
tsoil = 0.0
ALLOCATE(wetsfc( nxlg, nylg, 0:nstyp))
wetsfc = 0.0
ALLOCATE(wetdp( nxlg, nylg, 0:nstyp))
wetdp = 0.0
ALLOCATE(wetcanp(nxlg, nylg, 0:nstyp))
wetcanp = 0.0
END IF
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrti
(sd_ido, 'nstyp', i01, istat)
CALL hdfwrti
(sd_ido, 'prcflg', i02, istat)
CALL hdfwrti
(sd_ido, 'radflg', i03, istat)
CALL hdfwrti
(sd_ido, 'flxflg', i04, istat)
CALL hdfwrti
(sd_ido, 'snowflg',i06, istat)
END IF
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) &
r01, r02, r03, r04, r05, &
r06, r07, r08, r09, r10, &
r11, r12, r13, r14, r15, &
r16, r17, r18, r19, r20
END DO
END IF
!
!----------------------------------------------------------------------
!
! For every 1-, 2-, or 3-d set of data in the input file, read in
! the arrays from each processor's file and write out the
! combined data.
!
!----------------------------------------------------------------------
!
400 CONTINUE
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii),END=310) label
END DO
WRITE(varname,'(a)') label(1:8)
DO i = 1,8
IF(varname(i:i)== " ") EXIT
END DO
WRITE(varname,'(a)') varname(1:i-1)
IF (LEN_TRIM(varname) < 1) THEN
WRITE(6,'(3a)') 'Can not determind variable name from the label',&
label, 'Program stopped at JOINBIN2HDF.'
CALL arpsstop
('arpsstop called from JOINBIN2HDF',1)
END IF
SELECT CASE (label(12:12))
CASE ('1')
stg_dim = 1
CASE ('2')
stg_dim = 2
CASE ('3')
stg_dim = 3
CASE DEFAULT
stg_dim = 0
END SELECT
!
!--------------------------------------------------------------------------
!
! Please noted that BIN and HDF have differenct label for:
!
! prcrat1(prcrate1), prcrat2(prcrate2), prcrat3(prcrate3), prcrat4(prcrate4)
! and stypfrc(stypfrct)
!
!--------------------------------------------------------------------------
IF (varname(1:6)== "prcrat") THEN
WRITE(varname, '(a)') "prcrate"//varname(7:7)
ELSE IF (varname == "stypfrc") THEN
WRITE(varname, '(a)') "stypfrct"
END IF
WRITE(6,*) "JOINBIN2HDF: ", varname, "being joined. Label in: ", label
IF (label(10:10) == "1") THEN
IF (label(12:12) == "1") THEN ! 1-d x
!
!----------------------------------------------------------------------
!
! x.
!
!----------------------------------------------------------------------
!
IF (joff > 0 ) READ (junit0+joff-1) xlg
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) xsm
IF (fj == 1) THEN
DO i=1,nx
xlg(i+(fi-1)*(nx-3)) = xsm(i)
END DO
END IF
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt1d
(xlg,nxlg,sd_ido,'x','x coordinate','m')
WRITE(6,*) "Writing x"
ELSE
WRITE (junit0+joff) xlg
END IF
ELSE IF (label(12:12) == "2") THEN ! 1-d y
!
!----------------------------------------------------------------------
!
! y.
!
!----------------------------------------------------------------------
!
IF (joff > 0 ) READ (junit0+joff-1) ylg
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) ysm
IF (fi == 1) THEN
DO j=1,ny
ylg(j+(fj-1)*(ny-3)) = ysm(j)
END DO
END IF
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt1d
(ylg,nylg,sd_ido,'y','y coordinate','m')
WRITE(6,*) "Writing y"
ELSE
WRITE (junit0+joff) ylg
END IF
ELSE IF (label(12:12) == "3") THEN ! 1-d z
!
!----------------------------------------------------------------------
!
! z.
!
!----------------------------------------------------------------------
!
IF (joff > 0 ) READ (junit0+joff-1) z
DO ii=1+(jj-1)*maxunit,iiend
READ (iunit(ii)) z
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt1d
(z,nzlg,sd_ido,'z','z coordinate','m')
WRITE(6,*) "Writing z"
ELSE
WRITE (junit0+joff) z
END IF
ELSE
GO TO 330
END IF
ELSE IF (label(10:10) == "2") THEN
IF (label(9:9) == "r") THEN ! 2-d real
!---------------------------------------------------------------------
!
! Soil variables (stypfrct, tsfc, tsoil, wetsfc, wetdp, wetcanp)
!
!---------------------------------------------------------------------
SELECT CASE (varname)
CASE ("tsfc")
IF (sfcflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil variable(",varname, &
") output is mismatch with sfcflg (", sfcflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
nstypvar = nstypvar+1
IF (joff > 0 .AND. nstypvar < 6 ) READ (junit0+joff-1) tsfc
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
tsfc(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), (nstypvar-1)/5) = &
a2dsm(i,j)
END DO
END DO
END DO
IF ((nstypvar-1)/5+1 > nstyp .OR. nstyp <= 1) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(tsfc,nxlg,nylg,nstyp+1,sd_ido,0,hdfcompr, &
'tsfc','','', itmp,hmax,hmin)
WRITE(6,*) "Writing tsfc"
ELSE
WRITE (junit0+joff) tsfc
END IF
END IF
CASE ("tsoil")
IF (sfcflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil variable(",varname, &
") output is mismatch with sfcflg (", sfcflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
nstypvar = nstypvar+1
IF (joff > 0 .AND. nstypvar < 6 ) READ (junit0+joff-1) tsoil
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
tsoil(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), (nstypvar-1)/5) = &
a2dsm(i,j)
END DO
END DO
END DO
IF ((nstypvar-1)/5+1 > nstyp .OR. nstyp <= 1) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(tsoil,nxlg,nylg,nstyp+1,sd_ido,0,hdfcompr, &
'tsoil','','', itmp,hmax,hmin)
WRITE(6,*) "Writing tsoil"
ELSE
WRITE (junit0+joff) tsoil
END IF
END IF
CASE ("wetsfc")
IF (sfcflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil variable(",varname, &
") output is mismatch with sfcflg (", sfcflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
nstypvar = nstypvar+1
IF (joff > 0 .AND. nstypvar < 6 ) READ (junit0+joff-1) wetsfc
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
wetsfc(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), (nstypvar-1)/5) = &
a2dsm(i,j)
END DO
END DO
END DO
IF ((nstypvar-1)/5+1 > nstyp .OR. nstyp <= 1) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(wetsfc,nxlg,nylg,nstyp+1,sd_ido,0,hdfcompr, &
'wetsfc','','', itmp,hmax,hmin)
WRITE(6,*) "Writing wetsfc"
ELSE
WRITE (junit0+joff) wetsfc
END IF
END IF
CASE ("wetdp")
IF (sfcflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil variable(",varname, &
") output is mismatch with sfcflg (", sfcflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
nstypvar = nstypvar+1
IF (joff > 0 .AND. nstypvar < 6 ) READ (junit0+joff-1) wetdp
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
wetdp(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), (nstypvar-1)/5) = &
a2dsm(i,j)
END DO
END DO
END DO
IF ((nstypvar-1)/5+1 > nstyp .OR. nstyp <= 1) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(wetdp,nxlg,nylg,nstyp+1,sd_ido,0,hdfcompr, &
'wetdp','','', itmp,hmax,hmin)
WRITE(6,*) "Writing wetdp"
ELSE
WRITE (junit0+joff) wetdp
END IF
END IF
CASE ("wetcanp")
IF (sfcflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil variable(",varname, &
") output is mismatch with sfcflg (", sfcflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
nstypvar = nstypvar+1
IF (joff > 0 .AND. nstypvar < 6 ) READ (junit0+joff-1) wetcanp
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
wetcanp(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), (nstypvar-1)/5) = &
a2dsm(i,j)
END DO
END DO
END DO
IF ((nstypvar-1)/5+1 > nstyp .OR. nstyp <= 1) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(wetcanp,nxlg,nylg,nstyp+1,sd_ido,0,hdfcompr, &
'wetcanp','','', itmp,hmax,hmin)
WRITE(6,*) "Writing wetcanp"
ELSE
WRITE (junit0+joff) wetcanp
END IF
END IF
CASE ("stypfrct")
IF (landflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil fraction output is mismatch &
& with landflg (", landflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
IF (joff > 0 .AND. is == 1 ) READ (junit0+joff-1) stypfrct
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
stypfrct(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), is) = a2dsm(i,j)
END DO
END DO
END DO
IF (is >= nstyp) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(stypfrct,nxlg,nylg,nstyp,sd_ido,0,hdfcompr, &
'stypfrct','','', itmp,hmax,hmin)
WRITE(6,*) "Writing stypfrct"
ELSE
WRITE (junit0+joff) stypfrct
END IF
END IF
CASE DEFAULT
!
!----------------------------------------------------------------------
!
! 2-d real array.
!
!----------------------------------------------------------------------
!
IF (joff > 0 ) READ (junit0+joff-1) a2dlg
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
a2dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3)) = a2dsm(i,j)
END DO
END DO
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt2d
(a2dlg,nxlg,nylg,sd_ido,0,hdfcompr, &
varname,'','',itmp2d)
WRITE(6,*) "Writing ", varname
ELSE
WRITE (junit0+joff) a2dlg
END IF
END SELECT
ELSE IF (label(9:9) == "i") THEN ! 2-d integer
!---------------------------------------------------------------------
!
! Soiltyp
!
!---------------------------------------------------------------------
IF (varname == "soiltyp") THEN
IF (landflg /= 1) THEN
WRITE (*,*) "JOINBIN2HDF: Soil type output is mismatch &
& with landflg (", landflg,")."
CALL arpsstop ("ARPSSTOP called from JOINBIN2HDF.", 1)
END IF
is = is + 1
IF (joff > 0 .AND. is == 1 ) READ (junit0+joff-1) soiltyp
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) ai2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
soiltyp(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), is) = ai2dsm(i,j)
END DO
END DO
END DO
! WRITE(6,*) " istype: ", is, " of ", nstyp
IF (is >= nstyp) THEN
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3di
(soiltyp,nxlg,nylg,nstyp,sd_ido,0,hdfcompr, &
'soiltyp','','')
WRITE(6,*) "Writing soiltyp"
ELSE
WRITE (junit0+joff) soiltyp
END IF
END IF
ELSE
!
!----------------------------------------------------------------------
!
! 2-d integer array.
!
!----------------------------------------------------------------------
!
IF (joff > 0 ) READ (junit0+joff-1) ai2dlg
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) ai2dsm
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
ai2dlg(i+(fi-1)*(nx-3),j+(fj-1)*(ny-3)) = ai2dsm(i,j)
END DO
END DO
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt2di
(ai2dlg,nxlg,nylg,sd_ido,0,0, &
varname,'','')
WRITE(6,*) "Writing ", varname
ELSE
WRITE (junit0+joff) ai2dlg
END IF
END IF ! varname = "soiltyp"
ELSE
GO TO 330
END IF
ELSE IF (label(10:10) == "3") THEN ! 3-d
!
!----------------------------------------------------------------------
!
! 3-d real array.
!
!----------------------------------------------------------------------
!
IF (joff > 0 ) READ (junit0+joff-1) a3dlg
DO ii=1+(jj-1)*maxunit,iiend
fi = ffi(ii)
fj = ffj(ii)
READ (iunit(ii)) a3dsm
DO k = 1,nz
DO j=j0(fi,fj),ny
DO i=i0(fi,fj),nx
a3dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), k) = &
a3dsm(i,j,k)
END DO
END DO
END DO
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfwrt3d
(a3dlg,nxlg,nylg,nz,sd_ido,stg_dim,hdfcompr, &
varname,'','', itmp,hmax,hmin)
WRITE(6,*) "Writing ", varname
ELSE
WRITE (junit0+joff) a3dlg
END IF
ELSE
GO TO 330
END IF
GO TO 400
!
!-----------------------------------------------------------------------
!
! Error free finish. Close files and return.
!
!----------------------------------------------------------------------
!
310 CONTINUE
DO ii=1+(jj-1)*maxunit,iiend
CLOSE (iunit(ii))
END DO
IF (iiend == nproc_x*nproc_y) THEN
CALL hdfclose
(sd_ido,istat)
IF (istat == 0) THEN
WRITE(*,*) "JOINBIN2HDF: Successfully dump ", trim(outfile)
ELSE
WRITE(*,*) "JOINBIN2HDF: ERROR (status=", istat, ") closing ", trim(outfile)
END IF
ELSE
CLOSE (junit0+joff)
END IF
IF (joff > 0) THEN
CLOSE (junit0+joff-1,STATUS='delete')
END IF
joff = joff + 1
END DO ! jj
!-----------------------------------------------------------------------
!
! DEALLOCATE the arrays
!
!----------------------------------------------------------------------
DEALLOCATE(xlg, ylg, z, STAT= istat)
DEALLOCATE(xsm, ysm, STAT= istat)
DEALLOCATE(a3dlg, a3dsm, STAT= istat)
DEALLOCATE(a2dlg, a2dsm, STAT= istat)
DEALLOCATE(ai2dlg, ai2dsm, STAT= istat)
DEALLOCATE(i0, j0, STAT= istat)
DEALLOCATE(iunit, ffi, ffj, STAT= istat)
DEALLOCATE(itmp, itmp2d, hmax, hmin, STAT= istat)
DEALLOCATE(cmnt)
IF (i10 == 1) THEN
DEALLOCATE(soiltyp, stypfrct, STAT= istat)
DEALLOCATE(tsfc, tsoil, wetsfc, wetdp, wetcanp, STAT= istat)
END IF
RETURN
!
!----------------------------------------------------------------------
!
! Error with the label.
!
!----------------------------------------------------------------------
!
330 CONTINUE
WRITE(6,'(a,a)') ' Error with label in JOINBIN2HDF:',label
STOP 330
END SUBROUTINE joinbin2hdf