!====================================================================== ! Description: Function module for generic reading of NetCDF data by ! arbitrary variable name from any of multiple input files. ! May 2002 P. Dirmeyer ! Revision: 1. Set a flag to have the option for decent exit if the ! variable cannot be located in NetCDF files. ! 2. Grided data can be read in, and automatically gathered. ! Jun. 2002 Z. Guo ! $Log: drv_readnf_mod.f90,v $ ! Revision 1.1 2002/08/19 18:49:35 guo ! Initial revision ! !====================================================================== MODULE drv_readnf_mod USE drv_dat_mod USE netcdf ! INTEGER, EXTERNAL :: NF90_GET_VAR ! INTEGER, PARAMETER :: NF90_NOERR = 0 INTERFACE drv_readnf1 MODULE PROCEDURE drv_readnf1_real, drv_readnf1_int, drv_readnf1_rwf, drv_readnf1_iwf END INTERFACE ! drv_readnf1 INTERFACE drv_readnf2 MODULE PROCEDURE drv_readnf2_real, drv_readnf2_int, drv_readnf2_rwf, drv_readnf2_iwf END INTERFACE ! drv_readnf2 INTERFACE drv_readnf2d MODULE PROCEDURE drv_readnf2d_int, drv_readnf2d_real END INTERFACE ! drv_readnf2d INTERFACE drv_readnf3 MODULE PROCEDURE drv_readnf3_real, drv_readnf3_int, drv_readnf3_rwf, drv_readnf3_iwf END INTERFACE ! drv_readnf3 CONTAINS FUNCTION drv_readnf1_real(varname,ncin_dim,nc_input,var,lpnts) ! ! ! This routine reads a single vector from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf1_real ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: lpnts ! Dimension of var REAL, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension REAL, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: iret INTEGER :: indx INTEGER :: i INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! ! print *,varname indx = 0 DO i = 1, ncin_dim IF ( varname == nc_input(i)%ncname) THEN indx = i EXIT ENDIF ENDDO ! IF ( indx > 0 ) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF ENDDO IF (numADims == 1) THEN iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF ELSE IF (numADims == 2) THEN allocate(tmpVar(lenADims(1),lenADims(2))) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf1: this NetCDF variable is neither vector nor 2-D matrix ',varname STOP 'drv_readnf1' ENDIF ELSE WRITE (6,*) 'readnf1: Could not locate NetCDF variable ',varname STOP 'drv_readnf1' ENDIF drv_readnf1_real = iret ! END FUNCTION drv_readnf1_real ! FUNCTION drv_readnf1_rwf(varname,ncin_dim,nc_input,var,lpnts,flag) ! ! ! This routine reads a single vector from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf1_rwf ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: lpnts ! Dimension of var CHARACTER(LEN=3), INTENT(IN) :: flag ! No stop if flag='try' and variable not found REAL, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension REAL, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: iret INTEGER :: indx INTEGER :: i INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! ! print *,varname iret = 0 indx = 0 DO i = 1, ncin_dim IF ( varname == nc_input(i)%ncname ) THEN indx = i EXIT ENDIF ENDDO ! IF ( indx > 0 ) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF ENDDO IF (numADims == 1) THEN iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF ELSE IF (numADims == 2) THEN allocate(tmpVar(lenADims(1),lenADims(2))) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf1: this NetCDF variable is neither vector nor 2-D matrix ',varname STOP 'drv_readnf1' ENDIF ELSE iret = 1 IF(flag /= 'try' .and. flag /= 'TRY') THEN WRITE (6,*) 'readnf1: Could not locate NetCDF variable ',varname STOP 'drv_readnf1' ENDIF ENDIF drv_readnf1_rwf = iret ! END FUNCTION drv_readnf1_rwf ! FUNCTION drv_readnf1_int(varname,ncin_dim,nc_input,var,lpnts) ! ! This routine reads a single vector from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf1_int ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: lpnts ! Dimension of var INTEGER, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension INTEGER, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: iret INTEGER :: indx INTEGER :: i INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! ! print *,varname indx = 0 DO i = 1, ncin_dim IF ( varname == nc_input(i)%ncname ) THEN indx = i EXIT ENDIF ENDDO ! IF ( indx > 0 ) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF ENDDO IF (numADims == 1) THEN iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF ELSE IF (numADims == 2) THEN allocate(tmpVar(lenADims(1),lenADims(2))) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf1: this NetCDF variable is neither vector nor 2-D matrix ',varname STOP 'drv_readnf1' ENDIF ELSE WRITE (6,*) 'readnf1: Could not locate NetCDF variable ',varname STOP 'drv_readnf1' ENDIF drv_readnf1_int = iret ! END FUNCTION drv_readnf1_int FUNCTION drv_readnf1_iwf(varname,ncin_dim,nc_input,var,lpnts,flag) ! ! This routine reads a single vector from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf1_iwf ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: lpnts ! Dimension of var INTEGER, INTENT(INOUT) :: var(lpnts) ! Variable read and returned CHARACTER(LEN=3), INTENT(IN) :: flag ! No stop if flag='try' and variable not found ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension INTEGER, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: iret INTEGER :: indx INTEGER :: i INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! ! print *,varname iret = 0 indx = 0 DO i = 1, ncin_dim IF ( varname == nc_input(i)%ncname ) THEN indx = i EXIT ENDIF ENDDO ! IF ( indx > 0 ) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF ENDDO IF (numADims == 1) THEN iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF ELSE IF (numADims == 2) THEN allocate(tmpVar(lenADims(1),lenADims(2))) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf1: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf1: this NetCDF variable is neither vector nor 2-D matrix ',varname STOP 'drv_readnf1' ENDIF ELSE iret = 1 IF(flag /= 'try' .and. flag /= 'TRY') THEN WRITE (6,*) 'readnf1: Could not locate NetCDF variable ',varname STOP 'drv_readnf1' ENDIF ENDIF drv_readnf1_iwf = iret ! END FUNCTION drv_readnf1_iwf FUNCTION drv_readnf2_real(varname,ncin_dim,nc_input,ifdtt,var,lpnts) ! ! ! This routine reads a vector for a given time ifdtt from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf2_real ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: ifdtt ! Time step of input data INTEGER, INTENT(IN) :: lpnts ! Dimension of var REAL, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension REAL, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: i, iret, istart(4), icount(4) INTEGER :: indx INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim ! print *,i,'>', varname,':',nc_input(i)%ncname,'.' IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN istart(numDims) = ifdtt icount(1) = lpnts iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf2: Could not read istart=',2i6,', icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf2' ENDIF ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) istart(numDims) = ifdtt icount(1) = lenADims(1) icount(2) = lenADims(2) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf2: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf2' ENDIF ! WRITE (6,1001) varname(1:6),nc_input(indx)%varid,nc_input(indx)%ncid,istart,icount ! 1001 format('readnf2: NetCDF variable ',a6,2i3,8i6) ELSE WRITE (6,*) 'readnf2: Could not locate NetCDF variable ',varname STOP 'drv_readnf2' ENDIF drv_readnf2_real = iret ! END FUNCTION drv_readnf2_real ! FUNCTION drv_readnf2_rwf(varname,ncin_dim,nc_input,ifdtt,var,lpnts,flag) ! ! ! This routine reads a vector for a given time ifdtt from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf2_rwf ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: ifdtt ! Time step of input data INTEGER, INTENT(IN) :: lpnts ! Dimension of var CHARACTER(LEN=3), INTENT(IN) :: flag ! No stop if flag='try' and variable not found REAL, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension REAL, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: i, iret, istart(2), icount(2) INTEGER :: indx INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! iret = 0 indx = 0 DO i=1,ncin_dim ! print *,i,'>', varname,':',nc_input(i)%ncname,'.' IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN istart(numDims) = ifdtt icount(1) = lpnts iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf2: Could not read istart=',2i6,',icount=',2i6,'for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf2' ENDIF ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) istart(numDims) = ifdtt icount(1) = lenADims(1) icount(2) = lenADims(2) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf2: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf2' ENDIF ! WRITE (6,1001) varname(1:6),nc_input(indx)%varid,nc_input(indx)%ncid,(istart(n),n=1,3),(icount(n),n=1,3) ! 1001 format('readnf2: NetCDF variable ',a6,2i3,8i6) ELSE iret = 1 IF(flag /= 'try' .and. flag /= 'TRY') THEN WRITE (6,*) 'readnf2: Could not locate NetCDF variable ',varname STOP 'drv_readnf2' ENDIF ENDIF drv_readnf2_rwf = iret ! END FUNCTION drv_readnf2_rwf FUNCTION drv_readnf2_int(varname,ncin_dim,nc_input,ifdtt,var,lpnts) ! ! ! This routine reads a vector for a given time ifdtt from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf2_int ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: ifdtt ! Time step of input data INTEGER, INTENT(IN) :: lpnts ! Dimension of var INTEGER, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension INTEGER, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: i, iret, istart(2), icount(2) INTEGER :: indx INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim ! print *,i,'>', varname,':',nc_input(i)%ncname,'.' IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN istart(numDims) = ifdtt icount(1) = lpnts iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf2: Could not read istart=',2i6,',icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf2' ENDIF ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) istart(numDims) = ifdtt icount(1) = lenADims(1) icount(2) = lenADims(2) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf2: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf2' ENDIF ! WRITE (6,1001) varname(1:6),nc_input(indx)%varid,nc_input(indx)%ncid,(istart(n),n=1,3),(icount(n),n=1,3) ! 1001 format('readnf2: NetCDF variable ',a6,2i3,8i6) ELSE WRITE (6,*) 'readnf2: Could not locate NetCDF variable ',varname STOP 'drv_readnf2' ENDIF drv_readnf2_int = iret ! END FUNCTION drv_readnf2_int FUNCTION drv_readnf2_iwf(varname,ncin_dim,nc_input,ifdtt,var,lpnts,flag) ! ! ! This routine reads a vector for a given time ifdtt from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf2_iwf ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: ifdtt ! Time step of input data INTEGER, INTENT(IN) :: lpnts ! Dimension of var CHARACTER(LEN=3), INTENT(IN) :: flag ! No stop if flag='try' and variable not found INTEGER, INTENT(INOUT) :: var(lpnts) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension INTEGER, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: i, iret, istart(2), icount(2) INTEGER :: indx INTEGER :: n ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! iret = 0 indx = 0 DO i=1,ncin_dim ! print *,i,'>', varname,':',nc_input(i)%ncname,'.' IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf1: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf1' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN istart(numDims) = ifdtt icount(1) = lpnts iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf2: Could not read istart=',2i6,',icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf2' ENDIF ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) istart(numDims) = ifdtt icount(1) = lenADims(1) icount(2) = lenADims(2) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf2: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf2' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n)) = tmpVar(iindex(n),jindex(n)) ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf2: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf2' ENDIF ! WRITE (6,1001) varname(1:6),nc_input(indx)%varid,nc_input(indx)%ncid,(istart(n),n=1,3),(icount(n),n=1,3) ! 1001 format('readnf2: NetCDF variable ',a6,2i3,8i6) ELSE iret = 1 IF(flag /= 'try' .and. flag /= 'TRY') THEN WRITE (6,*) 'readnf2: Could not locate NetCDF variable ',varname STOP 'drv_readnf2' ENDIF ENDIF drv_readnf2_iwf = iret ! END FUNCTION drv_readnf2_iwf FUNCTION drv_readnf2d_int(varname,ncin_dim,nc_input,var,lonin,latin) ! ! ! This routine reads a vector for a given time ifdtt from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf2d_int ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: lonin ! Dimension of var INTEGER, INTENT(IN) :: latin ! Dimension of var INTEGER, INTENT(INOUT) :: var(lonin,latin) ! Variable read and returned ! ! LOCAL ! INTEGER :: i, iret INTEGER :: indx ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim ! print *,i,'>', varname,':',nc_input(i)%ncname,'.' IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf2d: Could not read for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf2' ENDIF ELSE WRITE (6,*) 'readnf2d: Could not locate NetCDF variable ',varname STOP 'drv_readnf2d' ENDIF drv_readnf2d_int = iret ! END FUNCTION drv_readnf2d_int FUNCTION drv_readnf2d_real(varname,ncin_dim,nc_input,var,lonin,latin) ! ! ! This routine reads a vector for a given time ifdtt from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! ! Changed to use F90 NetCDF utilities ! - P. Dirmeyer 5/2002 ! IMPLICIT NONE ! INTEGER :: drv_readnf2d_real ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: lonin ! Dimension of var INTEGER, INTENT(IN) :: latin ! Dimension of var REAL, INTENT(INOUT) :: var(lonin,latin) ! Variable read and returned ! ! LOCAL ! INTEGER :: i, iret INTEGER :: indx ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim ! print *,i,'>', varname,':',nc_input(i)%ncname,'.' IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf2d: Could not read for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf2' ENDIF ELSE WRITE (6,*) 'readnf2d: Could not locate NetCDF variable ',varname STOP 'drv_readnf2d' ENDIF drv_readnf2d_real = iret ! END FUNCTION drv_readnf2d_real FUNCTION drv_readnf3_real(varname,ncin_dim,nc_input,mth,var,lpnts) ! ! ! This routine reads 3 monthly veg vectors from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! IMPLICIT NONE ! INTEGER :: drv_readnf3_real ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: mth(3) ! The 3 months to read INTEGER, INTENT(IN) :: lpnts ! Dimension of var REAL, INTENT(OUT) :: var(lpnts,3) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension REAL, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: n INTEGER :: i, iret, istart(3), icount(3) INTEGER :: indx ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf3: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN icount(1) = lpnts DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var(:,i),istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf3: Could not read istart=',2i6,', icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf3 ' ENDIF ENDDO ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) icount(1) = lenADims(1) icount(2) = lenADims(2) DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n),i) = tmpVar(iindex(n),jindex(n)) ENDDO ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf3: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf3' ENDIF ELSE WRITE (6,*) 'readnf3: Could not locate NetCDF variable ',varname STOP 'drv_readnf3' ENDIF ! drv_readnf3_real = iret ! END FUNCTION drv_readnf3_real ! FUNCTION drv_readnf3_rwf(varname,ncin_dim,nc_input,mth,var,lpnts,flag) ! ! ! This routine reads 3 monthly veg vectors from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! IMPLICIT NONE ! INTEGER :: drv_readnf3_rwf ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: mth(3) ! The 3 months to read INTEGER, INTENT(IN) :: lpnts ! Dimension of var CHARACTER(LEN=3), INTENT(IN) :: flag ! No stop if flag='try' and variable not found REAL, INTENT(OUT) :: var(lpnts,3) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension REAL, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: n INTEGER :: i, iret, istart(3), icount(3) INTEGER :: indx ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf3: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN icount(1) = lpnts DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var(:,i),istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf3: Could not read istart=',2i6,', icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf3 ' ENDIF ENDDO ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) icount(1) = lenADims(1) icount(2) = lenADims(2) DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n),i) = tmpVar(iindex(n),jindex(n)) ENDDO ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf3: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf3' ENDIF ELSE iret = 1 IF(flag /= 'try' .and. flag /= 'TRY') THEN WRITE (6,*) 'readnf3: Could not locate NetCDF variable ',varname STOP 'drv_readnf3' ENDIF ENDIF ! drv_readnf3_rwf = iret ! END FUNCTION drv_readnf3_rwf ! FUNCTION drv_readnf3_int(varname,ncin_dim,nc_input,mth,var,lpnts) ! ! ! This routine reads 3 monthly veg vectors from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! IMPLICIT NONE ! INTEGER :: drv_readnf3_int ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: mth(3) ! The 3 months to read INTEGER, INTENT(IN) :: lpnts ! Dimension of var INTEGER, INTENT(OUT) :: var(lpnts,3) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension INTEGER, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: n INTEGER :: i, iret, istart(3), icount(3) INTEGER :: indx ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf3: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN icount(1) = lpnts DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var(:,i),istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf3: Could not read istart=',2i6,', icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf3 ' ENDIF ENDDO ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) icount(1) = lenADims(1) icount(2) = lenADims(2) DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n),i) = tmpVar(iindex(n),jindex(n)) ENDDO ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf3: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf3' ENDIF ELSE WRITE (6,*) 'readnf3: Could not locate NetCDF variable ',varname STOP 'drv_readnf3' ENDIF ! drv_readnf3_int = iret ! END FUNCTION drv_readnf3_int ! FUNCTION drv_readnf3_iwf(varname,ncin_dim,nc_input,mth,var,lpnts,flag) ! ! ! This routine reads 3 monthly veg vectors from a NetCDF file ! ! P. Dirmeyer 8/2001 ! ! Generalized so that only variable name is given ! - P. Dirmeyer 12/2001 ! IMPLICIT NONE ! INTEGER :: drv_readnf3_iwf ! Type of the function ! ! Data type for NetCDF variable input !!! TYPE nc_pointer !!! CHARACTER(LEN=15) :: ncname ! ALMA Name of NetCDF field !!! INTEGER :: ncid ! NCID of field !!! INTEGER :: varid ! VARID of field !!! END TYPE nc_pointer ! ! ARGUMENTS ! CHARACTER(LEN=15), INTENT(IN) :: varname ! Name of ALMA variable to read INTEGER,INTENT(IN) :: ncin_dim ! Dim of nc_input structure TYPE(nc_pointer), INTENT(IN) :: nc_input(ncin_dim) ! Structure for NetCDF input input INTEGER, INTENT(IN) :: mth(3) ! The 3 months to read INTEGER, INTENT(IN) :: lpnts ! Dimension of var CHARACTER(LEN=3), INTENT(IN) :: flag ! No stop if flag='try' and variable not found INTEGER, INTENT(OUT) :: var(lpnts,3) ! Variable read and returned ! ! LOCAL ! INTEGER :: numDims ! Number of dimensions for variable tmpVar INTEGER :: numADims ! Number of actual dimensions for variable tmpVar INTEGER, DIMENSION(4) :: dimIDs ! Dimension IDs for local variable tmpVar INTEGER, DIMENSION(4) :: lenDims ! Length for each dimension INTEGER, DIMENSION(4) :: lenADims ! Actual length for each dimension INTEGER, DIMENSION(:, :), ALLOCATABLE :: tmpVar ! Local variable read and gathered INTEGER :: n INTEGER :: i, iret, istart(3), icount(3) INTEGER :: indx ! ! ! ! Read thru the names of the NetCDF variable names until the requested ALMA variable is found ! indx = 0 DO i=1,ncin_dim IF ( varname == nc_input(i)%ncname ) THEN ! IF ( varname(1:len_trim(varname)) .EQ. & ! & nc_input(i)%ncname(1:len_trim(nc_input(i)%ncname)) ) THEN indx = i EXIT ENDIF ENDDO ! IF (indx > 0) THEN iret = NF90_INQUIRE_VARIABLE(nc_input(indx)%ncid,nc_input(indx)%varid,ndims = numDims, dimids = dimIDs) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not inquire dimensions of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF numADims = 0 n = 0 DO i = 1, numDims iret = NF90_INQUIRE_DIMENSION(nc_input(indx)%ncid, dimIDs(i), len = lenDims(i)) IF (iret .NE. NF90_NOERR) THEN WRITE (6,*) 'readnf3: Could not inquire dimension length of NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF IF (lenDims(i) > 1) THEN n = n + 1 numADims = numADims + 1 lenADims(n) = lenDims(i) ENDIF istart(i) = 1 icount(i) = 1 ENDDO IF (numADims == 2) THEN icount(1) = lpnts DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,var(:,i),istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,1000) istart,icount,nc_input(indx)%varid,nc_input(indx)%ncid 1000 format('readnf3: Could not read istart=',2i6,', icount=',2i6,' for NetCDF variable ',i4,' from file ',i4) STOP 'drv_readnf3 ' ENDIF ENDDO ELSE IF (numADims == 3) THEN allocate(tmpVar(lenADims(1),lenADims(2))) icount(1) = lenADims(1) icount(2) = lenADims(2) DO i=1,3 istart(numDims) = mth(i) iret = NF90_GET_VAR(nc_input(indx)%ncid,nc_input(indx)%varid,tmpVar,istart,icount) IF (iret .NE. NF90_NOERR ) THEN WRITE (6,*) 'readnf3: Could not read NetCDF variable ',varname,'; ', & & nc_input(indx)%varid,' from file ',nc_input(indx)%ncid STOP 'drv_readnf3' ENDIF DO n=1,lpnts if (iindex(n) .LE. 0 .OR. iindex(n) .GT. lenADims(1)) STOP 'gathering' if (jindex(n) .LE. 0 .OR. jindex(n) .GT. lenADims(2)) STOP 'gathering' if (hmask(n) > 0) & var(hmask(n),i) = tmpVar(iindex(n),jindex(n)) ENDDO ENDDO deallocate(tmpVar) ELSE WRITE (6,*) 'readnf3: this NetCDF variable is neither 2-D nor 3-D matrix ',varname STOP 'drv_readnf3' ENDIF ELSE iret = 1 IF(flag /= 'try' .and. flag /= 'TRY') THEN WRITE (6,*) 'readnf3: Could not locate NetCDF variable ',varname STOP 'drv_readnf3' ENDIF ENDIF ! drv_readnf3_iwf = iret ! END FUNCTION drv_readnf3_iwf ! END MODULE drv_readnf_mod