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 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
program fgennc
include 'netcdf.inc'
!* error status return
integer iret
!* netCDF id
integer ncid
!* dimension ids
integer lat_dim
integer lon_dim
integer level_dim
integer time_dim
!* dimension lengths
integer lat_len
integer lon_len
integer level_len
integer time_len
parameter (lat_len = 5)
parameter (lon_len = 10)
parameter (level_len = 4)
parameter (time_len = UNLIMITED)
!* variable ids
integer temp_id
integer rh_id
integer lat_id
integer lon_id
integer level_id
integer time_id
!* rank (number of dimensions) for each variable
integer temp_rank
integer rh_rank
integer lat_rank
integer lon_rank
integer level_rank
integer time_rank
parameter (temp_rank = 4)
parameter (rh_rank = 3)
parameter (lat_rank = 1)
parameter (lon_rank = 1)
parameter (level_rank = 1)
parameter (time_rank = 1)
!* variable shapes
integer temp_dims(temp_rank)
integer rh_dims(rh_rank)
integer lat_dims(lat_rank)
integer lon_dims(lon_rank)
integer level_dims(level_rank)
integer time_dims(time_rank)
!* data variables
integer lat(lat_len)
integer lon(lon_len)
integer level(level_len)
!* attribute vectors
double precision doubleval(2)
!* enter define mode
iret = nf_create('file_bis.nc', NF_CLOBBER, ncid)
call check_err(iret)
!* define dimensions
iret = nf_def_dim(ncid, 'lat', 5, lat_dim)
call check_err(iret)
iret = nf_def_dim(ncid, 'lon', 10, lon_dim)
call check_err(iret)
iret = nf_def_dim(ncid, 'level', 4, level_dim)
call check_err(iret)
iret = nf_def_dim(ncid, 'time', NF_UNLIMITED, time_dim)
call check_err(iret)
!* define variables
temp_dims(4) = time_dim
temp_dims(3) = level_dim
temp_dims(2) = lat_dim
temp_dims(1) = lon_dim
iret = nf_def_var(ncid, 'temp', NF_REAL, temp_rank, temp_dims, te&
mp_id)
call check_err(iret)
rh_dims(3) = time_dim
rh_dims(2) = lat_dim
rh_dims(1) = lon_dim
iret = nf_def_var(ncid, 'rh', NF_REAL, rh_rank, rh_dims, rh_id)
call check_err(iret)
lat_dims(1) = lat_dim
iret = nf_def_var(ncid, 'lat', NF_INT, lat_rank, lat_dims, lat_id)
call check_err(iret)
lon_dims(1) = lon_dim
iret = nf_def_var(ncid, 'lon', NF_INT, lon_rank, lon_dims, lon_id)
call check_err(iret)
level_dims(1) = level_dim
iret = nf_def_var(ncid, 'level', NF_INT, level_rank, level_dims,&
level_id)
call check_err(iret)
time_dims(1) = time_dim
iret = nf_def_var(ncid, 'time', NF_INT2, time_rank, time_dims, ti&
me_id)
call check_err(iret)
!* assign attributes
iret = nf_put_att_text(ncid, temp_id, 'long_name', 11, 'temperatu&
re')
call check_err(iret)
iret = nf_put_att_text(ncid, temp_id, 'units', 7, 'celsius')
call check_err(iret)
iret = nf_put_att_text(ncid, rh_id, 'long_name', 17, 'relative hu&
midity')
call check_err(iret)
doubleval(1) = 0
doubleval(2) = 1
iret = nf_put_att_double(ncid, rh_id, 'valid_range', NF_DOUBLE, &
2, doubleval)
call check_err(iret)
iret = nf_put_att_text(ncid, lat_id, 'units', 13, 'degrees_north')
call check_err(iret)
iret = nf_put_att_text(ncid, lon_id, 'units', 12, 'degrees_east')
call check_err(iret)
iret = nf_put_att_text(ncid, level_id, 'units', 9, 'millibars')
call check_err(iret)
iret = nf_put_att_text(ncid, time_id, 'units', 20, &
'hours since 1996-1-1')
call check_err(iret)
iret = nf_put_att_text(ncid, NF_GLOBAL, 'source', 13, &
'MESONH OUTPUT')
call check_err(iret)
!* leave define mode
iret = nf_enddef(ncid)
call check_err(iret)
!* store level
data level /1000, 850, 700, 500/
iret = nf_put_var_int(ncid, level_id, level)
call check_err(iret)
!* store lat
data lat /20, 30, 40, 50, 60/
iret = nf_put_var_int(ncid, lat_id, lat)
call check_err(iret)
!* store lon
data lon /-160, -140, -118, -96, -84, -52, -45, -35, -25, -15/
iret = nf_put_var_int(ncid, lon_id, lon)
call check_err(iret)
!* Write record variables
call writerecs(ncid,temp_id,rh_id,time_id)
iret = nf_close(ncid)
call check_err(iret)
end
subroutine writerecs(ncid,temp_id,rh_id,time_id)
!* netCDF id
integer ncid
!* variable ids
integer temp_id
integer rh_id
integer time_id
include 'netcdf.inc'
!* error status return
integer iret
!* netCDF dimension sizes for dimensions used with record variables
integer lat_len
parameter (lat_len = 5)
integer lon_len
parameter (lon_len = 10)
integer level_len
parameter (level_len = 4)
!* rank (number of dimensions) for each variable
integer temp_rank
integer rh_rank
integer time_rank
parameter (temp_rank = 4)
parameter (rh_rank = 3)
parameter (time_rank = 1)
!* starts and counts for array sections of record variables
integer temp_start(temp_rank), temp_count(temp_rank)
integer rh_start(rh_rank), rh_count(rh_rank)
integer time_start(time_rank), time_count(time_rank)
!* data variables
integer temp_nr
parameter (temp_nr = 1)
real temp(lon_len, lat_len, level_len, temp_nr)
integer rh_nr
parameter (rh_nr = 1)
real rh(lon_len, lat_len, rh_nr)
integer time_nr
parameter (time_nr = 1)
integer time(time_nr)
data temp /200 * NF_FILL_FLOAT/
data rh /0.5, 0.2, 0.40000001, 0.2, 0.30000001,&
0.2, 0.40000001, 0.5, 0.60000002, 0.69999999,&
0.1, 0.30000001, 0.1, 0.1, 0.1, &
0.1, 0.5, 0.69999999, 0.80000001, 0.80000001,&
0.1, 0.2, 0.2, 0.2, 0.2,&
0.5, 0.69999999, 0.80000001, 0.89999998, 0.89999998, &
0.1, 0.2, 0.30000001, 0.30000001, 0.30000001, &
0.30000001, 0.69999999, 0.80000001,0.89999998,0.89999998,&
0, 0.1, 0.2, 0.40000001, 0.40000001,&
0.40000001, 0.40000001, 0.69999999, 0.89999998, 0.89999998/
data time /12/
!* store rh
rh_start(1) = 1
rh_start(2) = 1
rh_start(3) = 1
rh_count(1) = lon_len
rh_count(2) = lat_len
rh_count(3) = rh_nr
iret = nf_put_vara_real(ncid, rh_id, rh_start, rh_count, rh)
call check_err(iret)
!* store time
time_start(1) = 1
time_count(1) = time_nr
iret = nf_put_vara_int(ncid, time_id, time_start, time_count, &
time)
call check_err(iret)
end
subroutine check_err(iret)
integer iret
include 'netcdf.inc'
if (iret .ne. NF_NOERR) then
print *, nf_strerror(iret)
stop
endif
end |
Partager