!
!wdt updated grid variables 2001-08-03 GMB
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE RDSATFLD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma. ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE rdsatfld(nx,ny,nfield, & 3,27
sfname,satname,latsat,lonsat, &
itime,isource,fldname,satfld,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Reads remapped satellite data to a file as one or
! more 2-d fields.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 09/20/97
!
! MODIFICATION HISTORY:
!
! 2001/08/03 (Gene Bassett)
! Read satellite grid parameters into temporary variables and compare
! to those defined in the common block.
!
! 04/17/01 (Leilei Wang)
! Added processing for hdf files.
!
!-----------------------------------------------------------------------
!
! INPUT:
! nx,ny horizontal dimensions
! nfield number of satellite fields to write
! sfname satellite file name (character string)
! satnam satellite name (character*6)
! latsat sub-satellite latitude (degrees N)
! lonsat sub-satellite longitude (degrees E)
! itime time, seconds since 1960
! isource source number
! 1= GVAR raw 2-byte data file
! 2= IDD 1-byte datafeed
! fldname name of variable(s) (character*6 array)
! satfld satellite data
!
! OUTPUT:
! data are written to file
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER :: nx,ny
INTEGER :: nfield
CHARACTER (LEN=*) :: sfname
CHARACTER (LEN=6) :: satname
REAL :: latsat
REAL :: lonsat
INTEGER :: itime
INTEGER :: isource
CHARACTER (LEN=6) :: fldname(nfield)
REAL :: satfld(nx,ny,nfield)
INTEGER :: istatus,istat
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=80) :: dummy_name
INTEGER :: iunit,iopen
INTEGER :: idummy
INTEGER :: nxin,nyin,nfieldin
REAL :: dxin,dyin,ctrlatin,ctrlonin,trlat1in,trlat2in,trlonin,sclfctin
INTEGER :: mprojin
REAL :: rdummy
INTEGER :: ireturn
INTEGER :: dmpfmt,sd_id,lens,i
!
!-----------------------------------------------------------------------
!
! hdf temporary arrays
!
!-----------------------------------------------------------------------
!
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmp(:,:,:)
REAL, ALLOCATABLE :: hmax(:)
REAL, ALLOCATABLE :: hmin(:)
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
PRINT *, ' sfname= ',sfname
PRINT *, ' nx,ny,nfield= ',nx,ny,nfield
!
CALL getunit
(iunit)
!
!-----------------------------------------------------------------------
!
! Open file for reading
!
!-----------------------------------------------------------------------
!
lens = LEN(trim(sfname))
IF(sfname(lens-3:lens)=='hdf4')THEN
dmpfmt=2
ELSE
dmpfmt=1
END IF
WRITE(6,'(a,i4,a,a)') ' rdsatfld: dmpfmt= ',dmpfmt,' sfname=',sfname
IF (dmpfmt == 1) THEN
OPEN(iunit,IOSTAT=iopen,FILE=trim(sfname),STATUS='old', &
FORM='unformatted')
IF(iopen == 0) THEN
!
!-----------------------------------------------------------------------
!
! Read satellite description variables
!
!-----------------------------------------------------------------------
!
READ (iunit,ERR=200) satname
READ (iunit,ERR=200) nxin,nyin,nfieldin,itime,idummy, &
idummy,idummy,idummy,idummy,idummy
!-----------------------------------------------------------------------
!
! Read grid description variables
! This should provide enough info to uniquely identify the 2-d grid.
!
!-----------------------------------------------------------------------
!
READ (iunit,ERR=200) dummy_name
READ (iunit,ERR=200) idummy,idummy,mprojin,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
READ (iunit,ERR=200) dxin,dyin,rdummy,rdummy,ctrlatin, &
ctrlonin,trlat1in,trlat2in,trlonin,sclfctin, &
latsat,lonsat,rdummy,rdummy,rdummy
ELSE
istatus=iopen
END IF
ELSE ! HDF4 format
CALL hdfopen
(trim(sfname), 1, sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "RDRADCOL: ERROR opening ", &
trim(sfname)," for reading."
GO TO 200
END IF
CALL hdfrdc
(sd_id, 6, 'satname', satname, istat)
CALL hdfrdi
(sd_id, 'nx', nxin, istat)
CALL hdfrdi
(sd_id, 'ny', nyin, istat)
CALL hdfrdi
(sd_id, 'nfield', nfieldin, istat)
CALL hdfrdi
(sd_id, 'itime', itime, istat)
CALL hdfrdc
(sd_id, 4, 'runname', dummy_name, istat)
CALL hdfrdi
(sd_id, 'hdmpfmt', idummy, istat)
CALL hdfrdi
(sd_id, 'strhopt', idummy, istat)
CALL hdfrdi
(sd_id, 'mapproj', mprojin, istat)
CALL hdfrdr
(sd_id, 'dx', dxin, istat)
CALL hdfrdr
(sd_id, 'dy', dyin, istat)
CALL hdfrdr
(sd_id, 'dz', rdummy, istat)
CALL hdfrdr
(sd_id, 'dzmin', rdummy, istat)
CALL hdfrdr
(sd_id, 'ctrlat', ctrlatin, istat)
CALL hdfrdr
(sd_id, 'ctrlon', ctrlonin, istat)
CALL hdfrdr
(sd_id, 'trulat1', trlat1in, istat)
CALL hdfrdr
(sd_id, 'trulat2', trlat2in, istat)
CALL hdfrdr
(sd_id, 'trulon', trlonin, istat)
CALL hdfrdr
(sd_id, 'sclfct', sclfctin, istat)
CALL hdfrdr
(sd_id, 'latsat', latsat, istat)
CALL hdfrdr
(sd_id, 'lonsat', lonsat, istat)
ENDIF
!
!-----------------------------------------------------------------------
!
! Check dimensions and grid parameters of incoming data.
!
!-----------------------------------------------------------------------
!
IF(iopen==0)THEN
CALL checkgrid2d
(nx,ny,nxin,nyin, &
dx,dy,ctrlat,ctrlon, &
mapproj,trulat1,trulat2,trulon,sclfct, &
dxin,dyin,ctrlatin,ctrlonin, &
mprojin,trlat1in,trlat2in,trlonin,sclfctin,ireturn)
IF (ireturn /= 0) THEN
WRITE (6,*) "RDSATFLD: ERROR, grid parameter mismatch in ", &
"satellite date file ",trim(sfname)
STOP
END IF
ELSE
istatus=iopen
END IF
!
!-----------------------------------------------------------------------
!
! Read 2-d fields.
!
!-----------------------------------------------------------------------
!
IF(dmpfmt==1)THEN
IF(iopen==0)THEN
READ(iunit,ERR=200) fldname
READ(iunit,ERR=200) satfld
!
CLOSE(iunit)
CALL retunit(iunit)
ELSE
istatus=iopen
END IF
ELSE
DO i = 1,nfield
CALL hdfrdc
(sd_id, 6, 'fldname', fldname(i), istat)
ENDDO
ALLOCATE (itmp(nx,ny,nfield),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREAD: ERROR allocating itmp, returning"
STOP
END IF
ALLOCATE (hmax(nfield),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREAD: ERROR allocating hmax, returning"
STOP
END IF
ALLOCATE (hmin(nfield),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "HDFREAD: ERROR allocating hmin, returning"
STOP
END IF
CALL hdfrd3d
(sd_id,"satfld",nx,ny,nfield,satfld,istat,itmp, &
hmax,hmin)
IF (istat /= 0) GO TO 200
CALL hdfclose
(sd_id,istat)
IF (istat /= 0) THEN
WRITE (6,*) "RDSATFLD: ERROR on closing file ",trim(sfname), &
" (status",istat,")"
END IF
DEALLOCATE(itmp)
DEALLOCATE(hmax)
DEALLOCATE(hmin)
END IF
!
!-----------------------------------------------------------------------
!
! Report on what data were read
!
!-----------------------------------------------------------------------
!
IF(dmpfmt==1)THEN
IF(iopen==0)THEN
WRITE(6,'(//a,a,a,a)') ' Read ',fldname(1),' from ',satname
!
PRINT *, ' satname= ',satname
PRINT *, ' lat,lon= ',latsat,lonsat
PRINT *, ' itime= ',itime
PRINT *, ' isource = ',isource
PRINT *, ' fldname= ',fldname(1)
PRINT *, ' satfld(1,1,1)= ',satfld(1,1,1)
PRINT *, ' satfld(nx,ny,1) = ',satfld(nx,ny,1)
istatus=0
ELSE
istatus=iopen
END IF
ELSE
istatus=0
END IF
RETURN
200 CONTINUE
istatus=-1
RETURN
END SUBROUTINE rdsatfld