46 nf95_put_var, nf95_gw_var
47 use netcdf
, only: nf90_nowrite, nf90_get_var
53 integer ncid_in, ncid_out
57 real,
pointer:: latitude(:)
60 real,
allocatable:: lat_in_edg(:)
64 real,
pointer:: plev(:)
67 real,
allocatable:: o3_par_in(:, :, :)
72 real,
allocatable:: v_regr_lat(:, :, :)
86 real,
allocatable:: o3_par_out(:, :, :)
94 integer,
parameter:: n_o3_param = 8
96 character(len=11) name_in(n_o3_param)
99 character(len=9) name_out(n_o3_param)
102 integer varid_in(n_o3_param), varid_out(n_o3_param), varid_plev, varid_time
106 real,
parameter:: tmidmonth(0:13) = (/(-15. + 30. * j, j = 0, 13)/)
112 real,
parameter:: tmidday(360) = (/(j + 0.5, j = 0, 359)/)
118 print *,
"Call sequence information: regr_lat_time_coefoz"
124 name_in(i_v) =
"P_net"
125 name_out(i_v) =
"P_net_Mob"
132 name_in(i_v) =
"tro3"
133 name_out(i_v) =
"r_Mob"
140 name_in(i_v) =
"temperature"
141 name_out(i_v) =
"temp_Mob"
148 name_in(i_v) =
"Sigma"
149 name_out(i_v) =
"Sigma_Mob"
152 name_in(i_v) =
"R_Het"
153 name_out(i_v) =
"R_Het"
155 call nf95_open(
"coefoz.nc", nf90_nowrite, ncid_in)
159 call nf95_inq_varid(ncid_in,
"latitude", varid)
160 call nf95_gw_var(ncid_in, varid, latitude)
162 latitude = latitude / 180. *
pi
163 n_lat =
size(latitude)
166 desc_lat = latitude(1) > latitude(n_lat)
167 if (desc_lat) latitude = latitude(n_lat:1:-1)
170 allocate(lat_in_edg(n_lat + 1))
171 lat_in_edg(1) = -
pi / 2
172 forall (j = 2:n_lat) lat_in_edg(j) = (latitude(j - 1) + latitude(j)) / 2
173 lat_in_edg(n_lat + 1) =
pi / 2
176 call nf95_inq_varid(ncid_in,
"plev", varid)
177 call nf95_gw_var(ncid_in, varid, plev)
182 do i_v = 1, n_o3_param
183 call nf95_inq_varid(ncid_in, trim(name_in(i_v)), varid_in(i_v))
187 call prepare_out(ncid_in, varid_in, n_plev, name_out, ncid_out, &
188 varid_out, varid_plev, varid_time)
191 call nf95_put_var(ncid_out, varid_time, tmidday)
192 call nf95_put_var(ncid_out, varid_plev, plev)
196 allocate(o3_par_in(n_lat, n_plev, 12))
197 allocate(v_regr_lat(
nbp_lat, n_plev, 0:13))
198 allocate(o3_par_out(
nbp_lat, n_plev, 360))
200 do i_v = 1, n_o3_param
203 ncerr = nf90_get_var(ncid_in, varid_in(i_v), o3_par_in)
204 call handle_err(
"nf90_get_var", ncerr, ncid_in)
206 if (desc_lat) o3_par_in = o3_par_in(n_lat:1:-1, :, :)
218 v_regr_lat(:, :, 0) = v_regr_lat(:, :, 12)
219 v_regr_lat(:, :, 13) = v_regr_lat(:, :, 1)
222 o3_par_out =
regr3_lint(v_regr_lat, tmidmonth, tmidday)
225 call nf95_put_var(ncid_out, varid_out(i_v), &
226 o3_par_out(
nbp_lat:1:-1, :, :))
230 call nf95_close(ncid_out)
231 call nf95_close(ncid_in)
237 subroutine prepare_out(ncid_in, varid_in, n_plev, name_out, ncid_out, &
238 varid_out, varid_plev, varid_time)
246 use netcdf95, only: nf95_create, nf95_def_dim, nf95_def_var, &
247 nf95_put_att, nf95_enddef, nf95_copy_att, nf95_put_var
248 use netcdf
, only: nf90_clobber, nf90_float, nf90_copy_att, nf90_global
252 integer,
intent(in):: ncid_in, varid_in(:), n_plev
253 character(len=*),
intent(in):: name_out(:)
254 integer,
intent(out):: ncid_out, varid_out(:), varid_plev, varid_time
259 integer dimid_rlatu, dimid_plev, dimid_time
261 integer i, n_o3_param
265 print *,
"Call sequence information: prepare_out"
266 n_o3_param =
assert_eq(
size(varid_in),
size(varid_out), &
267 size(name_out),
"prepare_out")
269 call nf95_create(
"coefoz_LMDZ.nc", nf90_clobber, ncid_out)
272 call nf95_def_dim(ncid_out,
"time", 360, dimid_time)
273 call nf95_def_dim(ncid_out,
"plev", n_plev, dimid_plev)
274 call nf95_def_dim(ncid_out,
"rlatu",
nbp_lat, dimid_rlatu)
278 call nf95_def_var(ncid_out,
"time", nf90_float, dimid_time, varid_time)
279 call nf95_put_att(ncid_out, varid_time,
"units",
"days since 2000-1-1")
280 call nf95_put_att(ncid_out, varid_time,
"calendar",
"360_day")
281 call nf95_put_att(ncid_out, varid_time,
"standard_name",
"time")
283 call nf95_def_var(ncid_out,
"plev", nf90_float, dimid_plev, varid_plev)
284 call nf95_put_att(ncid_out, varid_plev,
"units",
"millibar")
285 call nf95_put_att(ncid_out, varid_plev,
"standard_name",
"air_pressure")
286 call nf95_put_att(ncid_out, varid_plev,
"long_name",
"air pressure")
288 call nf95_def_var(ncid_out,
"rlatu", nf90_float, dimid_rlatu, varid_rlatu)
289 call nf95_put_att(ncid_out, varid_rlatu,
"units",
"degrees_north")
290 call nf95_put_att(ncid_out, varid_rlatu,
"standard_name",
"latitude")
295 call nf95_def_var(ncid_out, name_out(i), nf90_float, &
296 (/dimid_rlatu, dimid_plev, dimid_time/), varid_out(i))
301 ncerr = nf90_copy_att(ncid_in, varid_in(i),
"long_name",&
302 & ncid_out, varid_out(i))
305 ncerr = nf90_copy_att(ncid_in, varid_in(i),
"units", ncid_out,&
309 ncerr = nf90_copy_att(ncid_in, varid_in(i),
"standard_name", ncid_out,&
315 call nf95_copy_att(ncid_in, nf90_global,
"Conventions", ncid_out, &
317 call nf95_copy_att(ncid_in, nf90_global,
"title", ncid_out, nf90_global)
318 call nf95_copy_att(ncid_in, nf90_global,
"source", ncid_out, nf90_global)
319 call nf95_put_att(ncid_out, nf90_global,
"comment",
"Regridded for LMDZ")
321 call nf95_enddef(ncid_out)
331 use netcdf
, only: nf90_noerr, nf90_strerror
333 character(len=*),
intent(in):: att_name
337 if (ncerr /= nf90_noerr)
then
338 print *,
"prepare_out " // trim(name_out(i)) &
339 //
" nf90_copy_att " // att_name //
" -- " &
340 // trim(nf90_strerror(ncerr))
subroutine handle_err(status)
subroutine handle_err_copy_att(att_name)
subroutine prepare_out(ncid_in, varid_in, n_plev, name_out, ncid_out, varid_out, varid_plev, varid_time)
!$Id mode_top_bound COMMON comconstr && pi
real, dimension(:,:), allocatable, save boundslat_reg
subroutine, public regr_lat_time_coefoz
real, dimension(:), allocatable, save lat_reg