source: LMDZ6/trunk/libf/phylmd/stdlevvar_mod.f90 @ 6020

Last change on this file since 6020 was 5989, checked in by yann meurdesoif, 8 weeks ago

remove checksum calls
YM

  • Property svn:executable set to *
File size: 26.3 KB
Line 
1!
2MODULE stdlevvar_mod
3!
4! This module contains main procedures for calculation
5! of temperature, specific humidity and wind at a reference level
6!
7  USE yomcst_mod_h
8      USE cdrag_mod
9  USE screenp_mod
10  USE screenc_mod
11  IMPLICIT NONE
12
13CONTAINS
14!
15!****************************************************************************************
16!
17!r original routine svn3623
18!
19      SUBROUTINE stdlevvar(klon, knon, nsrf, zxli, &
20                           u1, v1, t1, q1, z1, &
21                           ts1, qsurf, z0m, z0h, psol, pat1, &
22                           t_2m, q_2m, t_10m, q_10m, u_10m, ustar, s_pblh, prain, tsol)
23!$gpum horizontal knon klon
24        USE yoethf_mod_h
25        USE flux_arp_mod_h
26      IMPLICIT NONE
27!-------------------------------------------------------------------------
28!
29! Objet : calcul de la temperature et l'humidite relative a 2m et du
30!         module du vent a 10m a partir des relations de Dyer-Businger et
31!         des equations de Louis.
32!
33! Reference : Hess, Colman et McAvaney (1995)
34!
35! I. Musat, 01.07.2002
36!
37!AM On rajoute en sortie t et q a 10m pr le calcule d'hbtm2 dans clmain
38!
39!-------------------------------------------------------------------------
40!
41! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
42! knon----input-I- nombre de points pour un type de surface
43! nsrf----input-I- indice pour le type de surface; voir indice_sol_mod.F90
44! zxli----input-L- TRUE si calcul des cdrags selon Laurent Li
45! u1------input-R- vent zonal au 1er niveau du modele
46! v1------input-R- vent meridien au 1er niveau du modele
47! t1------input-R- temperature de l'air au 1er niveau du modele
48! q1------input-R- humidite relative au 1er niveau du modele
49! z1------input-R- geopotentiel au 1er niveau du modele
50! ts1-----input-R- temperature de l'air a la surface
51! qsurf---input-R- humidite relative a la surface
52! z0m, z0h---input-R- rugosite
53! psol----input-R- pression au sol
54! pat1----input-R- pression au 1er niveau du modele
55!
56! t_2m---output-R- temperature de l'air a 2m
57! q_2m---output-R- humidite relative a 2m
58! u_10m--output-R- vitesse du vent a 10m
59!AM
60! t_10m--output-R- temperature de l'air a 10m
61! q_10m--output-R- humidite specifique a 10m
62! ustar--output-R- u*
63!
64      INTEGER, intent(in) :: klon, knon, nsrf
65      LOGICAL, intent(in) :: zxli
66      REAL, dimension(klon), intent(in) :: u1, v1, t1, q1, z1, ts1
67      REAL, dimension(klon), intent(in) :: qsurf
68      REAL, dimension(klon), intent(inout) :: z0m, z0h
69      REAL, dimension(klon), intent(in) :: psol, pat1
70!
71      REAL, dimension(klon), intent(out) :: t_2m, q_2m, ustar
72      REAL, dimension(klon), intent(out) :: u_10m, t_10m, q_10m
73      REAL, DIMENSION(klon), INTENT(INOUT) :: s_pblh
74      REAL, DIMENSION(klon), INTENT(IN) :: prain
75      REAL, DIMENSION(klon), INTENT(IN) :: tsol
76!-------------------------------------------------------------------------
77!
78! Quelques constantes et options:
79!
80! RKAR : constante de von Karman
81      REAL, PARAMETER :: RKAR=0.40
82! niter : nombre iterations calcul "corrector"
83!     INTEGER, parameter :: niter=6, ncon=niter-1
84      INTEGER, parameter :: niter=2, ncon=niter-1
85!
86! Variables locales
87      INTEGER :: i, n
88      REAL :: zref
89      REAL, dimension(klon) :: speed
90! tpot : temperature potentielle
91      REAL, dimension(klon) :: tpot
92      REAL, dimension(klon) :: zri1, cdran
93      REAL, dimension(klon) :: cdram, cdrah
94! ri1 : nb. de Richardson entre la surface --> la 1ere couche
95      REAL, dimension(klon) :: ri1
96      REAL, dimension(klon) :: testar, qstar
97      REAL, dimension(klon) :: zdte, zdq   
98! lmon : longueur de Monin-Obukhov selon Hess, Colman and McAvaney
99      DOUBLE PRECISION, dimension(klon) :: lmon
100      DOUBLE PRECISION, parameter :: eps=1.0D-20
101      REAL, dimension(klon) :: delu, delte, delq
102      REAL, dimension(klon) :: u_zref, te_zref, q_zref 
103      REAL, dimension(klon) :: temp, pref
104      LOGICAL :: okri
105      REAL, dimension(klon) :: u_zref_p, te_zref_p, temp_p, q_zref_p
106!convertgence
107      REAL, dimension(klon) :: te_zref_con, q_zref_con
108      REAL, dimension(klon) :: u_zref_c, te_zref_c, temp_c, q_zref_c
109      REAL, dimension(klon) :: ok_pred, ok_corr, zri_zero
110!     REAL, dimension(klon) :: conv_te, conv_q
111!-------------------------------------------------------------------------
112      DO i=1, knon
113       speed(i)=SQRT(u1(i)**2+v1(i)**2)
114       ri1(i) = 0.0
115      ENDDO
116!
117      okri=.FALSE.
118!      CALL coefcdrag(klon, knon, nsrf, zxli, &
119! &                   speed, t1, q1, z1, psol, &
120! &                   ts1, qsurf, rugos, okri, ri1,  &         
121! &                   cdram, cdrah, cdran, zri1, pref)           
122! Fuxing WANG, 04/03/2015, replace the coefcdrag by the merged version: cdrag
123
124      CALL cdrag(knon, nsrf, &
125 &                   speed, t1, q1, z1, &
126 &                   psol, s_pblh, ts1, qsurf, z0m, z0h, &
127 &                   zri_zero, 0, &
128 &                   cdram, cdrah, zri1, pref, prain, tsol, pat1)
129
130! --- special Dice: on force cdragm ( a defaut de forcer ustar) MPL 05082013
131     IF (ok_prescr_ust) then
132      DO i = 1, knon
133       print *,'cdram avant=',cdram(i)
134       cdram(i) = ust*ust/speed(i)/speed(i)
135       print *,'cdram ust speed apres=',cdram(i),ust,speed
136      ENDDO
137     ENDIF
138!
139!---------Star variables----------------------------------------------------
140!
141      DO i = 1, knon
142        ri1(i) = zri1(i)
143        tpot(i) = t1(i)* (psol(i)/pat1(i))**RKAPPA
144        ustar(i) = sqrt(cdram(i) * speed(i) * speed(i))
145        zdte(i) = tpot(i) - ts1(i)
146        zdq(i) = max(q1(i),0.0) - max(qsurf(i),0.0)
147!
148!
149!IM BUG BUG BUG       zdte(i) = max(zdte(i),1.e-10)
150        zdte(i) = sign(max(abs(zdte(i)),1.e-10),zdte(i))
151!
152        testar(i) = (cdrah(i) * zdte(i) * speed(i))/ustar(i)
153        qstar(i) = (cdrah(i) * zdq(i) * speed(i))/ustar(i)
154        lmon(i) = (ustar(i) * ustar(i) * tpot(i))/ &
155 &                (RKAR * RG * testar(i))
156      ENDDO
157!
158!----------First aproximation of variables at zref --------------------------
159      zref = 2.0
160      CALL screenp(klon, knon, nsrf, speed, tpot, q1, &
161 &                 ts1, qsurf, z0m, lmon, &
162 &                 ustar, testar, qstar, zref, &
163 &                 delu, delte, delq)
164!
165      DO i = 1, knon
166        u_zref(i) = delu(i)
167        q_zref(i) = max(qsurf(i),0.0) + delq(i)
168        te_zref(i) = ts1(i) + delte(i)
169        temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
170        q_zref_p(i) = q_zref(i)
171!       te_zref_p(i) = te_zref(i)
172        temp_p(i) = temp(i)
173      ENDDO
174!
175! Iteration of the variables at the reference level zref : corrector calculation ; see Hess & McAvaney, 1995
176!
177      DO n = 1, niter
178!
179        okri=.TRUE.
180        CALL screenc(klon, knon, nsrf, zxli, &
181 &                   u_zref, temp, q_zref, zref, &
182 &                   ts1, qsurf, z0m, z0h, psol, &           
183 &                   ustar, testar, qstar, okri, ri1, &
184 &                   pref, delu, delte, delq, s_pblh ,prain, tsol, pat1)
185!
186        DO i = 1, knon
187          u_zref(i) = delu(i)
188          q_zref(i) = delq(i) + max(qsurf(i),0.0)
189          te_zref(i) = delte(i) + ts1(i)
190!
191! return to normal temperature
192!
193          temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
194!         temp(i) = te_zref(i) - (zref* RG)/RCPD/ &
195!                 (1 + RVTMP2 * max(q_zref(i),0.0))
196!
197!IM +++
198!         IF(temp(i).GT.350.) THEN
199!           WRITE(*,*) 'temp(i) GT 350 K !!',i,nsrf,temp(i)
200!         ENDIF
201!IM ---
202!
203        IF(n.EQ.ncon) THEN
204          te_zref_con(i) = te_zref(i)
205          q_zref_con(i) = q_zref(i)
206        ENDIF
207!
208        ENDDO
209!
210      ENDDO
211!
212! verifier le critere de convergence : 0.25% pour te_zref et 5% pour qe_zref
213!
214!       DO i = 1, knon
215!         conv_te(i) = (te_zref(i) - te_zref_con(i))/te_zref_con(i)
216!         conv_q(i) = (q_zref(i) - q_zref_con(i))/q_zref_con(i)
217!IM +++
218!         IF(abs(conv_te(i)).GE.0.0025.AND.abs(conv_q(i)).GE.0.05) THEN
219!           PRINT*,'DIV','i=',i,te_zref_con(i),te_zref(i),conv_te(i), &
220!           q_zref_con(i),q_zref(i),conv_q(i)
221!         ENDIF
222!IM ---
223!       ENDDO
224!
225      DO i = 1, knon
226        q_zref_c(i) = q_zref(i)
227        temp_c(i) = temp(i)
228!
229!       IF(zri1(i).LT.0.) THEN
230!         IF(nsrf.EQ.1) THEN
231!           ok_pred(i)=1.
232!           ok_corr(i)=0.
233!         ELSE
234!           ok_pred(i)=0.
235!           ok_corr(i)=1.
236!         ENDIF
237!       ELSE
238!         ok_pred(i)=0.
239!         ok_corr(i)=1.
240!       ENDIF
241!
242        ok_pred(i)=0.
243        ok_corr(i)=1.
244!
245        t_2m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
246        q_2m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
247!IM +++
248!       IF(n.EQ.niter) THEN
249!       IF(t_2m(i).LT.t1(i).AND.t_2m(i).LT.ts1(i)) THEN
250!         PRINT*,' BAD t2m LT ',i,nsrf,t_2m(i),t1(i),ts1(i)
251!       ELSEIF(t_2m(i).GT.t1(i).AND.t_2m(i).GT.ts1(i)) THEN
252!         PRINT*,' BAD t2m GT ',i,nsrf,t_2m(i),t1(i),ts1(i)
253!       ENDIF
254!       ENDIF
255!IM ---
256      ENDDO
257!
258!
259!----------First aproximation of variables at zref --------------------------
260!
261      zref = 10.0
262      CALL screenp(klon, knon, nsrf, speed, tpot, q1, &
263 &                 ts1, qsurf, z0m, lmon, &
264 &                 ustar, testar, qstar, zref, &
265 &                 delu, delte, delq)
266!
267      DO i = 1, knon
268        u_zref(i) = delu(i)
269        q_zref(i) = max(qsurf(i),0.0) + delq(i)
270        te_zref(i) = ts1(i) + delte(i)
271        temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
272!       temp(i) = te_zref(i) - (zref* RG)/RCPD/ &
273!                 (1 + RVTMP2 * max(q_zref(i),0.0))
274        u_zref_p(i) = u_zref(i)
275      ENDDO
276!
277! Iteration of the variables at the reference level zref : corrector ; see Hess & McAvaney, 1995
278!
279      DO n = 1, niter
280!
281        okri=.TRUE.
282        CALL screenc(klon, knon, nsrf, zxli, &
283 &                   u_zref, temp, q_zref, zref, &
284 &                   ts1, qsurf, z0m, z0h, psol, &
285 &                   ustar, testar, qstar, okri, ri1, &
286 &                   pref, delu, delte, delq, s_pblh ,prain, tsol, pat1)
287!
288        DO i = 1, knon
289          u_zref(i) = delu(i)
290          q_zref(i) = delq(i) + max(qsurf(i),0.0)
291          te_zref(i) = delte(i) + ts1(i)
292          temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
293!         temp(i) = te_zref(i) - (zref* RG)/RCPD/ &
294!                   (1 + RVTMP2 * max(q_zref(i),0.0))
295        ENDDO
296!
297      ENDDO
298!
299      DO i = 1, knon
300        u_zref_c(i) = u_zref(i)
301!
302        u_10m(i) = u_zref_p(i) * ok_pred(i) + u_zref_c(i) * ok_corr(i)
303!
304!AM
305        q_zref_c(i) = q_zref(i)
306        temp_c(i) = temp(i)
307        t_10m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
308        q_10m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
309!MA
310      ENDDO
311!
312      RETURN
313      END subroutine stdlevvar
314!
315      SUBROUTINE stdlevvarn(klon, knon, nsrf, zxli, &
316                           u1, v1, t1, q1, z1, &
317                           ts1, qsurf, z0m, z0h, psol, pat1, &
318                           t_2m, q_2m, t_10m, q_10m, u_10m, ustar, &
319                           n2mout)
320!$gpum horizontal knon klon
321
322      USE indice_sol_mod, ONLY : nbsrf
323      USE yomcst_mod_h
324      USE ioipsl_getin_p_mod, ONLY : getin_p
325      USE yoethf_mod_h
326      USE flux_arp_mod_h
327      IMPLICIT NONE
328!-------------------------------------------------------------------------
329!
330! Objet : calcul de la temperature et l'humidite relative a 2m et du
331!         module du vent a 10m a partir des relations de Dyer-Businger et
332!         des equations de Louis.
333!
334! Reference : Hess, Colman et McAvaney (1995)
335!
336! I. Musat, 01.07.2002
337!
338!AM On rajoute en sortie t et q a 10m pr le calcule d'hbtm2 dans clmain
339!
340!-------------------------------------------------------------------------
341!
342! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
343! knon----input-I- nombre de points pour un type de surface
344! nsrf----input-I- indice pour le type de surface; voir indice_sol_mod.F90
345! zxli----input-L- TRUE si calcul des cdrags selon Laurent Li
346! u1------input-R- vent zonal au 1er niveau du modele
347! v1------input-R- vent meridien au 1er niveau du modele
348! t1------input-R- temperature de l'air au 1er niveau du modele
349! q1------input-R- humidite relative au 1er niveau du modele
350! z1------input-R- geopotentiel au 1er niveau du modele
351! ts1-----input-R- temperature de l'air a la surface
352! qsurf---input-R- humidite relative a la surface
353! z0m, z0h---input-R- rugosite
354! psol----input-R- pression au sol
355! pat1----input-R- pression au 1er niveau du modele
356!
357! t_2m---output-R- temperature de l'air a 2m
358! q_2m---output-R- humidite relative a 2m
359! u_2m--output-R- vitesse du vent a 2m
360! u_10m--output-R- vitesse du vent a 10m
361! ustar--output-R- u*
362!AM
363! t_10m--output-R- temperature de l'air a 10m
364! q_10m--output-R- humidite specifique a 10m
365!
366      INTEGER, intent(in) :: klon, knon, nsrf
367      LOGICAL, intent(in) :: zxli
368      REAL, dimension(klon), intent(in) :: u1, v1, t1, q1, ts1, z1
369      REAL, dimension(klon), intent(inout) :: z0m, z0h
370      REAL, dimension(klon), intent(in) :: qsurf
371      REAL, dimension(klon), intent(in) :: psol, pat1
372!
373      REAL, dimension(klon), intent(out) :: t_2m, q_2m, ustar
374      REAL, dimension(klon), intent(out) :: u_10m, t_10m, q_10m
375      INTEGER, dimension(klon, nbsrf, 6), intent(out) :: n2mout
376!
377      REAL, dimension(klon) :: u_2m
378      REAL, dimension(klon) :: cdrm2m, cdrh2m, ri2m
379      REAL, dimension(klon) :: cdram, cdrah, zri1
380      REAL, dimension(klon) :: cdmn1, cdhn1, fm1, fh1
381      REAL, dimension(klon) :: cdmn2m, cdhn2m, fm2m, fh2m
382      REAL, dimension(klon) :: ri2m_new
383      REAL, DIMENSION(klon) :: s_pblh
384      REAL, DIMENSION(klon) :: prain
385      REAL, DIMENSION(klon) :: tsol
386!-------------------------------------------------------------------------
387!
388! Quelques constantes et options:
389!
390! RKAR : constante de von Karman
391      REAL, PARAMETER :: RKAR=0.40
392! niter : nombre iterations calcul "corrector"
393!     INTEGER, parameter :: niter=6, ncon=niter-1
394!IM 071020     INTEGER, parameter :: niter=2, ncon=niter-1
395      INTEGER, parameter :: niter=2, ncon=niter
396!     INTEGER, parameter :: niter=6, ncon=niter
397!
398! Variables locales
399      INTEGER :: i, n
400      REAL :: zref
401      REAL, dimension(klon) :: speed
402! tpot : temperature potentielle
403      REAL, dimension(klon) :: tpot
404      REAL, dimension(klon) :: cdran
405! ri1 : nb. de Richardson entre la surface --> la 1ere couche
406      REAL, dimension(klon) :: ri1
407      DOUBLE PRECISION, parameter :: eps=1.0D-20
408      REAL, dimension(klon) :: delu, delte, delq
409      REAL, dimension(klon) :: delh, delm
410      REAL, dimension(klon) :: delh_new, delm_new
411      REAL, dimension(klon) :: u_zref, te_zref, q_zref 
412      REAL, dimension(klon) :: u_zref_pnew, te_zref_pnew, q_zref_pnew
413      REAL, dimension(klon) :: temp, pref
414      REAL, dimension(klon) :: temp_new, pref_new
415      LOGICAL :: okri
416      REAL, dimension(klon) :: u_zref_p, te_zref_p, temp_p, q_zref_p
417      REAL, dimension(klon) :: u_zref_p_new, te_zref_p_new, temp_p_new, q_zref_p_new
418!convergence
419      REAL, dimension(klon) :: te_zref_con, q_zref_con
420      REAL, dimension(klon) :: u_zref_c, te_zref_c, temp_c, q_zref_c
421      REAL, dimension(klon) :: ok_pred, ok_corr
422!
423      REAL, dimension(klon) :: cdrm10m, cdrh10m, ri10m
424      REAL, dimension(klon) :: cdmn10m, cdhn10m, fm10m, fh10m
425      REAL, dimension(klon) :: cdn2m, cdn1, zri_zero
426      REAL :: CEPDUE,zdu2
427      INTEGER :: nzref, nz1
428      LOGICAL, dimension(klon) :: ok_t2m_toosmall, ok_t2m_toobig
429      LOGICAL, dimension(klon) :: ok_q2m_toosmall, ok_q2m_toobig
430      LOGICAL, dimension(klon) :: ok_u2m_toobig
431      LOGICAL, dimension(klon) :: ok_t10m_toosmall, ok_t10m_toobig
432      LOGICAL, dimension(klon) :: ok_q10m_toosmall, ok_q10m_toobig
433      LOGICAL, dimension(klon) :: ok_u10m_toobig
434      INTEGER, dimension(klon, 6) :: n10mout
435
436
437!-------------------------------------------------------------------------
438      CEPDUE=0.1
439!
440! n2mout : compteur des pas de temps ou t2m,q2m ou u2m sont en dehors des intervalles
441!          [tsurf, temp], [qsurf, q1] ou [0, speed]
442! n10mout : compteur des pas de temps ou t10m,q10m ou u10m sont en dehors des intervalles
443!          [tsurf, temp], [qsurf, q1] ou [0, speed]
444!
445      n2mout(:, nsrf, :)=0
446      n10mout(:, :)=0
447     
448      DO i=1, knon
449       speed(i)=MAX(SQRT(u1(i)**2+v1(i)**2),CEPDUE)
450       ri1(i) = 0.0
451      ENDDO
452!
453      okri=.FALSE.
454      CALL cdrag(knon, nsrf, &
455 &                   speed, t1, q1, z1, &
456 &                   psol, s_pblh, ts1, qsurf, z0m, z0h, &
457 &                   zri_zero, 0, &
458 &                   cdram, cdrah, zri1, pref, prain, tsol, pat1)
459
460!
461      DO i = 1, knon
462        ri1(i) = zri1(i)
463        tpot(i) = t1(i)* (psol(i)/pat1(i))**RKAPPA
464        zdu2 = MAX(CEPDUE*CEPDUE, speed(i)**2)
465        ustar(i) = sqrt(cdram(i) * zdu2)
466!
467      ENDDO
468!
469!----------First aproximation of variables at zref --------------------------
470      zref = 2.0
471!
472! calcul first-guess en utilisant dans les calculs à 2m
473! le Richardson de la premiere couche atmospherique
474!
475       CALL screencn(klon, knon, nsrf, zxli, &
476 &                   speed, tpot, q1, zref, &
477 &                   ts1, qsurf, z0m, z0h, psol, &           
478 &                   cdram, cdrah,  okri, &
479 &                   ri1, 1, &
480 &                   pref_new, delm_new, delh_new, ri2m, &
481 &                   s_pblh, prain, tsol, pat1      )
482!
483       DO i = 1, knon
484         u_zref(i) = delm_new(i)*speed(i)
485         u_zref_p(i) = u_zref(i)
486         q_zref(i) = delh_new(i)*max(q1(i),0.0) + &
487         &           max(qsurf(i),0.0)*(1-delh_new(i))
488         q_zref_p(i) = q_zref(i)
489         te_zref(i) = delh_new(i)*tpot(i) + ts1(i)*(1-delh_new(i))
490         te_zref_p(i) = te_zref(i)
491!
492! return to normal temperature
493         temp(i) = te_zref(i) * (psol(i)/pref_new(i))**(-RKAPPA)
494         temp_p(i) = temp(i)
495!
496! compteurs ici
497!
498         ok_t2m_toosmall(i)=te_zref(i).LT.tpot(i).AND. &
499         & te_zref(i).LT.ts1(i)
500         ok_t2m_toobig(i)=te_zref(i).GT.tpot(i).AND. &
501         & te_zref(i).GT.ts1(i)
502         ok_q2m_toosmall(i)=q_zref(i).LT.q1(i).AND. &
503         & q_zref(i).LT.qsurf(i)
504         ok_q2m_toobig(i)=q_zref(i).GT.q1(i).AND. &
505         & q_zref(i).GT.qsurf(i)
506         ok_u2m_toobig(i)=u_zref(i).GT.speed(i)
507!
508         IF(ok_t2m_toosmall(i).OR.ok_t2m_toobig(i)) THEN
509             n2mout(i, nsrf, 1)=n2mout(i, nsrf, 1)+1
510         ENDIF
511         IF(ok_q2m_toosmall(i).OR.ok_q2m_toobig(i)) THEN
512             n2mout(i, nsrf, 3)=n2mout(i, nsrf, 3)+1
513         ENDIF
514         IF(ok_u2m_toobig(i)) THEN
515             n2mout(i, nsrf, 5)=n2mout(i, nsrf, 5)+1
516         ENDIF
517!
518         IF(ok_t2m_toosmall(i).OR.ok_t2m_toobig(i).OR. &
519          & ok_q2m_toosmall(i).OR.ok_q2m_toobig(i).OR. &
520          & ok_u2m_toobig(i)) THEN
521             delm_new(i)=min(max(delm_new(i),0.),1.)
522             delh_new(i)=min(max(delh_new(i),0.),1.)
523             u_zref(i) = delm_new(i)*speed(i)
524             u_zref_p(i) = u_zref(i)
525             q_zref(i) = delh_new(i)*max(q1(i),0.0) + &
526         &               max(qsurf(i),0.0)*(1-delh_new(i))
527             q_zref_p(i) = q_zref(i)
528             te_zref(i) = delh_new(i)*tpot(i) + ts1(i)*(1-delh_new(i))
529             te_zref_p(i) = te_zref(i)
530!
531! return to normal temperature
532             temp(i) = te_zref(i) * (psol(i)/pref_new(i))**(-RKAPPA)
533             temp_p(i) = temp(i)
534         ENDIF
535!
536       ENDDO
537!
538! Iteration of the variables at the reference level zref : corrector calculation ; see Hess & McAvaney, 1995
539!
540      DO n = 1, niter
541!
542        okri=.TRUE.
543        CALL screencn(klon, knon, nsrf, zxli, &
544 &                   u_zref, temp, q_zref, zref, &
545 &                   ts1, qsurf, z0m, z0h, psol, &
546 &                   cdram, cdrah,  okri, &
547 &                   ri1, 0, &
548 &                   pref, delm, delh, ri2m, &
549 &                   s_pblh, prain, tsol, pat1      )
550!
551        DO i = 1, knon
552          u_zref(i) = delm(i)*speed(i)
553          q_zref(i) = delh(i)*max(q1(i),0.0) + &
554          &           max(qsurf(i),0.0)*(1-delh(i))
555          te_zref(i) = delh(i)*tpot(i) + ts1(i)*(1-delh(i))
556!
557! return to normal temperature
558          temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
559!
560! compteurs ici
561!
562          ok_t2m_toosmall(i)=te_zref(i).LT.tpot(i).AND. &
563          & te_zref(i).LT.ts1(i)
564          ok_t2m_toobig(i)=te_zref(i).GT.tpot(i).AND. &
565          & te_zref(i).GT.ts1(i)
566          ok_q2m_toosmall(i)=q_zref(i).LT.q1(i).AND. &
567          & q_zref(i).LT.qsurf(i)
568          ok_q2m_toobig(i)=q_zref(i).GT.q1(i).AND. &
569          & q_zref(i).GT.qsurf(i)
570          ok_u2m_toobig(i)=u_zref(i).GT.speed(i)
571!
572          IF(ok_t2m_toosmall(i).OR.ok_t2m_toobig(i)) THEN
573              n2mout(i, nsrf, 2)=n2mout(i, nsrf, 2)+1
574          ENDIF
575          IF(ok_q2m_toosmall(i).OR.ok_q2m_toobig(i)) THEN
576              n2mout(i, nsrf, 4)=n2mout(i, nsrf, 4)+1
577          ENDIF
578          IF(ok_u2m_toobig(i)) THEN
579              n2mout(i, nsrf, 6)=n2mout(i, nsrf, 6)+1
580          ENDIF
581!
582          IF(ok_t2m_toosmall(i).OR.ok_t2m_toobig(i).OR. &
583           & ok_q2m_toosmall(i).OR.ok_q2m_toobig(i).OR. &
584           & ok_u2m_toobig(i)) THEN
585              delm(i)=min(max(delm(i),0.),1.)
586              delh(i)=min(max(delh(i),0.),1.)
587              u_zref(i) = delm(i)*speed(i)
588              q_zref(i) = delh(i)*max(q1(i),0.0) + &
589          &           max(qsurf(i),0.0)*(1-delh(i))
590              te_zref(i) = delh(i)*tpot(i) + ts1(i)*(1-delh(i))
591              temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
592          ENDIF
593!
594!
595          IF(n.EQ.ncon) THEN
596            te_zref_con(i) = te_zref(i)
597            q_zref_con(i) = q_zref(i)
598          ENDIF
599!
600        ENDDO
601!
602      ENDDO
603!
604      DO i = 1, knon
605        q_zref_c(i) = q_zref(i)
606        temp_c(i) = temp(i)
607!
608        ok_pred(i)=0.
609        ok_corr(i)=1.
610!
611        t_2m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
612        q_2m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
613!
614        u_zref_c(i) = u_zref(i)
615        u_2m(i) = u_zref_p(i) * ok_pred(i) + u_zref_c(i) * ok_corr(i)
616      ENDDO
617!
618!
619!----------First aproximation of variables at zref --------------------------
620!
621      zref = 10.0
622!
623       CALL screencn(klon, knon, nsrf, zxli, &
624 &                   speed, tpot, q1, zref, &
625 &                   ts1, qsurf, z0m, z0h, psol, &           
626 &                   cdram, cdrah,  okri, &
627 &                   ri1, 1, &
628 &                   pref_new, delm_new, delh_new, ri10m, &
629 &                   s_pblh, prain, tsol, pat1      )
630!
631       DO i = 1, knon
632         u_zref(i) = delm_new(i)*speed(i)
633         q_zref(i) = delh_new(i)*max(q1(i),0.0) + &
634         &           max(qsurf(i),0.0)*(1-delh_new(i))
635         te_zref(i) = delh_new(i)*tpot(i) + ts1(i)*(1-delh_new(i))
636         temp(i) = te_zref(i) * (psol(i)/pref_new(i))**(-RKAPPA)
637         u_zref_p(i) = u_zref(i)
638!
639! compteurs ici
640!
641         ok_t10m_toosmall(i)=te_zref(i).LT.tpot(i).AND. &
642         & te_zref(i).LT.ts1(i)
643         ok_t10m_toobig(i)=te_zref(i).GT.tpot(i).AND. &
644         & te_zref(i).GT.ts1(i)
645         ok_q10m_toosmall(i)=q_zref(i).LT.q1(i).AND. &
646         & q_zref(i).LT.qsurf(i)
647         ok_q10m_toobig(i)=q_zref(i).GT.q1(i).AND. &
648         & q_zref(i).GT.qsurf(i)
649         ok_u10m_toobig(i)=u_zref(i).GT.speed(i)
650!
651         IF(ok_t10m_toosmall(i).OR.ok_t10m_toobig(i)) THEN
652             n10mout(i,1)=n10mout(i,1)+1
653         ENDIF
654         IF(ok_q10m_toosmall(i).OR.ok_q10m_toobig(i)) THEN
655             n10mout(i,3)=n10mout(i,3)+1
656         ENDIF
657         IF(ok_u10m_toobig(i)) THEN
658             n10mout(i,5)=n10mout(i,5)+1
659         ENDIF
660!
661         IF(ok_t10m_toosmall(i).OR.ok_t10m_toobig(i).OR. &
662          & ok_q10m_toosmall(i).OR.ok_q10m_toobig(i).OR. &
663          & ok_u10m_toobig(i)) THEN
664             delm_new(i)=min(max(delm_new(i),0.),1.)
665             delh_new(i)=min(max(delh_new(i),0.),1.)
666             u_zref(i) = delm_new(i)*speed(i)
667             u_zref_p(i) = u_zref(i)
668             q_zref(i) = delh_new(i)*max(q1(i),0.0) + &
669         &               max(qsurf(i),0.0)*(1-delh_new(i))
670             te_zref(i) = delh_new(i)*tpot(i) + ts1(i)*(1-delh_new(i))
671             temp(i) = te_zref(i) * (psol(i)/pref_new(i))**(-RKAPPA)
672         ENDIF
673!
674       ENDDO
675!
676! Iteration of the variables at the reference level zref : corrector calculation ; see Hess & McAvaney, 1995
677!
678      DO n = 1, niter
679!
680        okri=.TRUE.
681        CALL screencn(klon, knon, nsrf, zxli, &
682 &                   u_zref, temp, q_zref, zref, &
683 &                   ts1, qsurf, z0m, z0h, psol, &
684 &                   cdram, cdrah,  okri, &
685 &                   ri1, 0, &
686 &                   pref, delm, delh, ri10m, &
687 &                   s_pblh, prain, tsol, pat1      )
688!
689        DO i = 1, knon
690          u_zref(i) = delm(i)*speed(i)
691          q_zref(i) = delh(i)*max(q1(i),0.0) + &
692          &           max(qsurf(i),0.0)*(1-delh(i))
693          te_zref(i) = delh(i)*tpot(i) + ts1(i)*(1-delh(i))
694!
695! return to normal temperature
696          temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
697!
698! compteurs ici
699!
700          ok_t10m_toosmall(i)=te_zref(i).LT.tpot(i).AND. &
701          & te_zref(i).LT.ts1(i)
702          ok_t10m_toobig(i)=te_zref(i).GT.tpot(i).AND. &
703          & te_zref(i).GT.ts1(i)
704          ok_q10m_toosmall(i)=q_zref(i).LT.q1(i).AND. &
705          & q_zref(i).LT.qsurf(i)
706          ok_q10m_toobig(i)=q_zref(i).GT.q1(i).AND. &
707          & q_zref(i).GT.qsurf(i)
708          ok_u10m_toobig(i)=u_zref(i).GT.speed(i)
709!
710          IF(ok_t10m_toosmall(i).OR.ok_t10m_toobig(i)) THEN
711              n10mout(i,2)=n10mout(i,2)+1
712          ENDIF
713          IF(ok_q10m_toosmall(i).OR.ok_q10m_toobig(i)) THEN
714              n10mout(i,4)=n10mout(i,4)+1
715          ENDIF
716          IF(ok_u10m_toobig(i)) THEN
717              n10mout(i,6)=n10mout(i,6)+1
718          ENDIF
719!
720          IF(ok_t10m_toosmall(i).OR.ok_t10m_toobig(i).OR. &
721           & ok_q10m_toosmall(i).OR.ok_q10m_toobig(i).OR. &
722           & ok_u10m_toobig(i)) THEN
723              delm(i)=min(max(delm(i),0.),1.)
724              delh(i)=min(max(delh(i),0.),1.)
725              u_zref(i) = delm(i)*speed(i)
726              q_zref(i) = delh(i)*max(q1(i),0.0) + &
727          &           max(qsurf(i),0.0)*(1-delh(i))
728              te_zref(i) = delh(i)*tpot(i) + ts1(i)*(1-delh(i))
729              temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
730          ENDIF
731!
732!
733          IF(n.EQ.ncon) THEN
734            te_zref_con(i) = te_zref(i)
735            q_zref_con(i) = q_zref(i)
736          ENDIF
737!
738        ENDDO
739!
740      ENDDO
741!
742      DO i = 1, knon
743        q_zref_c(i) = q_zref(i)
744        temp_c(i) = temp(i)
745!
746        ok_pred(i)=0.
747        ok_corr(i)=1.
748!
749        t_10m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
750        q_10m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
751!
752        u_zref_c(i) = u_zref(i)
753        u_10m(i) = u_zref_p(i) * ok_pred(i) + u_zref_c(i) * ok_corr(i)
754      ENDDO
755!
756      RETURN
757      END subroutine stdlevvarn
758
759END MODULE stdlevvar_mod
Note: See TracBrowser for help on using the repository browser.