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

Contents of /trunk/dyn3d/guide.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 70 - (show annotations)
Mon Jun 24 15:39:52 2013 UTC (10 years, 10 months ago) by guez
Original Path: trunk/libf/dyn3d/guide.f90
File size: 10167 byte(s)
In procedure, "addfi" access directly the module variable "dtphys"
instead of going through an argument.

In "conflx", do not create a local variable for temperature with
reversed order of vertical levels. Instead, give an actual argument
with reversed order in "physiq".

Changed names of variables "rmd" and "rmv" from module "suphec_m" to
"md" and "mv".

In "hgardfou", print only the first temperature out of range found.

1 MODULE guide_m
2
3 ! From dyn3d/guide.F, version 1.3 2005/05/25 13:10:09
4 ! and dyn3d/guide.h, version 1.1.1.1 2004/05/19 12:53:06
5
6 IMPLICIT NONE
7
8 REAL aire_min, aire_max
9
10 CONTAINS
11
12 SUBROUTINE guide(itau, ucov, vcov, teta, q, masse, ps)
13
14 ! Author: F.Hourdin
15
16 USE comconst, ONLY : cpp, daysec, dtvr, kappa
17 USE comgeom, ONLY : aire, rlatu, rlonv
18 USE conf_gcm_m, ONLY : day_step, iperiod
19 use conf_guide_m, only: conf_guide, guide_u, guide_v, guide_t, guide_q, &
20 guide_p, ncep, ini_anal, tau_min_u, tau_max_u, tau_min_v, tau_max_v, &
21 tau_min_t, tau_max_t, tau_min_q, tau_max_q, tau_min_p, tau_max_p, &
22 online
23 USE dimens_m, ONLY : jjm, llm
24 USE disvert_m, ONLY : ap, bp, preff, presnivs
25 USE exner_hyb_m, ONLY : exner_hyb
26 USE inigrads_m, ONLY : inigrads
27 use massdair_m, only: massdair
28 use netcdf, only: nf90_nowrite, nf90_open, nf90_close, nf90_inq_dimid, &
29 nf90_inquire_dimension
30 use nr_util, only: pi
31 USE paramet_m, ONLY : iip1, ip1jm, ip1jmp1, jjp1, llmp1
32 USE q_sat_m, ONLY : q_sat
33 USE serre, ONLY : clat, clon
34 use tau2alpha_m, only: tau2alpha, dxdys
35
36 ! variables dynamiques
37 REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants
38 REAL, intent(inout):: teta(ip1jmp1, llm) ! temperature potentielle
39 REAL q(ip1jmp1, llm) ! temperature potentielle
40 REAL ps(ip1jmp1) ! pression au sol
41 REAL, intent(out):: masse(ip1jmp1, llm) ! masse d'air
42
43 ! variables dynamiques pour les reanalyses.
44 REAL, save:: ucovrea1(ip1jmp1, llm), vcovrea1(ip1jm, llm) !vts cov reas
45 REAL, save:: tetarea1(ip1jmp1, llm) ! temp pot reales
46 REAL, save:: qrea1(ip1jmp1, llm) ! temp pot reales
47 REAL, save:: psrea1(ip1jmp1) ! ps
48 REAL, save:: ucovrea2(ip1jmp1, llm), vcovrea2(ip1jm, llm) !vts cov reas
49 REAL, save:: tetarea2(ip1jmp1, llm) ! temp pot reales
50 REAL, save:: qrea2(ip1jmp1, llm) ! temp pot reales
51 REAL, save:: masserea2(ip1jmp1, llm) ! masse
52 REAL, save:: psrea2(ip1jmp1) ! ps
53
54 REAL, save:: alpha_q(ip1jmp1)
55 REAL, save:: alpha_t(ip1jmp1), alpha_p(ip1jmp1)
56 REAL, save:: alpha_u(ip1jmp1), alpha_v(ip1jm)
57 REAL dday_step, toto, reste
58 real, save:: itau_test
59 INTEGER, save:: step_rea, count_no_rea
60
61 INTEGER ilon, ilat
62 REAL factt, ztau(ip1jmp1)
63
64 INTEGER, INTENT(IN):: itau
65 INTEGER ij, l
66 INTEGER ncidpl, varidpl, status
67 INTEGER rcod, rid
68 REAL ditau, tau, a
69 INTEGER, SAVE:: nlev
70
71 ! TEST SUR QSAT
72 REAL p(ip1jmp1, llmp1), pk(ip1jmp1, llm), pks(ip1jmp1)
73 REAL pkf(ip1jmp1, llm)
74 REAL pres(ip1jmp1, llm)
75
76 REAL qsat(ip1jmp1, llm)
77 REAL unskap
78 REAL tnat(ip1jmp1, llm)
79
80 LOGICAL:: first = .TRUE.
81 CHARACTER(len=10) file
82 INTEGER:: igrads = 2
83 REAL:: dtgrads = 100.
84
85 !-----------------------------------------------------------------------
86
87 PRINT *, 'Call sequence information: guide'
88
89 ! calcul de l'humidite saturante
90
91 forall (l = 1: llm + 1) p(:, l) = ap(l) + bp(l) * ps
92 CALL massdair(p, masse)
93 CALL exner_hyb(ps, p, pks, pk, pkf)
94 tnat(:, :) = pk(:, :)*teta(:, :)/cpp
95 unskap = 1./kappa
96 pres(:, :) = preff*(pk(:, :)/cpp)**unskap
97 qsat = q_sat(tnat, pres)
98
99 ! initialisations pour la lecture des reanalyses.
100 ! alpha determine la part des injections de donnees a chaque etape
101 ! alpha=1 signifie pas d'injection
102 ! alpha=0 signifie injection totale
103
104 IF (online==-1) THEN
105 RETURN
106 END IF
107
108 IF (first) THEN
109 CALL conf_guide
110 file = 'guide'
111 CALL inigrads(igrads, rlonv, 180./pi, -180., 180., rlatu, -90., 90., &
112 180./pi, presnivs, 1., dtgrads, file, 'dyn_zon ')
113 PRINT *, '1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'
114 IF (online==-1) RETURN
115
116 IF (online==1) THEN
117 ! Constantes de temps de rappel en jour
118 ! 0.1 c'est en gros 2h30.
119 ! 1e10 est une constante infinie donc en gros pas de guidage
120
121 ! coordonnees du centre du zoom
122 CALL coordij(clon, clat, ilon, ilat)
123 ! aire de la maille au centre du zoom
124 aire_min = aire(ilon+(ilat-1)*iip1)
125 ! aire maximale de la maille
126 aire_max = 0.
127 DO ij = 1, ip1jmp1
128 aire_max = max(aire_max, aire(ij))
129 END DO
130 ! factt = pas de temps en fraction de jour
131 factt = dtvr*iperiod/daysec
132
133 CALL tau2alpha(3, iip1, jjm, factt, tau_min_v, tau_max_v, alpha_v)
134 CALL tau2alpha(2, iip1, jjp1, factt, tau_min_u, tau_max_u, alpha_u)
135 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_t, tau_max_t, alpha_t)
136 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_p, tau_max_p, alpha_p)
137 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_q, tau_max_q, alpha_q)
138
139 CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
140 CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U ')
141 CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T ')
142
143 ! Cas ou on force exactement par les variables analysees
144 ELSE
145 alpha_t = 0.
146 alpha_u = 0.
147 alpha_v = 0.
148 alpha_p = 0.
149 ! physic=.false.
150 END IF
151
152 itau_test = 1001
153 step_rea = 1
154 count_no_rea = 0
155 ncidpl = -99
156
157 ! itau_test montre si l'importation a deja ete faite au rang itau
158 ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
159 if (guide_u) then
160 if (ncidpl.eq.-99) rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
161 endif
162
163 if (guide_v) then
164 if (ncidpl.eq.-99) rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
165 endif
166
167 if (guide_T) then
168 if (ncidpl.eq.-99) rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
169 endif
170
171 if (guide_Q) then
172 if (ncidpl.eq.-99) rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
173 endif
174
175 IF (ncep) THEN
176 status = nf90_inq_dimid(ncidpl, 'LEVEL', rid)
177 ELSE
178 status = nf90_inq_dimid(ncidpl, 'PRESSURE', rid)
179 END IF
180 status = nf90_inquire_dimension(ncidpl, rid, len=nlev)
181 PRINT *, 'nlev', nlev
182 rcod = nf90_close(ncidpl)
183 ! Lecture du premier etat des reanalyses.
184 CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
185 masserea2, psrea2, 1, nlev)
186 qrea2(:, :) = max(qrea2(:, :), 0.1)
187
188 ! Debut de l'integration temporelle:
189 END IF ! first
190
191 ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
192
193 ditau = real(itau)
194 dday_step = real(day_step)
195 WRITE (*, *) 'ditau, dday_step'
196 WRITE (*, *) ditau, dday_step
197 toto = 4*ditau/dday_step
198 reste = toto - aint(toto)
199
200 IF (reste==0.) THEN
201 IF (itau_test==itau) THEN
202 WRITE (*, *) 'deuxieme passage de advreel a itau=', itau
203 STOP
204 ELSE
205 vcovrea1(:, :) = vcovrea2(:, :)
206 ucovrea1(:, :) = ucovrea2(:, :)
207 tetarea1(:, :) = tetarea2(:, :)
208 qrea1(:, :) = qrea2(:, :)
209
210 PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
211 count_no_rea, ' non lectures'
212 step_rea = step_rea + 1
213 itau_test = itau
214 CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, &
215 qrea2, masserea2, psrea2, 1, nlev)
216 qrea2(:, :) = max(qrea2(:, :), 0.1)
217 factt = dtvr*iperiod/daysec
218 ztau(:) = factt/max(alpha_t(:), 1.E-10)
219 CALL wrgrads(igrads, 1, aire, 'aire ', 'aire ')
220 CALL wrgrads(igrads, 1, dxdys, 'dxdy ', 'dxdy ')
221 CALL wrgrads(igrads, 1, alpha_u, 'au ', 'au ')
222 CALL wrgrads(igrads, 1, alpha_t, 'at ', 'at ')
223 CALL wrgrads(igrads, 1, ztau, 'taut ', 'taut ')
224 CALL wrgrads(igrads, llm, ucov, 'u ', 'u ')
225 CALL wrgrads(igrads, llm, ucovrea2, 'ua ', 'ua ')
226 CALL wrgrads(igrads, llm, teta, 'T ', 'T ')
227 CALL wrgrads(igrads, llm, tetarea2, 'Ta ', 'Ta ')
228 CALL wrgrads(igrads, llm, qrea2, 'Qa ', 'Qa ')
229 CALL wrgrads(igrads, llm, q, 'Q ', 'Q ')
230
231 CALL wrgrads(igrads, llm, qsat, 'QSAT ', 'QSAT ')
232
233 END IF
234 ELSE
235 count_no_rea = count_no_rea + 1
236 END IF
237
238 ! Guidage
239 ! x_gcm = a * x_gcm + (1-a) * x_reanalyses
240
241 IF (ini_anal) PRINT *, 'ATTENTION !!! ON PART DU GUIDAGE'
242
243 ditau = real(itau)
244 dday_step = real(day_step)
245
246 tau = 4*ditau/dday_step
247 tau = tau - aint(tau)
248
249 ! ucov
250 IF (guide_u) THEN
251 DO l = 1, llm
252 DO ij = 1, ip1jmp1
253 a = (1.-tau)*ucovrea1(ij, l) + tau*ucovrea2(ij, l)
254 ucov(ij, l) = (1.-alpha_u(ij))*ucov(ij, l) + alpha_u(ij)*a
255 IF (first .AND. ini_anal) ucov(ij, l) = a
256 END DO
257 END DO
258 END IF
259
260 IF (guide_t) THEN
261 DO l = 1, llm
262 DO ij = 1, ip1jmp1
263 a = (1.-tau)*tetarea1(ij, l) + tau*tetarea2(ij, l)
264 teta(ij, l) = (1.-alpha_t(ij))*teta(ij, l) + alpha_t(ij)*a
265 IF (first .AND. ini_anal) teta(ij, l) = a
266 END DO
267 END DO
268 END IF
269
270 ! P
271 IF (guide_p) THEN
272 DO ij = 1, ip1jmp1
273 a = (1.-tau)*psrea1(ij) + tau*psrea2(ij)
274 ps(ij) = (1.-alpha_p(ij))*ps(ij) + alpha_p(ij)*a
275 IF (first .AND. ini_anal) ps(ij) = a
276 END DO
277 forall (l = 1: llm + 1) p(:, l) = ap(l) + bp(l) * ps
278 CALL massdair(p, masse)
279 END IF
280
281 ! q
282 IF (guide_q) THEN
283 DO l = 1, llm
284 DO ij = 1, ip1jmp1
285 a = (1.-tau)*qrea1(ij, l) + tau*qrea2(ij, l)
286 ! hum relative en % -> hum specif
287 a = qsat(ij, l)*a*0.01
288 q(ij, l) = (1.-alpha_q(ij))*q(ij, l) + alpha_q(ij)*a
289 IF (first .AND. ini_anal) q(ij, l) = a
290 END DO
291 END DO
292 END IF
293
294 ! vcov
295 IF (guide_v) THEN
296 DO l = 1, llm
297 DO ij = 1, ip1jm
298 a = (1.-tau)*vcovrea1(ij, l) + tau*vcovrea2(ij, l)
299 vcov(ij, l) = (1.-alpha_v(ij))*vcov(ij, l) + alpha_v(ij)*a
300 IF (first .AND. ini_anal) vcov(ij, l) = a
301 END DO
302 IF (first .AND. ini_anal) vcov(ij, l) = a
303 END DO
304 END IF
305
306 first = .FALSE.
307
308 END SUBROUTINE guide
309
310 END MODULE guide_m

  ViewVC Help
Powered by ViewVC 1.1.21