/[lmdze]/trunk/dyn3d/etat0.f
ViewVC logotype

Contents of /trunk/dyn3d/etat0.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 97 - (show annotations)
Fri Apr 25 14:58:31 2014 UTC (10 years ago) by guez
File size: 12062 byte(s)
Module pressure_var is now only used in gcm. Created local variables
pls and p3d in etat0, added argument p3d to regr_pr_o3.

In leapfrog, moved computation of p3d and exner function immediately
after integrd, for clarity (does not change the execution).

Removed unused arguments: ntra, tra1 and tra of cv3_compress; ntra,
tra and traent of cv3_mixing; ntra, ftra, ftra1 of cv3_uncompress;
ntra, tra, trap of cv3_unsat; ntra, tra, trap, traent, ftra of
cv3_yield; tra, tvp, pbase, bbase, dtvpdt1, dtvpdq1, dplcldt,
dplcldr, ntra of concvl; ndp1, ntra, tra1 of cv_driver

Removed argument d_tra and computation of d_tra in concvl. Removed
argument ftra1 and computation of ftra1 in cv_driver. ftra1 was just
set to 0 in cv_driver, associated to d_tra in concvl, and set again to
zero in concvl.

1 module etat0_mod
2
3 use indicesol, only: nbsrf
4 use dimphy, only: klon
5
6 IMPLICIT NONE
7
8 REAL pctsrf(klon, nbsrf)
9 ! ("pctsrf(i, :)" is the composition of the surface at horizontal
10 ! position "i")
11
12 private nbsrf, klon
13
14 contains
15
16 SUBROUTINE etat0
17
18 ! From "etat0_netcdf.F", version 1.3, 2005/05/25 13:10:09
19
20 use caldyn0_m, only: caldyn0
21 use comconst, only: cpp, kappa, iniconst
22 use comgeom, only: rlatu, rlonv, rlonu, rlatv, aire_2d, apoln, apols, &
23 cu_2d, cv_2d, inigeom
24 use conf_gcm_m, only: dayref, anneeref
25 use dimens_m, only: iim, jjm, llm, nqmx
26 use dimphy, only: zmasq
27 use dimsoil, only: nsoilmx
28 use disvert_m, only: ap, bp, preff, pa, disvert
29 use dynredem0_m, only: dynredem0
30 use dynredem1_m, only: dynredem1
31 use exner_hyb_m, only: exner_hyb
32 use geopot_m, only: geopot
33 use grid_atob, only: grille_m
34 use grid_change, only: init_dyn_phy, dyn_phy
35 use histclo_m, only: histclo
36 use indicesol, only: is_oce, is_sic, is_ter, is_lic, epsfra
37 use iniadvtrac_m, only: iniadvtrac
38 use inifilr_m, only: inifilr
39 use massdair_m, only: massdair
40 use netcdf, only: nf90_nowrite
41 use netcdf95, only: nf95_close, nf95_get_var, nf95_gw_var, &
42 nf95_inq_varid, nf95_open
43 use nr_util, only: pi, assert
44 use paramet_m, only: ip1jm, ip1jmp1
45 use phyredem_m, only: phyredem
46 use q_sat_m, only: q_sat
47 use regr_lat_time_coefoz_m, only: regr_lat_time_coefoz
48 use regr_pr_o3_m, only: regr_pr_o3
49 use serre, only: alphax
50 use startdyn, only: start_init_dyn
51 USE start_init_orog_m, only: start_init_orog, mask
52 use start_init_phys_m, only: start_init_phys
53 use start_inter_3d_m, only: start_inter_3d
54 use temps, only: itau_phy, annee_ref, day_ref
55
56 ! Variables local to the procedure:
57
58 REAL latfi(klon), lonfi(klon)
59 ! (latitude and longitude of a point of the scalar grid identified
60 ! by a simple index, in degrees)
61
62 REAL, dimension(iim + 1, jjm + 1, llm):: ucov, t3d, teta
63 REAL vcov(iim + 1, jjm, llm)
64
65 REAL q(iim + 1, jjm + 1, llm, nqmx)
66 ! (mass fractions of trace species
67 ! "q(i, j, l)" is at longitude "rlonv(i)", latitude "rlatu(j)"
68 ! and pressure level "pls(i, j, l)".)
69
70 real qsat(iim + 1, jjm + 1, llm) ! mass fraction of saturating water vapor
71 REAL tsol(klon), qsol(klon), sn(klon)
72 REAL tsolsrf(klon, nbsrf), qsolsrf(klon, nbsrf), snsrf(klon, nbsrf)
73 REAL albe(klon, nbsrf), evap(klon, nbsrf)
74 REAL alblw(klon, nbsrf)
75 REAL tsoil(klon, nsoilmx, nbsrf)
76 REAL radsol(klon), rain_fall(klon), snow_fall(klon)
77 REAL solsw(klon), sollw(klon), fder(klon)
78 !IM "slab" ocean
79 REAL tslab(klon)
80 real seaice(klon) ! kg m-2
81 REAL frugs(klon, nbsrf), agesno(klon, nbsrf)
82 REAL rugmer(klon)
83 REAL phis(iim + 1, jjm + 1) ! surface geopotential, in m2 s-2
84 real, dimension(iim + 1, jjm + 1):: zmea_2d, zstd_2d, zsig_2d, zgam_2d
85 real, dimension(iim + 1, jjm + 1):: zthe_2d, zpic_2d, zval_2d
86 real, dimension(iim + 1, jjm + 1):: tsol_2d, qsol_2d, ps
87 REAL zmea(klon), zstd(klon)
88 REAL zsig(klon), zgam(klon)
89 REAL zthe(klon)
90 REAL zpic(klon), zval(klon)
91 REAL t_ancien(klon, llm), q_ancien(klon, llm)
92 REAL run_off_lic_0(klon)
93 real clwcon(klon, llm), rnebcon(klon, llm), ratqs(klon, llm)
94
95 ! D\'eclarations pour lecture glace de mer :
96 INTEGER iml_lic, jml_lic
97 INTEGER ncid, varid
98 REAL, pointer:: dlon_lic(:), dlat_lic(:)
99 REAL, ALLOCATABLE:: fraclic(:, :) ! fraction land ice
100 REAL flic_tmp(iim + 1, jjm + 1) ! fraction land ice temporary
101
102 INTEGER l, ji
103
104 REAL pk(iim + 1, jjm + 1, llm) ! fonction d'Exner aux milieux des couches
105 real pks(iim + 1, jjm + 1)
106
107 REAL masse(iim + 1, jjm + 1, llm)
108 REAL phi(iim + 1, jjm + 1, llm)
109 REAL pbaru(ip1jmp1, llm), pbarv(ip1jm, llm)
110 REAL w(iim + 1, jjm + 1, llm)
111
112 real sig1(klon, llm) ! section adiabatic updraft
113 real w01(klon, llm) ! vertical velocity within adiabatic updraft
114
115 real pls(iim + 1, jjm + 1, llm)
116 ! (pressure at mid-layer of LMDZ grid, in Pa)
117 ! "pls(i, j, l)" is at longitude "rlonv(i)", latitude "rlatu(j)",
118 ! for layer "l")
119
120 REAL p3d(iim + 1, jjm + 1, llm+1) ! pressure at layer interfaces, in Pa
121 ! ("p3d(i, j, l)" is at longitude "rlonv(i)", latitude "rlatu(j)",
122 ! for interface "l")
123
124 !---------------------------------
125
126 print *, "Call sequence information: etat0"
127
128 CALL iniconst
129
130 ! Construct a grid:
131
132 pa = 5e4
133 CALL disvert
134 CALL inigeom
135 CALL inifilr
136
137 latfi(1) = 90.
138 latfi(2:klon-1) = pack(spread(rlatu(2:jjm), 1, iim), .true.) * 180. / pi
139 ! (with conversion to degrees)
140 latfi(klon) = - 90.
141
142 lonfi(1) = 0.
143 lonfi(2:klon-1) = pack(spread(rlonv(:iim), 2, jjm - 1), .true.) * 180. / pi
144 ! (with conversion to degrees)
145 lonfi(klon) = 0.
146
147 call start_init_orog(phis, zmea_2d, zstd_2d, zsig_2d, zgam_2d, zthe_2d, &
148 zpic_2d, zval_2d) ! also compute "mask"
149 call init_dyn_phy ! define the mask "dyn_phy" for distinct grid points
150 zmasq = pack(mask, dyn_phy)
151 PRINT *, 'Masque construit'
152
153 call start_init_phys(tsol_2d, qsol_2d)
154 CALL start_init_dyn(tsol_2d, phis, ps)
155
156 ! Compute pressure on intermediate levels:
157 forall(l = 1: llm + 1) p3d(:, :, l) = ap(l) + bp(l) * ps
158 CALL exner_hyb(ps, p3d, pks, pk)
159 call assert(MINVAL(pk) /= MAXVAL(pk), '"pk" should not be constant')
160
161 pls = preff * (pk / cpp)**(1. / kappa)
162 PRINT *, "minval(pls) = ", minval(pls)
163 print *, "maxval(pls) = ", maxval(pls)
164
165 call start_inter_3d('U', rlonv, rlatv, pls, ucov)
166 forall (l = 1: llm) ucov(:iim, :, l) = ucov(:iim, :, l) * cu_2d(:iim, :)
167 ucov(iim+1, :, :) = ucov(1, :, :)
168
169 call start_inter_3d('V', rlonu, rlatu(:jjm), pls(:, :jjm, :), vcov)
170 forall (l = 1: llm) vcov(:iim, :, l) = vcov(:iim, :, l) * cv_2d(:iim, :)
171 vcov(iim + 1, :, :) = vcov(1, :, :)
172
173 call start_inter_3d('TEMP', rlonu, rlatv, pls, t3d)
174 PRINT *, 'minval(t3d) = ', minval(t3d)
175 print *, "maxval(t3d) = ", maxval(t3d)
176
177 teta(:iim, :, :) = t3d(:iim, :, :) * cpp / pk(:iim, :, :)
178 teta(iim + 1, :, :) = teta(1, :, :)
179 DO l = 1, llm
180 teta(:, 1, l) = SUM(aire_2d(:, 1) * teta(:, 1, l)) / apoln
181 teta(:, jjm + 1, l) = SUM(aire_2d(:, jjm + 1) * teta(:, jjm + 1, l)) &
182 / apols
183 ENDDO
184
185 ! Calcul de l'humidit\'e \`a saturation :
186 qsat = q_sat(t3d, pls)
187 PRINT *, "minval(qsat) = ", minval(qsat)
188 print *, "maxval(qsat) = ", maxval(qsat)
189 IF (MINVAL(qsat) == MAXVAL(qsat)) stop '"qsat" should not be constant'
190
191 ! Water vapor:
192 call start_inter_3d('R', rlonu, rlatv, pls, q(:, :, :, 1))
193 q(:, :, :, 1) = 0.01 * q(:, :, :, 1) * qsat
194 WHERE (q(:, :, :, 1) < 0.) q(:, :, :, 1) = 1E-10
195 DO l = 1, llm
196 q(:, 1, l, 1) = SUM(aire_2d(:, 1) * q(:, 1, l, 1)) / apoln
197 q(:, jjm + 1, l, 1) &
198 = SUM(aire_2d(:, jjm + 1) * q(:, jjm + 1, l, 1)) / apols
199 ENDDO
200
201 q(:, :, :, 2:4) = 0. ! liquid water, radon and lead
202
203 if (nqmx >= 5) then
204 ! Ozone:
205 call regr_lat_time_coefoz
206 call regr_pr_o3(p3d, q(:, :, :, 5))
207 ! Convert from mole fraction to mass fraction:
208 q(:, :, :, 5) = q(:, :, :, 5) * 48. / 29.
209 end if
210
211 tsol = pack(tsol_2d, dyn_phy)
212 qsol = pack(qsol_2d, dyn_phy)
213 sn = 0. ! snow
214 radsol = 0.
215 tslab = 0. ! IM "slab" ocean
216 seaice = 0.
217 rugmer = 0.001
218 zmea = pack(zmea_2d, dyn_phy)
219 zstd = pack(zstd_2d, dyn_phy)
220 zsig = pack(zsig_2d, dyn_phy)
221 zgam = pack(zgam_2d, dyn_phy)
222 zthe = pack(zthe_2d, dyn_phy)
223 zpic = pack(zpic_2d, dyn_phy)
224 zval = pack(zval_2d, dyn_phy)
225
226 ! On initialise les sous-surfaces.
227 ! Lecture du fichier glace de terre pour fixer la fraction de terre
228 ! et de glace de terre :
229
230 call nf95_open("landiceref.nc", nf90_nowrite, ncid)
231
232 call nf95_inq_varid(ncid, 'longitude', varid)
233 call nf95_gw_var(ncid, varid, dlon_lic)
234 iml_lic = size(dlon_lic)
235
236 call nf95_inq_varid(ncid, 'latitude', varid)
237 call nf95_gw_var(ncid, varid, dlat_lic)
238 jml_lic = size(dlat_lic)
239
240 call nf95_inq_varid(ncid, 'landice', varid)
241 ALLOCATE(fraclic(iml_lic, jml_lic))
242 call nf95_get_var(ncid, varid, fraclic)
243
244 call nf95_close(ncid)
245
246 ! Interpolation sur la grille T du mod\`ele :
247 PRINT *, 'Dimensions de "landiceref.nc"'
248 print *, "iml_lic = ", iml_lic
249 print *, "jml_lic = ", jml_lic
250
251 ! Si les coordonn\'ees sont en degr\'es, on les transforme :
252 IF (MAXVAL(dlon_lic) > pi) THEN
253 dlon_lic = dlon_lic * pi / 180.
254 ENDIF
255 IF (maxval(dlat_lic) > pi) THEN
256 dlat_lic = dlat_lic * pi/ 180.
257 ENDIF
258
259 flic_tmp(:iim, :) = grille_m(dlon_lic, dlat_lic, fraclic, rlonv(:iim), &
260 rlatu)
261 flic_tmp(iim + 1, :) = flic_tmp(1, :)
262
263 deallocate(dlon_lic, dlat_lic) ! pointers
264
265 ! Passage sur la grille physique
266 pctsrf = 0.
267 pctsrf(:, is_lic) = pack(flic_tmp, dyn_phy)
268 ! Ad\'equation avec le maque terre/mer
269 WHERE (pctsrf(:, is_lic) < EPSFRA) pctsrf(:, is_lic) = 0.
270 WHERE (zmasq < EPSFRA) pctsrf(:, is_lic) = 0.
271 pctsrf(:, is_ter) = zmasq
272 where (zmasq > EPSFRA)
273 where (pctsrf(:, is_lic) >= zmasq)
274 pctsrf(:, is_lic) = zmasq
275 pctsrf(:, is_ter) = 0.
276 elsewhere
277 pctsrf(:, is_ter) = zmasq - pctsrf(:, is_lic)
278 where (pctsrf(:, is_ter) < EPSFRA)
279 pctsrf(:, is_ter) = 0.
280 pctsrf(:, is_lic) = zmasq
281 end where
282 end where
283 end where
284
285 ! Sous-surface oc\'ean et glace de mer (pour d\'emarrer on met glace
286 ! de mer \`a 0) :
287 pctsrf(:, is_oce) = 1. - zmasq
288 WHERE (pctsrf(:, is_oce) < EPSFRA) pctsrf(:, is_oce) = 0.
289
290 ! V\'erification que somme des sous-surfaces vaut 1 :
291 ji = count(abs(sum(pctsrf, dim = 2) - 1.) > EPSFRA)
292 IF (ji /= 0) then
293 PRINT *, 'Bad surface percentages for ', ji, 'points'
294 end IF
295
296 ! Calcul interm\'ediaire :
297 CALL massdair(p3d, masse)
298
299 print *, 'ALPHAX = ', alphax
300
301 forall (l = 1:llm)
302 masse(:, 1, l) = SUM(aire_2d(:iim, 1) * masse(:iim, 1, l)) / apoln
303 masse(:, jjm + 1, l) = &
304 SUM(aire_2d(:iim, jjm + 1) * masse(:iim, jjm + 1, l)) / apols
305 END forall
306
307 ! Initialisation pour traceurs:
308 call iniadvtrac
309 itau_phy = 0
310 day_ref = dayref
311 annee_ref = anneeref
312
313 CALL geopot(teta, pk , pks, phis, phi)
314 CALL caldyn0(ucov, vcov, teta, ps, masse, pk, phis, phi, w, pbaru, &
315 pbarv)
316 CALL dynredem0("start.nc", dayref, phis)
317 CALL dynredem1("start.nc", vcov, ucov, teta, q, masse, ps, itau=0)
318
319 ! Initialisations :
320 tsolsrf(:, is_ter) = tsol
321 tsolsrf(:, is_lic) = tsol
322 tsolsrf(:, is_oce) = tsol
323 tsolsrf(:, is_sic) = tsol
324 snsrf(:, is_ter) = sn
325 snsrf(:, is_lic) = sn
326 snsrf(:, is_oce) = sn
327 snsrf(:, is_sic) = sn
328 albe(:, is_ter) = 0.08
329 albe(:, is_lic) = 0.6
330 albe(:, is_oce) = 0.5
331 albe(:, is_sic) = 0.6
332 alblw = albe
333 evap = 0.
334 qsolsrf(:, is_ter) = 150.
335 qsolsrf(:, is_lic) = 150.
336 qsolsrf(:, is_oce) = 150.
337 qsolsrf(:, is_sic) = 150.
338 tsoil = spread(spread(tsol, 2, nsoilmx), 3, nbsrf)
339 rain_fall = 0.
340 snow_fall = 0.
341 solsw = 165.
342 sollw = -53.
343 t_ancien = 273.15
344 q_ancien = 0.
345 agesno = 0.
346 !IM "slab" ocean
347 tslab = tsolsrf(:, is_oce)
348 seaice = 0.
349
350 frugs(:, is_oce) = rugmer
351 frugs(:, is_ter) = MAX(1e-5, zstd * zsig / 2)
352 frugs(:, is_lic) = MAX(1e-5, zstd * zsig / 2)
353 frugs(:, is_sic) = 0.001
354 fder = 0.
355 clwcon = 0.
356 rnebcon = 0.
357 ratqs = 0.
358 run_off_lic_0 = 0.
359 sig1 = 0.
360 w01 = 0.
361
362 call phyredem("startphy.nc", latfi, lonfi, pctsrf, &
363 tsolsrf, tsoil, tslab, seaice, qsolsrf, qsol, snsrf, albe, alblw, &
364 evap, rain_fall, snow_fall, solsw, sollw, fder, radsol, frugs, &
365 agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, &
366 t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, w01)
367 CALL histclo
368
369 END SUBROUTINE etat0
370
371 end module etat0_mod

  ViewVC Help
Powered by ViewVC 1.1.21