netcdf-c/f90/netcdf4_variables.f90
2010-06-03 13:24:43 +00:00

357 lines
13 KiB
Fortran

! -----
! Variable definitions and inquiry
! -----
function nf90_def_var_Scalar(ncid, name, xtype, varid)
integer, intent( in) :: ncid
character (len = *), intent( in) :: name
integer, intent(in) :: xtype
integer, intent(out) :: varid
integer :: nf90_def_var_Scalar
! Dummy - shouldn't get used
integer, dimension(1) :: dimids
! These may not be used with scalars, but it causes an interface
! violation if they are not optional arguments.
nf90_def_var_Scalar = nf_def_var(ncid, name, xtype, 0, dimids, varid)
end function nf90_def_var_Scalar
! -----
function nf90_def_var_oneDim(ncid, name, xtype, dimids, varid, contiguous, &
chunksizes, deflate_level, shuffle, fletcher32, endianness, &
cache_size, cache_nelems, cache_preemption)
integer, intent( in) :: ncid
character (len = *), intent( in) :: name
integer, intent(in) :: xtype
integer, intent(in) :: dimids
integer, intent(out) :: varid
logical, optional, intent(in) :: contiguous
integer, optional, intent(in) :: chunksizes
integer, optional, intent(in) :: deflate_level
logical, optional, intent(in) :: shuffle, fletcher32
integer, optional, intent(in) :: endianness
integer, optional, intent(in) :: cache_size, cache_nelems, cache_preemption
integer :: nf90_def_var_oneDim
integer, dimension(1) :: dimidsA, chunksizes1
integer :: size1 = -1, nelems1 = -1, preemption1 = -1
integer :: contiguous1
! Put this int into an array, where all decent folk keep ids.
dimidsA(1) = dimids
! This is forbidden! Don't even think about it.
if (present(contiguous)) then
if (contiguous .and. present(chunksizes)) then
nf90_def_var_oneDim = nf90_einval
return
end if
end if
if (present(contiguous)) then
if (.not. contiguous .and. .not. present(chunksizes)) then
nf90_def_var_oneDim = nf90_einval
return
end if
end if
! Define the variable.
nf90_def_var_oneDim = nf_def_var(ncid, name, xtype, 1, dimidsA, varid)
if (nf90_def_var_oneDim .ne. nf90_noerr) return
! Handle chunksizes and contiguous.
if (present(chunksizes) .or. present(contiguous)) then
if (present(contiguous)) then
if (contiguous) then
contiguous1 = nf90_contiguous
else
contiguous1 = nf90_notcontiguous
endif
endif
if (present(chunksizes)) then
contiguous1 = 0
chunksizes1(1) = chunksizes
endif
nf90_def_var_oneDim = nf_def_var_chunking(ncid, varid, contiguous1, chunksizes1)
endif
if (present(contiguous)) then
if (contiguous) then
nf90_def_var_oneDim = nf_def_var_chunking(ncid, varid, 1, 0)
endif
endif
if (nf90_def_var_oneDim .ne. nf90_noerr) return
! Handle deflate and shuffle.
if (present(deflate_level)) then
if (deflate_level .gt. 0) then
if (present(shuffle)) then
if (shuffle) then
nf90_def_var_oneDim = nf_def_var_deflate(ncid, varid, 1, 1, deflate_level)
else
nf90_def_var_oneDim = nf_def_var_deflate(ncid, varid, 0, 1, deflate_level)
end if
if (nf90_def_var_oneDim .ne. nf90_noerr) return
end if
end if
endif
! Handle fletcher32.
if (present(fletcher32)) then
if (fletcher32) then
nf90_def_var_oneDim = nf_def_var_fletcher32(ncid, varid, 1)
if (nf90_def_var_oneDim .ne. nf90_noerr) return
endif
endif
! Handle endianness.
if (present(endianness)) then
nf90_def_var_oneDim = nf_def_var_endian(ncid, varid, endianness)
if (nf90_def_var_oneDim .ne. nf90_noerr) return
endif
! Set the cache if the user wants to.
if (present(cache_size) .or. present(cache_nelems) .or. &
present(cache_preemption)) then
! Negative values mean leave it alone.
if (present(cache_size)) size1 = cache_size
if (present(cache_nelems)) nelems1 = cache_nelems
if (present(cache_preemption)) preemption1 = cache_preemption
nf90_def_var_oneDim = nf_set_var_chunk_cache(ncid, varid, &
size1, nelems1, preemption1)
if (nf90_def_var_oneDim .ne. nf90_noerr) return
endif
end function nf90_def_var_oneDim
! -----
function nf90_def_var_ManyDims(ncid, name, xtype, dimids, varid, contiguous, &
chunksizes, deflate_level, shuffle, fletcher32, endianness, cache_size, &
cache_nelems, cache_preemption)
integer, intent(in) :: ncid
character (len = *), intent(in) :: name
integer, intent( in) :: xtype
integer, dimension(:), intent(in) :: dimids
integer, intent(out) :: varid
logical, optional, intent(in) :: contiguous
integer, optional, dimension(:), intent(in) :: chunksizes
integer, optional, intent(in) :: deflate_level
logical, optional, intent(in) :: shuffle, fletcher32
integer, optional, intent(in) :: endianness
integer, optional, intent(in) :: cache_size, cache_nelems, cache_preemption
integer :: nf90_def_var_ManyDims
! Local variables.
integer :: contiguous1, d
integer :: size1 = -1, nelems1 = -1, preemption1 = -1
integer, dimension(nf90_max_dims) :: chunksizes1
! This is forbidden!
if (present(contiguous)) then
if (contiguous .and. present(chunksizes)) then
nf90_def_var_ManyDims = nf90_einval
return
end if
end if
if (present(contiguous)) then
if (.not. contiguous .and. .not. present(chunksizes)) then
nf90_def_var_ManyDims = nf90_einval
return
endif
end if
! Be nice and check array size.
if (present(chunksizes)) then
if (size(chunksizes) .ne. size(dimids)) then
nf90_def_var_ManyDims = nf90_einval
return
end if
end if
! Define the variable.
nf90_def_var_ManyDims = nf_def_var(ncid, name, xtype, size(dimids), dimids, varid)
if (nf90_def_var_ManyDims .ne. nf90_noerr) return
! Handle chunksizes and contiguous.
if (present(chunksizes) .or. present(contiguous)) then
if (present(contiguous)) then
if (contiguous) then
contiguous1 = nf90_contiguous
else
contiguous1 = nf90_notcontiguous
endif
endif
if (present(chunksizes)) then
contiguous1 = 0
do d = 1, size(dimids)
chunksizes1(d) = chunksizes(d)
end do
endif
nf90_def_var_ManyDims = nf_def_var_chunking(ncid, varid, contiguous1, chunksizes1)
endif
if (present(contiguous)) then
if (contiguous) then
nf90_def_var_ManyDims = nf_def_var_chunking(ncid, varid, 1, 0)
endif
endif
if (nf90_def_var_ManyDims .ne. nf90_noerr) return
! Handle deflate and shuffle.
if (present(deflate_level)) then
if (deflate_level .gt. 0) then
if (present(shuffle)) then
if (shuffle) then
nf90_def_var_ManyDims = nf_def_var_deflate(ncid, varid, 1, 1, deflate_level)
else
nf90_def_var_ManyDims = nf_def_var_deflate(ncid, varid, 0, 1, deflate_level)
end if
end if
end if
endif
if (nf90_def_var_ManyDims .ne. nf90_noerr) return
! Handle fletcher32.
if (present(fletcher32)) then
if (fletcher32) then
nf90_def_var_ManyDims = nf_def_var_fletcher32(ncid, varid, 1)
endif
endif
if (nf90_def_var_ManyDims .ne. nf90_noerr) return
! Handle endianness.
if (present(endianness)) then
nf90_def_var_ManyDims = nf_def_var_endian(ncid, varid, endianness)
endif
! Set the cache if the user wants to.
if (present(cache_size) .or. present(cache_nelems) .or. &
present(cache_preemption)) then
! Negative values mean leave it alone.
if (present(cache_size)) size1 = cache_size
if (present(cache_nelems)) nelems1 = cache_nelems
if (present(cache_preemption)) preemption1 = cache_preemption
nf90_def_var_ManyDims = nf_set_var_chunk_cache(ncid, varid, &
size1, nelems1, preemption1)
if (nf90_def_var_ManyDims .ne. nf90_noerr) return
endif
end function nf90_def_var_ManyDims
! -----
function nf90_inq_varid(ncid, name, varid)
integer, intent(in) :: ncid
character (len = *), intent( in) :: name
integer, intent(out) :: varid
integer :: nf90_inq_varid
nf90_inq_varid = nf_inq_varid(ncid, name, varid)
if (nf90_inq_varid .ne. nf90_noerr) return
end function nf90_inq_varid
! -----
function nf90_set_var_chunk_cache(ncid, varid, size, nelems, preemption)
integer, intent(in) :: ncid, varid, size, nelems, preemption
integer :: nf90_set_var_chunk_cache
nf90_set_var_chunk_cache = nf_set_var_chunk_cache(ncid, varid, &
size, nelems, preemption)
if (nf90_set_var_chunk_cache .ne. nf90_noerr) return
end function nf90_set_var_chunk_cache
! -----
function nf90_inquire_variable(ncid, varid, name, xtype, ndims, dimids, nAtts, &
contiguous, chunksizes, deflate_level, shuffle, fletcher32, endianness, &
cache_size, cache_nelems, cache_preemption)
integer, intent(in) :: ncid, varid
character (len = *), optional, intent(out) :: name
integer, optional, intent(out) :: xtype, ndims
integer, dimension(:), optional, intent(out) :: dimids
integer, optional, intent(out) :: nAtts
logical, optional, intent(out) :: contiguous
integer, optional, dimension(:), intent(out) :: chunksizes
integer, optional, intent(out) :: deflate_level
logical, optional, intent(out) :: shuffle, fletcher32
integer, optional, intent(out) :: endianness
integer, optional, intent(out) :: cache_size, cache_nelems, cache_preemption
integer :: nf90_inquire_variable
! Local variables
character (len = nf90_max_name) :: varName = ''
integer :: externalType, numDimensions
integer, dimension(nf90_max_var_dims) :: dimensionIDs
integer :: numAttributes
integer :: deflate1, deflate_level1, contiguous1, shuffle1, fletcher321
integer, dimension(nf90_max_dims) :: chunksizes1
integer :: size1, nelems1, preemption1
integer :: d
! Learn the basic facts.
nf90_inquire_variable = nf_inq_var(ncid, varid, varName, externalType, &
numDimensions, dimensionIDs, numAttributes)
if (nf90_inquire_variable .ne. nf90_noerr) return
! Tell the user what he wants to know.
if (present(name)) name = trim(varName)
if (present(xtype)) xtype = externalType
if (present(ndims)) ndims = numDimensions
if (present(dimids)) then
if (size(dimids) .ge. numDimensions) then
dimids(:numDimensions) = dimensionIDs(:numDimensions)
else
nf90_inquire_variable = nf90_einval
endif
endif
if (present(nAtts)) nAtts = numAttributes
! Get the chunksizes and contiguous settings, if desired.
if (present(chunksizes) .or. present(contiguous)) then
nf90_inquire_variable = nf_inq_var_chunking(ncid, varid, contiguous1, chunksizes1)
if (nf90_inquire_variable .ne. nf90_noerr) return
if (present(contiguous)) contiguous = contiguous1 .ne. nf90_notcontiguous
if (present(chunksizes)) then
do d = 1, numDimensions
chunksizes(d) = chunksizes1(d)
end do
endif
endif
! Get the fletcher32 settings, if desired.
if (present(fletcher32)) then
nf90_inquire_variable = nf_inq_var_fletcher32(ncid, varid, fletcher321)
if (nf90_inquire_variable .ne. nf90_noerr) return
fletcher32 = fletcher321 .gt. 0
endif
! Get the deflate and shuffle settings, if desired.
if (present(deflate_level) .or. present(shuffle)) then
nf90_inquire_variable = nf_inq_var_deflate(ncid, varid, shuffle1, deflate1, deflate_level1)
if (nf90_inquire_variable .ne. nf90_noerr) return
if (present(deflate_level)) deflate_level = deflate_level1
if (present(shuffle)) shuffle = shuffle1 .ne. 0
endif
! And the endianness...
if (present(endianness)) then
nf90_inquire_variable = nf_inq_var_endian(ncid, varid, endianness)
if (nf90_inquire_variable .ne. nf90_noerr) return
endif
! Does the user want cache settings?
if (present(cache_size) .or. present(cache_nelems) .or. present(cache_preemption)) then
nf90_inquire_variable = nf_get_var_chunk_cache(ncid, varid, &
size1, nelems1, preemption1)
if (nf90_inquire_variable .ne. nf90_noerr) return
if (present(cache_size)) cache_size = size1
if (present(cache_nelems)) cache_nelems = nelems1
if (present(cache_preemption)) cache_preemption = preemption1
endif
end function nf90_inquire_variable
! -----
function nf90_rename_var(ncid, varid, newname)
integer, intent( in) :: ncid, varid
character (len = *), intent( in) :: newname
integer :: nf90_rename_var
nf90_rename_var = nf_rename_var(ncid, varid, newname)
end function nf90_rename_var
! -----