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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 7399 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

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

  ViewVC Help
Powered by ViewVC 1.1.21