/[lmdze]/trunk/Sources/phylmd/Mobidic/regr_pr_o3.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/Mobidic/regr_pr_o3.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 225 - (show annotations)
Mon Oct 16 12:35:41 2017 UTC (6 years, 6 months ago) by guez
File size: 4503 byte(s)
LMDZE is now in Fortran 2003 (use of allocatable arguments).

gradsdef was not used.

Change names: [uv]10m to [uv]10m_srf in clmain, y[uv]1 to
[uv]1lay. Remove useless complication: zx_alf[12]. Do not modify
[uv]1lay after initial definition from [uv].

Add [uv]10m_srf to output.

Change names in physiq: [uv]10m to [uv]10m_srf, z[uv]10m to [uv]10m,
corresponding to NetCDF output names.

Remove unused complication couchelimite and useless variable inirnpb
in phytrac.

1 module regr_pr_o3_m
2
3 implicit none
4
5 contains
6
7 subroutine regr_pr_o3(p3d, o3_mob_regr)
8
9 ! "regr_pr_o3" stands for "regrid pressure ozone".
10 ! This procedure reads Mobidic ozone mole fraction from
11 ! "coefoz_LMDZ.nc" at the initial day and regrids it in pressure.
12 ! Ozone mole fraction from "coefoz_LMDZ.nc" is a 2D latitude --
13 ! pressure variable.
14 ! The target horizontal LMDZ grid is the "scalar" grid: "rlonv", "rlatu".
15 ! The target vertical LMDZ grid is the grid of layer boundaries.
16 ! We assume that the input variable is already on the LMDZ "rlatu"
17 ! latitude grid.
18 ! The input variable does not depend on longitude, but the
19 ! pressure at LMDZ layers does.
20 ! Therefore, the values on the LMDZ grid do depend on longitude.
21 ! Regridding is by averaging, assuming a step function.
22 ! We assume that, in the input file, the pressure levels are in
23 ! hPa and strictly increasing.
24
25 use dimens_m, only: iim, jjm, llm
26 use dynetat0_m, only: day_ref
27 use grid_change, only: dyn_phy
28 use netcdf, only: nf90_nowrite, nf90_get_var
29 use netcdf95, only: nf95_open, nf95_close, nf95_inq_varid, handle_err, &
30 nf95_gw_var
31 use nr_util, only: assert
32 use numer_rec_95, only: regr1_step_av
33
34 REAL, intent(in):: p3d(:, :, :) ! (iim + 1, jjm + 1, llm+1)
35 ! pressure at layer interfaces, in Pa
36 ! ("p3d(i, j, l)" is at longitude "rlonv(i)", latitude "rlatu(j)",
37 ! for interface "l")
38
39 real, intent(out):: o3_mob_regr(:, :, :) ! (iim + 1, jjm + 1, llm)
40 ! (ozone mole fraction from Mobidic adapted to the LMDZ grid)
41 ! ("o3_mob_regr(i, j, l)" is at longitude "rlonv(i)", latitude
42 ! "rlatu(j)" and pressure level "pls(i, j, l)")
43
44 ! Variables local to the procedure:
45
46 real, allocatable:: plev(:)
47 ! (pressure levels of Mobidic data, in Pa, in strictly increasing order)
48
49 real, allocatable:: press_in_edg(:)
50 ! (edges of pressure intervals for Mobidic data, in Pa, in strictly
51 ! increasing order)
52
53 integer ncid, varid, ncerr ! for NetCDF
54 integer n_plev ! number of pressure levels in Mobidic data
55 integer i, j
56
57 real, allocatable:: r_mob(:, :)! (jjm + 1, n_plev)
58 ! (ozone mole fraction from Mobidic at day "day_ref")
59 ! (r_mob(j, k) is at latitude "rlatu(j)" and pressure level "plev(k)".)
60
61 !------------------------------------------------------------
62
63 print *, "Call sequence information: regr_pr_o3"
64
65 call assert(shape(o3_mob_regr) == (/iim + 1, jjm + 1, llm/), &
66 "regr_pr_o3 o3_mob_regr")
67 call assert(shape(p3d) == (/iim + 1, jjm + 1, llm + 1/), &
68 "regr_pr_o3 p3d")
69
70 call nf95_open("coefoz_LMDZ.nc", nf90_nowrite, ncid)
71
72 call nf95_inq_varid(ncid, "plev", varid)
73 call nf95_gw_var(ncid, varid, plev)
74 ! Convert from hPa to Pa because "regr_pr_av" requires so:
75 plev = plev * 100.
76 n_plev = size(plev)
77
78 ! Compute edges of pressure intervals:
79 allocate(press_in_edg(n_plev + 1))
80 press_in_edg(1) = 0.
81 ! We choose edges halfway in logarithm:
82 forall (j = 2:n_plev) press_in_edg(j) = sqrt(plev(j - 1) * plev(j))
83 press_in_edg(n_plev + 1) = huge(0.)
84 ! (infinity, but any value guaranteed to be greater than the
85 ! surface pressure would do)
86
87 call nf95_inq_varid(ncid, "r_Mob", varid)
88 allocate(r_mob(jjm + 1, n_plev))
89
90 ! Get data at the right day from the input file:
91 ncerr = nf90_get_var(ncid, varid, r_mob, start=(/1, 1, day_ref/))
92 call handle_err("nf90_get_var r_Mob", ncerr)
93 ! Latitudes are in increasing order in the input file while
94 ! "rlatu" is in decreasing order so we need to invert order:
95 r_mob = r_mob(jjm+1:1:-1, :)
96
97 call nf95_close(ncid)
98
99 ! Regrid in pressure by averaging a step function of pressure:
100 do j = 1, jjm + 1
101 do i = 1, iim
102 if (dyn_phy(i, j)) then
103 o3_mob_regr(i, j, llm:1:-1) &
104 = regr1_step_av(r_mob(j, :), press_in_edg, &
105 p3d(i, j, llm+1:1:-1))
106 ! (invert order of indices because "p3d" is decreasing)
107 end if
108 end do
109 end do
110
111 ! Duplicate pole values on all longitudes:
112 o3_mob_regr(2:, 1, :) = spread(o3_mob_regr(1, 1, :), dim=1, ncopies=iim)
113 o3_mob_regr(2:, jjm + 1, :) &
114 = spread(o3_mob_regr(1, jjm + 1, :), dim=1, ncopies=iim)
115
116 ! Duplicate first longitude to last longitude:
117 o3_mob_regr(iim + 1, 2:jjm, :) = o3_mob_regr(1, 2:jjm, :)
118
119 end subroutine regr_pr_o3
120
121 end module regr_pr_o3_m

  ViewVC Help
Powered by ViewVC 1.1.21