1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
C This is part of the netCDF package.
C Copyright 2008 University Corporation for Atmospheric Research/Unidata.
C See COPYRIGHT file for conditions of use.
C This program tests netCDF-4 variable functions from fortran, even
C more, even more.
C $Id: ftst_vars6.F,v 1.7 2009/02/11 16:53:46 ed Exp $
program ftst_vars6
implicit none
include 'netcdf.inc'
C This is the name of the data file we will create.
character*(*) FILE_NAME
parameter (FILE_NAME='ftst_vars6.nc')
integer NDIMS
parameter (NDIMS = 1)
integer DIM_LEN
parameter (DIM_LEN = 22)
integer NVARS
parameter (NVARS = 3)
integer DATA_LEN
parameter (DATA_LEN = 2)
integer check_file
integer ncid, varid(NVARS), dimids(NDIMS)
integer data_len_in, offset
parameter (offset = 20)
integer data1(data_len), data1_in(data_len)
character*(4) var_name(NVARS)
character*(4) dim_name
parameter (dim_name = 'dim1')
integer NO_FILL, MY_FILL_VALUE
parameter (NO_FILL = 1)
parameter (MY_FILL_VALUE = 42)
C Loop index and error handling.
integer x, retval
print *, ''
print *,'*** Testing fill values.'
C Prepare some data to write.
do x = 1, data_len
data1(x) = x
end do
C Set up var names.
var_name(1) = 'var1'
var_name(2) = 'var2'
var_name(3) = 'var3'
C Create the netCDF file.
retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
if (retval .ne. nf_noerr) call handle_err(retval)
C Create a dimension.
retval = nf_def_dim(ncid, dim_name, DIM_LEN, dimids(1))
if (retval .ne. nf_noerr) call handle_err(retval)
C Create a few integer variables.
do x = 1, NVARS
retval = nf_def_var(ncid, var_name(x), NF_INT, NDIMS, dimids,
$ varid(x))
if (retval .ne. nf_noerr) call handle_err(retval)
end do
C Set no fill mode for the second variable.
retval = nf_def_var_fill(ncid, varid(2), NO_FILL, 88)
if (retval .ne. 0) stop 2
C Set an alternative fill value for the third variable.
retval = nf_def_var_fill(ncid, varid(3), 0, MY_FILL_VALUE)
if (retval .ne. 0) stop 3
C Check it out.
c retval = check_file(ncid, var_name, dim_name)
c if (retval .ne. 0) stop 2
C Close the file.
retval = nf_close(ncid)
if (retval .ne. nf_noerr) call handle_err(retval)
C Reopen the file.
retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
if (retval .ne. nf_noerr) call handle_err(retval)
C Check it out.
retval = check_file(ncid, var_name, dim_name)
if (retval .ne. 0) stop 4
C Close the file.
retval = nf_close(ncid)
if (retval .ne. nf_noerr) call handle_err(retval)
print *,'*** SUCCESS!'
end
C This function check the file to make sure everything is OK.
integer function check_file(ncid, var_name, dim_name)
implicit none
include 'netcdf.inc'
C I need these in both here and the main program.
integer NDIMS
parameter (NDIMS = 1)
integer DIM_LEN
parameter (DIM_LEN = 22)
integer NVARS
parameter (NVARS = 3)
integer DATA_LEN
parameter (DATA_LEN = 2)
integer MY_FILL_VALUE
parameter (MY_FILL_VALUE = 42)
C Parameters
integer ncid
character*(4) var_name(NVARS)
character*(4) dim_name
C Values that are read in, to check the file.
integer ndims_in, nvars_in, ngatts_in, unlimdimid_in
integer xtype_in, dimids_in(NDIMS), natts_in
integer varid_in(NVARS), dimid_in, no_fill_in, fill_value_in
character*(4) var_name_in
integer int_data_in(DIM_LEN)
integer x, retval
C Check it out.
retval = nf_inq(ncid, ndims_in, nvars_in, ngatts_in,
$ unlimdimid_in)
if (retval .ne. nf_noerr) call handle_err(retval)
if (ndims_in .ne. 1 .or. nvars_in .ne. NVARS .or. ngatts_in .ne. 0
$ .or. unlimdimid_in .ne. -1) stop 5
C Get the varids and the dimid.
do x = 1, NVARS
retval = nf_inq_varid(ncid, var_name(x), varid_in(x))
if (retval .ne. nf_noerr) call handle_err(retval)
if (varid_in(x) .ne. x) stop 6
end do
retval = nf_inq_dimid(ncid, dim_name, dimid_in)
if (retval .ne. nf_noerr) call handle_err(retval)
if (dimid_in .ne. 1) stop 7
C These things are the same for all three variables, except
C natts_in..
do x = 1, NVARS
retval = nf_inq_var(ncid, varid_in(x), var_name_in, xtype_in,
$ ndims_in, dimids_in, natts_in)
if (retval .ne. nf_noerr) call handle_err(retval)
if (ndims_in .ne. 1 .or. xtype_in .ne. NF_INT .or. dimids_in(1)
$ .ne. dimid_in) stop 8
if (x .eq. 3 .and. natts_in .ne. 1) stop 9
if (x .lt. 3 .and. natts_in .ne. 0) stop 10
end do
C Check the fill value for the first var. Nothing was set, so
C no_fill should be off, and fill_value should be the default fill
C value for this type.
retval = nf_inq_var_fill(ncid, varid_in(1), no_fill_in,
$ fill_value_in)
if (retval .ne. nf_noerr) call handle_err(retval)
if (no_fill_in .ne. 0 .or. fill_value_in .ne. nf_fill_int) stop 11
C Check that no_fill mode is on for the second variable.
retval = nf_inq_var_fill(ncid, varid_in(2), no_fill_in,
$ fill_value_in)
if (retval .ne. nf_noerr) call handle_err(retval)
if (no_fill_in .ne. 1 .or. fill_value_in .ne. nf_fill_int) stop 12
C Check that a non-default fill value is in use for the third variable.
retval = nf_inq_var_fill(ncid, varid_in(3), no_fill_in,
$ fill_value_in)
if (retval .ne. nf_noerr) call handle_err(retval)
if (no_fill_in .ne. 0 .or. fill_value_in .ne. MY_FILL_VALUE) stop
$ 2
C Get the data in var1. It will be all the default fill value.
retval = nf_get_var_int(ncid, varid_in(1), int_data_in)
if (retval .ne. nf_noerr) call handle_err(retval)
do x = 1, DIM_LEN
if (int_data_in(x) .ne. nf_fill_int) stop 13
end do
C Get the data in var2. What will it be?
retval = nf_get_var_int(ncid, varid_in(2), int_data_in)
if (retval .ne. nf_noerr) call handle_err(retval)
C$$$ do x = 1, DIM_LEN
C$$$ print *, int_data_in(x)
C$$$ end do
C Get the data in var3. It will be all the default fill value.
retval = nf_get_var_int(ncid, varid_in(3), int_data_in)
if (retval .ne. nf_noerr) call handle_err(retval)
do x = 1, DIM_LEN
C print *, int_data_in(x)
if (int_data_in(x) .ne. MY_FILL_VALUE) stop 14
end do
check_file = 0
end
|