[3] | 1 | SUBROUTINE orodrag( nlon,nlev |
---|
| 2 | i , kgwd, kdx, ktest |
---|
| 3 | r , ptsphy |
---|
| 4 | r , paphm1,papm1,pgeom1,pn2m1,ptm1,pum1,pvm1 |
---|
| 5 | r , pmea, pstd, psig, pgam, pthe, ppic, pval |
---|
| 6 | c outputs |
---|
| 7 | r , pulow,pvlow |
---|
| 8 | r , pvom,pvol,pte ) |
---|
| 9 | |
---|
[101] | 10 | use dimphy |
---|
[3] | 11 | IMPLICIT NONE |
---|
| 12 | |
---|
| 13 | #include "dimensions.h" |
---|
| 14 | #include "paramet.h" |
---|
| 15 | |
---|
| 16 | c |
---|
| 17 | c |
---|
| 18 | c**** *orodrag* - does the SSO drag parametrization. |
---|
| 19 | c |
---|
| 20 | c purpose. |
---|
| 21 | c -------- |
---|
| 22 | c |
---|
| 23 | c this routine computes the physical tendencies of the |
---|
| 24 | c prognostic variables u,v and t due to vertical transports by |
---|
| 25 | c subgridscale orographically excited gravity waves, and to |
---|
| 26 | c low level blocked flow drag. |
---|
| 27 | c |
---|
| 28 | c** interface. |
---|
| 29 | c ---------- |
---|
| 30 | c called from *drag_noro*. |
---|
| 31 | c |
---|
| 32 | c the routine takes its input from the long-term storage: |
---|
| 33 | c u,v,t and p at t-1. |
---|
| 34 | c |
---|
| 35 | c explicit arguments : |
---|
| 36 | c -------------------- |
---|
| 37 | c ==== inputs === |
---|
| 38 | c nlon----input-I-Total number of horizontal points that get into physics |
---|
| 39 | c nlev----input-I-Number of vertical levels |
---|
| 40 | c |
---|
| 41 | c kgwd- -input-I: Total nb of points where the orography schemes are active |
---|
| 42 | c ktest--input-I: Flags to indicate active points |
---|
| 43 | c kdx----input-I: Locate the physical location of an active point. |
---|
| 44 | c ptsphy--input-R-Time-step (s) |
---|
| 45 | c paphm1--input-R: pressure at model 1/2 layer |
---|
| 46 | c papm1---input-R: pressure at model layer |
---|
| 47 | c pgeom1--input-R: Altitude of layer above ground |
---|
| 48 | c pn2m1---input-R-Brunt-Vaisala freq.^2 at 1/2 layers |
---|
| 49 | c ptm1, pum1, pvm1--R-: t, u and v |
---|
| 50 | c pmea----input-R-Mean Orography (m) |
---|
| 51 | C pstd----input-R-SSO standard deviation (m) |
---|
| 52 | c psig----input-R-SSO slope |
---|
| 53 | c pgam----input-R-SSO Anisotropy |
---|
| 54 | c pthe----input-R-SSO Angle |
---|
| 55 | c ppic----input-R-SSO Peacks elevation (m) |
---|
| 56 | c pval----input-R-SSO Valleys elevation (m) |
---|
| 57 | |
---|
| 58 | integer nlon,nlev,kgwd |
---|
| 59 | real ptsphy |
---|
| 60 | |
---|
| 61 | c ==== outputs === |
---|
| 62 | c pulow, pvlow -output-R: Low-level wind |
---|
| 63 | c |
---|
| 64 | c pte -----output-R: T tendency |
---|
| 65 | c pvom-----output-R: U tendency |
---|
| 66 | c pvol-----output-R: V tendency |
---|
| 67 | c |
---|
| 68 | c |
---|
| 69 | c Implicit Arguments: |
---|
| 70 | c =================== |
---|
| 71 | c |
---|
| 72 | c klon-common-I: Number of points seen by the physics |
---|
| 73 | c klev-common-I: Number of vertical layers |
---|
| 74 | c |
---|
| 75 | c method. |
---|
| 76 | c ------- |
---|
| 77 | c |
---|
| 78 | c externals. |
---|
| 79 | c ---------- |
---|
| 80 | Coff integer ismin, ismax |
---|
| 81 | Coff external ismin, ismax |
---|
| 82 | c |
---|
| 83 | c reference. |
---|
| 84 | c ---------- |
---|
| 85 | c |
---|
| 86 | c author. |
---|
| 87 | c ------- |
---|
| 88 | c m.miller + b.ritter e.c.m.w.f. 15/06/86. |
---|
| 89 | c |
---|
| 90 | c f.lott + m. miller e.c.m.w.f. 22/11/94 |
---|
| 91 | c----------------------------------------------------------------------- |
---|
| 92 | c |
---|
| 93 | c |
---|
| 94 | #include "YOMCST.h" |
---|
| 95 | #include "YOEGWD.h" |
---|
| 96 | |
---|
| 97 | c----------------------------------------------------------------------- |
---|
| 98 | c |
---|
| 99 | c* 0.1 arguments |
---|
| 100 | c --------- |
---|
| 101 | c |
---|
| 102 | c |
---|
| 103 | real pte(nlon,nlev), |
---|
| 104 | * pvol(nlon,nlev), |
---|
| 105 | * pvom(nlon,nlev), |
---|
| 106 | * pulow(nlon), |
---|
| 107 | * pvlow(nlon) |
---|
| 108 | real pum1(nlon,nlev), |
---|
| 109 | * pvm1(nlon,nlev), |
---|
| 110 | * ptm1(nlon,nlev), |
---|
| 111 | * pmea(nlon),pstd(nlon),psig(nlon), |
---|
| 112 | * pgam(nlon),pthe(nlon),ppic(nlon),pval(nlon), |
---|
| 113 | * pgeom1(nlon,nlev),pn2m1(nlon,nlev), |
---|
| 114 | * papm1(nlon,nlev), |
---|
| 115 | * paphm1(nlon,nlev+1) |
---|
| 116 | c |
---|
| 117 | integer kdx(nlon),ktest(nlon) |
---|
| 118 | c----------------------------------------------------------------------- |
---|
| 119 | c |
---|
| 120 | c* 0.2 local arrays |
---|
| 121 | c ------------ |
---|
| 122 | integer isect(klon), |
---|
| 123 | * icrit(klon), |
---|
| 124 | * ikcrith(klon), |
---|
| 125 | * ikenvh(klon), |
---|
| 126 | * iknu(klon), |
---|
| 127 | * iknu2(klon), |
---|
| 128 | * ikcrit(klon), |
---|
| 129 | * ikhlim(klon) |
---|
| 130 | c |
---|
| 131 | real ztau(klon,klev+1), |
---|
| 132 | * zstab(klon,klev+1), |
---|
| 133 | * zvph(klon,klev+1), |
---|
| 134 | * zrho(klon,klev+1), |
---|
| 135 | * zri(klon,klev+1), |
---|
| 136 | * zpsi(klon,klev+1), |
---|
| 137 | * zzdep(klon,klev) |
---|
| 138 | real zdudt(klon), |
---|
| 139 | * zdvdt(klon), |
---|
| 140 | * zdtdt(klon), |
---|
| 141 | * zdedt(klon), |
---|
| 142 | * zvidis(klon), |
---|
| 143 | * ztfr(klon), |
---|
| 144 | * znu(klon), |
---|
| 145 | * zd1(klon), |
---|
| 146 | * zd2(klon), |
---|
| 147 | * zdmod(klon) |
---|
| 148 | |
---|
| 149 | |
---|
| 150 | c local quantities: |
---|
| 151 | |
---|
| 152 | integer jl,jk,ji |
---|
| 153 | real ztmst,zdelp,ztemp,zforc,ztend,rover |
---|
| 154 | real zb,zc,zconb,zabsv,zzd1,ratio,zbet,zust,zvst,zdis |
---|
| 155 | |
---|
| 156 | c |
---|
| 157 | c------------------------------------------------------------------ |
---|
| 158 | c |
---|
| 159 | c* 1. initialization |
---|
| 160 | c -------------- |
---|
| 161 | c |
---|
| 162 | c print *,' in orodrag' |
---|
| 163 | 100 continue |
---|
| 164 | c |
---|
| 165 | c ------------------------------------------------------------------ |
---|
| 166 | c |
---|
| 167 | c* 1.1 computational constants |
---|
| 168 | c ----------------------- |
---|
| 169 | c |
---|
| 170 | 110 continue |
---|
| 171 | c |
---|
| 172 | c ztmst=twodt |
---|
| 173 | c if(nstep.eq.nstart) ztmst=0.5*twodt |
---|
| 174 | ztmst=ptsphy |
---|
| 175 | c ------------------------------------------------------------------ |
---|
| 176 | c |
---|
| 177 | 120 continue |
---|
| 178 | c |
---|
| 179 | c ------------------------------------------------------------------ |
---|
| 180 | c |
---|
| 181 | c* 1.3 check whether row contains point for printing |
---|
| 182 | c --------------------------------------------- |
---|
| 183 | c |
---|
| 184 | 130 continue |
---|
| 185 | c |
---|
| 186 | c ------------------------------------------------------------------ |
---|
| 187 | c |
---|
| 188 | c* 2. precompute basic state variables. |
---|
| 189 | c* ---------- ----- ----- ---------- |
---|
| 190 | c* define low level wind, project winds in plane of |
---|
| 191 | c* low level wind, determine sector in which to take |
---|
| 192 | c* the variance and set indicator for critical levels. |
---|
| 193 | c |
---|
| 194 | |
---|
| 195 | 200 continue |
---|
| 196 | c |
---|
| 197 | do jk=1,klev |
---|
| 198 | zstab(:,jk) = pn2m1(:,jk) |
---|
| 199 | enddo |
---|
| 200 | c |
---|
| 201 | call orosetup |
---|
| 202 | * ( nlon, nlev , ktest |
---|
| 203 | * , ikcrit, ikcrith, icrit, isect, ikhlim, ikenvh,iknu,iknu2 |
---|
| 204 | * , paphm1, papm1 , pum1 , pvm1 , ptm1 , pgeom1, zstab, pstd |
---|
| 205 | * , zrho , zri , ztau , zvph , zpsi, zzdep |
---|
| 206 | * , pulow, pvlow |
---|
| 207 | * , pthe,pgam,pmea,ppic,pval,znu ,zd1, zd2, zdmod ) |
---|
| 208 | |
---|
| 209 | c |
---|
| 210 | c |
---|
| 211 | c |
---|
| 212 | c*********************************************************** |
---|
| 213 | c |
---|
| 214 | c |
---|
| 215 | c* 3. compute low level stresses using subcritical and |
---|
| 216 | c* supercritical forms.computes anisotropy coefficient |
---|
| 217 | c* as measure of orographic twodimensionality. |
---|
| 218 | c |
---|
| 219 | 300 continue |
---|
| 220 | c |
---|
| 221 | call gwstress |
---|
| 222 | * ( nlon , nlev |
---|
| 223 | * , ikcrit, isect, ikhlim, ktest, ikcrith, icrit, ikenvh, iknu |
---|
| 224 | * , zrho , zstab, zvph , pstd, psig, pmea, ppic, pval |
---|
| 225 | * , ztfr , ztau |
---|
| 226 | * , pgeom1,pgam,zd1,zd2,zdmod,znu) |
---|
| 227 | |
---|
| 228 | c |
---|
| 229 | c |
---|
| 230 | c* 4. compute stress profile including |
---|
| 231 | c trapped waves, wave breaking, |
---|
| 232 | c linear decay in stratosphere. |
---|
| 233 | c |
---|
| 234 | 400 continue |
---|
| 235 | c |
---|
| 236 | c |
---|
| 237 | |
---|
| 238 | call gwprofil |
---|
| 239 | * ( nlon , nlev |
---|
| 240 | * , kgwd , kdx , ktest |
---|
| 241 | * , ikcrit, ikcrith, icrit , ikenvh, iknu |
---|
| 242 | * ,iknu2 , paphm1, zrho , zstab , ztfr , zvph |
---|
| 243 | * , zri , ztau |
---|
| 244 | |
---|
| 245 | * , zdmod , znu , psig , pgam , pstd , ppic , pval) |
---|
| 246 | |
---|
| 247 | c |
---|
| 248 | c* 5. Compute tendencies from waves stress profile. |
---|
| 249 | c Compute low level blocked flow drag. |
---|
| 250 | c* -------------------------------------------- |
---|
| 251 | c |
---|
| 252 | 500 continue |
---|
| 253 | |
---|
| 254 | |
---|
| 255 | c |
---|
| 256 | c explicit solution at all levels for the gravity wave |
---|
| 257 | c implicit solution for the blocked levels |
---|
| 258 | |
---|
| 259 | do 510 jl=kidia,kfdia |
---|
| 260 | zvidis(jl)=0.0 |
---|
| 261 | zdudt(jl)=0.0 |
---|
| 262 | zdvdt(jl)=0.0 |
---|
| 263 | zdtdt(jl)=0.0 |
---|
| 264 | 510 continue |
---|
| 265 | c |
---|
| 266 | |
---|
| 267 | do 524 jk=1,klev |
---|
| 268 | c |
---|
| 269 | |
---|
| 270 | C WAVE STRESS |
---|
| 271 | C------------- |
---|
| 272 | c |
---|
| 273 | c |
---|
| 274 | do 523 ji=kidia,kfdia |
---|
| 275 | |
---|
| 276 | if(ktest(ji).eq.1) then |
---|
| 277 | |
---|
| 278 | zdelp=paphm1(ji,jk+1)-paphm1(ji,jk) |
---|
| 279 | ztemp=-rg*(ztau(ji,jk+1)-ztau(ji,jk))/(zvph(ji,klev+1)*zdelp) |
---|
| 280 | |
---|
| 281 | zdudt(ji)=(pulow(ji)*zd1(ji)-pvlow(ji)*zd2(ji))*ztemp/zdmod(ji) |
---|
| 282 | zdvdt(ji)=(pvlow(ji)*zd1(ji)+pulow(ji)*zd2(ji))*ztemp/zdmod(ji) |
---|
| 283 | c |
---|
| 284 | c Control Overshoots |
---|
| 285 | c |
---|
| 286 | |
---|
| 287 | if(jk.ge.ntop)then |
---|
| 288 | rover=0.10 |
---|
| 289 | if(abs(zdudt(ji)).gt.rover*abs(pum1(ji,jk))/ztmst) |
---|
| 290 | C zdudt(ji)=rover*abs(pum1(ji,jk))/ztmst* |
---|
| 291 | C zdudt(ji)/(abs(zdudt(ji))+1.E-10) |
---|
| 292 | if(abs(zdvdt(ji)).gt.rover*abs(pvm1(ji,jk))/ztmst) |
---|
| 293 | C zdvdt(ji)=rover*abs(pvm1(ji,jk))/ztmst* |
---|
| 294 | C zdvdt(ji)/(abs(zdvdt(ji))+1.E-10) |
---|
| 295 | endif |
---|
| 296 | |
---|
| 297 | rover=0.25 |
---|
| 298 | zforc=sqrt(zdudt(ji)**2+zdvdt(ji)**2) |
---|
| 299 | ztend=sqrt(pum1(ji,jk)**2+pvm1(ji,jk)**2)/ztmst |
---|
| 300 | |
---|
| 301 | if(zforc.ge.rover*ztend)then |
---|
| 302 | zdudt(ji)=rover*ztend/zforc*zdudt(ji) |
---|
| 303 | zdvdt(ji)=rover*ztend/zforc*zdvdt(ji) |
---|
| 304 | endif |
---|
| 305 | c |
---|
| 306 | c BLOCKED FLOW DRAG: |
---|
| 307 | C ----------------- |
---|
| 308 | c |
---|
| 309 | if(jk.gt.ikenvh(ji)) then |
---|
| 310 | zb=1.0-0.18*pgam(ji)-0.04*pgam(ji)**2 |
---|
| 311 | zc=0.48*pgam(ji)+0.3*pgam(ji)**2 |
---|
| 312 | zconb=2.*ztmst*gkwake*psig(ji)/(4.*pstd(ji)) |
---|
| 313 | zabsv=sqrt(pum1(ji,jk)**2+pvm1(ji,jk)**2)/2. |
---|
| 314 | zzd1=zb*cos(zpsi(ji,jk))**2+zc*sin(zpsi(ji,jk))**2 |
---|
| 315 | ratio=(cos(zpsi(ji,jk))**2+pgam(ji)*sin(zpsi(ji,jk))**2)/ |
---|
| 316 | * (pgam(ji)*cos(zpsi(ji,jk))**2+sin(zpsi(ji,jk))**2) |
---|
| 317 | zbet=max(0.,2.-1./ratio)*zconb*zzdep(ji,jk)*zzd1*zabsv |
---|
| 318 | c |
---|
| 319 | c OPPOSED TO THE WIND |
---|
| 320 | c |
---|
| 321 | zdudt(ji)=-pum1(ji,jk)/ztmst |
---|
| 322 | zdvdt(ji)=-pvm1(ji,jk)/ztmst |
---|
| 323 | c |
---|
| 324 | c PERPENDICULAR TO THE SSO MAIN AXIS: |
---|
| 325 | C |
---|
| 326 | cmod zdudt(ji)=-(pum1(ji,jk)*cos(pthe(ji)*rpi/180.) |
---|
| 327 | cmod * +pvm1(ji,jk)*sin(pthe(ji)*rpi/180.)) |
---|
| 328 | cmod * *cos(pthe(ji)*rpi/180.)/ztmst |
---|
| 329 | cmod zdvdt(ji)=-(pum1(ji,jk)*cos(pthe(ji)*rpi/180.) |
---|
| 330 | cmod * +pvm1(ji,jk)*sin(pthe(ji)*rpi/180.)) |
---|
| 331 | cmod * *sin(pthe(ji)*rpi/180.)/ztmst |
---|
| 332 | C |
---|
| 333 | zdudt(ji)=zdudt(ji)*(zbet/(1.+zbet)) |
---|
| 334 | zdvdt(ji)=zdvdt(ji)*(zbet/(1.+zbet)) |
---|
| 335 | end if |
---|
| 336 | pvom(ji,jk)=zdudt(ji) |
---|
| 337 | pvol(ji,jk)=zdvdt(ji) |
---|
| 338 | zust=pum1(ji,jk)+ztmst*zdudt(ji) |
---|
| 339 | zvst=pvm1(ji,jk)+ztmst*zdvdt(ji) |
---|
| 340 | zdis=0.5*(pum1(ji,jk)**2+pvm1(ji,jk)**2-zust**2-zvst**2) |
---|
| 341 | zdedt(ji)=zdis/ztmst |
---|
| 342 | zvidis(ji)=zvidis(ji)+zdis*zdelp |
---|
| 343 | c VENUS ATTENTION: CP VARIABLE |
---|
| 344 | zdtdt(ji)=zdedt(ji)/rcpd |
---|
| 345 | c |
---|
| 346 | c NO TENDENCIES ON TEMPERATURE ..... |
---|
| 347 | c |
---|
| 348 | c Instead of, pte(ji,jk)=zdtdt(ji), due to mechanical dissipation |
---|
| 349 | c |
---|
| 350 | pte(ji,jk)=0.0 |
---|
| 351 | |
---|
| 352 | endif |
---|
| 353 | |
---|
| 354 | 523 continue |
---|
| 355 | 524 continue |
---|
| 356 | c |
---|
| 357 | c |
---|
| 358 | 501 continue |
---|
| 359 | |
---|
| 360 | return |
---|
| 361 | end |
---|
| 362 | |
---|