72 nf95_inq_dimid, nf95_inq_varid, nf95_inquire_dimension, nf95_open, &
74 use netcdf
, only: nf90_get_att, nf90_get_var, nf90_noerr, nf90_nowrite
79 integer,
intent(in):: read_climoz
91 real,
pointer:: latitude(:)
94 real,
allocatable:: lat_in_edg(:)
98 real,
pointer:: plev(:)
105 real,
allocatable:: o3_in(:, :, :, :)
116 real,
allocatable:: o3_regr_lat(:, :, :, :)
133 real,
allocatable:: o3_out(:, :, :, :)
145 integer ncid_in, ncid_out
146 integer varid_plev, varid_time, varid, ncerr, dimid
147 character(len=80) press_unit
149 integer varid_in(read_climoz), varid_out(read_climoz)
153 real,
parameter:: tmidmonth(0:13) = (/(-15. + 30. * l, l = 0, 13)/)
159 real,
parameter:: tmidday(360) = (/(l + 0.5, l = 0, 359)/)
165 print *,
"Call sequence information: regr_lat_time_climoz"
166 call assert(read_climoz == 1 .or. read_climoz == 2,
"regr_lat_time_climoz")
168 call nf95_open(
"climoz.nc", nf90_nowrite, ncid_in)
172 call nf95_inq_varid(ncid_in,
"latitude", varid)
173 call nf95_gw_var(ncid_in, varid, latitude)
175 latitude = latitude / 180. *
pi
176 n_lat =
size(latitude)
179 desc_lat = latitude(1) > latitude(n_lat)
180 if (desc_lat) latitude = latitude(n_lat:1:-1)
183 allocate(lat_in_edg(n_lat + 1))
184 lat_in_edg(1) = -
pi / 2
185 forall (j = 2:n_lat) lat_in_edg(j) = (latitude(j - 1) + latitude(j)) / 2
186 lat_in_edg(n_lat + 1) =
pi / 2
189 call nf95_inq_varid(ncid_in,
"plev", varid)
190 call nf95_gw_var(ncid_in, varid, plev)
196 desc_plev = plev(1) > plev(n_plev)
197 if (desc_plev) plev = plev(n_plev:1:-1)
198 call nf95_get_att(ncid_in, varid,
"units", press_unit)
199 if (press_unit ==
"Pa")
then
202 elseif (press_unit /=
"hPa")
then
203 print *,
"regr_lat_time_climoz: the only recognized units are Pa " &
209 call prepare_out(ncid_in, n_plev, ncid_out, varid_out, varid_plev, &
213 call nf95_put_var(ncid_out, varid_plev, plev)
214 call nf95_put_var(ncid_out, varid_time, tmidday)
219 call nf95_inq_dimid(ncid_in,
"time", dimid)
220 call nf95_inquire_dimension(ncid_in, dimid, nclen=n_month)
222 allocate(o3_in(n_lat, n_plev, n_month, read_climoz))
224 call nf95_inq_varid(ncid_in,
"tro3", varid_in(1))
225 ncerr = nf90_get_var(ncid_in, varid_in(1), o3_in(:, :, :, 1))
226 call handle_err(
"regr_lat_time_climoz nf90_get_var tro3", ncerr, ncid_in)
228 if (read_climoz == 2)
then
229 call nf95_inq_varid(ncid_in,
"tro3_daylight", varid_in(2))
230 ncerr = nf90_get_var(ncid_in, varid_in(2), o3_in(:, :, :, 2))
231 call handle_err(
"regr_lat_time_climoz nf90_get_var tro3_daylight", &
232 ncerr, ncid_in, varid_in(2))
235 if (desc_lat) o3_in = o3_in(n_lat:1:-1, :, :, :)
236 if (desc_plev) o3_in = o3_in(:, n_plev:1:-1, :, :)
238 do m = 1, read_climoz
239 ncerr = nf90_get_att(ncid_in, varid_in(m),
"missing_value", &
241 if (ncerr == nf90_noerr)
then
247 do while (o3_in(j, 1, l, m) == missing_value)
250 if (j > 1) o3_in(:j-1, :, l, m) = &
251 spread(o3_in(j, :, l, m), dim=1, ncopies=j-1)
255 do while (o3_in(j, 1, l, m) == missing_value)
258 if (j < n_lat) o3_in(j+1:, :, l, m) = &
259 spread(o3_in(j, :, l, m), dim=1, ncopies=n_lat-j)
268 do while (o3_in(j, k, l, m) /= missing_value .and. k < n_plev)
273 if (o3_in(j, k, l, m) == missing_value) &
274 o3_in(j, k:n_plev, l, m) = o3_in(j, k-1, l, m)
278 print *,
"regr_lat_time_climoz: field ", m, &
279 ", no missing value attribute"
283 call nf95_close(ncid_in)
285 allocate(o3_regr_lat(
nbp_lat, n_plev, 0:13, read_climoz))
286 allocate(o3_out(
nbp_lat, n_plev, 360, read_climoz))
291 if (n_month == 12)
then
293 "Found 12 months in ozone climatologies, assuming periodicity..."
301 o3_regr_lat(:, :, 0, :) = o3_regr_lat(:, :, 12, :)
302 o3_regr_lat(:, :, 13, :) = o3_regr_lat(:, :, 1, :)
304 print *,
"Using 14 months in ozone climatologies..."
312 o3_out =
regr3_lint(o3_regr_lat, tmidmonth, tmidday)
315 do m = 1, read_climoz
316 call nf95_put_var(ncid_out, varid_out(m), o3_out(
nbp_lat:1:-1, :, :, m))
320 call nf95_close(ncid_out)
326 subroutine prepare_out(ncid_in, n_plev, ncid_out, varid_out, varid_plev, &
333 use netcdf95, only: nf95_create, nf95_def_dim, nf95_def_var, &
334 nf95_put_att, nf95_enddef, nf95_copy_att, nf95_put_var
335 use netcdf
, only: nf90_clobber, nf90_float, nf90_global
339 integer,
intent(in):: ncid_in, n_plev
340 integer,
intent(out):: ncid_out, varid_plev, varid_time
342 integer,
intent(out):: varid_out(:)
349 integer dimid_rlatu, dimid_plev, dimid_time
354 print *,
"Call sequence information: prepare_out"
356 call nf95_create(
"climoz_LMDZ.nc", nf90_clobber, ncid_out)
359 call nf95_def_dim(ncid_out,
"time", 360, dimid_time)
360 call nf95_def_dim(ncid_out,
"plev", n_plev, dimid_plev)
361 call nf95_def_dim(ncid_out,
"rlatu",
nbp_lat, dimid_rlatu)
365 call nf95_def_var(ncid_out,
"time", nf90_float, dimid_time, varid_time)
366 call nf95_put_att(ncid_out, varid_time,
"units",
"days since 2000-1-1")
367 call nf95_put_att(ncid_out, varid_time,
"calendar",
"360_day")
368 call nf95_put_att(ncid_out, varid_time,
"standard_name",
"time")
370 call nf95_def_var(ncid_out,
"plev", nf90_float, dimid_plev, varid_plev)
371 call nf95_put_att(ncid_out, varid_plev,
"units",
"millibar")
372 call nf95_put_att(ncid_out, varid_plev,
"standard_name",
"air_pressure")
373 call nf95_put_att(ncid_out, varid_plev,
"long_name",
"air pressure")
375 call nf95_def_var(ncid_out,
"rlatu", nf90_float, dimid_rlatu, varid_rlatu)
376 call nf95_put_att(ncid_out, varid_rlatu,
"units",
"degrees_north")
377 call nf95_put_att(ncid_out, varid_rlatu,
"standard_name",
"latitude")
381 call nf95_def_var(ncid_out,
"tro3", nf90_float, &
382 (/dimid_rlatu, dimid_plev, dimid_time/), varid_out(1))
383 call nf95_put_att(ncid_out, varid_out(1),
"long_name", &
384 "ozone mole fraction")
385 call nf95_put_att(ncid_out, varid_out(1),
"standard_name", &
386 "mole_fraction_of_ozone_in_air")
388 if (
size(varid_out) == 2)
then
389 call nf95_def_var(ncid_out,
"tro3_daylight", nf90_float, &
390 (/dimid_rlatu, dimid_plev, dimid_time/), varid_out(2))
391 call nf95_put_att(ncid_out, varid_out(2),
"long_name", &
392 "ozone mole fraction in daylight")
401 call nf95_copy_att(ncid_in, nf90_global,
"Conventions", ncid_out, &
405 call nf95_copy_att(ncid_in, nf90_global,
"title", ncid_out, nf90_global, &
409 call nf95_copy_att(ncid_in, nf90_global,
"institution", ncid_out, &
413 call nf95_copy_att(ncid_in, nf90_global,
"source", ncid_out, nf90_global, &
417 call nf95_put_att(ncid_out, nf90_global,
"comment",
"Regridded for LMDZ")
419 call nf95_enddef(ncid_out)
429 use netcdf
, only: nf90_noerr, nf90_strerror
431 character(len=*),
intent(in):: att_name
435 if (ncerr /= nf90_noerr)
then
436 print *,
"regr_lat_time_climoz_m prepare_out nf95_copy_att " &
437 // att_name //
" -- " // trim(nf90_strerror(ncerr))
subroutine handle_err(status)
subroutine, public regr_lat_time_climoz(read_climoz)
subroutine handle_err_copy_att(att_name)
!$Id mode_top_bound COMMON comconstr && pi
real, dimension(:,:), allocatable, save boundslat_reg
subroutine prepare_out(ncid_in, n_plev, ncid_out, varid_out, varid_plev, varid_time)
real, dimension(:), allocatable, save lat_reg