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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 202 - (hide 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 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     REAL u1lay(klon), v1lay(klon)
21 guez 62 ! u1lay----input-R- vent u de la premiere couche (m/s)
22     ! v1lay----input-R- vent v de la premiere couche (m/s)
23 guez 70
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 guez 62 ! t--------input-R- temperature (K)
31     ! ven------input-R- vitesse horizontale (m/s)
32 guez 70 REAL paprs(klon, klev+1), pplay(klon, klev), delp(klon, klev)
33 guez 62 ! 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 guez 70 REAL d_ven(klon, klev)
37 guez 62 ! d_ven----output-R- le changement de "ven"
38 guez 70 REAL flux_v(klon, klev)
39 guez 62 ! flux_v---output-R- (diagnostic) flux du vent: (kg m/s)/(m**2 s)
40    
41 guez 70 ! Local:
42 guez 62 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 guez 70 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 guez 62 ENDDO
65    
66     DO k = 2, klev
67     DO i = 1, knon
68 guez 70 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 guez 62 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