/[lmdze]/trunk/Sources/phylmd/stdlevvar.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/stdlevvar.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 225 by guez, Mon Oct 16 12:35:41 2017 UTC revision 227 by guez, Thu Nov 2 15:47:03 2017 UTC
# Line 4  module stdlevvar_m Line 4  module stdlevvar_m
4    
5  contains  contains
6    
7    SUBROUTINE stdlevvar(klon, knon, nsrf, zxli, u1, v1, t1, q1, z1, ts1, &    SUBROUTINE stdlevvar(klon, knon, nsrf, u1, v1, t1, q1, z1, ts1, qsurf, &
8         qsurf, rugos, psol, pat1, t_2m, q_2m, t_10m, q_10m, u_10m, ustar)         rugos, psol, pat1, t_2m, q_2m, t_10m, q_10m, wind10m, ustar)
9    
10      ! From LMDZ4/libf/phylmd/stdlevvar.F90, version 1.3 2005/05/25 13:10:09      ! From LMDZ4/libf/phylmd/stdlevvar.F90, version 1.3, 2005/05/25 13:10:09
11    
12      ! Objet : calcul de la température et de l'humidité relative à 2 m      ! Objet : calcul de la température et de l'humidité relative à 2 m
13      ! et du module du vent à 10 m à partir des relations de      ! et du module du vent à 10 m à partir des relations de
# Line 27  contains Line 27  contains
27    
28      INTEGER, intent(in):: knon ! nombre de points pour un type de surface      INTEGER, intent(in):: knon ! nombre de points pour un type de surface
29      INTEGER, intent(in):: nsrf ! indice pour le type de surface      INTEGER, intent(in):: nsrf ! indice pour le type de surface
     LOGICAL, intent(in):: zxli ! calcul des cdrags selon Laurent Li  
