!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
SUBROUTINE split_hdf(fileheader,nxsm,nysm,nz,buf_r,buf_i,buf_i16,sstat) 8,23
IMPLICIT NONE
! INCLUDE 'mpif.h'
INCLUDE 'mp.inc'
INCLUDE 'hdf.f90' ! HDF4 library include file
CHARACTER (LEN=*) :: fileheader
INTEGER :: nxsm,nysm,nz
INTEGER :: sstat ! split status: sstat=1 if error encountered
INTEGER :: nxlg, nylg
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
CHARACTER (LEN=128) :: filename
INTEGER :: fi, fj, i, j, k
INTEGER :: nxin, nyin, nzin
REAL :: buf_r(nxsm,nysm,nz)
INTEGER :: buf_i(nxsm,nysm,nz)
INTEGER (KIND=selected_int_kind(4)):: buf_i16(nxsm,nysm,nz)
INTEGER :: ierr
INTEGER :: sd_id,sd_id2,ndata,nattr,istat,aindex,dindex
INTEGER :: sds_id,sds_id2,rank,dims(6),dtype,ndattr
CHARACTER (LEN=128) :: name, aname
CHARACTER (LEN=1024) :: char_attr
CHARACTER (LEN=1), ALLOCATABLE :: lchar_attr(:)
INTEGER :: nvalues
INTEGER :: istart, iend, jstart, jend
INTEGER :: size(3),start(3),stride(3),strideout(3),startout(3)
INTEGER :: x_off, y_off
INTEGER :: comp_code, comp_prm(1)
!-----------------------------------------------------------------------
!
! Functions
!
!-----------------------------------------------------------------------
INTEGER :: sfcreate, sfrdata, sfrnatt, sfscompress, sfselect, &
sfsnatt, sfwdata, sfendacc
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
nxlg = (nxsm-3)*nproc_x+3
nylg = (nysm-3)*nproc_y+3
stride = 1
startout = 0
sstat = 0
!-----------------------------------------------------------------------
!
! Open the original file, read in its attributes and check the
! dimensions in the file against the dimensions passed in.
!
!-----------------------------------------------------------------------
CALL hdfopen
(trim(fileheader),1,sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR opening ", &
trim(fileheader)," for reading."
sstat = 1
RETURN
END IF
CALL hdfinfo
(sd_id,ndata,nattr,istat)
CALL hdfrdi
(sd_id,"nx",nxin,istat)
CALL hdfrdi
(sd_id,"ny",nyin,istat)
IF (nz > 1) THEN
CALL hdfrdi
(sd_id,"nz",nzin,istat)
ELSE
nzin = nz ! the file is 2-D so it won't have nz
ENDIF
IF ((nxin /= nxlg).OR.(nyin /= nylg).OR.(nzin /= nz)) THEN
WRITE (*,*) "ERROR: mismatch in sizes."
WRITE (*,*) "nxin,nyin,nzin: ",nxin,nyin,nzin
WRITE (*,*) "nxlg,nylg,nz: ",nxlg,nylg,nz
sstat = 1
RETURN
END IF
if ( mp_opt > 0 ) then
istart = loc_x
iend = loc_x
jstart = loc_y
jend = loc_y
else
istart = 1
iend = nproc_x
jstart = 1
jend = nproc_y
endif
! DO fj=1,nproc_y
! DO fi=1,nproc_x
DO fj=jstart,jend
DO fi=istart,iend
x_off = (fi-1) * (nxsm-3)
y_off = (fj-1) * (nysm-3)
!-----------------------------------------------------------------------
!
! Create each split file.
!
!-----------------------------------------------------------------------
WRITE (filename, '(a,a,2i2.2)') &
trim(fileheader),'_',fi,fj
CALL hdfopen
(filename,2,sd_id2)
IF (sd_id2 < 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR creating HDF4 file: ", &
trim(filename)
sstat = 1
GO TO 600
END IF
!-----------------------------------------------------------------------
!
! Read/write header info.
!
!-----------------------------------------------------------------------
DO aindex = 0,nattr-1
CALL hdfainfo
(sd_id,aindex,name,dtype,nvalues,istat)
IF (dtype == dfnt_char8) THEN
IF (nvalues > 1024) THEN
ALLOCATE (lchar_attr(nvalues))
CALL hdfrdc
(sd_id,nvalues,name,lchar_attr,istat)
CALL hdfwrtc
(sd_id2,nvalues,name,lchar_attr,istat)
DEALLOCATE(lchar_attr)
ELSE
CALL hdfrdc
(sd_id,nvalues,name,char_attr,istat)
CALL hdfwrtc
(sd_id2,nvalues,name,char_attr,istat)
ENDIF
ELSE IF (dtype == dfnt_float32) THEN
istat = sfrnatt(sd_id, aindex, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, reading attribute ",trim(name)
sstat = 1
GOTO 600
ENDIF
istat = sfsnatt(sd_id2, trim(name), dfnt_float32, nvalues, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, writing attribute ",trim(name)
sstat = 1
GOTO 600
ENDIF
ELSE IF (dtype == dfnt_int32) THEN
IF (trim(name) == 'nx') THEN
CALL hdfwrti
(sd_id2, 'nx', nxsm, istat)
ELSE IF (trim(name) == 'ny') THEN
CALL hdfwrti
(sd_id2, 'ny', nysm, istat)
ELSE
istat = sfrnatt(sd_id, aindex, buf_i)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, reading attribute ",trim(name)
sstat = 1
GOTO 600
ENDIF
istat = sfsnatt(sd_id2, trim(name), dfnt_int32, nvalues, buf_i)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, writing attribute ",trim(name)
sstat = 1
GOTO 600
ENDIF
ENDIF
ELSE
WRITE (6,*) "SPLIT_HDF: ERROR, unknown data type for ", &
"attribute ", trim(name)
sstat = 1
GOTO 600
ENDIF
END DO
!-----------------------------------------------------------------------
!
! Read/write each data set.
!
!-----------------------------------------------------------------------
DO dindex = 0,ndata-1
sds_id = sfselect(sd_id,dindex)
! data set
CALL hdfdinfo
(sds_id,name,rank,dims,dtype,ndattr,istat)
start(1) = x_off
start(2) = y_off
start(3) = 0
size(1) = nxsm
size(2) = nysm
size(3) = dims(3)
CALL hdfrdi
(sds_id,"hdf_comp_prm",comp_prm,istat)
CALL hdfrdi
(sds_id,"hdf_comp_code",comp_code,istat)
IF (rank == 1) THEN
IF (dtype /= dfnt_float32) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, unsuppored data type for 1-d ", &
" variable ",trim(name)
sstat = 1
GOTO 600
ENDIF
IF (trim(name) == 'x') THEN ! x
size(1) = nxsm
istat = sfrdata(sds_id, start, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_float32, 1, size)
istat = sfwdata(sds_id2, startout, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ELSE IF (trim(name) == 'y') THEN ! y
start(1) = y_off
size(1) = nysm
istat = sfrdata(sds_id, start, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_float32, 1, size)
istat = sfwdata(sds_id2, startout, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ELSE IF (trim(name) == 'z') THEN ! z
start = 0
size(1) = nz
istat = sfrdata(sds_id, start, stride, dims, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_float32, 1, size)
istat = sfwdata(sds_id2, startout, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ELSE
start = 0
startout = 0
istat = sfrdata(sds_id, start, stride, dims, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_float32, 1, dims)
istat = sfwdata(sds_id2, startout, stride, dims, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ENDIF
ELSE
IF (dtype == dfnt_float32) THEN
istat = sfrdata(sds_id, start, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_float32, rank, size)
IF (comp_prm(1) > 0) THEN
istat = sfscompress(sds_id2, comp_code, comp_prm)
ENDIF
istat = sfwdata(sds_id2, startout, stride, size, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ELSE IF (dtype == dfnt_int32) THEN
istat = sfrdata(sds_id, start, stride, size, buf_i)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_int32, rank, size)
IF (comp_prm(1) > 0) THEN
istat = sfscompress(sds_id2, comp_code, comp_prm)
ENDIF
istat = sfwdata(sds_id2, startout, stride, size, buf_i)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ELSE IF (dtype == dfnt_int16) THEN
istat = sfrdata(sds_id, start, stride, size, buf_i16)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR reading ",trim(name),", exiting"
sstat = 1
GOTO 600
ENDIF
sds_id2 = sfcreate(sd_id2, trim(name), dfnt_int16, rank, size)
IF (comp_prm(1) > 0) THEN
istat = sfscompress(sds_id2, comp_code, comp_prm)
ENDIF
istat = sfwdata(sds_id2, startout, stride, size, buf_i16)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing ",trim(name), &
" to file ",trim(filename)," , exiting"
sstat = 1
GOTO 600
ENDIF
ELSE
WRITE (6,*) "SPLIT_HDF: ERROR, unknown data type for ", &
"attribute ", trim(name)
sstat = 1
GOTO 600
ENDIF
ENDIF
! data set attributes
DO aindex = 0,ndattr-1
CALL hdfainfo
(sds_id,aindex,aname,dtype,nvalues,istat)
IF (dtype == dfnt_char8) THEN
IF (nvalues > 1024) THEN
ALLOCATE (lchar_attr(nvalues))
CALL hdfrdc
(sds_id,nvalues,aname,lchar_attr,istat)
CALL hdfwrtc
(sds_id2,nvalues,aname,lchar_attr,istat)
DEALLOCATE(lchar_attr)
ELSE
CALL hdfrdc
(sds_id,nvalues,aname,char_attr,istat)
CALL hdfwrtc
(sds_id2,nvalues,aname,char_attr,istat)
ENDIF
ELSE IF (dtype == dfnt_float32) THEN
istat = sfrnatt(sds_id, aindex, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, reading attribute ",trim(aname)
sstat = 1
GOTO 600
ENDIF
istat = sfsnatt(sds_id2, trim(aname), dfnt_float32, nvalues, buf_r)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, writing attribute ",trim(aname)
sstat = 1
GOTO 600
ENDIF
ELSE IF (dtype == dfnt_int32) THEN
istat = sfrnatt(sds_id, aindex, buf_i)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, reading attribute ",trim(aname)
sstat = 1
GOTO 600
ENDIF
istat = sfsnatt(sds_id2, trim(aname), dfnt_int32, nvalues, buf_i)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR, writing attribute ",trim(aname)
sstat = 1
GOTO 600
ENDIF
ELSE
WRITE (6,*) "SPLIT_HDF: ERROR, unknown data type for ", &
"attribute ", trim(aname)
sstat = 1
GOTO 600
ENDIF
END DO
istat = sfendacc(sds_id2)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR writing variable ",trim(name)
END IF
END DO ! dindex
CALL hdfclose
(sd_id2,istat)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR on close of file ",trim(filename)
sstat = 1
GOTO 600
ENDIF
END DO ! fi
END DO ! fj
!-----------------------------------------------------------------------
!
! Close I/O and return.
!
!----------------------------------------------------------------------
600 CONTINUE
CALL hdfclose
(sd_id,istat)
IF (istat /= 0) THEN
WRITE (6,*) "SPLIT_HDF: ERROR on close of file ",trim(fileheader)
sstat = 1
ENDIF
RETURN
END SUBROUTINE split_hdf