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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 208 - (show annotations)
Wed Dec 7 16:44:53 2016 UTC (7 years, 5 months ago) by guez
File size: 6987 byte(s)
Module academic was not used.

Useful values for iflag_phys were only 0 and 1 so changed type to logical.

Definition of fmagic was duplicated in procedures alboc and alboc_cd
so moved it up to interfsurf_hq and also moved multiplication by
fmagic (following LMDZ).

1 module stdlevvar_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE stdlevvar(klon, knon, nsrf, zxli, u1, v1, t1, q1, z1, ts1, &
8 qsurf, rugos, psol, pat1, t_2m, q_2m, t_10m, q_10m, u_10m, ustar)
9
10 ! From LMDZ4/libf/phylmd/stdlevvar.F90, version 1.3 2005/05/25 13:10:09
11
12 use coefcdrag_m, only: coefcdrag
13 USE suphec_m, ONLY: rg, rkappa
14 use screenp_m, only: screenp
15
16 ! Objet : calcul de la température et de l'humidité relative à 2 m
17 ! et du module du vent à 10 m à partir des relations de
18 ! Dyer-Businger et des équations de Louis.
19
20 ! Reference: Hess, Colman and McAvaney (1995)
21
22 ! Author: I. Musat, July 1st, 2002
23
24 INTEGER, intent(in):: klon
25 ! dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
26
27 INTEGER, intent(in):: knon ! nombre de points pour un type de surface
28
29 INTEGER, intent(in):: nsrf
30 ! indice pour le type de surface; voir indicesol.inc
31
32 LOGICAL, intent(in):: zxli ! calcul des cdrags selon Laurent Li
33 REAL, dimension(klon), intent(in):: u1 ! vent zonal au 1er niveau du modele
34
35 REAL, dimension(klon), intent(in):: v1
36 ! vent meridien au 1er niveau du modele
37
38 REAL, dimension(klon), intent(in):: t1
39 ! temperature de l'air au 1er niveau du modele
40
41 REAL, dimension(klon), intent(in):: q1
42 ! humidite relative au 1er niveau du modele
43
44 REAL, dimension(klon), intent(in):: z1
45 ! geopotentiel au 1er niveau du modele
46
47 REAL, dimension(klon), intent(in):: ts1 ! temperature de l'air a la surface
48 REAL, dimension(klon), intent(in):: qsurf ! humidite relative a la surface
49 REAL, dimension(klon), intent(in):: rugos ! rugosite
50 REAL, dimension(klon), intent(in):: psol ! pression au sol
51 REAL, dimension(klon), intent(in):: pat1 ! pression au 1er niveau du modele
52 REAL, dimension(klon), intent(out):: t_2m ! temperature de l'air a 2m
53 REAL, dimension(klon), intent(out):: q_2m ! humidite relative a 2m
54 REAL, dimension(klon), intent(out):: t_10m ! temperature de l'air a 10m
55 REAL, dimension(klon), intent(out):: q_10m ! humidite specifique a 10m
56 REAL, dimension(klon), intent(out):: u_10m ! vitesse du vent a 10m
57 REAL, intent(out):: ustar(klon) ! u*
58
59 ! Local:
60
61 ! RKAR : constante de von Karman
62 REAL, PARAMETER:: RKAR=0.40
63 ! niter : nombre iterations calcul "corrector"
64 INTEGER, parameter:: niter=2
65
66 ! Variables locales
67 INTEGER i, n
68 REAL zref
69 REAL, dimension(klon):: speed
70 ! tpot : temperature potentielle
71 REAL, dimension(klon):: tpot
72 REAL, dimension(klon):: zri1, cdran
73 REAL cdram(klon), cdrah(klon)
74 ! ri1 : nb. de Richardson entre la surface --> la 1ere couche
75 REAL, dimension(klon):: ri1
76 REAL, dimension(klon):: testar, qstar
77 REAL, dimension(klon):: zdte, zdq
78 ! lmon : longueur de Monin-Obukhov selon Hess, Colman and McAvaney
79 DOUBLE PRECISION, dimension(klon):: lmon
80 REAL, dimension(klon):: delu, delte, delq
81 REAL, dimension(klon):: u_zref, te_zref, q_zref
82 REAL, dimension(klon):: temp, pref
83 LOGICAL okri
84 REAL, dimension(klon):: u_zref_p, temp_p, q_zref_p
85 !convertgence
86 REAL, dimension(klon):: u_zref_c, temp_c, q_zref_c
87 REAL, dimension(klon):: ok_pred, ok_corr
88
89 !-------------------------------------------------------------------------
90
91 DO i=1, knon
92 speed(i)=SQRT(u1(i)**2+v1(i)**2)
93 ri1(i) = 0.0
94 ENDDO
95
96 okri=.FALSE.
97 CALL coefcdrag(klon, knon, nsrf, zxli, speed, t1, q1, z1, psol, ts1, &
98 qsurf, rugos, okri, ri1, cdram, cdrah, cdran, zri1, pref)
99
100 ! Star variables
101
102 DO i = 1, knon
103 ri1(i) = zri1(i)
104 tpot(i) = t1(i)* (psol(i)/pat1(i))**RKAPPA
105 ustar(i) = sqrt(cdram(i) * speed(i) * speed(i))
106 zdte(i) = tpot(i) - ts1(i)
107 zdq(i) = max(q1(i), 0.0) - max(qsurf(i), 0.0)
108
109 zdte(i) = sign(max(abs(zdte(i)), 1.e-10), zdte(i))
110
111 testar(i) = (cdrah(i) * zdte(i) * speed(i))/ustar(i)
112 qstar(i) = (cdrah(i) * zdq(i) * speed(i))/ustar(i)
113 lmon(i) = (ustar(i) * ustar(i) * tpot(i))/ &
114 (RKAR * RG * testar(i))
115 ENDDO
116
117 ! First aproximation of variables at zref
118 zref = 2.0
119 CALL screenp(klon, knon, speed, tpot, q1, &
120 ts1, qsurf, rugos, lmon, &
121 ustar, testar, qstar, zref, &
122 delu, delte, delq)
123
124 DO i = 1, knon
125 u_zref(i) = delu(i)
126 q_zref(i) = max(qsurf(i), 0.0) + delq(i)
127 te_zref(i) = ts1(i) + delte(i)
128 temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
129 q_zref_p(i) = q_zref(i)
130 temp_p(i) = temp(i)
131 ENDDO
132
133 ! Iteration of the variables at the reference level zref :
134 ! corrector calculation ; see Hess & McAvaney, 1995
135
136 DO n = 1, niter
137 okri=.TRUE.
138 CALL screenc(klon, knon, nsrf, zxli, &
139 u_zref, temp, q_zref, zref, &
140 ts1, qsurf, rugos, psol, &
141 ustar, testar, qstar, okri, ri1, &
142 pref, delu, delte, delq)
143
144 DO i = 1, knon
145 u_zref(i) = delu(i)
146 q_zref(i) = delq(i) + max(qsurf(i), 0.0)
147 te_zref(i) = delte(i) + ts1(i)
148
149 ! return to normal temperature
150
151 temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
152 ENDDO
153 ENDDO
154
155 ! verifier le critere de convergence : 0.25% pour te_zref et 5% pour qe_zref
156
157 DO i = 1, knon
158 q_zref_c(i) = q_zref(i)
159 temp_c(i) = temp(i)
160
161 ok_pred(i)=0.
162 ok_corr(i)=1.
163
164 t_2m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
165 q_2m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
166 ENDDO
167
168 ! First aproximation of variables at zref
169
170 zref = 10.0
171 CALL screenp(klon, knon, speed, tpot, q1, &
172 ts1, qsurf, rugos, lmon, &
173 ustar, testar, qstar, zref, &
174 delu, delte, delq)
175
176 DO i = 1, knon
177 u_zref(i) = delu(i)
178 q_zref(i) = max(qsurf(i), 0.0) + delq(i)
179 te_zref(i) = ts1(i) + delte(i)
180 temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
181 u_zref_p(i) = u_zref(i)
182 ENDDO
183
184 ! Iteration of the variables at the reference level zref:
185 ! corrector ; see Hess & McAvaney, 1995
186
187 DO n = 1, niter
188 okri=.TRUE.
189 CALL screenc(klon, knon, nsrf, zxli, &
190 u_zref, temp, q_zref, zref, &
191 ts1, qsurf, rugos, psol, &
192 ustar, testar, qstar, okri, ri1, &
193 pref, delu, delte, delq)
194
195 DO i = 1, knon
196 u_zref(i) = delu(i)
197 q_zref(i) = delq(i) + max(qsurf(i), 0.0)
198 te_zref(i) = delte(i) + ts1(i)
199 temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
200 ENDDO
201 ENDDO
202
203 DO i = 1, knon
204 u_zref_c(i) = u_zref(i)
205
206 u_10m(i) = u_zref_p(i) * ok_pred(i) + u_zref_c(i) * ok_corr(i)
207
208 q_zref_c(i) = q_zref(i)
209 temp_c(i) = temp(i)
210 t_10m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
211 q_10m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
212 ENDDO
213
214 END subroutine stdlevvar
215
216 end module stdlevvar_m

  ViewVC Help
Powered by ViewVC 1.1.21