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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (hide 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 guez 104 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 guez 108 use coefcdrag_m, only: coefcdrag
13 guez 104 USE suphec_m, ONLY: rg, rkappa
14 guez 178 use screenp_m, only: screenp
15 guez 104
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 guez 106 INTEGER, intent(in):: knon
28 guez 104 ! knon----input-I- nombre de points pour un type de surface
29 guez 106 INTEGER, intent(in):: nsrf
30 guez 104 ! 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 guez 106 REAL, dimension(klon), intent(in):: u1
34 guez 104 ! u1------input-R- vent zonal au 1er niveau du modele
35 guez 106 REAL, dimension(klon), intent(in):: v1
36 guez 104 ! v1------input-R- vent meridien au 1er niveau du modele
37 guez 106 REAL, dimension(klon), intent(in):: t1
38 guez 104 ! t1------input-R- temperature de l'air au 1er niveau du modele
39 guez 106 REAL, dimension(klon), intent(in):: q1
40 guez 104 ! q1------input-R- humidite relative au 1er niveau du modele
41 guez 106 REAL, dimension(klon), intent(in):: z1
42 guez 104 ! z1------input-R- geopotentiel au 1er niveau du modele
43 guez 106 REAL, dimension(klon), intent(in):: ts1
44 guez 104 ! ts1-----input-R- temperature de l'air a la surface
45 guez 106 REAL, dimension(klon), intent(in):: qsurf
46 guez 104 ! qsurf---input-R- humidite relative a la surface
47 guez 106 REAL, dimension(klon), intent(in):: rugos
48 guez 104 ! rugos---input-R- rugosite
49 guez 106 REAL, dimension(klon), intent(in):: psol
50 guez 104 ! psol----input-R- pression au sol
51 guez 106 REAL, dimension(klon), intent(in):: pat1
52 guez 104 ! pat1----input-R- pression au 1er niveau du modele
53    
54 guez 106 REAL, dimension(klon), intent(out):: t_2m
55 guez 104 ! t_2m---output-R- temperature de l'air a 2m
56 guez 106 REAL, dimension(klon), intent(out):: q_2m
57 guez 104 ! q_2m---output-R- humidite relative a 2m
58 guez 106 REAL, dimension(klon), intent(out):: t_10m
59 guez 104 ! t_10m--output-R- temperature de l'air a 10m
60 guez 106 REAL, dimension(klon), intent(out):: q_10m
61 guez 104 ! 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 guez 3 speed(i)=SQRT(u1(i)**2+v1(i)**2)
101     ri1(i) = 0.0
102 guez 104 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 guez 178 CALL screenp(klon, knon, speed, tpot, q1, &
128 guez 104 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 guez 3 u_zref(i) = delu(i)
154 guez 104 q_zref(i) = delq(i) + max(qsurf(i), 0.0)
155 guez 3 te_zref(i) = delte(i) + ts1(i)
156 guez 104
157     ! return to normal temperature
158    
159 guez 3 temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
160 guez 104 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 guez 178 CALL screenp(klon, knon, speed, tpot, q1, &
180 guez 104 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 guez 3 u_zref(i) = delu(i)
205 guez 104 q_zref(i) = delq(i) + max(qsurf(i), 0.0)
206 guez 3 te_zref(i) = delte(i) + ts1(i)
207     temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
208 guez 104 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