/[lmdze]/trunk/phylmd/clvent.f
ViewVC logotype

Annotation of /trunk/phylmd/clvent.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 227 - (hide annotations)
Thu Nov 2 15:47:03 2017 UTC (6 years, 6 months ago) by guez
Original Path: trunk/Sources/phylmd/clvent.f
File size: 3518 byte(s)
Rename phisinit to phis in restart.nc: clearer, same name as Fortran variable.

In aaam_bud, use rlat and rlon from phyetat0_m instead of having these
module variables associated to actual arguments in physiq.

In clmain, too many wind variables make the procedure hard to
understand. Use yu(:knon, 1) and yv(:knon, 1) instead of u1lay(:knon)
and v1lay(:knon). Note that when yu(:knon, 1) and yv(:knon, 1) are
used as actual arguments, they are probably copied to new arrays since
the elements are not contiguous. Rename yu10m to wind10m because this
is the norm of wind vector, not its zonal component. Rename yustar to
ustar. Rename uzon and vmer to u1 and v1 since these are wind
components at first layer and u1 and v1 are the names of corresponding
dummy arguments in stdlevvar.

In clmain, rename yzlev to zlev.

In clmain, screenc, stdlevvar and coefcdrag, remove the code
corresponding to zxli true (not used in LMDZ either).

Subroutine ustarhb becomes a function. Simplifications using the fact
that zx_alf2 = 0 and zx_alf1 = 1 (discarding the possibility to change
this).

In procedure vdif_kcay, remove unused dummy argument plev. Remove
useless computations of sss and sssq.

In clouds_gno, exp(100.) would overflow in single precision. Set
maximum to exp(80.) instead.

In physiq, use u(:, 1) and v(:, 1) as arguments to phytrac instead of
creating ad hoc variables yu1 and yv1.

In stdlevvar, rename dummy argument u_10m to wind10m, following the
corresponding modification in clmain. Simplifications using the fact
that ok_pred = 0 and ok_corr = 1 (discarding the possibility to change
this).

1 guez 62 module clvent_m
2    
3     IMPLICIT none
4    
5     contains
6    
7     SUBROUTINE clvent(knon, dtime, u1lay, v1lay, coef, t, ven, paprs, pplay, &
8     delp, d_ven, flux_v)
9    
10 guez 70 ! Author: Z. X. Li (LMD/CNRS)
11     ! Date: 1993/08/18
12 guez 62 ! Objet : diffusion verticale de la vitesse
13    
14     USE dimphy, ONLY: klev, klon
15     USE suphec_m, ONLY: rd, rg
16    
17 guez 70 INTEGER knon
18 guez 202 REAL, intent(in):: dtime ! intervalle de temps (en s)
19 guez 70
20 guez 225 REAL, intent(in):: u1lay(:), v1lay(:) ! (knon)
21     ! vent de la premiere couche (m/s)
22 guez 70
23     REAL, intent(in):: coef(:, :) ! (knon, klev)
24     ! Coefficient d'echange (m**2/s) multiplié par le cisaillement du
25     ! vent (dV/dz). La première valeur indique la valeur de Cdrag (sans
26     ! unité).
27    
28 guez 227 REAL, intent(in):: t(klon, klev), ven(klon, klev)
29 guez 62 ! t--------input-R- temperature (K)
30     ! ven------input-R- vitesse horizontale (m/s)
31 guez 70 REAL paprs(klon, klev+1), pplay(klon, klev), delp(klon, klev)
32 guez 62 ! paprs----input-R- pression a inter-couche (Pa)
33     ! pplay----input-R- pression au milieu de couche (Pa)
34     ! delp-----input-R- epaisseur de couche (Pa)
35 guez 70 REAL d_ven(klon, klev)
36 guez 62 ! d_ven----output-R- le changement de "ven"
37    
38 guez 206 REAL, intent(out):: flux_v(:) ! (knon)
39     ! (diagnostic) flux du vent à la surface, en (kg m/s)/(m**2 s)
40     ! flux_v est le flux de moment angulaire (positif vers bas)
41    
42 guez 70 ! Local:
43 guez 62 INTEGER i, k
44     REAL zx_cv(klon, 2:klev)
45     REAL zx_dv(klon, 2:klev)
46     REAL zx_buf(klon)
47     REAL zx_coef(klon, klev)
48     REAL local_ven(klon, klev)
49     REAL zx_alf1(klon), zx_alf2(klon)
50    
51     !------------------------------------------------------------------
52    
53     DO k = 1, klev
54     DO i = 1, knon
55     local_ven(i, k) = ven(i, k)
56     ENDDO
57     ENDDO
58    
59     DO i = 1, knon
60     zx_alf1(i) = 1.0
61     zx_alf2(i) = 1.0 - zx_alf1(i)
62 guez 70 zx_coef(i, 1) = coef(i, 1) * (1. + SQRT(u1lay(i)**2 + v1lay(i)**2)) &
63     * pplay(i, 1) / (RD * t(i, 1))
64     zx_coef(i, 1) = zx_coef(i, 1) * dtime * RG
65 guez 62 ENDDO
66    
67     DO k = 2, klev
68     DO i = 1, knon
69 guez 70 zx_coef(i, k) = coef(i, k) * RG / (pplay(i, k-1) - pplay(i, k)) &
70     * (paprs(i, k) * 2 / (t(i, k) + t(i, k - 1)) / RD)**2
71     zx_coef(i, k) = zx_coef(i, k) * dtime * RG
72 guez 62 ENDDO
73     ENDDO
74    
75     DO i = 1, knon
76     zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i)+zx_coef(i, 2)
77     zx_cv(i, 2) = local_ven(i, 1)*delp(i, 1) / zx_buf(i)
78     zx_dv(i, 2) = (zx_coef(i, 2)-zx_alf2(i)*zx_coef(i, 1)) &
79     /zx_buf(i)
80     ENDDO
81     DO k = 3, klev
82     DO i = 1, knon
83     zx_buf(i) = delp(i, k-1) + zx_coef(i, k) &
84     + zx_coef(i, k-1)*(1.-zx_dv(i, k-1))
85     zx_cv(i, k) = (local_ven(i, k-1)*delp(i, k-1) &
86     +zx_coef(i, k-1)*zx_cv(i, k-1) )/zx_buf(i)
87     zx_dv(i, k) = zx_coef(i, k)/zx_buf(i)
88     ENDDO
89     ENDDO
90     DO i = 1, knon
91     local_ven(i, klev) = ( local_ven(i, klev)*delp(i, klev) &
92     +zx_coef(i, klev)*zx_cv(i, klev) ) &
93     / ( delp(i, klev) + zx_coef(i, klev) &
94     -zx_coef(i, klev)*zx_dv(i, klev) )
95     ENDDO
96     DO k = klev-1, 1, -1
97     DO i = 1, knon
98     local_ven(i, k) = zx_cv(i, k+1) + zx_dv(i, k+1)*local_ven(i, k+1)
99     ENDDO
100     ENDDO
101    
102     DO i = 1, knon
103 guez 206 flux_v(i) = zx_coef(i, 1)/(RG*dtime) &
104 guez 62 *(local_ven(i, 1)*zx_alf1(i) &
105     +local_ven(i, 2)*zx_alf2(i))
106     ENDDO
107    
108     DO k = 1, klev
109     DO i = 1, knon
110     d_ven(i, k) = local_ven(i, k) - ven(i, k)
111     ENDDO
112     ENDDO
113    
114     END SUBROUTINE clvent
115    
116     end module clvent_m

  ViewVC Help
Powered by ViewVC 1.1.21