/[lmdze]/trunk/Sources/phylmd/Orography/orodrag.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/Orography/orodrag.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 38 - (hide annotations)
Thu Jan 6 17:52:19 2011 UTC (13 years, 5 months ago) by guez
Original Path: trunk/libf/phylmd/Orography/orodrag.f90
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 guez 23 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 guez 38 USE suphec_m
8 guez 23 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