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

Annotation of /trunk/Sources/dyn3d/etat0.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 155 - (hide annotations)
Wed Jul 8 17:03:45 2015 UTC (8 years, 10 months ago) by guez
File size: 11951 byte(s)
Do not write any longer to startphy.nc nor read from restartphy.nc the
NetCDF variable ALBLW: it was the same than ALBE. ALBE was for the
visible and ALBLW for the near infrared. In physiq, use only variables
falbe and albsol, removed falblw and albsollw. See revision 888 of
LMDZ.

Removed unused arguments pdp of SUBROUTINE lwbv, ptave of SUBROUTINE
lwv, kuaer of SUBROUTINE lwvd, nq of SUBROUTINE initphysto.

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

  ViewVC Help
Powered by ViewVC 1.1.21