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