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

Contents of /trunk/dyn3d/guide.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 83 - (show annotations)
Thu Mar 6 15:12:00 2014 UTC (10 years, 2 months ago) by guez
File size: 10189 byte(s)
In procedure conf_guide, replaced calls to getpar by reading a
namelist. Removed file getparam.f, now unused. So getin of IOIPSL is
now unused too. Removed files getincom.f, getincom2.f, cmpblank.f,
find_sig.f, gensig.f and nocomma.f.

Moved variables lat_min_guide and lat_max_guide from module
tau2alpha_m to module conf_guide_m.

Removed variables nivsig and nivsigs of module disvert_m. Instead, in
initdynav and initfluxsto, directly wrote arithmetic sequence for
verical axis, pending a better vertical axis. Removed variables nivsig
and nivsigs of "(re)?.start.nc".

In procedure exner_hyb, replaced p(:, :, 1) by equivalent ps.

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

  ViewVC Help
Powered by ViewVC 1.1.21