Files
GEOS-Chem-adjoint-v35-note/code/new/netcdf_util_mod.f
2018-08-28 00:39:32 -04:00

1103 lines
40 KiB
Fortran

!$Id: netcdf_util_mod.f,v 1.1 2012/03/01 22:00:27 daven Exp $
!------------------------------------------------------------------------------
! Harvard University Atmospheric Chemistry Modeling Group !
!------------------------------------------------------------------------------
!BOP
!
! !MODULE: netcdf_util_mod
!
!\\
!\\
! !INTERFACE:
!
MODULE NETCDF_UTIL_MOD
!
! !USES:
!
USE NETCDF
IMPLICIT NONE
PRIVATE
!
!
! !PUBLIC MEMBER FUNCTIONS:
!
! Functions
PUBLIC :: NCDF_GET_VARID ! Return variable ID
PUBLIC :: NCDF_GET_DIMID ! Return variable ID
! Subroutines
PUBLIC :: NCDF_OPEN_FOR_READ
PUBLIC :: NCDF_CLOSE
PUBLIC :: NCDF_VAR_EXIST
PUBLIC :: NCDF_DIM_EXIST
PUBLIC :: NCDF_GET_VAR ! Get data from a netCDF file
PUBLIC :: NCDF_SYNC ! Push data in buffers to the file ahead of close
PUBLIC :: CHECK_NCDF ! Test for error on netCDF API functions
PUBLIC :: NCDF_INIT ! Set intial variables, etc.
!
! !PRIVATE MEMBER FUNCTIONS:
!
! !PUBLIC DATA MEMBERS:
INTEGER, PUBLIC :: NCDF_CHAR
INTEGER, PUBLIC :: NCDF_INT
INTEGER, PUBLIC :: NCDF_REAL
INTEGER, PUBLIC :: DEF_LEV ! Deflation level
! Dimension IDs
INTEGER, PUBLIC :: LVL_DIMID, LVL_VARID ! Vertical level dimension
INTEGER, PUBLIC :: LVLE_DIMID, LVLE_VARID ! Vertical edge dimension
INTEGER, PUBLIC :: LAT_DIMID, LAT_VARID ! Latitude dimension
INTEGER, PUBLIC :: LON_DIMID, LON_VARID ! Longitude dimension
INTEGER, PUBLIC :: TRACER_DIMID ! Tracer dimension
INTEGER, PUBLIC :: STRLEN_8_DIMID ! CHAR(LEN=8) dimension
INTEGER, PUBLIC :: STRLEN_16_DIMID ! CHAR(LEN=16) dimension
INTEGER, PUBLIC :: STRLEN_64_DIMID ! CHAR(LEN=64) dimension
INTEGER, PUBLIC :: PL_DIMID, PL_VARID ! Prod or Loss dimension
INTEGER, PUBLIC :: REC_DIMID, REC_VARID ! Record dimension (time,unlimited)
INTEGER, PUBLIC :: TRACER_NAME_VARID
!
! !REMARKS:
!
! References:
! ============================================================================
! (1 )
! !REVISION HISTORY:
! 2 Feb 2011 - L. Murray - Initial version.
! 1 Jun 2011 - L. Murray - Read-only version of the code.
!EOP
!------------------------------------------------------------------------------
!BOC
!
! !PRIVATE TYPES:
!
INTERFACE NCDF_GET_VAR
! Compiler chooses which one is appropriate when called
MODULE PROCEDURE NCDF_GET_VAR_CHAR
MODULE PROCEDURE NCDF_GET_VAR_1D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_2D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_3D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_4D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_5D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_6D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_7D_CHAR
MODULE PROCEDURE NCDF_GET_VAR_INT
MODULE PROCEDURE NCDF_GET_VAR_1D_INT
MODULE PROCEDURE NCDF_GET_VAR_2D_INT
MODULE PROCEDURE NCDF_GET_VAR_3D_INT
MODULE PROCEDURE NCDF_GET_VAR_4D_INT
MODULE PROCEDURE NCDF_GET_VAR_5D_INT
MODULE PROCEDURE NCDF_GET_VAR_6D_INT
MODULE PROCEDURE NCDF_GET_VAR_7D_INT
MODULE PROCEDURE NCDF_GET_VAR_REAL
MODULE PROCEDURE NCDF_GET_VAR_1D_REAL
MODULE PROCEDURE NCDF_GET_VAR_2D_REAL
MODULE PROCEDURE NCDF_GET_VAR_3D_REAL
MODULE PROCEDURE NCDF_GET_VAR_4D_REAL
MODULE PROCEDURE NCDF_GET_VAR_5D_REAL
MODULE PROCEDURE NCDF_GET_VAR_6D_REAL
MODULE PROCEDURE NCDF_GET_VAR_7D_REAL
MODULE PROCEDURE NCDF_GET_VAR_DBLE
MODULE PROCEDURE NCDF_GET_VAR_1D_DBLE
MODULE PROCEDURE NCDF_GET_VAR_2D_DBLE
MODULE PROCEDURE NCDF_GET_VAR_3D_DBLE
MODULE PROCEDURE NCDF_GET_VAR_4D_DBLE
MODULE PROCEDURE NCDF_GET_VAR_5D_DBLE
MODULE PROCEDURE NCDF_GET_VAR_6D_DBLE
MODULE PROCEDURE NCDF_GET_VAR_7D_DBLE
END INTERFACE
CONTAINS
!------------------------------------------------------------------------------
SUBROUTINE CHECK_NCDF( STATUS )
USE ERROR_MOD, ONLY : GEOS_CHEM_STOP
IMPLICIT NONE
INTEGER, INTENT( IN ) :: STATUS
IF ( STATUS /= nf90_noerr ) THEN
WRITE(6,*) 'Error with netCDF'
PRINT*,trim( nf90_strerror(status) )
CALL GEOS_CHEM_STOP
END IF
END SUBROUTINE CHECK_NCDF
!------------------------------------------------------------------------------
SUBROUTINE NCDF_INIT
! Call only once
IMPLICIT NONE
! Set type flags
NCDF_CHAR = NF90_CHAR
NCDF_INT = NF90_INT
NCDF_REAL = NF90_REAL
END SUBROUTINE NCDF_INIT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_OPEN_FOR_READ( NCID, FILENAME )
IMPLICIT NONE
CHARACTER(LEN=*), INTENT( IN ) :: FILENAME
INTEGER, INTENT( OUT ) :: NCID
write(6,*) 'netCDF: Opening file for read: ',trim(filename)
call check_ncdf( nf90_open( trim(filename), nf90_nowrite, ncid ) )
END SUBROUTINE NCDF_OPEN_FOR_READ
!------------------------------------------------------------------------------
FUNCTION NCDF_DIM_EXIST( NCID, DIMNAME ) RESULT( DIMEXIST )
INTEGER, INTENT( IN ) :: NCID
CHARACTER(LEN=*), INTENT( IN ) :: dimName
LOGICAL :: dimExist
INTEGER :: dimid, status
dimExist = .false.
! Inquire about the the variable id
status = nf90_inq_dimid( ncid, trim(dimname), dimid )
if ( status .eq. nf90_NoErr ) dimExist = .true.
END FUNCTION NCDF_DIM_EXIST
!------------------------------------------------------------------------------
FUNCTION NCDF_VAR_EXIST( NCID, VARNAME ) RESULT( VAREXIST )
INTEGER, INTENT( IN ) :: NCID
CHARACTER(LEN=*), INTENT( IN ) :: VARNAME
LOGICAL :: varExist
INTEGER :: varid, status
varExist = .false.
! Inquire about the the variable id
status = nf90_inq_varid( ncid, trim(varname), varid )
if ( status .eq. nf90_NoErr ) varExist = .true.
! status .eq. -49 is variable not found
END FUNCTION NCDF_VAR_EXIST
!------------------------------------------------------------------------------
FUNCTION NCDF_GET_DIMID( NCID, DIMNAME ) RESULT( DIMID )
INTEGER, INTENT( IN ) :: NCID
CHARACTER(LEN=*), INTENT( IN ) :: DIMNAME
INTEGER :: DIMID
! Get the dimiable id
call check_ncdf( nf90_inq_dimid( ncid, trim(dimname), dimid ) )
END FUNCTION NCDF_GET_DIMID
!------------------------------------------------------------------------------
FUNCTION NCDF_GET_VARID( NCID, VARNAME ) RESULT( VARID )
INTEGER, INTENT( IN ) :: NCID
CHARACTER(LEN=*), INTENT( IN ) :: VARNAME
INTEGER :: VARID
! Get the variable id
call check_ncdf( nf90_inq_varid( ncid, trim(varname), varid ) )
END FUNCTION NCDF_GET_VARID
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_1D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_1D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_2D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_2D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_3D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_3D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_4D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_4D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_5D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_5D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_6D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_6D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_7D_CHAR(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
CHARACTER(LEN=*), INTENT( OUT ) :: ARRAY(:,:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_7D_CHAR
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_INT(NCID, VARID, VALUE )
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: VALUE
! Get the variable
call check_ncdf( nf90_get_var( ncid, varID, value ) )
END SUBROUTINE NCDF_GET_VAR_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_1D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_1D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_2D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_2D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_3D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_3D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_4D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_4D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_5D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_5D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_6D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_6D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_7D_INT(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
INTEGER, INTENT( OUT ) :: ARRAY(:,:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_7D_INT
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_REAL(NCID, VARID, VALUE )
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: VALUE
! Get the variable
call check_ncdf( nf90_get_var( ncid, varID, value ) )
END SUBROUTINE NCDF_GET_VAR_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_1D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_1D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_2D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_2D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_3D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_3D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_4D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_4D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_5D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_5D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_6D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_6D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_7D_REAL(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*4, INTENT( OUT ) :: ARRAY(:,:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_7D_REAL
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_DBLE(NCID, VARID, VALUE )
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: VALUE
! Get the variable
call check_ncdf( nf90_get_var( ncid, varID, value ) )
END SUBROUTINE NCDF_GET_VAR_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_1D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_1D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_2D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_2D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_3D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_3D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_4D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_4D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_5D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_5D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_6D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_6D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_GET_VAR_7D_DBLE(NCID, VARID, ARRAY, START, COUNT)
IMPLICIT NONE
INTEGER, INTENT( IN ) :: NCID
INTEGER, INTENT( IN ) :: VARID
REAL*8, INTENT( OUT ) :: ARRAY(:,:,:,:,:,:,:)
INTEGER, OPTIONAL, INTENT( IN ) :: START(:)
INTEGER, OPTIONAL, INTENT( IN ) :: COUNT(:)
! Get the variable
if ( present( start ) .and. present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start, count=count ) )
else if ( present( start ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& start=start ) )
else if ( present( count ) ) then
call check_ncdf( nf90_get_var( ncid, varID, array,
& count=count ) )
else
call check_ncdf( nf90_get_var( ncid, varID, array ) )
endif
END SUBROUTINE NCDF_GET_VAR_7D_DBLE
!------------------------------------------------------------------------------
SUBROUTINE NCDF_SYNC( NCID )
INTEGER, INTENT( IN ) :: NCID
call check_ncdf( nf90_sync( NCID ) )
END SUBROUTINE NCDF_SYNC
!------------------------------------------------------------------------------
SUBROUTINE NCDF_CLOSE( NCID )
USE NETCDF
INTEGER, INTENT( IN ) :: NCID
call check_ncdf( nf90_close( NCID ) )
END SUBROUTINE NCDF_CLOSE
END MODULE NETCDF_UTIL_MOD