/[lmdze]/trunk/libf/phylmd/Mobidic/regr_pr_coefoz.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/Mobidic/regr_pr_coefoz.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19 - (show annotations)
Thu Aug 7 15:46:20 2008 UTC (15 years, 9 months ago) by guez
File size: 6034 byte(s)
Inlined procedures "regr_pr_av" and "regr_pr_int" in "regr_pr_o3",
"regr_pr_av_coefoz" and "regr_pr_int_coefoz".

1 module regr_pr_coefoz
2
3 ! Both procedures of this module read a single Mobidic ozone
4 ! coefficient from "coefoz_LMDZ.nc", at the current day, regrid this
5 ! coefficient in pressure to the LMDZ vertical grid and pack it to the LMDZ
6 ! horizontal "physics" grid.
7 ! The input data is a 2D latitude -- pressure field.
8 ! The target horizontal LMDZ grid is the "scalar" grid: "rlonv", "rlatu".
9 ! We assume that the input data is already on the LMDZ "rlatu"
10 ! latitude grid.
11
12 implicit none
13
14 contains
15
16 subroutine regr_pr_av_coefoz(ncid, name, julien, v3)
17
18 ! "regr_pr_av_coefoz" stands for "regrid pressure averaging
19 ! coefficient ozone".
20 ! The target vertical LMDZ grid is the grid of layer boundaries.
21 ! The input data does not depend on longitude, but the pressure
22 ! at LMDZ layers does.
23 ! Therefore, the values on the LMDZ grid do depend on longitude.
24 ! Regridding in pressure is done by averaging a step function.
25
26 use dimens_m, only: iim, jjm, llm
27 use dimphy, only: klon
28 use netcdf95, only: nf95_inq_varid, handle_err
29 use netcdf, only: nf90_get_var
30 use grid_change, only: dyn_phy
31 use numer_rec, only: assert
32 use press_coefoz_m, only: press_in_edg
33 use regr1_step_av_m, only: regr1_step_av
34 use pressure_var, only: p3d
35
36 integer, intent(in):: ncid ! NetCDF ID of the file
37 character(len=*), intent(in):: name ! of the NetCDF variable
38 integer, intent(in):: julien ! jour julien, 1 <= julien <= 360
39
40 real, intent(out):: v3(:, :) ! (klon, llm)
41 ! (ozone coefficient from Mobidic on the "physics" grid)
42 ! ("v3(i, k)" is at longitude "xlon(i)", latitude
43 ! "xlat(i)", middle of layer "k".)
44
45 ! Variables local to the procedure:
46 integer varid, ncerr
47 integer i, j, k
48
49 real v1(jjm + 1, size(press_in_edg) - 1)
50 ! (ozone coefficient from "coefoz_LMDZ.nc" at day "julien")
51 ! ("v1(j, k)" is at latitude "rlatu(j)" and for
52 ! pressure interval "[press_in_edg(k), press_in_edg(k+1)]".)
53
54 real v2(iim + 1, jjm + 1, llm)
55 ! (ozone coefficient from Mobidic on the "dynamics" grid)
56 ! "v2(i, j, k)" is at longitude "rlonv(i)", latitude
57 ! "rlatu(j)", middle of layer "k".)
58
59 !--------------------------------------------
60
61 call assert(shape(v3) == (/klon, llm/), "regr_pr_av_coefoz")
62
63 call nf95_inq_varid(ncid, name, varid)
64
65 ! Get data at the right day from the input file:
66 ncerr = nf90_get_var(ncid, varid, v1, start=(/1, 1, julien/))
67 call handle_err("regr_pr_av_coefoz nf90_get_var " // name, ncerr, ncid)
68 ! Latitudes are in increasing order in the input file while
69 ! "rlatu" is in decreasing order so we need to invert order:
70 v1 = v1(jjm+1:1:-1, :)
71
72 ! Regrid in pressure at each horizontal position:
73 do j = 1, jjm + 1
74 do i = 1, iim
75 if (dyn_phy(i, j)) then
76 v2(i, j, llm:1:-1) &
77 = regr1_step_av(v1(j, :), press_in_edg, &
78 p3d(i, j, llm+1:1:-1))
79 ! (invert order of indices because "p3d" is decreasing)
80 end if
81 end do
82 end do
83
84 forall (k = 1:llm) v3(:, k) = pack(v2(:, :, k), dyn_phy)
85
86 end subroutine regr_pr_av_coefoz
87
88 !***************************************************************
89
90 subroutine regr_pr_int_coefoz(ncid, name, julien, top_value, v3)
91
92 ! "regr_pr_int_coefoz" stands for "regrid pressure interpolation
93 ! coefficient ozone".
94 ! The target vertical LMDZ grid is the grid of mid-layers.
95 ! The input data does not depend on longitude, but the pressure
96 ! at LMDZ mid-layers does.
97 ! Therefore, the values on the LMDZ grid do depend on longitude.
98 ! Regridding is by linear interpolation.
99
100 use dimens_m, only: iim, jjm, llm
101 use dimphy, only: klon
102 use netcdf95, only: nf95_inq_varid, handle_err
103 use netcdf, only: nf90_get_var
104 use grid_change, only: dyn_phy
105 use numer_rec, only: assert
106 use press_coefoz_m, only: plev
107 use regr1_lint_m, only: regr1_lint
108 use pressure_var, only: pls
109
110 integer, intent(in):: ncid ! NetCDF ID of the file
111 character(len=*), intent(in):: name ! of the NetCDF variable
112 integer, intent(in):: julien ! jour julien, 1 <= julien <= 360
113
114 real, intent(in):: top_value
115 ! (extra value of ozone coefficient at 0 pressure)
116
117 real, intent(out):: v3(:, :) ! (klon, llm)
118 ! (ozone coefficient from Mobidic on the "physics" grid)
119 ! ("v3(i, k)" is at longitude "xlon(i)", latitude
120 ! "xlat(i)", middle of layer "k".)
121
122 ! Variables local to the procedure:
123 integer varid, ncerr
124 integer i, j, k
125
126 real v1(jjm + 1, 0:size(plev))
127 ! (ozone coefficient from "coefoz_LMDZ.nc" at day "julien")
128 ! ("v1(j, k >=1)" is at latitude "rlatu(j)" and pressure "plev(k)".)
129
130 real v2(iim + 1, jjm + 1, llm)
131 ! (ozone coefficient from Mobidic on the "dynamics" grid)
132 ! "v2(i, j, k)" is at longitude "rlonv(i)", latitude
133 ! "rlatu(j)", middle of layer "k".)
134
135 !--------------------------------------------
136
137 call assert(shape(v3) == (/klon, llm/), "regr_pr_int_coefoz")
138
139 call nf95_inq_varid(ncid, name, varid)
140
141 ! Get data at the right day from the input file:
142 ncerr = nf90_get_var(ncid, varid, v1(:, 1:), start=(/1, 1, julien/))
143 call handle_err("regr_pr_int_coefoz nf90_get_var " // name, ncerr, ncid)
144 ! Latitudes are in increasing order in the input file while
145 ! "rlatu" is in decreasing order so we need to invert order:
146 v1(:, 1:) = v1(jjm+1:1:-1, 1:)
147
148 ! Complete "v1" with the value at 0 pressure:
149 v1(:, 0) = top_value
150
151 ! Regrid in pressure at each horizontal position:
152 do j = 1, jjm + 1
153 do i = 1, iim
154 if (dyn_phy(i, j)) then
155 v2(i, j, llm:1:-1) &
156 = regr1_lint(v1(j, :), (/0., plev/), pls(i, j, llm:1:-1))
157 ! (invert order of indices because "pls" is decreasing)
158 end if
159 end do
160 end do
161
162 forall (k = 1:llm) v3(:, k) = pack(v2(:, :, k), dyn_phy)
163
164 end subroutine regr_pr_int_coefoz
165
166 end module regr_pr_coefoz

  ViewVC Help
Powered by ViewVC 1.1.21