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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 202 - (show annotations)
Wed Jun 8 12:23:41 2016 UTC (7 years, 10 months ago) by guez
File size: 3766 byte(s)
Promoted lmt_pas from local variable of physiq to variable of module
conf_gcm_m.

Removed variable run_off of module interface_surf. Was not
used. Called run_off_ter in LMDZ, but not used nor printed there
either.

Simplified logic in interfoce_lim. The way it was convoluted with
interfsurf_hq and clmain was quite a mess. Extracted reading of SST
into a separate procedure: read_sst. We do not need SST and pctsrf_new
at the same time: SST is not needed for sea-ice surface. I did not
like this programming: going through the procedure repeatedly for
different purposes and testing inside whether there was something to
do or it was already done. Reading is now only controlled by itap and
lmt_pas, instead of debut, jour, jour_lu and deja_lu. Now we do not
copy from pct_tmp to pctsrf_new every time step.

Simplified processing of pctsrf in clmain and below. It was quite
troubling: pctsrf_new was intent out in interfoce_lim but only defined
for ocean and sea-ice. Also the idea of having arrays for all
surfaces, pcsrf and pctsrf_new, in interfsurf_hq, which is called for
a particular surface, was troubling. pctsrf_new for all surfaces was
intent out in intefsurf_hq, but not defined for all surfaces at each
call. Removed argument pctsrf_new of clmain: was a duplicate of pctsrf
on output, and not used in physiq. Replaced pctsrf_new in clmain by
pctsrf_new_oce and pctsrf_new_sic, which were the only ones modified.

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 u1lay(klon), v1lay(klon)
21 ! u1lay----input-R- vent u de la premiere couche (m/s)
22 ! v1lay----input-R- vent v de la premiere couche (m/s)
23
24 REAL, intent(in):: coef(:, :) ! (knon, klev)
25 ! Coefficient d'echange (m**2/s) multiplié par le cisaillement du
26 ! vent (dV/dz). La première valeur indique la valeur de Cdrag (sans
27 ! unité).
28
29 REAL t(klon, klev), ven(klon, klev)
30 ! t--------input-R- temperature (K)
31 ! ven------input-R- vitesse horizontale (m/s)
32 REAL paprs(klon, klev+1), pplay(klon, klev), delp(klon, klev)
33 ! paprs----input-R- pression a inter-couche (Pa)
34 ! pplay----input-R- pression au milieu de couche (Pa)
35 ! delp-----input-R- epaisseur de couche (Pa)
36 REAL d_ven(klon, klev)
37 ! d_ven----output-R- le changement de "ven"
38 REAL flux_v(klon, klev)
39 ! flux_v---output-R- (diagnostic) flux du vent: (kg m/s)/(m**2 s)
40
41 ! Local:
42 INTEGER i, k
43 REAL zx_cv(klon, 2:klev)
44 REAL zx_dv(klon, 2:klev)
45 REAL zx_buf(klon)
46 REAL zx_coef(klon, klev)
47 REAL local_ven(klon, klev)
48 REAL zx_alf1(klon), zx_alf2(klon)
49
50 !------------------------------------------------------------------
51
52 DO k = 1, klev
53 DO i = 1, knon
54 local_ven(i, k) = ven(i, k)
55 ENDDO
56 ENDDO
57
58 DO i = 1, knon
59 zx_alf1(i) = 1.0
60 zx_alf2(i) = 1.0 - zx_alf1(i)
61 zx_coef(i, 1) = coef(i, 1) * (1. + SQRT(u1lay(i)**2 + v1lay(i)**2)) &
62 * pplay(i, 1) / (RD * t(i, 1))
63 zx_coef(i, 1) = zx_coef(i, 1) * dtime * RG
64 ENDDO
65
66 DO k = 2, klev
67 DO i = 1, knon
68 zx_coef(i, k) = coef(i, k) * RG / (pplay(i, k-1) - pplay(i, k)) &
69 * (paprs(i, k) * 2 / (t(i, k) + t(i, k - 1)) / RD)**2
70 zx_coef(i, k) = zx_coef(i, k) * dtime * RG
71 ENDDO
72 ENDDO
73
74 DO i = 1, knon
75 zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i)+zx_coef(i, 2)
76 zx_cv(i, 2) = local_ven(i, 1)*delp(i, 1) / zx_buf(i)
77 zx_dv(i, 2) = (zx_coef(i, 2)-zx_alf2(i)*zx_coef(i, 1)) &
78 /zx_buf(i)
79 ENDDO
80 DO k = 3, klev
81 DO i = 1, knon
82 zx_buf(i) = delp(i, k-1) + zx_coef(i, k) &
83 + zx_coef(i, k-1)*(1.-zx_dv(i, k-1))
84 zx_cv(i, k) = (local_ven(i, k-1)*delp(i, k-1) &
85 +zx_coef(i, k-1)*zx_cv(i, k-1) )/zx_buf(i)
86 zx_dv(i, k) = zx_coef(i, k)/zx_buf(i)
87 ENDDO
88 ENDDO
89 DO i = 1, knon
90 local_ven(i, klev) = ( local_ven(i, klev)*delp(i, klev) &
91 +zx_coef(i, klev)*zx_cv(i, klev) ) &
92 / ( delp(i, klev) + zx_coef(i, klev) &
93 -zx_coef(i, klev)*zx_dv(i, klev) )
94 ENDDO
95 DO k = klev-1, 1, -1
96 DO i = 1, knon
97 local_ven(i, k) = zx_cv(i, k+1) + zx_dv(i, k+1)*local_ven(i, k+1)
98 ENDDO
99 ENDDO
100
101 ! flux_v est le flux de moment angulaire (positif vers bas) dont
102 ! l'unite est: (kg m/s)/(m**2 s)
103 DO i = 1, knon
104 flux_v(i, 1) = zx_coef(i, 1)/(RG*dtime) &
105 *(local_ven(i, 1)*zx_alf1(i) &
106 +local_ven(i, 2)*zx_alf2(i))
107 ENDDO
108 DO k = 2, klev
109 DO i = 1, knon
110 flux_v(i, k) = zx_coef(i, k)/(RG*dtime) &
111 * (local_ven(i, k)-local_ven(i, k-1))
112 ENDDO
113 ENDDO
114
115 DO k = 1, klev
116 DO i = 1, knon
117 d_ven(i, k) = local_ven(i, k) - ven(i, k)
118 ENDDO
119 ENDDO
120
121 END SUBROUTINE clvent
122
123 end module clvent_m

  ViewVC Help
Powered by ViewVC 1.1.21