/[lmdze]/trunk/libf/phylmd/Orography/orodrag.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/Orography/orodrag.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 38 - (show annotations)
Thu Jan 6 17:52:19 2011 UTC (13 years, 4 months ago) by guez
File size: 7631 byte(s)
Extracted ASCII art from "inigeom" into a separate text file in the
documentation.

"test_disvert" now creates a separate file for layer thicknesses.

Moved variables from module "yomcst" to module "suphec_m" because this
is where those variables are defined. Kept in "yomcst" only parameters
of Earth orbit. Gave the attribute "parameter" to some variables of
module "suphec_m".

Variables of module "yoethf" were defined in procedure "suphec". Moved
these definitions to a new procedure "yoethf" in module "yoethf_m".

1 SUBROUTINE orodrag(nlon,nlev,kgwd,kdx,ktest,ptsphy,paphm1,papm1,pgeom1, &
2 ptm1,pum1,pvm1,pmea,pstd,psig,pgamma,ptheta,ppic,pval &
3 ,pulow,pvlow,pvom,pvol,pte)
4
5 USE dimens_m
6 USE dimphy
7 USE suphec_m
8 USE yoegwd
9 IMPLICIT NONE
10
11
12
13 !**** *gwdrag* - does the gravity wave parametrization.
14
15 ! purpose.
16 ! --------
17
18 ! this routine computes the physical tendencies of the
19 ! prognostic variables u,v and t due to vertical transports by
20 ! subgridscale orographically excited gravity waves
21
22 !** interface.
23 ! ----------
24 ! called from *callpar*.
25
26 ! the routine takes its input from the long-term storage:
27 ! u,v,t and p at t-1.
28
29 ! explicit arguments :
30 ! --------------------
31 ! ==== inputs ===
32 ! ==== outputs ===
33
34 ! implicit arguments : none
35 ! --------------------
36
37 ! implicit logical (l)
38
39 ! method.
40 ! -------
41
42 ! externals.
43 ! ----------
44 INTEGER ismin, ismax
45 EXTERNAL ismin, ismax
46
47 ! reference.
48 ! ----------
49
50 ! author.
51 ! -------
52 ! m.miller + b.ritter e.c.m.w.f. 15/06/86.
53
54 ! f.lott + m. miller e.c.m.w.f. 22/11/94
55 !-----------------------------------------------------------------------
56
57
58 !-----------------------------------------------------------------------
59
60 !* 0.1 arguments
61 ! ---------
62
63
64 INTEGER nlon, nlev, klevm1
65 INTEGER kgwd, jl, ilevp1, jk, ji
66 REAL zdelp, ztemp, zforc, ztend
67 REAL rover, zb, zc, zconb, zabsv
68 REAL zzd1, ratio, zbet, zust, zvst, zdis
69 REAL pte(nlon,nlev), pvol(nlon,nlev), pvom(nlon,nlev), pulow(klon), &
70 pvlow(klon)
71 REAL pum1(nlon,nlev), pvm1(nlon,nlev), ptm1(nlon,nlev), pmea(nlon)
72 REAL, INTENT (IN) :: pstd(nlon)
73 REAL, INTENT (IN) :: psig(nlon)
74 REAL pgamma(nlon), ptheta(nlon), ppic(nlon), pval(nlon), &
75 pgeom1(nlon,nlev), papm1(nlon,nlev), paphm1(nlon,nlev+1)
76
77 INTEGER kdx(nlon), ktest(nlon)
78 !-----------------------------------------------------------------------
79
80 !* 0.2 local arrays
81 ! ------------
82 INTEGER isect(klon), icrit(klon), ikcrith(klon), ikenvh(klon), &
83 iknu(klon), iknu2(klon), ikcrit(klon), ikhlim(klon)
84
85 REAL ztau(klon,klev+1), ztauf(klon,klev+1), zstab(klon,klev+1), &
86 zvph(klon,klev+1), zrho(klon,klev+1), zri(klon,klev+1), &
87 zpsi(klon,klev+1), zzdep(klon,klev)
88 REAL zdudt(klon), zdvdt(klon), zdtdt(klon), zdedt(klon), zvidis(klon), &
89 znu(klon), zd1(klon), zd2(klon), zdmod(klon)
90 REAL ztmst, zrtmst
91 REAL, INTENT (IN) :: ptsphy
92
93 !------------------------------------------------------------------
94
95 !* 1. initialization
96 ! --------------
97
98 100 CONTINUE
99
100 ! ------------------------------------------------------------------
101
102 !* 1.1 computational constants
103 ! -----------------------
104
105 110 CONTINUE
106
107 ! ztmst=twodt
108 ! if(nstep.eq.nstart) ztmst=0.5*twodt
109 klevm1 = klev - 1
110 ztmst = ptsphy
111 zrtmst = 1./ztmst
112 ! ------------------------------------------------------------------
113
114 120 CONTINUE
115
116 ! ------------------------------------------------------------------
117
118 !* 1.3 check whether row contains point for printing
119 ! ---------------------------------------------
120
121 130 CONTINUE
122
123 ! ------------------------------------------------------------------
124
125 !* 2. precompute basic state variables.
126 !* ---------- ----- ----- ----------
127 !* define low level wind, project winds in plane of
128 !* low level wind, determine sector in which to take
129 !* the variance and set indicator for critical levels.
130
131 200 CONTINUE
132
133
134
135 CALL orosetup(nlon,ktest,ikcrit,ikcrith,icrit,ikenvh,iknu,iknu2,paphm1, &
136 papm1,pum1,pvm1,ptm1,pgeom1,pstd,zrho,zri,zstab,ztau,zvph,zpsi,zzdep, &
137 pulow,pvlow,ptheta,pgamma,pmea,ppic,pval,znu,zd1,zd2,zdmod)
138
139
140
141 !***********************************************************
142
143
144 !* 3. compute low level stresses using subcritical and
145 !* supercritical forms.computes anisotropy coefficient
146 !* as measure of orographic twodimensionality.
147
148 300 CONTINUE
149
150 CALL gwstress(nlon,nlev,ktest,icrit,ikenvh,iknu,zrho,zstab,zvph,pstd, &
151 psig,pmea,ppic,ztau,pgeom1,zdmod)
152
153
154 !* 4. compute stress profile.
155 !* ------- ------ --------
156
157 400 CONTINUE
158
159
160 CALL gwprofil(nlon,nlev,kgwd,kdx,ktest,ikcrith,icrit,paphm1,zrho,zstab, &
161 zvph,zri,ztau,zdmod,psig,pstd)
162
163
164 !* 5. compute tendencies.
165 !* -------------------
166
167 500 CONTINUE
168
169 ! explicit solution at all levels for the gravity wave
170 ! implicit solution for the blocked levels
171
172 DO 510 jl = 1, klon
173 zvidis(jl) = 0.0
174 zdudt(jl) = 0.0
175 zdvdt(jl) = 0.0
176 zdtdt(jl) = 0.0
177 510 CONTINUE
178
179 ilevp1 = klev + 1
180
181
182 DO 524 jk = 1, klev
183
184
185 ! do 523 jl=1,kgwd
186 ! ji=kdx(jl)
187 ! Modif vectorisation 02/04/2004
188 DO 523 ji = 1, klon
189 IF (ktest(ji)==1) THEN
190
191 zdelp = paphm1(ji,jk+1) - paphm1(ji,jk)
192 ztemp = -rg*(ztau(ji,jk+1)-ztau(ji,jk))/(zvph(ji,ilevp1)*zdelp)
193 zdudt(ji) = (pulow(ji)*zd1(ji)-pvlow(ji)*zd2(ji))*ztemp/zdmod(ji)
194 zdvdt(ji) = (pvlow(ji)*zd1(ji)+pulow(ji)*zd2(ji))*ztemp/zdmod(ji)
195
196 ! controle des overshoots:
197
198 zforc = sqrt(zdudt(ji)**2+zdvdt(ji)**2) + 1.E-12
199 ztend = sqrt(pum1(ji,jk)**2+pvm1(ji,jk)**2)/ztmst + 1.E-12
200 rover = 0.25
201 IF (zforc>=rover*ztend) THEN
202 zdudt(ji) = rover*ztend/zforc*zdudt(ji)
203 zdvdt(ji) = rover*ztend/zforc*zdvdt(ji)
204 END IF
205
206 ! fin du controle des overshoots
207
208 IF (jk>=ikenvh(ji)) THEN
209 zb = 1.0 - 0.18*pgamma(ji) - 0.04*pgamma(ji)**2
210 zc = 0.48*pgamma(ji) + 0.3*pgamma(ji)**2
211 zconb = 2.*ztmst*gkwake*psig(ji)/(4.*pstd(ji))
212 zabsv = sqrt(pum1(ji,jk)**2+pvm1(ji,jk)**2)/2.
213 zzd1 = zb*cos(zpsi(ji,jk))**2 + zc*sin(zpsi(ji,jk))**2
214 ratio = (cos(zpsi(ji,jk))**2+pgamma(ji)*sin(zpsi(ji, &
215 jk))**2)/(pgamma(ji)*cos(zpsi(ji,jk))**2+sin(zpsi(ji,jk))**2)
216 zbet = max(0.,2.-1./ratio)*zconb*zzdep(ji,jk)*zzd1*zabsv
217
218 ! simplement oppose au vent
219
220 zdudt(ji) = -pum1(ji,jk)/ztmst
221 zdvdt(ji) = -pvm1(ji,jk)/ztmst
222
223 ! projection dans la direction de l'axe principal de l'orographie
224 !mod zdudt(ji)=-(pum1(ji,jk)*cos(ptheta(ji)*rpi/180.)
225 !mod * +pvm1(ji,jk)*sin(ptheta(ji)*rpi/180.))
226 !mod * *cos(ptheta(ji)*rpi/180.)/ztmst
227 !mod zdvdt(ji)=-(pum1(ji,jk)*cos(ptheta(ji)*rpi/180.)
228 !mod * +pvm1(ji,jk)*sin(ptheta(ji)*rpi/180.))
229 !mod * *sin(ptheta(ji)*rpi/180.)/ztmst
230 zdudt(ji) = zdudt(ji)*(zbet/(1.+zbet))
231 zdvdt(ji) = zdvdt(ji)*(zbet/(1.+zbet))
232 END IF
233 pvom(ji,jk) = zdudt(ji)
234 pvol(ji,jk) = zdvdt(ji)
235 zust = pum1(ji,jk) + ztmst*zdudt(ji)
236 zvst = pvm1(ji,jk) + ztmst*zdvdt(ji)
237 zdis = 0.5*(pum1(ji,jk)**2+pvm1(ji,jk)**2-zust**2-zvst**2)
238 zdedt(ji) = zdis/ztmst
239 zvidis(ji) = zvidis(ji) + zdis*zdelp
240 zdtdt(ji) = zdedt(ji)/rcpd
241 ! pte(ji,jk)=zdtdt(ji)
242
243 ! ENCORE UN TRUC POUR EVITER LES EXPLOSIONS
244
245 pte(ji,jk) = 0.0
246
247 END IF
248 523 CONTINUE
249
250 524 CONTINUE
251
252
253 RETURN
254 END

  ViewVC Help
Powered by ViewVC 1.1.21