30      REAL, intent(in):: u1(:) ! (knon) vent zonal au 1er niveau du modele      REAL, intent(in):: u1(:) ! (knon) vent zonal au 1er niveau du modele
31      REAL, intent(in):: v1(:) ! (knon) vent meridien au 1er niveau du modele      REAL, intent(in):: v1(:) ! (knon) vent meridien au 1er niveau du modele
32      REAL, intent(in):: t1 (klon) ! temperature de l'air au 1er niveau du modele      REAL, intent(in):: t1(:) ! (knon) temperature de l'air au 1er
33                                 ! niveau du modele
34      REAL, intent(in):: q1(klon) ! humidite relative au 1er niveau du modele      REAL, intent(in):: q1(klon) ! humidite relative au 1er niveau du modele
35      REAL, intent(in):: z1 (klon) ! geopotentiel au 1er niveau du modele      REAL, intent(in):: z1 (klon) ! geopotentiel au 1er niveau du modele
36      REAL, intent(in):: ts1(klon) ! temperature de l'air a la surface      REAL, intent(in):: ts1(klon) ! temperature de l'air a la surface
# Line 42  contains Line 42  contains
42      REAL, intent(out):: q_2m(klon) ! humidite relative a 2m      REAL, intent(out):: q_2m(klon) ! humidite relative a 2m
43      REAL, intent(out):: t_10m(klon) ! temperature de l'air a 10m      REAL, intent(out):: t_10m(klon) ! temperature de l'air a 10m
44      REAL, intent(out):: q_10m(klon) ! humidite specifique a 10m      REAL, intent(out):: q_10m(klon) ! humidite specifique a 10m
45      REAL, intent(out):: u_10m(klon) ! vitesse du vent a 10m      REAL, intent(out):: wind10m(:) ! (knon) norme du vent \`a 10m
46      REAL, intent(out):: ustar(klon) ! u*      REAL, intent(out):: ustar(klon) ! u*
47    
48      ! Local:      ! Local:
49        REAL, PARAMETER:: RKAR = 0.4 ! constante de von Karman
50      ! RKAR : constante de von Karman      INTEGER, parameter:: niter = 2 ! nombre iterations calcul "corrector"
     REAL, PARAMETER:: RKAR=0.40  
     ! niter : nombre iterations calcul "corrector"  
     INTEGER, parameter:: niter=2  
   
     ! Variables locales  
51      INTEGER i, n      INTEGER i, n
52      REAL zref      REAL zref
53      REAL, dimension(klon):: speed      REAL, dimension(klon):: speed
# Line 69  contains Line 64  contains
64      REAL, dimension(klon):: delu, delte, delq      REAL, dimension(klon):: delu, delte, delq
65      REAL, dimension(klon):: u_zref, te_zref, q_zref      REAL, dimension(klon):: u_zref, te_zref, q_zref
66      REAL, dimension(klon):: temp, pref      REAL, dimension(klon):: temp, pref
     LOGICAL okri  
     REAL, dimension(klon):: u_zref_p, temp_p, q_zref_p  
     !convertgence  
     REAL, dimension(klon):: u_zref_c, temp_c, q_zref_c  
     REAL, dimension(klon):: ok_pred, ok_corr  
67    
68      !-------------------------------------------------------------------------      !-------------------------------------------------------------------------
69    
# Line 82  contains Line 72  contains
72         ri1(i) = 0.0         ri1(i) = 0.0
73      ENDDO      ENDDO
74    
75      okri=.FALSE.      CALL coefcdrag(knon, nsrf, speed(:knon), t1(:knon), q1(:knon), &
76      CALL coefcdrag(klon, knon, nsrf, zxli, speed, t1, q1, z1, psol, ts1, &           z1(:knon), psol(:knon), ts1, qsurf, rugos, cdram, cdrah, cdran, &
77           qsurf, rugos, okri, ri1, cdram, cdrah, cdran, zri1, pref)           zri1, pref)
78    
79      ! Star variables      ! Star variables
80    
# Line 99  contains Line 89  contains
89    
90         testar(i) = (cdrah(i) * zdte(i) * speed(i))/ustar(i)         testar(i) = (cdrah(i) * zdte(i) * speed(i))/ustar(i)
91         qstar(i) = (cdrah(i) * zdq(i) * speed(i))/ustar(i)         qstar(i) = (cdrah(i) * zdq(i) * speed(i))/ustar(i)
92         lmon(i) = (ustar(i) * ustar(i) * tpot(i))/ &         lmon(i) = (ustar(i) * ustar(i) * tpot(i)) / (RKAR * RG * testar(i))
             (RKAR * RG * testar(i))  
93      ENDDO      ENDDO
94    
95      ! First aproximation of variables at zref        ! First aproximation of variables at zref  
96      zref = 2.0      zref = 2.0
97      CALL screenp(klon, knon, speed, tpot, q1, &      CALL screenp(knon, speed, tpot, q1, ts1, qsurf, rugos, lmon, ustar, &
98           ts1, qsurf, rugos, lmon, &           testar, qstar, zref, delu, delte, delq)
          ustar, testar, qstar, zref, &  
          delu, delte, delq)  
99    
100      DO i = 1, knon      DO i = 1, knon
101         u_zref(i) = delu(i)         u_zref(i) = delu(i)
102         q_zref(i) = max(qsurf(i), 0.0) + delq(i)         q_zref(i) = max(qsurf(i), 0.0) + delq(i)
103         te_zref(i) = ts1(i) + delte(i)         te_zref(i) = ts1(i) + delte(i)
104         temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)         temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
        q_zref_p(i) = q_zref(i)  
        temp_p(i) = temp(i)  
105      ENDDO      ENDDO
106    
107      ! Iteration of the variables at the reference level zref :      ! Iteration of the variables at the reference level zref :
108      ! corrector calculation ; see Hess & McAvaney, 1995      ! corrector calculation ; see Hess & McAvaney, 1995
109    
110      DO n = 1, niter      DO n = 1, niter
111         okri=.TRUE.         CALL screenc(klon, knon, nsrf, u_zref, temp, q_zref, zref, ts1, &
112         CALL screenc(klon, knon, nsrf, zxli, &              qsurf, rugos, psol, ustar, testar, qstar, pref, delu, delte, delq)
             u_zref, temp, q_zref, zref, &  
             ts1, qsurf, rugos, psol, &  
             ustar, testar, qstar, okri, ri1, &  
             pref, delu, delte, delq)  
113    
114         DO i = 1, knon         DO i = 1, knon
115            u_zref(i) = delu(i)            u_zref(i) = delu(i)
# Line 136  contains Line 117  contains
117            te_zref(i) = delte(i) + ts1(i)            te_zref(i) = delte(i) + ts1(i)
118    
119            ! return to normal temperature            ! return to normal temperature
   
120            temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)            temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
121         ENDDO         ENDDO
122      ENDDO      ENDDO
# Line 144  contains Line 124  contains
124      ! verifier le critere de convergence : 0.25% pour te_zref et 5% pour qe_zref      ! verifier le critere de convergence : 0.25% pour te_zref et 5% pour qe_zref
125    
126      DO i = 1, knon      DO i = 1, knon
127         q_zref_c(i) = q_zref(i)         t_2m(i) = temp(i)
128         temp_c(i) = temp(i)         q_2m(i) = q_zref(i)
   
        ok_pred(i)=0.  
        ok_corr(i)=1.  
   
        t_2m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)  
        q_2m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)  
129      ENDDO      ENDDO
130    
131      ! First aproximation of variables at zref        ! First aproximation of variables at zref  
132    
133      zref = 10.0      zref = 10.
134      CALL screenp(klon, knon, speed, tpot, q1, ts1, qsurf, rugos, lmon, ustar, &      CALL screenp(knon, speed, tpot, q1, ts1, qsurf, rugos, lmon, ustar, &
135           testar, qstar, zref, delu, delte, delq)           testar, qstar, zref, delu, delte, delq)
136    
137      DO i = 1, knon      DO i = 1, knon
# Line 165  contains Line 139  contains
139         q_zref(i) = max(qsurf(i), 0.0) + delq(i)         q_zref(i) = max(qsurf(i), 0.0) + delq(i)
140         te_zref(i) = ts1(i) + delte(i)         te_zref(i) = ts1(i) + delte(i)
141         temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)         temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
        u_zref_p(i) = u_zref(i)  
142      ENDDO      ENDDO
143    
144      ! Iteration of the variables at the reference level zref:      ! Iteration of the variables at the reference level zref:
145      ! corrector ; see Hess & McAvaney, 1995      ! corrector ; see Hess & McAvaney, 1995
146    
147      DO n = 1, niter      DO n = 1, niter
148         okri=.TRUE.         CALL screenc(klon, knon, nsrf, u_zref, temp, q_zref, zref, ts1, &
149         CALL screenc(klon, knon, nsrf, zxli, u_zref, temp, q_zref, zref, ts1, &              qsurf, rugos, psol, ustar, testar, qstar, pref, delu, delte, delq)
             qsurf, rugos, psol, ustar, testar, qstar, okri, ri1, pref, delu, &  
             delte, delq)  
150    
151         DO i = 1, knon         DO i = 1, knon
152            u_zref(i) = delu(i)            u_zref(i) = delu(i)
# Line 186  contains Line 157  contains
157      ENDDO      ENDDO
158    
159      DO i = 1, knon      DO i = 1, knon
160         u_zref_c(i) = u_zref(i)         wind10m(i) = u_zref(i)
161         u_10m(i) = u_zref_p(i) * ok_pred(i) + u_zref_c(i) * ok_corr(i)         t_10m(i) = temp(i)
162         q_zref_c(i) = q_zref(i)         q_10m(i) = q_zref(i)
        temp_c(i) = temp(i)  
        t_10m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)  
        q_10m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)  
163      ENDDO      ENDDO
164    
165    END subroutine stdlevvar    END subroutine stdlevvar

Legend:
Removed from v.225  
changed lines
  Added in v.227

  ViewVC Help
Powered by ViewVC 1.1.21