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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 309 - (hide annotations)
Thu Sep 27 14:58:10 2018 UTC (5 years, 8 months ago) by guez
File size: 5711 byte(s)
Remove variable pourc_* in histins.nc, redundant with fract_*.

In procedure physiq, change the meaning of variable "sens" to avoid
changing the sign several times needlessly. Also the meaning of
variable "sens" in physiq is now the same than the meaning of netCDF
variable "sens". Also the convention for "sens" is now the same than
for radsol, zxfluxlat, and flux_t.

1 guez 104 module stdlevvar_m
2    
3     IMPLICIT NONE
4    
5     contains
6    
7 guez 272 SUBROUTINE stdlevvar(nsrf, u1, v1, t1, q1, z1, ts1, qsurf, rugos, psol, &
8     pat1, t_2m, q_2m, t_10m, q_10m, wind10m, ustar)
9 guez 104
10 guez 227 ! From LMDZ4/libf/phylmd/stdlevvar.F90, version 1.3, 2005/05/25 13:10:09
11 guez 104
12     ! 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
14     ! Dyer-Businger et des équations de Louis.
15    
16     ! Reference: Hess, Colman and McAvaney (1995)
17    
18 guez 208 ! Author: I. Musat, July 1st, 2002
19 guez 104
20 guez 272 use nr_util, only: assert_eq
21    
22 guez 275 use cdrag_m, only: cdrag
23 guez 272 USE dimphy, ONLY: klon
24 guez 225 USE suphec_m, ONLY: rg, rkappa
25     use screenc_m, only: screenc
26     use screenp_m, only: screenp
27    
28     INTEGER, intent(in):: nsrf ! indice pour le type de surface
29     REAL, intent(in):: u1(:) ! (knon) vent zonal au 1er niveau du modele
30     REAL, intent(in):: v1(:) ! (knon) vent meridien au 1er niveau du modele
31 guez 227 REAL, intent(in):: t1(:) ! (knon) temperature de l'air au 1er
32     ! niveau du modele
33 guez 225 REAL, intent(in):: q1(klon) ! humidite relative au 1er niveau du modele
34     REAL, intent(in):: z1 (klon) ! geopotentiel au 1er niveau du modele
35     REAL, intent(in):: ts1(klon) ! temperature de l'air a la surface
36 guez 309 REAL, intent(in):: qsurf(:) ! (knon) humidit\'e relative \`a la surface
37 guez 225 REAL, intent(in):: rugos(klon) ! rugosite
38     REAL, intent(in):: psol(klon) ! pression au sol
39     REAL, intent(in):: pat1(klon) ! pression au 1er niveau du modele
40     REAL, intent(out):: t_2m(klon) ! temperature de l'air a 2m
41     REAL, intent(out):: q_2m(klon) ! humidite relative a 2m
42     REAL, intent(out):: t_10m(klon) ! temperature de l'air a 10m
43     REAL, intent(out):: q_10m(klon) ! humidite specifique a 10m
44 guez 227 REAL, intent(out):: wind10m(:) ! (knon) norme du vent \`a 10m
45 guez 246 REAL, intent(out):: ustar(:) ! (knon) u*
46 guez 104
47     ! Local:
48 guez 272 INTEGER knon ! nombre de points pour un type de surface
49 guez 227 REAL, PARAMETER:: RKAR = 0.4 ! constante de von Karman
50     INTEGER, parameter:: niter = 2 ! nombre iterations calcul "corrector"
51 guez 104 INTEGER i, n
52     REAL zref
53     REAL, dimension(klon):: speed
54     ! tpot : temperature potentielle
55     REAL, dimension(klon):: tpot
56 guez 274 REAL cdram(size(u1)), cdrah(size(u1))
57 guez 104 REAL, dimension(klon):: testar, qstar
58     REAL, dimension(klon):: zdte, zdq
59     ! lmon : longueur de Monin-Obukhov selon Hess, Colman and McAvaney
60     DOUBLE PRECISION, dimension(klon):: lmon
61     REAL, dimension(klon):: delu, delte, delq
62     REAL, dimension(klon):: u_zref, te_zref, q_zref
63 guez 272 REAL, dimension(klon):: temp
64     real pref(size(u1)) ! (knon)
65 guez 104
66     !-------------------------------------------------------------------------
67    
68 guez 272 knon = assert_eq([size(u1), size(v1), size(t1), size(wind10m), &
69     size(ustar)], "stdlevvar knon")
70    
71 guez 104 DO i=1, knon
72 guez 3 speed(i)=SQRT(u1(i)**2+v1(i)**2)
73 guez 104 ENDDO
74    
75 guez 275 CALL cdrag(nsrf, speed(:knon), t1(:knon), q1(:knon), z1(:knon), &
76 guez 304 psol(:knon), ts1(:knon), qsurf, rugos(:knon), cdram, cdrah)
77 guez 104
78     ! Star variables
79    
80     DO i = 1, knon
81     tpot(i) = t1(i)* (psol(i)/pat1(i))**RKAPPA
82     ustar(i) = sqrt(cdram(i) * speed(i) * speed(i))
83     zdte(i) = tpot(i) - ts1(i)
84     zdq(i) = max(q1(i), 0.0) - max(qsurf(i), 0.0)
85    
86     zdte(i) = sign(max(abs(zdte(i)), 1.e-10), zdte(i))
87    
88     testar(i) = (cdrah(i) * zdte(i) * speed(i))/ustar(i)
89     qstar(i) = (cdrah(i) * zdq(i) * speed(i))/ustar(i)
90 guez 227 lmon(i) = (ustar(i) * ustar(i) * tpot(i)) / (RKAR * RG * testar(i))
91 guez 104 ENDDO
92    
93     ! First aproximation of variables at zref
94     zref = 2.0
95 guez 227 CALL screenp(knon, speed, tpot, q1, ts1, qsurf, rugos, lmon, ustar, &
96     testar, qstar, zref, delu, delte, delq)
97 guez 104
98     DO i = 1, knon
99     u_zref(i) = delu(i)
100     q_zref(i) = max(qsurf(i), 0.0) + delq(i)
101     te_zref(i) = ts1(i) + delte(i)
102     temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
103     ENDDO
104    
105     ! Iteration of the variables at the reference level zref :
106     ! corrector calculation ; see Hess & McAvaney, 1995
107    
108     DO n = 1, niter
109 guez 227 CALL screenc(klon, knon, nsrf, u_zref, temp, q_zref, zref, ts1, &
110     qsurf, rugos, psol, ustar, testar, qstar, pref, delu, delte, delq)
111 guez 104
112     DO i = 1, knon
113 guez 3 u_zref(i) = delu(i)
114 guez 104 q_zref(i) = delq(i) + max(qsurf(i), 0.0)
115 guez 3 te_zref(i) = delte(i) + ts1(i)
116 guez 104
117     ! return to normal temperature
118 guez 3 temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
119 guez 104 ENDDO
120     ENDDO
121    
122     ! verifier le critere de convergence : 0.25% pour te_zref et 5% pour qe_zref
123    
124     DO i = 1, knon
125 guez 227 t_2m(i) = temp(i)
126     q_2m(i) = q_zref(i)
127 guez 104 ENDDO
128    
129     ! First aproximation of variables at zref
130    
131 guez 227 zref = 10.
132     CALL screenp(knon, speed, tpot, q1, ts1, qsurf, rugos, lmon, ustar, &
133 guez 225 testar, qstar, zref, delu, delte, delq)
134 guez 104
135     DO i = 1, knon
136     u_zref(i) = delu(i)
137     q_zref(i) = max(qsurf(i), 0.0) + delq(i)
138     te_zref(i) = ts1(i) + delte(i)
139     temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-RKAPPA)
140     ENDDO
141    
142     ! Iteration of the variables at the reference level zref:
143     ! corrector ; see Hess & McAvaney, 1995
144    
145     DO n = 1, niter
146 guez 227 CALL screenc(klon, knon, nsrf, u_zref, temp, q_zref, zref, ts1, &
147     qsurf, rugos, psol, ustar, testar, qstar, pref, delu, delte, delq)
148 guez 104
149     DO i = 1, knon
150 guez 3 u_zref(i) = delu(i)
151 guez 104 q_zref(i) = delq(i) + max(qsurf(i), 0.0)
152 guez 3 te_zref(i) = delte(i) + ts1(i)
153     temp(i) = te_zref(i) * (psol(i)/pref(i))**(-RKAPPA)
154 guez 104 ENDDO
155     ENDDO
156    
157     DO i = 1, knon
158 guez 227 wind10m(i) = u_zref(i)
159     t_10m(i) = temp(i)
160     q_10m(i) = q_zref(i)
161 guez 104 ENDDO
162    
163     END subroutine stdlevvar
164    
165     end module stdlevvar_m

  ViewVC Help
Powered by ViewVC 1.1.21