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

Contents of /trunk/phylmd/Interface_surf/clvent.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 227 - (show 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 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 ! Author: Z. X. Li (LMD/CNRS)
11 ! Date: 1993/08/18
12 ! Objet : diffusion verticale de la vitesse
13
14 USE dimphy, ONLY: klev, klon
15 USE suphec_m, ONLY: rd, rg
16
17 INTEGER knon
18 REAL, intent(in):: dtime ! intervalle de temps (en s)
19
20 REAL, intent(in):: u1lay(:), v1lay(:) ! (knon)
21 ! vent de la premiere couche (m/s)
22
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 REAL, intent(in):: t(klon, klev), ven(klon, klev)
29 ! t--------input-R- temperature (K)
30 ! ven------input-R- vitesse horizontale (m/s)
31 REAL paprs(klon, klev+1), pplay(klon, klev), delp(klon, klev)
32 ! 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 REAL d_ven(klon, klev)
36 ! d_ven----output-R- le changement de "ven"
37
38 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 ! Local:
43 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 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 ENDDO
66
67 DO k = 2, klev
68 DO i = 1, knon
69 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 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 flux_v(i) = zx_coef(i, 1)/(RG*dtime) &
104 *(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