44 use netcdf95, only: nf95_open, nf95_close, nf95_inq_varid, handle_err, &
45 nf95_put_var, nf95_gw_var
46 use netcdf
, only: nf90_nowrite, nf90_get_var
50 include
"dimensions.h"
58 integer ncid_in, ncid_out
62 real,
pointer:: latitude(:)
65 real,
allocatable:: lat_in_edg(:)
69 real,
pointer:: plev(:)
72 real,
allocatable:: o3_par_in(:, :, :)
77 real,
allocatable:: v_regr_lat(:, :, :)
91 real,
allocatable:: o3_par_out(:, :, :)
99 integer,
parameter:: n_o3_param = 8
101 character(len=11) name_in(n_o3_param)
104 character(len=9) name_out(n_o3_param)
107 integer varid_in(n_o3_param), varid_out(n_o3_param), varid_plev, varid_time
111 real,
parameter:: tmidmonth(0:13) = (/(-15. + 30. *
j,
j = 0, 13)/)
117 real,
parameter:: tmidday(360) = (/(
j + 0.5,
j = 0, 359)/)
123 print *,
"Call sequence information: regr_lat_time_coefoz"
129 name_in(i_v) =
"P_net"
130 name_out(i_v) =
"P_net_Mob"
137 name_in(i_v) =
"tro3"
138 name_out(i_v) =
"r_Mob"
145 name_in(i_v) =
"temperature"
146 name_out(i_v) =
"temp_Mob"
153 name_in(i_v) =
"Sigma"
154 name_out(i_v) =
"Sigma_Mob"
157 name_in(i_v) =
"R_Het"
158 name_out(i_v) =
"R_Het"
160 call
nf95_open(
"coefoz.nc", nf90_nowrite, ncid_in)
165 call nf95_gw_var(ncid_in, varid, latitude)
167 latitude = latitude / 180. *
pi
168 n_lat =
size(latitude)
171 desc_lat = latitude(1) > latitude(n_lat)
172 if (desc_lat) latitude = latitude(n_lat:1:-1)
175 allocate(lat_in_edg(n_lat + 1))
176 lat_in_edg(1) = -
pi / 2
177 forall (
j = 2:n_lat) lat_in_edg(
j) = (latitude(
j - 1) + latitude(
j)) / 2
178 lat_in_edg(n_lat + 1) =
pi / 2
182 call nf95_gw_var(ncid_in, varid, plev)
187 do i_v = 1, n_o3_param
192 call
prepare_out(ncid_in, varid_in, n_plev, name_out, ncid_out, &
193 varid_out, varid_plev, varid_time)
196 call nf95_put_var(ncid_out, varid_time, tmidday)
197 call nf95_put_var(ncid_out, varid_plev, plev)
201 allocate(o3_par_in(n_lat, n_plev, 12))
202 allocate(v_regr_lat(jjm + 1, n_plev, 0:13))
203 allocate(o3_par_out(jjm + 1, n_plev, 360))
205 do i_v = 1, n_o3_param
208 ncerr = nf90_get_var(ncid_in, varid_in(i_v), o3_par_in)
209 call
handle_err(
"nf90_get_var", ncerr, ncid_in)
211 if (desc_lat) o3_par_in = o3_par_in(n_lat:1:-1, :, :)
217 xs=sin(lat_in_edg), xt=sin((/-
pi / 2,
rlatv(jjm:1:-1),
pi / 2/)))
223 v_regr_lat(:, :, 0) = v_regr_lat(:, :, 12)
224 v_regr_lat(:, :, 13) = v_regr_lat(:, :, 1)
227 o3_par_out =
regr3_lint(v_regr_lat, tmidmonth, tmidday)
230 call nf95_put_var(ncid_out, varid_out(i_v), &
231 o3_par_out(jjm+1:1:-1, :, :))
242 subroutine prepare_out(ncid_in, varid_in, n_plev, name_out, ncid_out, &
243 varid_out, varid_plev, varid_time)
250 use netcdf95, only: nf95_create, nf95_def_dim, nf95_def_var, &
252 use netcdf
, only: nf90_clobber, nf90_float, nf90_copy_att, nf90_global
254 integer,
intent(in):: ncid_in, varid_in(:), n_plev
255 character(len=*),
intent(in):: name_out(:)
256 integer,
intent(out):: ncid_out, varid_out(:), varid_plev, varid_time
260 include
"dimensions.h"
269 integer dimid_rlatu, dimid_plev, dimid_time
271 integer i, n_o3_param
275 print *,
"Call sequence information: prepare_out"
276 n_o3_param =
assert_eq(
size(varid_in),
size(varid_out), &
277 size(name_out),
"prepare_out")
279 call
nf95_create(
"coefoz_LMDZ.nc", nf90_clobber, ncid_out)
284 call
nf95_def_dim(ncid_out,
"rlatu", jjm + 1, dimid_rlatu)
288 call nf95_def_var(ncid_out,
"time", nf90_float, dimid_time, varid_time)
289 call nf95_put_att(ncid_out, varid_time,
"units",
"days since 2000-1-1")
290 call nf95_put_att(ncid_out, varid_time,
"calendar",
"360_day")
291 call nf95_put_att(ncid_out, varid_time,
"standard_name",
"time")
293 call nf95_def_var(ncid_out,
"plev", nf90_float, dimid_plev, varid_plev)
294 call nf95_put_att(ncid_out, varid_plev,
"units",
"millibar")
295 call nf95_put_att(ncid_out, varid_plev,
"standard_name",
"air_pressure")
296 call nf95_put_att(ncid_out, varid_plev,
"long_name",
"air pressure")
298 call nf95_def_var(ncid_out,
"rlatu", nf90_float, dimid_rlatu, varid_rlatu)
299 call nf95_put_att(ncid_out, varid_rlatu,
"units",
"degrees_north")
300 call nf95_put_att(ncid_out, varid_rlatu,
"standard_name",
"latitude")
305 call nf95_def_var(ncid_out, name_out(
i), nf90_float, &
306 (/dimid_rlatu, dimid_plev, dimid_time/), varid_out(
i))
311 ncerr = nf90_copy_att(ncid_in, varid_in(
i),
"long_name",&
312 & ncid_out, varid_out(
i))
315 ncerr = nf90_copy_att(ncid_in, varid_in(
i),
"units", ncid_out,&
319 ncerr = nf90_copy_att(ncid_in, varid_in(
i),
"standard_name", ncid_out,&
325 call
nf95_copy_att(ncid_in, nf90_global,
"Conventions", ncid_out, &
327 call
nf95_copy_att(ncid_in, nf90_global,
"title", ncid_out, nf90_global)
328 call
nf95_copy_att(ncid_in, nf90_global,
"source", ncid_out, nf90_global)
329 call nf95_put_att(ncid_out, nf90_global,
"comment",
"Regridded for LMDZ")
334 call nf95_put_var(ncid_out, varid_rlatu,
rlatu(jjm+1:1:-1) /
pi * 180.)
341 use netcdf
, only: nf90_noerr, nf90_strerror
343 character(len=*),
intent(in):: att_name
347 if (ncerr /= nf90_noerr)
then
348 print *,
"prepare_out " // trim(name_out(
i)) &
349 //
" nf90_copy_att " // att_name //
" -- " &
350 // trim(nf90_strerror(ncerr))