!
! $Id: read_mask.f v 1. 2003/07/24 fletcher Exp $
!
!_ ---------------------------------------------------------------------
!_ $Log: read_mask.f $
!_ Revision 1. 24/07/2003 Sara Fletcher
!_ Started Coding
!_
!***********************************************************************
!
! NAME: READ_MASK.F
!
! DESCRIPTION: This program demonstrates how to read a 3-D netCDF region mask 
!              file.
!
! COMPILING: 
!
!          f77-o read_mask.x read_mask.f /usr/appl/lib/libnetcdf_g77.a -lnsl
!
! VARIABLES:
!       imt, jmt: indices of the region mask in the input file 
!       filename = Name of Net CDF file
!       ndyetrac  = Number of dye regions (30 or 16)
!       region_index = 2-D array containing a region index which assigns each 
!                      ocean region to a different index value
!       region_mask = 3-D (i,j,ndyetrac) array. Gridboxes included in each
!                     model region are set to 1 and those not included are set
!                     to -99.  
!
!***********************************************************************

	PROGRAM read_mask
     
! No implicit declarations
        IMPLICIT NONE
        INCLUDE 'netcdf.inc'

! define variables
	CHARACTER*256 string256,filename
	INTEGER ndyetrac,imt,jmt, i,j,n 
        PARAMETER (ndyetrac=30)  !Equals 30 or 16
        PARAMETER (imt= 96, jmt=40)
        REAL*4 lon(imt)
        REAL*4 lat(jmt)
        CHARACTER*30, reg_name(ndyetrac)
        CHARACTER*1, string1
        CHARACTER*2, string2
        INTEGER region_index(imt,jmt)
        INTEGER mask_temp(imt,jmt), region_mask(imt,jmt,ndyetrac)
        

        INTEGER*4  NC_ID, STATUS
        INTEGER*4 idlon, idlat, idtrac, idindex, idmask(ndyetrac)



!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!  Generate region names
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        
        do i=1,ndyetrac
         if (i.lt.10) then
          write(string1,'(I1.1)') i
          reg_name(i)='region'//string1
         else
          write(string2,'(I2.2)') i
          reg_name(i)='region'//string2
         endif 
       enddo


!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! NetCDF filename
! Either 30reg_regionmask.cdf or 16reg_regionmask.cdf 
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        
        if (ndyetrac.eq.30) then
          filename='30reg_regionmask.cdf'
        else if (ndyetrac.eq.16) then
          filename='16reg_regionmask.cdf'
        endif 

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Open the NetCDF file
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	STATUS=NF_OPEN(filename,NF_NOWRITE,NC_ID)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Get the netCDF variable dimensions 
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
        STATUS=NF_INQ_DIMID(NC_ID,'tlon',idlon)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

	STATUS=NF_INQ_DIMID(NC_ID,'tlat',idlat)
         IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
        
	STATUS=NF_INQ_VARID(NC_ID,'reg_indx',idindex)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        do i=1,ndyetrac
	 STATUS=NF_INQ_VARID(NC_ID,reg_name(i),idmask(i))
	 IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
        enddo

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! READ the netCDF DATA
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	STATUS=NF_GET_VAR_REAL(NC_ID,idlon, lon)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

	STATUS=NF_GET_VAR_REAL(NC_ID,idlat,lat)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

	STATUS=NF_GET_VAR_INT(NC_ID,idindex,region_index)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        do n=1,ndyetrac
	 STATUS=NF_GET_VAR_INT(NC_ID,idmask(n),mask_temp)
	 IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
         do i=1,imt
          do j=1,jmt         
           region_mask(i,j,n)=mask_temp(i,j)
          enddo
         enddo  
       enddo


!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Close the NetCDF file
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	STATUS=NF_CLOSE(NC_ID)
	IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

	END


!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Error handling subroutine
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        SUBROUTINE HANDLE_ERRORS(STATUS)

        INCLUDE 'netcdf.inc'
        INTEGER*4 STATUS

        IF (STATUS .NE. nf_noerr) THEN
                PRINT *, nf_strerror(STATUS)
                STOP 'stopped'
        ENDIF

        END

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

