Changeset 1992 for LMDZ5/trunk/libf/phylmd/cv_routines.F90
- Timestamp:
- Mar 5, 2014, 2:19:12 PM (10 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/cv_routines.F90
r1988 r1992 1 ! 1 2 2 ! $Id$ 3 ! 4 SUBROUTINE cv_param(nd) 5 implicit none 6 7 c------------------------------------------------------------ 8 c Set parameters for convectL 9 c (includes microphysical parameters and parameters that 10 c control the rate of approach to quasi-equilibrium) 11 c------------------------------------------------------------ 12 13 C *** ELCRIT IS THE AUTOCONVERSION THERSHOLD WATER CONTENT (gm/gm) *** 14 C *** TLCRIT IS CRITICAL TEMPERATURE BELOW WHICH THE AUTO- *** 15 C *** CONVERSION THRESHOLD IS ASSUMED TO BE ZERO *** 16 C *** (THE AUTOCONVERSION THRESHOLD VARIES LINEARLY *** 17 C *** BETWEEN 0 C AND TLCRIT) *** 18 C *** ENTP IS THE COEFFICIENT OF MIXING IN THE ENTRAINMENT *** 19 C *** FORMULATION *** 20 C *** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT *** 21 C *** SIGS IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE *** 22 C *** OF CLOUD *** 23 C *** OMTRAIN IS THE ASSUMED FALL SPEED (P/s) OF RAIN *** 24 C *** OMTSNOW IS THE ASSUMED FALL SPEED (P/s) OF SNOW *** 25 C *** COEFFR IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION *** 26 C *** OF RAIN *** 27 C *** COEFFS IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION *** 28 C *** OF SNOW *** 29 C *** CU IS THE COEFFICIENT GOVERNING CONVECTIVE MOMENTUM *** 30 C *** TRANSPORT *** 31 C *** DTMAX IS THE MAXIMUM NEGATIVE TEMPERATURE PERTURBATION *** 32 C *** A LIFTED PARCEL IS ALLOWED TO HAVE BELOW ITS LFC *** 33 C *** ALPHA AND DAMP ARE PARAMETERS THAT CONTROL THE RATE OF *** 34 C *** APPROACH TO QUASI-EQUILIBRIUM *** 35 C *** (THEIR STANDARD VALUES ARE 0.20 AND 0.1, RESPECTIVELY) *** 36 C *** (DAMP MUST BE LESS THAN 1) *** 37 38 include "cvparam.h" 39 integer nd 40 CHARACTER (LEN=20) :: modname='cv_routines' 41 CHARACTER (LEN=80) :: abort_message 42 43 c noff: integer limit for convection (nd-noff) 44 c minorig: First level of convection 45 46 noff = 2 47 minorig = 2 48 49 nl=nd-noff 50 nlp=nl+1 51 nlm=nl-1 52 53 elcrit=0.0011 54 tlcrit=-55.0 55 entp=1.5 56 sigs=0.12 57 sigd=0.05 58 omtrain=50.0 59 omtsnow=5.5 60 coeffr=1.0 61 coeffs=0.8 62 dtmax=0.9 63 c 64 cu=0.70 65 c 66 betad=10.0 67 c 68 damp=0.1 69 alpha=0.2 70 c 71 delta=0.01 ! cld 72 c 73 return 74 end 75 76 SUBROUTINE cv_prelim(len,nd,ndp1,t,q,p,ph 77 : ,lv,cpn,tv,gz,h,hm) 78 implicit none 79 80 !===================================================================== 81 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY 82 !===================================================================== 83 84 c inputs: 85 integer len, nd, ndp1 86 real t(len,nd), q(len,nd), p(len,nd), ph(len,ndp1) 87 88 c outputs: 89 real lv(len,nd), cpn(len,nd), tv(len,nd) 90 real gz(len,nd), h(len,nd), hm(len,nd) 91 92 c local variables: 93 integer k, i 94 real cpx(len,nd) 95 96 include "cvthermo.h" 97 include "cvparam.h" 98 99 100 do 110 k=1,nlp 101 do 100 i=1,len 102 lv(i,k)= lv0-clmcpv*(t(i,k)-t0) 103 cpn(i,k)=cpd*(1.0-q(i,k))+cpv*q(i,k) 104 cpx(i,k)=cpd*(1.0-q(i,k))+cl*q(i,k) 105 tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1) 106 100 continue 107 110 continue 108 c 109 c gz = phi at the full levels (same as p). 110 c 111 do 120 i=1,len 112 gz(i,1)=0.0 113 120 continue 114 do 140 k=2,nlp 115 do 130 i=1,len 116 gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k)) 117 & *(p(i,k-1)-p(i,k))/ph(i,k) 118 130 continue 119 140 continue 120 c 121 c h = phi + cpT (dry static energy). 122 c hm = phi + cp(T-Tbase)+Lq 123 c 124 do 170 k=1,nlp 125 do 160 i=1,len 126 h(i,k)=gz(i,k)+cpn(i,k)*t(i,k) 127 hm(i,k)=gz(i,k)+cpx(i,k)*(t(i,k)-t(i,1))+lv(i,k)*q(i,k) 128 160 continue 129 170 continue 130 131 return 132 end 133 134 SUBROUTINE cv_feed(len,nd,t,q,qs,p,hm,gz 135 : ,nk,icb,icbmax,iflag,tnk,qnk,gznk,plcl) 136 implicit none 137 138 C================================================================ 139 C Purpose: CONVECTIVE FEED 140 C================================================================ 141 142 include "cvparam.h" 143 144 c inputs: 145 integer len, nd 146 real t(len,nd), q(len,nd), qs(len,nd), p(len,nd) 147 real hm(len,nd), gz(len,nd) 148 149 c outputs: 150 integer iflag(len), nk(len), icb(len), icbmax 151 real tnk(len), qnk(len), gznk(len), plcl(len) 152 153 c local variables: 154 integer i, k 155 integer ihmin(len) 156 real work(len) 157 real pnk(len), qsnk(len), rh(len), chi(len) 158 159 !------------------------------------------------------------------- 160 ! --- Find level of minimum moist static energy 161 ! --- If level of minimum moist static energy coincides with 162 ! --- or is lower than minimum allowable parcel origin level, 163 ! --- set iflag to 6. 164 !------------------------------------------------------------------- 165 166 do 180 i=1,len 167 work(i)=1.0e12 168 ihmin(i)=nl 169 180 continue 170 do 200 k=2,nlp 171 do 190 i=1,len 172 if((hm(i,k).lt.work(i)).and. 173 & (hm(i,k).lt.hm(i,k-1)))then 174 work(i)=hm(i,k) 175 ihmin(i)=k 176 endif 177 190 continue 178 200 continue 179 do 210 i=1,len 180 ihmin(i)=min(ihmin(i),nlm) 181 if(ihmin(i).le.minorig)then 182 iflag(i)=6 183 endif 184 210 continue 185 c 186 !------------------------------------------------------------------- 187 ! --- Find that model level below the level of minimum moist static 188 ! --- energy that has the maximum value of moist static energy 189 !------------------------------------------------------------------- 190 191 do 220 i=1,len 192 work(i)=hm(i,minorig) 193 nk(i)=minorig 194 220 continue 195 do 240 k=minorig+1,nl 196 do 230 i=1,len 197 if((hm(i,k).gt.work(i)).and.(k.le.ihmin(i)))then 198 work(i)=hm(i,k) 199 nk(i)=k 200 endif 201 230 continue 202 240 continue 203 !------------------------------------------------------------------- 204 ! --- Check whether parcel level temperature and specific humidity 205 ! --- are reasonable 206 !------------------------------------------------------------------- 207 do 250 i=1,len 208 if(((t(i,nk(i)).lt.250.0).or. 209 & (q(i,nk(i)).le.0.0).or. 210 & (p(i,ihmin(i)).lt.400.0)).and. 211 & (iflag(i).eq.0))iflag(i)=7 212 250 continue 213 !------------------------------------------------------------------- 214 ! --- Calculate lifted condensation level of air at parcel origin level 215 ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980) 216 !------------------------------------------------------------------- 217 do 260 i=1,len 218 tnk(i)=t(i,nk(i)) 219 qnk(i)=q(i,nk(i)) 220 gznk(i)=gz(i,nk(i)) 221 pnk(i)=p(i,nk(i)) 222 qsnk(i)=qs(i,nk(i)) 223 c 224 rh(i)=qnk(i)/qsnk(i) 225 rh(i)=min(1.0,rh(i)) 226 chi(i)=tnk(i)/(1669.0-122.0*rh(i)-tnk(i)) 227 plcl(i)=pnk(i)*(rh(i)**chi(i)) 228 if(((plcl(i).lt.200.0).or.(plcl(i).ge.2000.0)) 229 & .and.(iflag(i).eq.0))iflag(i)=8 230 260 continue 231 !------------------------------------------------------------------- 232 ! --- Calculate first level above lcl (=icb) 233 !------------------------------------------------------------------- 234 do 270 i=1,len 235 icb(i)=nlm 236 270 continue 237 c 238 do 290 k=minorig,nl 239 do 280 i=1,len 240 if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i))) 241 & icb(i)=min(icb(i),k) 242 280 continue 243 290 continue 244 c 245 do 300 i=1,len 246 if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9 247 300 continue 248 c 249 c Compute icbmax. 250 c 251 icbmax=2 252 do 310 i=1,len 253 icbmax=max(icbmax,icb(i)) 254 310 continue 255 256 return 257 end 258 259 SUBROUTINE cv_undilute1(len,nd,t,q,qs,gz,p,nk,icb,icbmax 260 : ,tp,tvp,clw) 261 implicit none 262 263 include "cvthermo.h" 264 include "cvparam.h" 265 266 c inputs: 267 integer len, nd 268 integer nk(len), icb(len), icbmax 269 real t(len,nd), q(len,nd), qs(len,nd), gz(len,nd) 270 real p(len,nd) 271 272 c outputs: 273 real tp(len,nd), tvp(len,nd), clw(len,nd) 274 275 c local variables: 276 integer i, k 277 real tg, qg, alv, s, ahg, tc, denom, es, rg 278 real ah0(len), cpp(len) 279 real tnk(len), qnk(len), gznk(len), ticb(len), gzicb(len) 280 281 !------------------------------------------------------------------- 282 ! --- Calculates the lifted parcel virtual temperature at nk, 283 ! --- the actual temperature, and the adiabatic 284 ! --- liquid water content. The procedure is to solve the equation. 285 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 286 !------------------------------------------------------------------- 287 288 do 320 i=1,len 289 tnk(i)=t(i,nk(i)) 290 qnk(i)=q(i,nk(i)) 291 gznk(i)=gz(i,nk(i)) 292 ticb(i)=t(i,icb(i)) 293 gzicb(i)=gz(i,icb(i)) 294 320 continue 295 c 296 c *** Calculate certain parcel quantities, including static energy *** 297 c 298 do 330 i=1,len 299 ah0(i)=(cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) 300 & +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15))+gznk(i) 301 cpp(i)=cpd*(1.-qnk(i))+qnk(i)*cpv 302 330 continue 303 c 304 c *** Calculate lifted parcel quantities below cloud base *** 305 c 306 do 350 k=minorig,icbmax-1 307 do 340 i=1,len 308 tp(i,k)=tnk(i)-(gz(i,k)-gznk(i))/cpp(i) 309 tvp(i,k)=tp(i,k)*(1.+qnk(i)*epsi) 310 340 continue 311 350 continue 312 c 313 c *** Find lifted parcel quantities above cloud base *** 314 c 315 do 360 i=1,len 316 tg=ticb(i) 317 qg=qs(i,icb(i)) 318 alv=lv0-clmcpv*(ticb(i)-t0) 319 c 320 c First iteration. 321 c 322 s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 323 s=1./s 324 ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 325 tg=tg+s*(ah0(i)-ahg) 326 tg=max(tg,35.0) 327 tc=tg-t0 328 denom=243.5+tc 329 if(tc.ge.0.0)then 330 es=6.112*exp(17.67*tc/denom) 331 else 332 es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 333 endif 334 qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 335 c 336 c Second iteration. 337 c 338 s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 339 s=1./s 340 ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 341 tg=tg+s*(ah0(i)-ahg) 342 tg=max(tg,35.0) 343 tc=tg-t0 344 denom=243.5+tc 345 if(tc.ge.0.0)then 346 es=6.112*exp(17.67*tc/denom) 347 else 348 es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 349 end if 350 qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 351 c 352 alv=lv0-clmcpv*(ticb(i)-273.15) 353 tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i) 354 & -gz(i,icb(i))-alv*qg)/cpd 355 clw(i,icb(i))=qnk(i)-qg 356 clw(i,icb(i))=max(0.0,clw(i,icb(i))) 357 rg=qg/(1.-qnk(i)) 358 tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi) 359 360 continue 360 c 361 do 380 k=minorig,icbmax 362 do 370 i=1,len 363 tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i) 364 370 continue 365 380 continue 366 c 367 return 368 end 369 370 SUBROUTINE cv_trigger(len,nd,icb,cbmf,tv,tvp,iflag) 371 implicit none 372 373 !------------------------------------------------------------------- 374 ! --- Test for instability. 375 ! --- If there was no convection at last time step and parcel 376 ! --- is stable at icb, then set iflag to 4. 377 !------------------------------------------------------------------- 378 379 include "cvparam.h" 380 381 c inputs: 382 integer len, nd, icb(len) 383 real cbmf(len), tv(len,nd), tvp(len,nd) 384 385 c outputs: 386 integer iflag(len) ! also an input 387 388 c local variables: 389 integer i 390 391 392 do 390 i=1,len 393 if((cbmf(i).eq.0.0) .and.(iflag(i).eq.0).and. 394 & (tvp(i,icb(i)).le.(tv(i,icb(i))-dtmax)))iflag(i)=4 395 390 continue 396 397 return 398 end 399 400 SUBROUTINE cv_compress( len,nloc,ncum,nd 401 : ,iflag1,nk1,icb1 402 : ,cbmf1,plcl1,tnk1,qnk1,gznk1 403 : ,t1,q1,qs1,u1,v1,gz1 404 : ,h1,lv1,cpn1,p1,ph1,tv1,tp1,tvp1,clw1 405 o ,iflag,nk,icb 406 o ,cbmf,plcl,tnk,qnk,gznk 407 o ,t,q,qs,u,v,gz,h,lv,cpn,p,ph,tv,tp,tvp,clw 408 o ,dph ) 409 implicit none 410 411 include "cvparam.h" 412 413 c inputs: 414 integer len,ncum,nd,nloc 415 integer iflag1(len),nk1(len),icb1(len) 416 real cbmf1(len),plcl1(len),tnk1(len),qnk1(len),gznk1(len) 417 real t1(len,nd),q1(len,nd),qs1(len,nd),u1(len,nd),v1(len,nd) 418 real gz1(len,nd),h1(len,nd),lv1(len,nd),cpn1(len,nd) 419 real p1(len,nd),ph1(len,nd+1),tv1(len,nd),tp1(len,nd) 420 real tvp1(len,nd),clw1(len,nd) 421 422 c outputs: 423 integer iflag(nloc),nk(nloc),icb(nloc) 424 real cbmf(nloc),plcl(nloc),tnk(nloc),qnk(nloc),gznk(nloc) 425 real t(nloc,nd),q(nloc,nd),qs(nloc,nd),u(nloc,nd),v(nloc,nd) 426 real gz(nloc,nd),h(nloc,nd),lv(nloc,nd),cpn(nloc,nd) 427 real p(nloc,nd),ph(nloc,nd+1),tv(nloc,nd),tp(nloc,nd) 428 real tvp(nloc,nd),clw(nloc,nd) 429 real dph(nloc,nd) 430 431 c local variables: 432 integer i,k,nn 433 CHARACTER (LEN=20) :: modname='cv_compress' 434 CHARACTER (LEN=80) :: abort_message 435 436 include 'iniprint.h' 437 438 439 do 110 k=1,nl+1 440 nn=0 441 do 100 i=1,len 442 if(iflag1(i).eq.0)then 443 nn=nn+1 444 t(nn,k)=t1(i,k) 445 q(nn,k)=q1(i,k) 446 qs(nn,k)=qs1(i,k) 447 u(nn,k)=u1(i,k) 448 v(nn,k)=v1(i,k) 449 gz(nn,k)=gz1(i,k) 450 h(nn,k)=h1(i,k) 451 lv(nn,k)=lv1(i,k) 452 cpn(nn,k)=cpn1(i,k) 453 p(nn,k)=p1(i,k) 454 ph(nn,k)=ph1(i,k) 455 tv(nn,k)=tv1(i,k) 456 tp(nn,k)=tp1(i,k) 457 tvp(nn,k)=tvp1(i,k) 458 clw(nn,k)=clw1(i,k) 459 endif 460 100 continue 461 110 continue 462 463 if (nn.ne.ncum) then 464 write(lunout,*)'strange! nn not equal to ncum: ',nn,ncum 465 abort_message = '' 466 CALL abort_gcm (modname,abort_message,1) 467 endif 468 469 nn=0 470 do 150 i=1,len 471 if(iflag1(i).eq.0)then 472 nn=nn+1 473 cbmf(nn)=cbmf1(i) 474 plcl(nn)=plcl1(i) 475 tnk(nn)=tnk1(i) 476 qnk(nn)=qnk1(i) 477 gznk(nn)=gznk1(i) 478 nk(nn)=nk1(i) 479 icb(nn)=icb1(i) 480 iflag(nn)=iflag1(i) 481 endif 482 150 continue 483 484 do 170 k=1,nl 485 do 160 i=1,ncum 486 dph(i,k)=ph(i,k)-ph(i,k+1) 487 160 continue 488 170 continue 489 490 return 491 end 492 493 SUBROUTINE cv_undilute2(nloc,ncum,nd,icb,nk 494 : ,tnk,qnk,gznk,t,q,qs,gz 495 : ,p,dph,h,tv,lv 496 o ,inb,inb1,tp,tvp,clw,hp,ep,sigp,frac) 497 implicit none 498 499 C--------------------------------------------------------------------- 500 C Purpose: 501 C FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 502 C & 503 C COMPUTE THE PRECIPITATION EFFICIENCIES AND THE 504 C FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD 505 C & 506 C FIND THE LEVEL OF NEUTRAL BUOYANCY 507 C--------------------------------------------------------------------- 508 509 include "cvthermo.h" 510 include "cvparam.h" 511 512 c inputs: 513 integer ncum, nd, nloc 514 integer icb(nloc), nk(nloc) 515 real t(nloc,nd), q(nloc,nd), qs(nloc,nd), gz(nloc,nd) 516 real p(nloc,nd), dph(nloc,nd) 517 real tnk(nloc), qnk(nloc), gznk(nloc) 518 real lv(nloc,nd), tv(nloc,nd), h(nloc,nd) 519 520 c outputs: 521 integer inb(nloc), inb1(nloc) 522 real tp(nloc,nd), tvp(nloc,nd), clw(nloc,nd) 523 real ep(nloc,nd), sigp(nloc,nd), hp(nloc,nd) 524 real frac(nloc) 525 526 c local variables: 527 integer i, k 528 real tg,qg,ahg,alv,s,tc,es,denom,rg,tca,elacrit 529 real by, defrac 530 real ah0(nloc), cape(nloc), capem(nloc), byp(nloc) 531 logical lcape(nloc) 532 533 !===================================================================== 534 ! --- SOME INITIALIZATIONS 535 !===================================================================== 536 537 do 170 k=1,nl 538 do 160 i=1,ncum 539 ep(i,k)=0.0 540 sigp(i,k)=sigs 541 160 continue 542 170 continue 543 544 !===================================================================== 545 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 546 !===================================================================== 547 c 548 c --- The procedure is to solve the equation. 549 c cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 550 c 551 c *** Calculate certain parcel quantities, including static energy *** 552 c 553 c 554 do 240 i=1,ncum 555 ah0(i)=(cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) 556 & +qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i) 557 240 continue 558 c 559 c 560 c *** Find lifted parcel quantities above cloud base *** 561 c 562 c 563 do 300 k=minorig+1,nl 564 do 290 i=1,ncum 565 if(k.ge.(icb(i)+1))then 566 tg=t(i,k) 567 qg=qs(i,k) 568 alv=lv0-clmcpv*(t(i,k)-t0) 569 c 570 c First iteration. 571 c 572 s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k)) 573 s=1./s 574 ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) 575 tg=tg+s*(ah0(i)-ahg) 576 tg=max(tg,35.0) 577 tc=tg-t0 578 denom=243.5+tc 579 if(tc.ge.0.0)then 580 es=6.112*exp(17.67*tc/denom) 581 else 582 es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 583 endif 584 qg=eps*es/(p(i,k)-es*(1.-eps)) 585 c 586 c Second iteration. 587 c 588 s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k)) 589 s=1./s 590 ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) 591 tg=tg+s*(ah0(i)-ahg) 592 tg=max(tg,35.0) 593 tc=tg-t0 594 denom=243.5+tc 595 if(tc.ge.0.0)then 596 es=6.112*exp(17.67*tc/denom) 597 else 598 es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 599 endif 600 qg=eps*es/(p(i,k)-es*(1.-eps)) 601 c 602 alv=lv0-clmcpv*(t(i,k)-t0) 603 c print*,'cpd dans convect2 ',cpd 604 c print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd' 605 c print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd 606 tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd 607 c if (.not.cpd.gt.1000.) then 608 c print*,'CPD=',cpd 609 c stop 610 c endif 611 clw(i,k)=qnk(i)-qg 612 clw(i,k)=max(0.0,clw(i,k)) 613 rg=qg/(1.-qnk(i)) 614 tvp(i,k)=tp(i,k)*(1.+rg*epsi) 615 endif 616 290 continue 617 300 continue 618 c 619 !===================================================================== 620 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF 621 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD 622 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I) 623 !===================================================================== 624 c 625 do 320 k=minorig+1,nl 626 do 310 i=1,ncum 627 if(k.ge.(nk(i)+1))then 628 tca=tp(i,k)-t0 629 if(tca.ge.0.0)then 630 elacrit=elcrit 631 else 632 elacrit=elcrit*(1.0-tca/tlcrit) 633 endif 634 elacrit=max(elacrit,0.0) 635 ep(i,k)=1.0-elacrit/max(clw(i,k),1.0e-8) 636 ep(i,k)=max(ep(i,k),0.0 ) 637 ep(i,k)=min(ep(i,k),1.0 ) 638 sigp(i,k)=sigs 639 endif 640 310 continue 641 320 continue 642 c 643 !===================================================================== 644 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL 645 ! --- VIRTUAL TEMPERATURE 646 !===================================================================== 647 c 648 do 340 k=minorig+1,nl 649 do 330 i=1,ncum 650 if(k.ge.(icb(i)+1))then 651 tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k)) 652 c print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)' 653 c print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k) 654 endif 655 330 continue 656 340 continue 657 do 350 i=1,ncum 658 tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd 659 350 continue 660 c 661 c===================================================================== 662 c --- FIND THE FIRST MODEL LEVEL (INB1) ABOVE THE PARCEL'S 663 c --- HIGHEST LEVEL OF NEUTRAL BUOYANCY 664 c --- AND THE HIGHEST LEVEL OF POSITIVE CAPE (INB) 665 c===================================================================== 666 c 667 do 510 i=1,ncum 668 cape(i)=0.0 669 capem(i)=0.0 670 inb(i)=icb(i)+1 671 inb1(i)=inb(i) 672 510 continue 673 c 674 c Originial Code 675 c 676 c do 530 k=minorig+1,nl-1 677 c do 520 i=1,ncum 678 c if(k.ge.(icb(i)+1))then 679 c by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 680 c byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 681 c cape(i)=cape(i)+by 682 c if(by.ge.0.0)inb1(i)=k+1 683 c if(cape(i).gt.0.0)then 684 c inb(i)=k+1 685 c capem(i)=cape(i) 686 c endif 687 c endif 688 c520 continue 689 c530 continue 690 c do 540 i=1,ncum 691 c byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl) 692 c cape(i)=capem(i)+byp 693 c defrac=capem(i)-cape(i) 694 c defrac=max(defrac,0.001) 695 c frac(i)=-cape(i)/defrac 696 c frac(i)=min(frac(i),1.0) 697 c frac(i)=max(frac(i),0.0) 698 c540 continue 699 c 700 c K Emanuel fix 701 c 702 c call zilch(byp,ncum) 703 c do 530 k=minorig+1,nl-1 704 c do 520 i=1,ncum 705 c if(k.ge.(icb(i)+1))then 706 c by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 707 c cape(i)=cape(i)+by 708 c if(by.ge.0.0)inb1(i)=k+1 709 c if(cape(i).gt.0.0)then 710 c inb(i)=k+1 711 c capem(i)=cape(i) 712 c byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 713 c endif 714 c endif 715 c520 continue 716 c530 continue 717 c do 540 i=1,ncum 718 c inb(i)=max(inb(i),inb1(i)) 719 c cape(i)=capem(i)+byp(i) 720 c defrac=capem(i)-cape(i) 721 c defrac=max(defrac,0.001) 722 c frac(i)=-cape(i)/defrac 723 c frac(i)=min(frac(i),1.0) 724 c frac(i)=max(frac(i),0.0) 725 c540 continue 726 c 727 c J Teixeira fix 728 c 729 call zilch(byp,ncum) 730 do 515 i=1,ncum 731 lcape(i)=.true. 732 515 continue 733 do 530 k=minorig+1,nl-1 734 do 520 i=1,ncum 735 if(cape(i).lt.0.0)lcape(i)=.false. 736 if((k.ge.(icb(i)+1)).and.lcape(i))then 737 by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 738 byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 739 cape(i)=cape(i)+by 740 if(by.ge.0.0)inb1(i)=k+1 741 if(cape(i).gt.0.0)then 742 inb(i)=k+1 743 capem(i)=cape(i) 744 endif 745 endif 746 520 continue 747 530 continue 748 do 540 i=1,ncum 749 cape(i)=capem(i)+byp(i) 750 defrac=capem(i)-cape(i) 751 defrac=max(defrac,0.001) 752 frac(i)=-cape(i)/defrac 753 frac(i)=min(frac(i),1.0) 754 frac(i)=max(frac(i),0.0) 755 540 continue 756 c 757 c===================================================================== 758 c --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL 759 c===================================================================== 760 c 761 c initialization: 762 do i=1,ncum*nlp 763 hp(i,1)=h(i,1) 764 enddo 765 766 do 600 k=minorig+1,nl 767 do 590 i=1,ncum 768 if((k.ge.icb(i)).and.(k.le.inb(i)))then 769 hp(i,k)=h(i,nk(i))+(lv(i,k)+(cpd-cpv)*t(i,k))*ep(i,k)*clw(i,k) 770 endif 771 590 continue 772 600 continue 773 c 774 return 775 end 776 c 777 SUBROUTINE cv_closure(nloc,ncum,nd,nk,icb 778 : ,tv,tvp,p,ph,dph,plcl,cpn 779 : ,iflag,cbmf) 780 implicit none 781 782 c inputs: 783 integer ncum, nd, nloc 784 integer nk(nloc), icb(nloc) 785 real tv(nloc,nd), tvp(nloc,nd), p(nloc,nd), dph(nloc,nd) 786 real ph(nloc,nd+1) ! caution nd instead ndp1 to be consistent... 787 real plcl(nloc), cpn(nloc,nd) 788 789 c outputs: 790 integer iflag(nloc) 791 real cbmf(nloc) ! also an input 792 793 c local variables: 794 integer i, k, icbmax 795 real dtpbl(nloc), dtmin(nloc), tvpplcl(nloc), tvaplcl(nloc) 796 real work(nloc) 797 798 include "cvthermo.h" 799 include "cvparam.h" 800 801 c------------------------------------------------------------------- 802 c Compute icbmax. 803 c------------------------------------------------------------------- 804 805 icbmax=2 806 do 230 i=1,ncum 807 icbmax=max(icbmax,icb(i)) 808 230 continue 809 810 c===================================================================== 811 c --- CALCULATE CLOUD BASE MASS FLUX 812 c===================================================================== 813 c 814 c tvpplcl = parcel temperature lifted adiabatically from level 815 c icb-1 to the LCL. 816 c tvaplcl = virtual temperature at the LCL. 817 c 818 do 610 i=1,ncum 819 dtpbl(i)=0.0 820 tvpplcl(i)=tvp(i,icb(i)-1) 821 & -rrd*tvp(i,icb(i)-1)*(p(i,icb(i)-1)-plcl(i)) 822 & /(cpn(i,icb(i)-1)*p(i,icb(i)-1)) 823 tvaplcl(i)=tv(i,icb(i)) 824 & +(tvp(i,icb(i))-tvp(i,icb(i)+1))*(plcl(i)-p(i,icb(i))) 825 & /(p(i,icb(i))-p(i,icb(i)+1)) 826 610 continue 827 828 c------------------------------------------------------------------- 829 c --- Interpolate difference between lifted parcel and 830 c --- environmental temperatures to lifted condensation level 831 c------------------------------------------------------------------- 832 c 833 c dtpbl = average of tvp-tv in the PBL (k=nk to icb-1). 834 c 835 do 630 k=minorig,icbmax 836 do 620 i=1,ncum 837 if((k.ge.nk(i)).and.(k.le.(icb(i)-1)))then 838 dtpbl(i)=dtpbl(i)+(tvp(i,k)-tv(i,k))*dph(i,k) 839 endif 840 620 continue 841 630 continue 842 do 640 i=1,ncum 843 dtpbl(i)=dtpbl(i)/(ph(i,nk(i))-ph(i,icb(i))) 844 dtmin(i)=tvpplcl(i)-tvaplcl(i)+dtmax+dtpbl(i) 845 640 continue 846 c 847 c------------------------------------------------------------------- 848 c --- Adjust cloud base mass flux 849 c------------------------------------------------------------------- 850 c 851 do 650 i=1,ncum 852 work(i)=cbmf(i) 853 cbmf(i)=max(0.0,(1.0-damp)*cbmf(i)+0.1*alpha*dtmin(i)) 854 if((work(i).eq.0.0).and.(cbmf(i).eq.0.0))then 855 iflag(i)=3 856 endif 857 650 continue 858 859 return 860 end 861 862 SUBROUTINE cv_mixing(nloc,ncum,nd,icb,nk,inb,inb1 863 : ,ph,t,q,qs,u,v,h,lv,qnk 864 : ,hp,tv,tvp,ep,clw,cbmf 865 : ,m,ment,qent,uent,vent,nent,sij,elij) 866 implicit none 867 868 include "cvthermo.h" 869 include "cvparam.h" 870 871 c inputs: 872 integer ncum, nd, nloc 873 integer icb(nloc), inb(nloc), inb1(nloc), nk(nloc) 874 real cbmf(nloc), qnk(nloc) 875 real ph(nloc,nd+1) 876 real t(nloc,nd), q(nloc,nd), qs(nloc,nd), lv(nloc,nd) 877 real u(nloc,nd), v(nloc,nd), h(nloc,nd), hp(nloc,nd) 878 real tv(nloc,nd), tvp(nloc,nd), ep(nloc,nd), clw(nloc,nd) 879 880 c outputs: 881 integer nent(nloc,nd) 882 real m(nloc,nd), ment(nloc,nd,nd), qent(nloc,nd,nd) 883 real uent(nloc,nd,nd), vent(nloc,nd,nd) 884 real sij(nloc,nd,nd), elij(nloc,nd,nd) 885 886 c local variables: 887 integer i, j, k, ij 888 integer num1, num2 889 real dbo, qti, bf2, anum, denom, dei, altem, cwat, stemp 890 real alt, qp1, smid, sjmin, sjmax, delp, delm 891 real work(nloc), asij(nloc), smin(nloc), scrit(nloc) 892 real bsum(nloc,nd) 893 logical lwork(nloc) 894 895 c===================================================================== 896 c --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS 897 c===================================================================== 898 c 899 do 360 i=1,ncum*nlp 900 nent(i,1)=0 901 m(i,1)=0.0 902 360 continue 903 c 904 do 400 k=1,nlp 905 do 390 j=1,nlp 906 do 385 i=1,ncum 907 qent(i,k,j)=q(i,j) 908 uent(i,k,j)=u(i,j) 909 vent(i,k,j)=v(i,j) 910 elij(i,k,j)=0.0 911 ment(i,k,j)=0.0 912 sij(i,k,j)=0.0 913 385 continue 914 390 continue 915 400 continue 916 c 917 c------------------------------------------------------------------- 918 c --- Calculate rates of mixing, m(i) 919 c------------------------------------------------------------------- 920 c 921 call zilch(work,ncum) 922 c 923 do 670 j=minorig+1,nl 924 do 660 i=1,ncum 925 if((j.ge.(icb(i)+1)).and.(j.le.inb(i)))then 926 k=min(j,inb1(i)) 927 dbo=abs(tv(i,k+1)-tvp(i,k+1)-tv(i,k-1)+tvp(i,k-1)) 928 & +entp*0.04*(ph(i,k)-ph(i,k+1)) 929 work(i)=work(i)+dbo 930 m(i,j)=cbmf(i)*dbo 931 endif 932 660 continue 933 670 continue 934 do 690 k=minorig+1,nl 935 do 680 i=1,ncum 936 if((k.ge.(icb(i)+1)).and.(k.le.inb(i)))then 937 m(i,k)=m(i,k)/work(i) 938 endif 939 680 continue 940 690 continue 941 c 942 c 943 c===================================================================== 944 c --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING 945 c --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING 946 c --- FRACTION (sij) 947 c===================================================================== 948 c 949 c 950 do 750 i=minorig+1,nl 951 do 710 j=minorig+1,nl 952 do 700 ij=1,ncum 953 if((i.ge.(icb(ij)+1)).and.(j.ge.icb(ij)) 954 & .and.(i.le.inb(ij)).and.(j.le.inb(ij)))then 955 qti=qnk(ij)-ep(ij,i)*clw(ij,i) 956 bf2=1.+lv(ij,j)*lv(ij,j)*qs(ij,j) 957 & /(rrv*t(ij,j)*t(ij,j)*cpd) 958 anum=h(ij,j)-hp(ij,i)+(cpv-cpd)*t(ij,j)*(qti-q(ij,j)) 959 denom=h(ij,i)-hp(ij,i)+(cpd-cpv)*(q(ij,i)-qti)*t(ij,j) 960 dei=denom 961 if(abs(dei).lt.0.01)dei=0.01 962 sij(ij,i,j)=anum/dei 963 sij(ij,i,i)=1.0 964 altem=sij(ij,i,j)*q(ij,i)+(1.-sij(ij,i,j))*qti-qs(ij,j) 965 altem=altem/bf2 966 cwat=clw(ij,j)*(1.-ep(ij,j)) 967 stemp=sij(ij,i,j) 968 if((stemp.lt.0.0.or.stemp.gt.1.0.or. 969 1 altem.gt.cwat).and.j.gt.i)then 970 anum=anum-lv(ij,j)*(qti-qs(ij,j)-cwat*bf2) 971 denom=denom+lv(ij,j)*(q(ij,i)-qti) 972 if(abs(denom).lt.0.01)denom=0.01 973 sij(ij,i,j)=anum/denom 974 altem=sij(ij,i,j)*q(ij,i)+(1.-sij(ij,i,j))*qti-qs(ij,j) 975 altem=altem-(bf2-1.)*cwat 976 endif 977 if(sij(ij,i,j).gt.0.0.and.sij(ij,i,j).lt.0.9)then 978 qent(ij,i,j)=sij(ij,i,j)*q(ij,i) 979 & +(1.-sij(ij,i,j))*qti 980 uent(ij,i,j)=sij(ij,i,j)*u(ij,i) 981 & +(1.-sij(ij,i,j))*u(ij,nk(ij)) 982 vent(ij,i,j)=sij(ij,i,j)*v(ij,i) 983 & +(1.-sij(ij,i,j))*v(ij,nk(ij)) 984 elij(ij,i,j)=altem 985 elij(ij,i,j)=max(0.0,elij(ij,i,j)) 986 ment(ij,i,j)=m(ij,i)/(1.-sij(ij,i,j)) 987 nent(ij,i)=nent(ij,i)+1 988 endif 989 sij(ij,i,j)=max(0.0,sij(ij,i,j)) 990 sij(ij,i,j)=min(1.0,sij(ij,i,j)) 991 endif 992 700 continue 993 710 continue 994 c 995 c *** If no air can entrain at level i assume that updraft detrains *** 996 c *** at that level and calculate detrained air flux and properties *** 997 c 998 do 740 ij=1,ncum 999 if((i.ge.(icb(ij)+1)).and.(i.le.inb(ij)) 1000 & .and.(nent(ij,i).eq.0))then 1001 ment(ij,i,i)=m(ij,i) 1002 qent(ij,i,i)=q(ij,nk(ij))-ep(ij,i)*clw(ij,i) 1003 uent(ij,i,i)=u(ij,nk(ij)) 1004 vent(ij,i,i)=v(ij,nk(ij)) 1005 elij(ij,i,i)=clw(ij,i) 1006 sij(ij,i,i)=1.0 1007 endif 1008 740 continue 1009 750 continue 1010 c 1011 do 770 i=1,ncum 1012 sij(i,inb(i),inb(i))=1.0 1013 770 continue 1014 c 1015 c===================================================================== 1016 c --- NORMALIZE ENTRAINED AIR MASS FLUXES 1017 c --- TO REPRESENT EQUAL PROBABILITIES OF MIXING 1018 c===================================================================== 1019 c 1020 call zilch(bsum,ncum*nlp) 1021 do 780 ij=1,ncum 1022 lwork(ij)=.false. 1023 780 continue 1024 do 789 i=minorig+1,nl 1025 c 1026 num1=0 1027 do 779 ij=1,ncum 1028 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)))num1=num1+1 1029 779 continue 1030 if(num1.le.0)go to 789 1031 c 1032 do 781 ij=1,ncum 1033 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)))then 1034 lwork(ij)=(nent(ij,i).ne.0) 1035 qp1=q(ij,nk(ij))-ep(ij,i)*clw(ij,i) 1036 anum=h(ij,i)-hp(ij,i)-lv(ij,i)*(qp1-qs(ij,i)) 1037 denom=h(ij,i)-hp(ij,i)+lv(ij,i)*(q(ij,i)-qp1) 1038 if(abs(denom).lt.0.01)denom=0.01 1039 scrit(ij)=anum/denom 1040 alt=qp1-qs(ij,i)+scrit(ij)*(q(ij,i)-qp1) 1041 if(scrit(ij).lt.0.0.or.alt.lt.0.0)scrit(ij)=1.0 1042 asij(ij)=0.0 1043 smin(ij)=1.0 1044 endif 1045 781 continue 1046 do 783 j=minorig,nl 1047 c 1048 num2=0 1049 do 778 ij=1,ncum 1050 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)) 1051 & .and.(j.ge.icb(ij)).and.(j.le.inb(ij)) 1052 & .and.lwork(ij))num2=num2+1 1053 778 continue 1054 if(num2.le.0)go to 783 1055 c 1056 do 782 ij=1,ncum 1057 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)) 1058 & .and.(j.ge.icb(ij)).and.(j.le.inb(ij)).and.lwork(ij))then 1059 if(sij(ij,i,j).gt.0.0.and.sij(ij,i,j).lt.0.9)then 1060 if(j.gt.i)then 1061 smid=min(sij(ij,i,j),scrit(ij)) 1062 sjmax=smid 1063 sjmin=smid 1064 if(smid.lt.smin(ij) 1065 & .and.sij(ij,i,j+1).lt.smid)then 1066 smin(ij)=smid 1067 sjmax=min(sij(ij,i,j+1),sij(ij,i,j),scrit(ij)) 1068 sjmin=max(sij(ij,i,j-1),sij(ij,i,j)) 1069 sjmin=min(sjmin,scrit(ij)) 1070 endif 1071 else 1072 sjmax=max(sij(ij,i,j+1),scrit(ij)) 1073 smid=max(sij(ij,i,j),scrit(ij)) 1074 sjmin=0.0 1075 if(j.gt.1)sjmin=sij(ij,i,j-1) 1076 sjmin=max(sjmin,scrit(ij)) 1077 endif 1078 delp=abs(sjmax-smid) 1079 delm=abs(sjmin-smid) 1080 asij(ij)=asij(ij)+(delp+delm) 1081 & *(ph(ij,j)-ph(ij,j+1)) 1082 ment(ij,i,j)=ment(ij,i,j)*(delp+delm) 1083 & *(ph(ij,j)-ph(ij,j+1)) 1084 endif 1085 endif 1086 782 continue 1087 783 continue 1088 do 784 ij=1,ncum 1089 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)).and.lwork(ij))then 1090 asij(ij)=max(1.0e-21,asij(ij)) 1091 asij(ij)=1.0/asij(ij) 1092 bsum(ij,i)=0.0 1093 endif 1094 784 continue 1095 do 786 j=minorig,nl+1 1096 do 785 ij=1,ncum 1097 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)) 1098 & .and.(j.ge.icb(ij)).and.(j.le.inb(ij)) 1099 & .and.lwork(ij))then 1100 ment(ij,i,j)=ment(ij,i,j)*asij(ij) 1101 bsum(ij,i)=bsum(ij,i)+ment(ij,i,j) 1102 endif 1103 785 continue 1104 786 continue 1105 do 787 ij=1,ncum 1106 if((i.ge.icb(ij)+1).and.(i.le.inb(ij)) 1107 & .and.(bsum(ij,i).lt.1.0e-18).and.lwork(ij))then 1108 nent(ij,i)=0 1109 ment(ij,i,i)=m(ij,i) 1110 qent(ij,i,i)=q(ij,nk(ij))-ep(ij,i)*clw(ij,i) 1111 uent(ij,i,i)=u(ij,nk(ij)) 1112 vent(ij,i,i)=v(ij,nk(ij)) 1113 elij(ij,i,i)=clw(ij,i) 1114 sij(ij,i,i)=1.0 1115 endif 1116 787 continue 1117 789 continue 1118 c 1119 return 1120 end 1121 1122 SUBROUTINE cv_unsat(nloc,ncum,nd,inb,t,q,qs,gz,u,v,p,ph 1123 : ,h,lv,ep,sigp,clw,m,ment,elij 1124 : ,iflag,mp,qp,up,vp,wt,water,evap) 1125 implicit none 1126 1127 1128 include "cvthermo.h" 1129 include "cvparam.h" 1130 1131 c inputs: 1132 integer ncum, nd, nloc 1133 integer inb(nloc) 1134 real t(nloc,nd), q(nloc,nd), qs(nloc,nd) 1135 real gz(nloc,nd), u(nloc,nd), v(nloc,nd) 1136 real p(nloc,nd), ph(nloc,nd+1), h(nloc,nd) 1137 real lv(nloc,nd), ep(nloc,nd), sigp(nloc,nd), clw(nloc,nd) 1138 real m(nloc,nd), ment(nloc,nd,nd), elij(nloc,nd,nd) 1139 1140 c outputs: 1141 integer iflag(nloc) ! also an input 1142 real mp(nloc,nd), qp(nloc,nd), up(nloc,nd), vp(nloc,nd) 1143 real water(nloc,nd), evap(nloc,nd), wt(nloc,nd) 1144 1145 c local variables: 1146 integer i,j,k,ij,num1 1147 integer jtt(nloc) 1148 real awat, coeff, qsm, afac, sigt, b6, c6, revap 1149 real dhdp, fac, qstm, rat 1150 real wdtrain(nloc) 1151 logical lwork(nloc) 1152 1153 c===================================================================== 1154 c --- PRECIPITATING DOWNDRAFT CALCULATION 1155 c===================================================================== 1156 c 1157 c Initializations: 1158 c 1159 do i = 1, ncum 1160 do k = 1, nl+1 1161 wt(i,k) = omtsnow 1162 mp(i,k) = 0.0 1163 evap(i,k) = 0.0 1164 water(i,k) = 0.0 1165 enddo 1166 enddo 1167 1168 do 420 i=1,ncum 1169 qp(i,1)=q(i,1) 1170 up(i,1)=u(i,1) 1171 vp(i,1)=v(i,1) 1172 420 continue 1173 1174 do 440 k=2,nl+1 1175 do 430 i=1,ncum 1176 qp(i,k)=q(i,k-1) 1177 up(i,k)=u(i,k-1) 1178 vp(i,k)=v(i,k-1) 1179 430 continue 1180 440 continue 1181 1182 1183 c *** Check whether ep(inb)=0, if so, skip precipitating *** 1184 c *** downdraft calculation *** 1185 c 1186 c 1187 c *** Integrate liquid water equation to find condensed water *** 1188 c *** and condensed water flux *** 1189 c 1190 c 1191 do 890 i=1,ncum 1192 jtt(i)=2 1193 if(ep(i,inb(i)).le.0.0001)iflag(i)=2 1194 if(iflag(i).eq.0)then 1195 lwork(i)=.true. 1196 else 1197 lwork(i)=.false. 1198 endif 1199 890 continue 1200 c 1201 c *** Begin downdraft loop *** 1202 c 1203 c 1204 call zilch(wdtrain,ncum) 1205 do 899 i=nl+1,1,-1 1206 c 1207 num1=0 1208 do 879 ij=1,ncum 1209 if((i.le.inb(ij)).and.lwork(ij))num1=num1+1 1210 879 continue 1211 if(num1.le.0)go to 899 1212 c 1213 c 1214 c *** Calculate detrained precipitation *** 1215 c 1216 do 891 ij=1,ncum 1217 if((i.le.inb(ij)).and.(lwork(ij)))then 1218 wdtrain(ij)=g*ep(ij,i)*m(ij,i)*clw(ij,i) 1219 endif 1220 891 continue 1221 c 1222 if(i.gt.1)then 1223 do 893 j=1,i-1 1224 do 892 ij=1,ncum 1225 if((i.le.inb(ij)).and.(lwork(ij)))then 1226 awat=elij(ij,j,i)-(1.-ep(ij,i))*clw(ij,i) 1227 awat=max(0.0,awat) 1228 wdtrain(ij)=wdtrain(ij)+g*awat*ment(ij,j,i) 1229 endif 1230 892 continue 1231 893 continue 1232 endif 1233 c 1234 c *** Find rain water and evaporation using provisional *** 1235 c *** estimates of qp(i)and qp(i-1) *** 1236 c 1237 c 1238 c *** Value of terminal velocity and coeffecient of evaporation for snow *** 1239 c 1240 do 894 ij=1,ncum 1241 if((i.le.inb(ij)).and.(lwork(ij)))then 1242 coeff=coeffs 1243 wt(ij,i)=omtsnow 1244 c 1245 c *** Value of terminal velocity and coeffecient of evaporation for rain *** 1246 c 1247 if(t(ij,i).gt.273.0)then 1248 coeff=coeffr 1249 wt(ij,i)=omtrain 1250 endif 1251 qsm=0.5*(q(ij,i)+qp(ij,i+1)) 1252 afac=coeff*ph(ij,i)*(qs(ij,i)-qsm) 1253 & /(1.0e4+2.0e3*ph(ij,i)*qs(ij,i)) 1254 afac=max(afac,0.0) 1255 sigt=sigp(ij,i) 1256 sigt=max(0.0,sigt) 1257 sigt=min(1.0,sigt) 1258 b6=100.*(ph(ij,i)-ph(ij,i+1))*sigt*afac/wt(ij,i) 1259 c6=(water(ij,i+1)*wt(ij,i+1)+wdtrain(ij)/sigd)/wt(ij,i) 1260 revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 1261 evap(ij,i)=sigt*afac*revap 1262 water(ij,i)=revap*revap 1263 c 1264 c *** Calculate precipitating downdraft mass flux under *** 1265 c *** hydrostatic approximation *** 1266 c 1267 if(i.gt.1)then 1268 dhdp=(h(ij,i)-h(ij,i-1))/(p(ij,i-1)-p(ij,i)) 1269 dhdp=max(dhdp,10.0) 1270 mp(ij,i)=100.*ginv*lv(ij,i)*sigd*evap(ij,i)/dhdp 1271 mp(ij,i)=max(mp(ij,i),0.0) 1272 c 1273 c *** Add small amount of inertia to downdraft *** 1274 c 1275 fac=20.0/(ph(ij,i-1)-ph(ij,i)) 1276 mp(ij,i)=(fac*mp(ij,i+1)+mp(ij,i))/(1.+fac) 1277 c 1278 c *** Force mp to decrease linearly to zero *** 1279 c *** between about 950 mb and the surface *** 1280 c 1281 if(p(ij,i).gt.(0.949*p(ij,1)))then 1282 jtt(ij)=max(jtt(ij),i) 1283 mp(ij,i)=mp(ij,jtt(ij))*(p(ij,1)-p(ij,i)) 1284 & /(p(ij,1)-p(ij,jtt(ij))) 1285 endif 1286 endif 1287 c 1288 c *** Find mixing ratio of precipitating downdraft *** 1289 c 1290 if(i.ne.inb(ij))then 1291 if(i.eq.1)then 1292 qstm=qs(ij,1) 1293 else 1294 qstm=qs(ij,i-1) 1295 endif 1296 if(mp(ij,i).gt.mp(ij,i+1))then 1297 rat=mp(ij,i+1)/mp(ij,i) 1298 qp(ij,i)=qp(ij,i+1)*rat+q(ij,i)*(1.0-rat)+100.*ginv* 1299 & sigd*(ph(ij,i)-ph(ij,i+1))*(evap(ij,i)/mp(ij,i)) 1300 up(ij,i)=up(ij,i+1)*rat+u(ij,i)*(1.-rat) 1301 vp(ij,i)=vp(ij,i+1)*rat+v(ij,i)*(1.-rat) 1302 else 1303 if(mp(ij,i+1).gt.0.0)then 1304 qp(ij,i)=(gz(ij,i+1)-gz(ij,i) 1305 & +qp(ij,i+1)*(lv(ij,i+1)+t(ij,i+1) 1306 & *(cl-cpd))+cpd*(t(ij,i+1)-t(ij,i))) 1307 & /(lv(ij,i)+t(ij,i)*(cl-cpd)) 1308 up(ij,i)=up(ij,i+1) 1309 vp(ij,i)=vp(ij,i+1) 1310 endif 1311 endif 1312 qp(ij,i)=min(qp(ij,i),qstm) 1313 qp(ij,i)=max(qp(ij,i),0.0) 1314 endif 1315 endif 1316 894 continue 1317 899 continue 1318 c 1319 return 1320 end 1321 1322 SUBROUTINE cv_yield(nloc,ncum,nd,nk,icb,inb,delt 1323 : ,t,q,u,v,gz,p,ph,h,hp,lv,cpn 1324 : ,ep,clw,frac,m,mp,qp,up,vp 1325 : ,wt,water,evap 1326 : ,ment,qent,uent,vent,nent,elij 1327 : ,tv,tvp 1328 o ,iflag,wd,qprime,tprime 1329 o ,precip,cbmf,ft,fq,fu,fv,Ma,qcondc) 1330 implicit none 1331 1332 include "cvthermo.h" 1333 include "cvparam.h" 1334 1335 c inputs 1336 integer ncum, nd, nloc 1337 integer nk(nloc), icb(nloc), inb(nloc) 1338 integer nent(nloc,nd) 1339 real delt 1340 real t(nloc,nd), q(nloc,nd), u(nloc,nd), v(nloc,nd) 1341 real gz(nloc,nd) 1342 real p(nloc,nd), ph(nloc,nd+1), h(nloc,nd) 1343 real hp(nloc,nd), lv(nloc,nd) 1344 real cpn(nloc,nd), ep(nloc,nd), clw(nloc,nd), frac(nloc) 1345 real m(nloc,nd), mp(nloc,nd), qp(nloc,nd) 1346 real up(nloc,nd), vp(nloc,nd) 1347 real wt(nloc,nd), water(nloc,nd), evap(nloc,nd) 1348 real ment(nloc,nd,nd), qent(nloc,nd,nd), elij(nloc,nd,nd) 1349 real uent(nloc,nd,nd), vent(nloc,nd,nd) 1350 real tv(nloc,nd), tvp(nloc,nd) 1351 1352 c outputs 1353 integer iflag(nloc) ! also an input 1354 real cbmf(nloc) ! also an input 1355 real wd(nloc), tprime(nloc), qprime(nloc) 1356 real precip(nloc) 1357 real ft(nloc,nd), fq(nloc,nd), fu(nloc,nd), fv(nloc,nd) 1358 real Ma(nloc,nd) 1359 real qcondc(nloc,nd) 1360 1361 c local variables 1362 integer i,j,ij,k,num1 1363 real dpinv,cpinv,awat,fqold,ftold,fuold,fvold,delti 1364 real work(nloc), am(nloc),amp1(nloc),ad(nloc) 1365 real ents(nloc), uav(nloc),vav(nloc),lvcp(nloc,nd) 1366 real qcond(nloc,nd), nqcond(nloc,nd), wa(nloc,nd) ! cld 1367 real siga(nloc,nd), ax(nloc,nd), mac(nloc,nd) ! cld 1368 1369 1370 c -- initializations: 1371 1372 delti = 1.0/delt 1373 1374 do 160 i=1,ncum 1375 precip(i)=0.0 1376 wd(i)=0.0 1377 tprime(i)=0.0 1378 qprime(i)=0.0 1379 do 170 k=1,nl+1 1380 ft(i,k)=0.0 1381 fu(i,k)=0.0 1382 fv(i,k)=0.0 1383 fq(i,k)=0.0 1384 lvcp(i,k)=lv(i,k)/cpn(i,k) 1385 qcondc(i,k)=0.0 ! cld 1386 qcond(i,k)=0.0 ! cld 1387 nqcond(i,k)=0.0 ! cld 1388 170 continue 1389 160 continue 1390 1391 c 1392 c *** Calculate surface precipitation in mm/day *** 1393 c 1394 do 1190 i=1,ncum 1395 if(iflag(i).le.1)then 1396 cc precip(i)=precip(i)+wt(i,1)*sigd*water(i,1)*3600.*24000. 1397 cc & /(rowl*g) 1398 cc precip(i)=precip(i)*delt/86400. 1399 precip(i) = wt(i,1)*sigd*water(i,1)*86400/g 1400 endif 1401 1190 continue 1402 c 1403 c 1404 c *** Calculate downdraft velocity scale and surface temperature and *** 1405 c *** water vapor fluctuations *** 1406 c 1407 do i=1,ncum 1408 wd(i)=betad*abs(mp(i,icb(i)))*0.01*rrd*t(i,icb(i)) 1409 : /(sigd*p(i,icb(i))) 1410 qprime(i)=0.5*(qp(i,1)-q(i,1)) 1411 tprime(i)=lv0*qprime(i)/cpd 1412 enddo 1413 c 1414 c *** Calculate tendencies of lowest level potential temperature *** 1415 c *** and mixing ratio *** 1416 c 1417 do 1200 i=1,ncum 1418 work(i)=0.01/(ph(i,1)-ph(i,2)) 1419 am(i)=0.0 1420 1200 continue 1421 do 1220 k=2,nl 1422 do 1210 i=1,ncum 1423 if((nk(i).eq.1).and.(k.le.inb(i)).and.(nk(i).eq.1))then 1424 am(i)=am(i)+m(i,k) 1425 endif 1426 1210 continue 1427 1220 continue 1428 do 1240 i=1,ncum 1429 if((g*work(i)*am(i)).ge.delti)iflag(i)=1 1430 ft(i,1)=ft(i,1)+g*work(i)*am(i)*(t(i,2)-t(i,1) 1431 & +(gz(i,2)-gz(i,1))/cpn(i,1)) 1432 ft(i,1)=ft(i,1)-lvcp(i,1)*sigd*evap(i,1) 1433 ft(i,1)=ft(i,1)+sigd*wt(i,2)*(cl-cpd)*water(i,2)*(t(i,2) 1434 & -t(i,1))*work(i)/cpn(i,1) 1435 fq(i,1)=fq(i,1)+g*mp(i,2)*(qp(i,2)-q(i,1))* 1436 & work(i)+sigd*evap(i,1) 1437 fq(i,1)=fq(i,1)+g*am(i)*(q(i,2)-q(i,1))*work(i) 1438 fu(i,1)=fu(i,1)+g*work(i)*(mp(i,2)*(up(i,2)-u(i,1)) 1439 & +am(i)*(u(i,2)-u(i,1))) 1440 fv(i,1)=fv(i,1)+g*work(i)*(mp(i,2)*(vp(i,2)-v(i,1)) 1441 & +am(i)*(v(i,2)-v(i,1))) 1442 1240 continue 1443 do 1260 j=2,nl 1444 do 1250 i=1,ncum 1445 if(j.le.inb(i))then 1446 fq(i,1)=fq(i,1) 1447 & +g*work(i)*ment(i,j,1)*(qent(i,j,1)-q(i,1)) 1448 fu(i,1)=fu(i,1) 1449 & +g*work(i)*ment(i,j,1)*(uent(i,j,1)-u(i,1)) 1450 fv(i,1)=fv(i,1) 1451 & +g*work(i)*ment(i,j,1)*(vent(i,j,1)-v(i,1)) 1452 endif 1453 1250 continue 1454 1260 continue 1455 c 1456 c *** Calculate tendencies of potential temperature and mixing ratio *** 1457 c *** at levels above the lowest level *** 1458 c 1459 c *** First find the net saturated updraft and downdraft mass fluxes *** 1460 c *** through each level *** 1461 c 1462 do 1500 i=2,nl+1 1463 c 1464 num1=0 1465 do 1265 ij=1,ncum 1466 if(i.le.inb(ij))num1=num1+1 1467 1265 continue 1468 if(num1.le.0)go to 1500 1469 c 1470 call zilch(amp1,ncum) 1471 call zilch(ad,ncum) 1472 c 1473 do 1280 k=i+1,nl+1 1474 do 1270 ij=1,ncum 1475 if((i.ge.nk(ij)).and.(i.le.inb(ij)) 1476 & .and.(k.le.(inb(ij)+1)))then 1477 amp1(ij)=amp1(ij)+m(ij,k) 1478 endif 1479 1270 continue 1480 1280 continue 1481 c 1482 do 1310 k=1,i 1483 do 1300 j=i+1,nl+1 1484 do 1290 ij=1,ncum 1485 if((j.le.(inb(ij)+1)).and.(i.le.inb(ij)))then 1486 amp1(ij)=amp1(ij)+ment(ij,k,j) 1487 endif 1488 1290 continue 1489 1300 continue 1490 1310 continue 1491 do 1340 k=1,i-1 1492 do 1330 j=i,nl+1 1493 do 1320 ij=1,ncum 1494 if((i.le.inb(ij)).and.(j.le.inb(ij)))then 1495 ad(ij)=ad(ij)+ment(ij,j,k) 1496 endif 1497 1320 continue 1498 1330 continue 1499 1340 continue 1500 c 1501 do 1350 ij=1,ncum 1502 if(i.le.inb(ij))then 1503 dpinv=0.01/(ph(ij,i)-ph(ij,i+1)) 1504 cpinv=1.0/cpn(ij,i) 1505 c 1506 ft(ij,i)=ft(ij,i) 1507 & +g*dpinv*(amp1(ij)*(t(ij,i+1)-t(ij,i) 1508 & +(gz(ij,i+1)-gz(ij,i))*cpinv) 1509 & -ad(ij)*(t(ij,i)-t(ij,i-1)+(gz(ij,i)-gz(ij,i-1))*cpinv)) 1510 & -sigd*lvcp(ij,i)*evap(ij,i) 1511 ft(ij,i)=ft(ij,i)+g*dpinv*ment(ij,i,i)*(hp(ij,i)-h(ij,i)+ 1512 & t(ij,i)*(cpv-cpd)*(q(ij,i)-qent(ij,i,i)))*cpinv 1513 ft(ij,i)=ft(ij,i)+sigd*wt(ij,i+1)*(cl-cpd)*water(ij,i+1)* 1514 & (t(ij,i+1)-t(ij,i))*dpinv*cpinv 1515 fq(ij,i)=fq(ij,i)+g*dpinv*(amp1(ij)*(q(ij,i+1)-q(ij,i))- 1516 & ad(ij)*(q(ij,i)-q(ij,i-1))) 1517 fu(ij,i)=fu(ij,i)+g*dpinv*(amp1(ij)*(u(ij,i+1)-u(ij,i))- 1518 & ad(ij)*(u(ij,i)-u(ij,i-1))) 1519 fv(ij,i)=fv(ij,i)+g*dpinv*(amp1(ij)*(v(ij,i+1)-v(ij,i))- 1520 & ad(ij)*(v(ij,i)-v(ij,i-1))) 1521 endif 1522 1350 continue 1523 do 1370 k=1,i-1 1524 do 1360 ij=1,ncum 1525 if(i.le.inb(ij))then 1526 awat=elij(ij,k,i)-(1.-ep(ij,i))*clw(ij,i) 1527 awat=max(awat,0.0) 1528 fq(ij,i)=fq(ij,i) 1529 & +g*dpinv*ment(ij,k,i)*(qent(ij,k,i)-awat-q(ij,i)) 1530 fu(ij,i)=fu(ij,i) 1531 & +g*dpinv*ment(ij,k,i)*(uent(ij,k,i)-u(ij,i)) 1532 fv(ij,i)=fv(ij,i) 1533 & +g*dpinv*ment(ij,k,i)*(vent(ij,k,i)-v(ij,i)) 1534 c (saturated updrafts resulting from mixing) ! cld 1535 qcond(ij,i)=qcond(ij,i)+(elij(ij,k,i)-awat) ! cld 1536 nqcond(ij,i)=nqcond(ij,i)+1. ! cld 1537 endif 1538 1360 continue 1539 1370 continue 1540 do 1390 k=i,nl+1 1541 do 1380 ij=1,ncum 1542 if((i.le.inb(ij)).and.(k.le.inb(ij)))then 1543 fq(ij,i)=fq(ij,i) 1544 & +g*dpinv*ment(ij,k,i)*(qent(ij,k,i)-q(ij,i)) 1545 fu(ij,i)=fu(ij,i) 1546 & +g*dpinv*ment(ij,k,i)*(uent(ij,k,i)-u(ij,i)) 1547 fv(ij,i)=fv(ij,i) 1548 & +g*dpinv*ment(ij,k,i)*(vent(ij,k,i)-v(ij,i)) 1549 endif 1550 1380 continue 1551 1390 continue 1552 do 1400 ij=1,ncum 1553 if(i.le.inb(ij))then 1554 fq(ij,i)=fq(ij,i) 1555 & +sigd*evap(ij,i)+g*(mp(ij,i+1)* 1556 & (qp(ij,i+1)-q(ij,i)) 1557 & -mp(ij,i)*(qp(ij,i)-q(ij,i-1)))*dpinv 1558 fu(ij,i)=fu(ij,i) 1559 & +g*(mp(ij,i+1)*(up(ij,i+1)-u(ij,i))-mp(ij,i)* 1560 & (up(ij,i)-u(ij,i-1)))*dpinv 1561 fv(ij,i)=fv(ij,i) 1562 & +g*(mp(ij,i+1)*(vp(ij,i+1)-v(ij,i))-mp(ij,i)* 1563 & (vp(ij,i)-v(ij,i-1)))*dpinv 1564 C (saturated downdrafts resulting from mixing) ! cld 1565 do k=i+1,inb(ij) ! cld 1566 qcond(ij,i)=qcond(ij,i)+elij(ij,k,i) ! cld 1567 nqcond(ij,i)=nqcond(ij,i)+1. ! cld 1568 enddo ! cld 1569 C (particular case: no detraining level is found) ! cld 1570 if (nent(ij,i).eq.0) then ! cld 1571 qcond(ij,i)=qcond(ij,i)+(1.-ep(ij,i))*clw(ij,i) ! cld 1572 nqcond(ij,i)=nqcond(ij,i)+1. ! cld 1573 endif ! cld 1574 if (nqcond(ij,i).ne.0.) then ! cld 1575 qcond(ij,i)=qcond(ij,i)/nqcond(ij,i) ! cld 1576 endif ! cld 1577 endif 1578 1400 continue 1579 1500 continue 1580 c 1581 c *** Adjust tendencies at top of convection layer to reflect *** 1582 c *** actual position of the level zero cape *** 1583 c 1584 do 503 ij=1,ncum 1585 fqold=fq(ij,inb(ij)) 1586 fq(ij,inb(ij))=fq(ij,inb(ij))*(1.-frac(ij)) 1587 fq(ij,inb(ij)-1)=fq(ij,inb(ij)-1) 1588 & +frac(ij)*fqold*((ph(ij,inb(ij))-ph(ij,inb(ij)+1))/ 1589 1 (ph(ij,inb(ij)-1)-ph(ij,inb(ij))))*lv(ij,inb(ij)) 1590 & /lv(ij,inb(ij)-1) 1591 ftold=ft(ij,inb(ij)) 1592 ft(ij,inb(ij))=ft(ij,inb(ij))*(1.-frac(ij)) 1593 ft(ij,inb(ij)-1)=ft(ij,inb(ij)-1) 1594 & +frac(ij)*ftold*((ph(ij,inb(ij))-ph(ij,inb(ij)+1))/ 1595 1 (ph(ij,inb(ij)-1)-ph(ij,inb(ij))))*cpn(ij,inb(ij)) 1596 & /cpn(ij,inb(ij)-1) 1597 fuold=fu(ij,inb(ij)) 1598 fu(ij,inb(ij))=fu(ij,inb(ij))*(1.-frac(ij)) 1599 fu(ij,inb(ij)-1)=fu(ij,inb(ij)-1) 1600 & +frac(ij)*fuold*((ph(ij,inb(ij))-ph(ij,inb(ij)+1))/ 1601 1 (ph(ij,inb(ij)-1)-ph(ij,inb(ij)))) 1602 fvold=fv(ij,inb(ij)) 1603 fv(ij,inb(ij))=fv(ij,inb(ij))*(1.-frac(ij)) 1604 fv(ij,inb(ij)-1)=fv(ij,inb(ij)-1) 1605 & +frac(ij)*fvold*((ph(ij,inb(ij))-ph(ij,inb(ij)+1))/ 1606 1 (ph(ij,inb(ij)-1)-ph(ij,inb(ij)))) 1607 503 continue 1608 c 1609 c *** Very slightly adjust tendencies to force exact *** 1610 c *** enthalpy, momentum and tracer conservation *** 1611 c 1612 do 682 ij=1,ncum 1613 ents(ij)=0.0 1614 uav(ij)=0.0 1615 vav(ij)=0.0 1616 do 681 i=1,inb(ij) 1617 ents(ij)=ents(ij) 1618 & +(cpn(ij,i)*ft(ij,i)+lv(ij,i)*fq(ij,i))*(ph(ij,i)-ph(ij,i+1)) 1619 uav(ij)=uav(ij)+fu(ij,i)*(ph(ij,i)-ph(ij,i+1)) 1620 vav(ij)=vav(ij)+fv(ij,i)*(ph(ij,i)-ph(ij,i+1)) 1621 681 continue 1622 682 continue 1623 do 683 ij=1,ncum 1624 ents(ij)=ents(ij)/(ph(ij,1)-ph(ij,inb(ij)+1)) 1625 uav(ij)=uav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1)) 1626 vav(ij)=vav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1)) 1627 683 continue 1628 do 642 ij=1,ncum 1629 do 641 i=1,inb(ij) 1630 ft(ij,i)=ft(ij,i)-ents(ij)/cpn(ij,i) 1631 fu(ij,i)=(1.-cu)*(fu(ij,i)-uav(ij)) 1632 fv(ij,i)=(1.-cu)*(fv(ij,i)-vav(ij)) 1633 641 continue 1634 642 continue 1635 c 1636 do 1810 k=1,nl+1 1637 do 1800 i=1,ncum 1638 if((q(i,k)+delt*fq(i,k)).lt.0.0)iflag(i)=10 1639 1800 continue 1640 1810 continue 1641 c 1642 c 1643 do 1900 i=1,ncum 1644 if(iflag(i).gt.2)then 1645 precip(i)=0.0 1646 cbmf(i)=0.0 1647 endif 1648 1900 continue 1649 do 1920 k=1,nl 1650 do 1910 i=1,ncum 1651 if(iflag(i).gt.2)then 1652 ft(i,k)=0.0 1653 fq(i,k)=0.0 1654 fu(i,k)=0.0 1655 fv(i,k)=0.0 1656 qcondc(i,k)=0.0 ! cld 1657 endif 1658 1910 continue 1659 1920 continue 1660 1661 do k=1,nl+1 1662 do i=1,ncum 1663 Ma(i,k) = 0. 1664 enddo 1665 enddo 1666 do k=nl,1,-1 1667 do i=1,ncum 1668 Ma(i,k) = Ma(i,k+1)+m(i,k) 1669 enddo 1670 enddo 1671 1672 c 1673 c *** diagnose the in-cloud mixing ratio *** ! cld 1674 c *** of condensed water *** ! cld 1675 c ! cld 1676 DO ij=1,ncum ! cld 1677 do i=1,nd ! cld 1678 mac(ij,i)=0.0 ! cld 1679 wa(ij,i)=0.0 ! cld 1680 siga(ij,i)=0.0 ! cld 1681 enddo ! cld 1682 do i=nk(ij),inb(ij) ! cld 1683 do k=i+1,inb(ij)+1 ! cld 1684 mac(ij,i)=mac(ij,i)+m(ij,k) ! cld 1685 enddo ! cld 1686 enddo ! cld 1687 do i=icb(ij),inb(ij)-1 ! cld 1688 ax(ij,i)=0. ! cld 1689 do j=icb(ij),i ! cld 1690 ax(ij,i)=ax(ij,i)+rrd*(tvp(ij,j)-tv(ij,j)) ! cld 1691 : *(ph(ij,j)-ph(ij,j+1))/p(ij,j) ! cld 1692 enddo ! cld 1693 if (ax(ij,i).gt.0.0) then ! cld 1694 wa(ij,i)=sqrt(2.*ax(ij,i)) ! cld 1695 endif ! cld 1696 enddo ! cld 1697 do i=1,nl ! cld 1698 if (wa(ij,i).gt.0.0) ! cld 1699 : siga(ij,i)=mac(ij,i)/wa(ij,i) ! cld 1700 : *rrd*tvp(ij,i)/p(ij,i)/100./delta ! cld 1701 siga(ij,i) = min(siga(ij,i),1.0) ! cld 1702 qcondc(ij,i)=siga(ij,i)*clw(ij,i)*(1.-ep(ij,i)) ! cld 1703 : + (1.-siga(ij,i))*qcond(ij,i) ! cld 1704 enddo ! cld 1705 ENDDO ! cld 1706 1707 return 1708 end 1709 1710 SUBROUTINE cv_uncompress(nloc,len,ncum,nd,idcum 1711 : ,iflag 1712 : ,precip,cbmf 1713 : ,ft,fq,fu,fv 1714 : ,Ma,qcondc 1715 : ,iflag1 1716 : ,precip1,cbmf1 1717 : ,ft1,fq1,fu1,fv1 1718 : ,Ma1,qcondc1 1719 : ) 1720 implicit none 1721 1722 include "cvparam.h" 1723 1724 c inputs: 1725 integer len, ncum, nd, nloc 1726 integer idcum(nloc) 1727 integer iflag(nloc) 1728 real precip(nloc), cbmf(nloc) 1729 real ft(nloc,nd), fq(nloc,nd), fu(nloc,nd), fv(nloc,nd) 1730 real Ma(nloc,nd) 1731 real qcondc(nloc,nd) !cld 1732 1733 c outputs: 1734 integer iflag1(len) 1735 real precip1(len), cbmf1(len) 1736 real ft1(len,nd), fq1(len,nd), fu1(len,nd), fv1(len,nd) 1737 real Ma1(len,nd) 1738 real qcondc1(len,nd) !cld 1739 1740 c local variables: 1741 integer i,k 1742 1743 do 2000 i=1,ncum 1744 precip1(idcum(i))=precip(i) 1745 cbmf1(idcum(i))=cbmf(i) 1746 iflag1(idcum(i))=iflag(i) 1747 2000 continue 1748 1749 do 2020 k=1,nl 1750 do 2010 i=1,ncum 1751 ft1(idcum(i),k)=ft(i,k) 1752 fq1(idcum(i),k)=fq(i,k) 1753 fu1(idcum(i),k)=fu(i,k) 1754 fv1(idcum(i),k)=fv(i,k) 1755 Ma1(idcum(i),k)=Ma(i,k) 1756 qcondc1(idcum(i),k)=qcondc(i,k) 1757 2010 continue 1758 2020 continue 1759 1760 return 1761 end 1762 3 4 SUBROUTINE cv_param(nd) 5 IMPLICIT NONE 6 7 ! ------------------------------------------------------------ 8 ! Set parameters for convectL 9 ! (includes microphysical parameters and parameters that 10 ! control the rate of approach to quasi-equilibrium) 11 ! ------------------------------------------------------------ 12 13 ! *** ELCRIT IS THE AUTOCONVERSION THERSHOLD WATER CONTENT (gm/gm) *** 14 ! *** TLCRIT IS CRITICAL TEMPERATURE BELOW WHICH THE AUTO- *** 15 ! *** CONVERSION THRESHOLD IS ASSUMED TO BE ZERO *** 16 ! *** (THE AUTOCONVERSION THRESHOLD VARIES LINEARLY *** 17 ! *** BETWEEN 0 C AND TLCRIT) *** 18 ! *** ENTP IS THE COEFFICIENT OF MIXING IN THE ENTRAINMENT *** 19 ! *** FORMULATION *** 20 ! *** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT *** 21 ! *** SIGS IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE *** 22 ! *** OF CLOUD *** 23 ! *** OMTRAIN IS THE ASSUMED FALL SPEED (P/s) OF RAIN *** 24 ! *** OMTSNOW IS THE ASSUMED FALL SPEED (P/s) OF SNOW *** 25 ! *** COEFFR IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION *** 26 ! *** OF RAIN *** 27 ! *** COEFFS IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION *** 28 ! *** OF SNOW *** 29 ! *** CU IS THE COEFFICIENT GOVERNING CONVECTIVE MOMENTUM *** 30 ! *** TRANSPORT *** 31 ! *** DTMAX IS THE MAXIMUM NEGATIVE TEMPERATURE PERTURBATION *** 32 ! *** A LIFTED PARCEL IS ALLOWED TO HAVE BELOW ITS LFC *** 33 ! *** ALPHA AND DAMP ARE PARAMETERS THAT CONTROL THE RATE OF *** 34 ! *** APPROACH TO QUASI-EQUILIBRIUM *** 35 ! *** (THEIR STANDARD VALUES ARE 0.20 AND 0.1, RESPECTIVELY) *** 36 ! *** (DAMP MUST BE LESS THAN 1) *** 37 38 include "cvparam.h" 39 INTEGER nd 40 CHARACTER (LEN=20) :: modname = 'cv_routines' 41 CHARACTER (LEN=80) :: abort_message 42 43 ! noff: integer limit for convection (nd-noff) 44 ! minorig: First level of convection 45 46 noff = 2 47 minorig = 2 48 49 nl = nd - noff 50 nlp = nl + 1 51 nlm = nl - 1 52 53 elcrit = 0.0011 54 tlcrit = -55.0 55 entp = 1.5 56 sigs = 0.12 57 sigd = 0.05 58 omtrain = 50.0 59 omtsnow = 5.5 60 coeffr = 1.0 61 coeffs = 0.8 62 dtmax = 0.9 63 64 cu = 0.70 65 66 betad = 10.0 67 68 damp = 0.1 69 alpha = 0.2 70 71 delta = 0.01 ! cld 72 73 RETURN 74 END SUBROUTINE cv_param 75 76 SUBROUTINE cv_prelim(len, nd, ndp1, t, q, p, ph, lv, cpn, tv, gz, h, hm) 77 IMPLICIT NONE 78 79 ! ===================================================================== 80 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY 81 ! ===================================================================== 82 83 ! inputs: 84 INTEGER len, nd, ndp1 85 REAL t(len, nd), q(len, nd), p(len, nd), ph(len, ndp1) 86 87 ! outputs: 88 REAL lv(len, nd), cpn(len, nd), tv(len, nd) 89 REAL gz(len, nd), h(len, nd), hm(len, nd) 90 91 ! local variables: 92 INTEGER k, i 93 REAL cpx(len, nd) 94 95 include "cvthermo.h" 96 include "cvparam.h" 97 98 99 DO k = 1, nlp 100 DO i = 1, len 101 lv(i, k) = lv0 - clmcpv*(t(i,k)-t0) 102 cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k) 103 cpx(i, k) = cpd*(1.0-q(i,k)) + cl*q(i, k) 104 tv(i, k) = t(i, k)*(1.0+q(i,k)*epsim1) 105 END DO 106 END DO 107 108 ! gz = phi at the full levels (same as p). 109 110 DO i = 1, len 111 gz(i, 1) = 0.0 112 END DO 113 DO k = 2, nlp 114 DO i = 1, len 115 gz(i, k) = gz(i, k-1) + hrd*(tv(i,k-1)+tv(i,k))*(p(i,k-1)-p(i,k))/ph(i, & 116 k) 117 END DO 118 END DO 119 120 ! h = phi + cpT (dry static energy). 121 ! hm = phi + cp(T-Tbase)+Lq 122 123 DO k = 1, nlp 124 DO i = 1, len 125 h(i, k) = gz(i, k) + cpn(i, k)*t(i, k) 126 hm(i, k) = gz(i, k) + cpx(i, k)*(t(i,k)-t(i,1)) + lv(i, k)*q(i, k) 127 END DO 128 END DO 129 130 RETURN 131 END SUBROUTINE cv_prelim 132 133 SUBROUTINE cv_feed(len, nd, t, q, qs, p, hm, gz, nk, icb, icbmax, iflag, tnk, & 134 qnk, gznk, plcl) 135 IMPLICIT NONE 136 137 ! ================================================================ 138 ! Purpose: CONVECTIVE FEED 139 ! ================================================================ 140 141 include "cvparam.h" 142 143 ! inputs: 144 INTEGER len, nd 145 REAL t(len, nd), q(len, nd), qs(len, nd), p(len, nd) 146 REAL hm(len, nd), gz(len, nd) 147 148 ! outputs: 149 INTEGER iflag(len), nk(len), icb(len), icbmax 150 REAL tnk(len), qnk(len), gznk(len), plcl(len) 151 152 ! local variables: 153 INTEGER i, k 154 INTEGER ihmin(len) 155 REAL work(len) 156 REAL pnk(len), qsnk(len), rh(len), chi(len) 157 158 ! ------------------------------------------------------------------- 159 ! --- Find level of minimum moist static energy 160 ! --- If level of minimum moist static energy coincides with 161 ! --- or is lower than minimum allowable parcel origin level, 162 ! --- set iflag to 6. 163 ! ------------------------------------------------------------------- 164 165 DO i = 1, len 166 work(i) = 1.0E12 167 ihmin(i) = nl 168 END DO 169 DO k = 2, nlp 170 DO i = 1, len 171 IF ((hm(i,k)<work(i)) .AND. (hm(i,k)<hm(i,k-1))) THEN 172 work(i) = hm(i, k) 173 ihmin(i) = k 174 END IF 175 END DO 176 END DO 177 DO i = 1, len 178 ihmin(i) = min(ihmin(i), nlm) 179 IF (ihmin(i)<=minorig) THEN 180 iflag(i) = 6 181 END IF 182 END DO 183 184 ! ------------------------------------------------------------------- 185 ! --- Find that model level below the level of minimum moist static 186 ! --- energy that has the maximum value of moist static energy 187 ! ------------------------------------------------------------------- 188 189 DO i = 1, len 190 work(i) = hm(i, minorig) 191 nk(i) = minorig 192 END DO 193 DO k = minorig + 1, nl 194 DO i = 1, len 195 IF ((hm(i,k)>work(i)) .AND. (k<=ihmin(i))) THEN 196 work(i) = hm(i, k) 197 nk(i) = k 198 END IF 199 END DO 200 END DO 201 ! ------------------------------------------------------------------- 202 ! --- Check whether parcel level temperature and specific humidity 203 ! --- are reasonable 204 ! ------------------------------------------------------------------- 205 DO i = 1, len 206 IF (((t(i,nk(i))<250.0) .OR. (q(i,nk(i))<=0.0) .OR. (p(i,ihmin(i))< & 207 400.0)) .AND. (iflag(i)==0)) iflag(i) = 7 208 END DO 209 ! ------------------------------------------------------------------- 210 ! --- Calculate lifted condensation level of air at parcel origin level 211 ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980) 212 ! ------------------------------------------------------------------- 213 DO i = 1, len 214 tnk(i) = t(i, nk(i)) 215 qnk(i) = q(i, nk(i)) 216 gznk(i) = gz(i, nk(i)) 217 pnk(i) = p(i, nk(i)) 218 qsnk(i) = qs(i, nk(i)) 219 220 rh(i) = qnk(i)/qsnk(i) 221 rh(i) = min(1.0, rh(i)) 222 chi(i) = tnk(i)/(1669.0-122.0*rh(i)-tnk(i)) 223 plcl(i) = pnk(i)*(rh(i)**chi(i)) 224 IF (((plcl(i)<200.0) .OR. (plcl(i)>=2000.0)) .AND. (iflag(i)==0)) iflag(i & 225 ) = 8 226 END DO 227 ! ------------------------------------------------------------------- 228 ! --- Calculate first level above lcl (=icb) 229 ! ------------------------------------------------------------------- 230 DO i = 1, len 231 icb(i) = nlm 232 END DO 233 234 DO k = minorig, nl 235 DO i = 1, len 236 IF ((k>=(nk(i)+1)) .AND. (p(i,k)<plcl(i))) icb(i) = min(icb(i), k) 237 END DO 238 END DO 239 240 DO i = 1, len 241 IF ((icb(i)>=nlm) .AND. (iflag(i)==0)) iflag(i) = 9 242 END DO 243 244 ! Compute icbmax. 245 246 icbmax = 2 247 DO i = 1, len 248 icbmax = max(icbmax, icb(i)) 249 END DO 250 251 RETURN 252 END SUBROUTINE cv_feed 253 254 SUBROUTINE cv_undilute1(len, nd, t, q, qs, gz, p, nk, icb, icbmax, tp, tvp, & 255 clw) 256 IMPLICIT NONE 257 258 include "cvthermo.h" 259 include "cvparam.h" 260 261 ! inputs: 262 INTEGER len, nd 263 INTEGER nk(len), icb(len), icbmax 264 REAL t(len, nd), q(len, nd), qs(len, nd), gz(len, nd) 265 REAL p(len, nd) 266 267 ! outputs: 268 REAL tp(len, nd), tvp(len, nd), clw(len, nd) 269 270 ! local variables: 271 INTEGER i, k 272 REAL tg, qg, alv, s, ahg, tc, denom, es, rg 273 REAL ah0(len), cpp(len) 274 REAL tnk(len), qnk(len), gznk(len), ticb(len), gzicb(len) 275 276 ! ------------------------------------------------------------------- 277 ! --- Calculates the lifted parcel virtual temperature at nk, 278 ! --- the actual temperature, and the adiabatic 279 ! --- liquid water content. The procedure is to solve the equation. 280 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 281 ! ------------------------------------------------------------------- 282 283 DO i = 1, len 284 tnk(i) = t(i, nk(i)) 285 qnk(i) = q(i, nk(i)) 286 gznk(i) = gz(i, nk(i)) 287 ticb(i) = t(i, icb(i)) 288 gzicb(i) = gz(i, icb(i)) 289 END DO 290 291 ! *** Calculate certain parcel quantities, including static energy *** 292 293 DO i = 1, len 294 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- & 295 273.15)) + gznk(i) 296 cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv 297 END DO 298 299 ! *** Calculate lifted parcel quantities below cloud base *** 300 301 DO k = minorig, icbmax - 1 302 DO i = 1, len 303 tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))/cpp(i) 304 tvp(i, k) = tp(i, k)*(1.+qnk(i)*epsi) 305 END DO 306 END DO 307 308 ! *** Find lifted parcel quantities above cloud base *** 309 310 DO i = 1, len 311 tg = ticb(i) 312 qg = qs(i, icb(i)) 313 alv = lv0 - clmcpv*(ticb(i)-t0) 314 315 ! First iteration. 316 317 s = cpd + alv*alv*qg/(rrv*ticb(i)*ticb(i)) 318 s = 1./s 319 ahg = cpd*tg + (cl-cpd)*qnk(i)*ticb(i) + alv*qg + gzicb(i) 320 tg = tg + s*(ah0(i)-ahg) 321 tg = max(tg, 35.0) 322 tc = tg - t0 323 denom = 243.5 + tc 324 IF (tc>=0.0) THEN 325 es = 6.112*exp(17.67*tc/denom) 326 ELSE 327 es = exp(23.33086-6111.72784/tg+0.15215*log(tg)) 328 END IF 329 qg = eps*es/(p(i,icb(i))-es*(1.-eps)) 330 331 ! Second iteration. 332 333 s = cpd + alv*alv*qg/(rrv*ticb(i)*ticb(i)) 334 s = 1./s 335 ahg = cpd*tg + (cl-cpd)*qnk(i)*ticb(i) + alv*qg + gzicb(i) 336 tg = tg + s*(ah0(i)-ahg) 337 tg = max(tg, 35.0) 338 tc = tg - t0 339 denom = 243.5 + tc 340 IF (tc>=0.0) THEN 341 es = 6.112*exp(17.67*tc/denom) 342 ELSE 343 es = exp(23.33086-6111.72784/tg+0.15215*log(tg)) 344 END IF 345 qg = eps*es/(p(i,icb(i))-es*(1.-eps)) 346 347 alv = lv0 - clmcpv*(ticb(i)-273.15) 348 tp(i, icb(i)) = (ah0(i)-(cl-cpd)*qnk(i)*ticb(i)-gz(i,icb(i))-alv*qg)/cpd 349 clw(i, icb(i)) = qnk(i) - qg 350 clw(i, icb(i)) = max(0.0, clw(i,icb(i))) 351 rg = qg/(1.-qnk(i)) 352 tvp(i, icb(i)) = tp(i, icb(i))*(1.+rg*epsi) 353 END DO 354 355 DO k = minorig, icbmax 356 DO i = 1, len 357 tvp(i, k) = tvp(i, k) - tp(i, k)*qnk(i) 358 END DO 359 END DO 360 361 RETURN 362 END SUBROUTINE cv_undilute1 363 364 SUBROUTINE cv_trigger(len, nd, icb, cbmf, tv, tvp, iflag) 365 IMPLICIT NONE 366 367 ! ------------------------------------------------------------------- 368 ! --- Test for instability. 369 ! --- If there was no convection at last time step and parcel 370 ! --- is stable at icb, then set iflag to 4. 371 ! ------------------------------------------------------------------- 372 373 include "cvparam.h" 374 375 ! inputs: 376 INTEGER len, nd, icb(len) 377 REAL cbmf(len), tv(len, nd), tvp(len, nd) 378 379 ! outputs: 380 INTEGER iflag(len) ! also an input 381 382 ! local variables: 383 INTEGER i 384 385 386 DO i = 1, len 387 IF ((cbmf(i)==0.0) .AND. (iflag(i)==0) .AND. (tvp(i, & 388 icb(i))<=(tv(i,icb(i))-dtmax))) iflag(i) = 4 389 END DO 390 391 RETURN 392 END SUBROUTINE cv_trigger 393 394 SUBROUTINE cv_compress(len, nloc, ncum, nd, iflag1, nk1, icb1, cbmf1, plcl1, & 395 tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, cpn1, p1, ph1, tv1, & 396 tp1, tvp1, clw1, iflag, nk, icb, cbmf, plcl, tnk, qnk, gznk, t, q, qs, u, & 397 v, gz, h, lv, cpn, p, ph, tv, tp, tvp, clw, dph) 398 IMPLICIT NONE 399 400 include "cvparam.h" 401 402 ! inputs: 403 INTEGER len, ncum, nd, nloc 404 INTEGER iflag1(len), nk1(len), icb1(len) 405 REAL cbmf1(len), plcl1(len), tnk1(len), qnk1(len), gznk1(len) 406 REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd) 407 REAL gz1(len, nd), h1(len, nd), lv1(len, nd), cpn1(len, nd) 408 REAL p1(len, nd), ph1(len, nd+1), tv1(len, nd), tp1(len, nd) 409 REAL tvp1(len, nd), clw1(len, nd) 410 411 ! outputs: 412 INTEGER iflag(nloc), nk(nloc), icb(nloc) 413 REAL cbmf(nloc), plcl(nloc), tnk(nloc), qnk(nloc), gznk(nloc) 414 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), u(nloc, nd), v(nloc, nd) 415 REAL gz(nloc, nd), h(nloc, nd), lv(nloc, nd), cpn(nloc, nd) 416 REAL p(nloc, nd), ph(nloc, nd+1), tv(nloc, nd), tp(nloc, nd) 417 REAL tvp(nloc, nd), clw(nloc, nd) 418 REAL dph(nloc, nd) 419 420 ! local variables: 421 INTEGER i, k, nn 422 CHARACTER (LEN=20) :: modname = 'cv_compress' 423 CHARACTER (LEN=80) :: abort_message 424 425 include 'iniprint.h' 426 427 428 DO k = 1, nl + 1 429 nn = 0 430 DO i = 1, len 431 IF (iflag1(i)==0) THEN 432 nn = nn + 1 433 t(nn, k) = t1(i, k) 434 q(nn, k) = q1(i, k) 435 qs(nn, k) = qs1(i, k) 436 u(nn, k) = u1(i, k) 437 v(nn, k) = v1(i, k) 438 gz(nn, k) = gz1(i, k) 439 h(nn, k) = h1(i, k) 440 lv(nn, k) = lv1(i, k) 441 cpn(nn, k) = cpn1(i, k) 442 p(nn, k) = p1(i, k) 443 ph(nn, k) = ph1(i, k) 444 tv(nn, k) = tv1(i, k) 445 tp(nn, k) = tp1(i, k) 446 tvp(nn, k) = tvp1(i, k) 447 clw(nn, k) = clw1(i, k) 448 END IF 449 END DO 450 END DO 451 452 IF (nn/=ncum) THEN 453 WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum 454 abort_message = '' 455 CALL abort_gcm(modname, abort_message, 1) 456 END IF 457 458 nn = 0 459 DO i = 1, len 460 IF (iflag1(i)==0) THEN 461 nn = nn + 1 462 cbmf(nn) = cbmf1(i) 463 plcl(nn) = plcl1(i) 464 tnk(nn) = tnk1(i) 465 qnk(nn) = qnk1(i) 466 gznk(nn) = gznk1(i) 467 nk(nn) = nk1(i) 468 icb(nn) = icb1(i) 469 iflag(nn) = iflag1(i) 470 END IF 471 END DO 472 473 DO k = 1, nl 474 DO i = 1, ncum 475 dph(i, k) = ph(i, k) - ph(i, k+1) 476 END DO 477 END DO 478 479 RETURN 480 END SUBROUTINE cv_compress 481 482 SUBROUTINE cv_undilute2(nloc, ncum, nd, icb, nk, tnk, qnk, gznk, t, q, qs, & 483 gz, p, dph, h, tv, lv, inb, inb1, tp, tvp, clw, hp, ep, sigp, frac) 484 IMPLICIT NONE 485 486 ! --------------------------------------------------------------------- 487 ! Purpose: 488 ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 489 ! & 490 ! COMPUTE THE PRECIPITATION EFFICIENCIES AND THE 491 ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD 492 ! & 493 ! FIND THE LEVEL OF NEUTRAL BUOYANCY 494 ! --------------------------------------------------------------------- 495 496 include "cvthermo.h" 497 include "cvparam.h" 498 499 ! inputs: 500 INTEGER ncum, nd, nloc 501 INTEGER icb(nloc), nk(nloc) 502 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), gz(nloc, nd) 503 REAL p(nloc, nd), dph(nloc, nd) 504 REAL tnk(nloc), qnk(nloc), gznk(nloc) 505 REAL lv(nloc, nd), tv(nloc, nd), h(nloc, nd) 506 507 ! outputs: 508 INTEGER inb(nloc), inb1(nloc) 509 REAL tp(nloc, nd), tvp(nloc, nd), clw(nloc, nd) 510 REAL ep(nloc, nd), sigp(nloc, nd), hp(nloc, nd) 511 REAL frac(nloc) 512 513 ! local variables: 514 INTEGER i, k 515 REAL tg, qg, ahg, alv, s, tc, es, denom, rg, tca, elacrit 516 REAL by, defrac 517 REAL ah0(nloc), cape(nloc), capem(nloc), byp(nloc) 518 LOGICAL lcape(nloc) 519 520 ! ===================================================================== 521 ! --- SOME INITIALIZATIONS 522 ! ===================================================================== 523 524 DO k = 1, nl 525 DO i = 1, ncum 526 ep(i, k) = 0.0 527 sigp(i, k) = sigs 528 END DO 529 END DO 530 531 ! ===================================================================== 532 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 533 ! ===================================================================== 534 535 ! --- The procedure is to solve the equation. 536 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 537 538 ! *** Calculate certain parcel quantities, including static energy *** 539 540 541 DO i = 1, ncum 542 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- & 543 t0)) + gznk(i) 544 END DO 545 546 547 ! *** Find lifted parcel quantities above cloud base *** 548 549 550 DO k = minorig + 1, nl 551 DO i = 1, ncum 552 IF (k>=(icb(i)+1)) THEN 553 tg = t(i, k) 554 qg = qs(i, k) 555 alv = lv0 - clmcpv*(t(i,k)-t0) 556 557 ! First iteration. 558 559 s = cpd + alv*alv*qg/(rrv*t(i,k)*t(i,k)) 560 s = 1./s 561 ahg = cpd*tg + (cl-cpd)*qnk(i)*t(i, k) + alv*qg + gz(i, k) 562 tg = tg + s*(ah0(i)-ahg) 563 tg = max(tg, 35.0) 564 tc = tg - t0 565 denom = 243.5 + tc 566 IF (tc>=0.0) THEN 567 es = 6.112*exp(17.67*tc/denom) 568 ELSE 569 es = exp(23.33086-6111.72784/tg+0.15215*log(tg)) 570 END IF 571 qg = eps*es/(p(i,k)-es*(1.-eps)) 572 573 ! Second iteration. 574 575 s = cpd + alv*alv*qg/(rrv*t(i,k)*t(i,k)) 576 s = 1./s 577 ahg = cpd*tg + (cl-cpd)*qnk(i)*t(i, k) + alv*qg + gz(i, k) 578 tg = tg + s*(ah0(i)-ahg) 579 tg = max(tg, 35.0) 580 tc = tg - t0 581 denom = 243.5 + tc 582 IF (tc>=0.0) THEN 583 es = 6.112*exp(17.67*tc/denom) 584 ELSE 585 es = exp(23.33086-6111.72784/tg+0.15215*log(tg)) 586 END IF 587 qg = eps*es/(p(i,k)-es*(1.-eps)) 588 589 alv = lv0 - clmcpv*(t(i,k)-t0) 590 ! print*,'cpd dans convect2 ',cpd 591 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd' 592 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd 593 tp(i, k) = (ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd 594 ! if (.not.cpd.gt.1000.) then 595 ! print*,'CPD=',cpd 596 ! stop 597 ! endif 598 clw(i, k) = qnk(i) - qg 599 clw(i, k) = max(0.0, clw(i,k)) 600 rg = qg/(1.-qnk(i)) 601 tvp(i, k) = tp(i, k)*(1.+rg*epsi) 602 END IF 603 END DO 604 END DO 605 606 ! ===================================================================== 607 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF 608 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD 609 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I) 610 ! ===================================================================== 611 612 DO k = minorig + 1, nl 613 DO i = 1, ncum 614 IF (k>=(nk(i)+1)) THEN 615 tca = tp(i, k) - t0 616 IF (tca>=0.0) THEN 617 elacrit = elcrit 618 ELSE 619 elacrit = elcrit*(1.0-tca/tlcrit) 620 END IF 621 elacrit = max(elacrit, 0.0) 622 ep(i, k) = 1.0 - elacrit/max(clw(i,k), 1.0E-8) 623 ep(i, k) = max(ep(i,k), 0.0) 624 ep(i, k) = min(ep(i,k), 1.0) 625 sigp(i, k) = sigs 626 END IF 627 END DO 628 END DO 629 630 ! ===================================================================== 631 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL 632 ! --- VIRTUAL TEMPERATURE 633 ! ===================================================================== 634 635 DO k = minorig + 1, nl 636 DO i = 1, ncum 637 IF (k>=(icb(i)+1)) THEN 638 tvp(i, k) = tvp(i, k)*(1.0-qnk(i)+ep(i,k)*clw(i,k)) 639 ! print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)' 640 ! print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k) 641 END IF 642 END DO 643 END DO 644 DO i = 1, ncum 645 tvp(i, nlp) = tvp(i, nl) - (gz(i,nlp)-gz(i,nl))/cpd 646 END DO 647 648 ! ===================================================================== 649 ! --- FIND THE FIRST MODEL LEVEL (INB1) ABOVE THE PARCEL'S 650 ! --- HIGHEST LEVEL OF NEUTRAL BUOYANCY 651 ! --- AND THE HIGHEST LEVEL OF POSITIVE CAPE (INB) 652 ! ===================================================================== 653 654 DO i = 1, ncum 655 cape(i) = 0.0 656 capem(i) = 0.0 657 inb(i) = icb(i) + 1 658 inb1(i) = inb(i) 659 END DO 660 661 ! Originial Code 662 663 ! do 530 k=minorig+1,nl-1 664 ! do 520 i=1,ncum 665 ! if(k.ge.(icb(i)+1))then 666 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 667 ! byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 668 ! cape(i)=cape(i)+by 669 ! if(by.ge.0.0)inb1(i)=k+1 670 ! if(cape(i).gt.0.0)then 671 ! inb(i)=k+1 672 ! capem(i)=cape(i) 673 ! endif 674 ! endif 675 ! 520 continue 676 ! 530 continue 677 ! do 540 i=1,ncum 678 ! byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl) 679 ! cape(i)=capem(i)+byp 680 ! defrac=capem(i)-cape(i) 681 ! defrac=max(defrac,0.001) 682 ! frac(i)=-cape(i)/defrac 683 ! frac(i)=min(frac(i),1.0) 684 ! frac(i)=max(frac(i),0.0) 685 ! 540 continue 686 687 ! K Emanuel fix 688 689 ! call zilch(byp,ncum) 690 ! do 530 k=minorig+1,nl-1 691 ! do 520 i=1,ncum 692 ! if(k.ge.(icb(i)+1))then 693 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 694 ! cape(i)=cape(i)+by 695 ! if(by.ge.0.0)inb1(i)=k+1 696 ! if(cape(i).gt.0.0)then 697 ! inb(i)=k+1 698 ! capem(i)=cape(i) 699 ! byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 700 ! endif 701 ! endif 702 ! 520 continue 703 ! 530 continue 704 ! do 540 i=1,ncum 705 ! inb(i)=max(inb(i),inb1(i)) 706 ! cape(i)=capem(i)+byp(i) 707 ! defrac=capem(i)-cape(i) 708 ! defrac=max(defrac,0.001) 709 ! frac(i)=-cape(i)/defrac 710 ! frac(i)=min(frac(i),1.0) 711 ! frac(i)=max(frac(i),0.0) 712 ! 540 continue 713 714 ! J Teixeira fix 715 716 CALL zilch(byp, ncum) 717 DO i = 1, ncum 718 lcape(i) = .TRUE. 719 END DO 720 DO k = minorig + 1, nl - 1 721 DO i = 1, ncum 722 IF (cape(i)<0.0) lcape(i) = .FALSE. 723 IF ((k>=(icb(i)+1)) .AND. lcape(i)) THEN 724 by = (tvp(i,k)-tv(i,k))*dph(i, k)/p(i, k) 725 byp(i) = (tvp(i,k+1)-tv(i,k+1))*dph(i, k+1)/p(i, k+1) 726 cape(i) = cape(i) + by 727 IF (by>=0.0) inb1(i) = k + 1 728 IF (cape(i)>0.0) THEN 729 inb(i) = k + 1 730 capem(i) = cape(i) 731 END IF 732 END IF 733 END DO 734 END DO 735 DO i = 1, ncum 736 cape(i) = capem(i) + byp(i) 737 defrac = capem(i) - cape(i) 738 defrac = max(defrac, 0.001) 739 frac(i) = -cape(i)/defrac 740 frac(i) = min(frac(i), 1.0) 741 frac(i) = max(frac(i), 0.0) 742 END DO 743 744 ! ===================================================================== 745 ! --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL 746 ! ===================================================================== 747 748 ! initialization: 749 DO i = 1, ncum*nlp 750 hp(i, 1) = h(i, 1) 751 END DO 752 753 DO k = minorig + 1, nl 754 DO i = 1, ncum 755 IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN 756 hp(i, k) = h(i, nk(i)) + (lv(i,k)+(cpd-cpv)*t(i,k))*ep(i, k)*clw(i, k & 757 ) 758 END IF 759 END DO 760 END DO 761 762 RETURN 763 END SUBROUTINE cv_undilute2 764 765 SUBROUTINE cv_closure(nloc, ncum, nd, nk, icb, tv, tvp, p, ph, dph, plcl, & 766 cpn, iflag, cbmf) 767 IMPLICIT NONE 768 769 ! inputs: 770 INTEGER ncum, nd, nloc 771 INTEGER nk(nloc), icb(nloc) 772 REAL tv(nloc, nd), tvp(nloc, nd), p(nloc, nd), dph(nloc, nd) 773 REAL ph(nloc, nd+1) ! caution nd instead ndp1 to be consistent... 774 REAL plcl(nloc), cpn(nloc, nd) 775 776 ! outputs: 777 INTEGER iflag(nloc) 778 REAL cbmf(nloc) ! also an input 779 780 ! local variables: 781 INTEGER i, k, icbmax 782 REAL dtpbl(nloc), dtmin(nloc), tvpplcl(nloc), tvaplcl(nloc) 783 REAL work(nloc) 784 785 include "cvthermo.h" 786 include "cvparam.h" 787 788 ! ------------------------------------------------------------------- 789 ! Compute icbmax. 790 ! ------------------------------------------------------------------- 791 792 icbmax = 2 793 DO i = 1, ncum 794 icbmax = max(icbmax, icb(i)) 795 END DO 796 797 ! ===================================================================== 798 ! --- CALCULATE CLOUD BASE MASS FLUX 799 ! ===================================================================== 800 801 ! tvpplcl = parcel temperature lifted adiabatically from level 802 ! icb-1 to the LCL. 803 ! tvaplcl = virtual temperature at the LCL. 804 805 DO i = 1, ncum 806 dtpbl(i) = 0.0 807 tvpplcl(i) = tvp(i, icb(i)-1) - rrd*tvp(i, icb(i)-1)*(p(i,icb(i)-1)-plcl( & 808 i))/(cpn(i,icb(i)-1)*p(i,icb(i)-1)) 809 tvaplcl(i) = tv(i, icb(i)) + (tvp(i,icb(i))-tvp(i,icb(i)+1))*(plcl(i)-p(i & 810 ,icb(i)))/(p(i,icb(i))-p(i,icb(i)+1)) 811 END DO 812 813 ! ------------------------------------------------------------------- 814 ! --- Interpolate difference between lifted parcel and 815 ! --- environmental temperatures to lifted condensation level 816 ! ------------------------------------------------------------------- 817 818 ! dtpbl = average of tvp-tv in the PBL (k=nk to icb-1). 819 820 DO k = minorig, icbmax 821 DO i = 1, ncum 822 IF ((k>=nk(i)) .AND. (k<=(icb(i)-1))) THEN 823 dtpbl(i) = dtpbl(i) + (tvp(i,k)-tv(i,k))*dph(i, k) 824 END IF 825 END DO 826 END DO 827 DO i = 1, ncum 828 dtpbl(i) = dtpbl(i)/(ph(i,nk(i))-ph(i,icb(i))) 829 dtmin(i) = tvpplcl(i) - tvaplcl(i) + dtmax + dtpbl(i) 830 END DO 831 832 ! ------------------------------------------------------------------- 833 ! --- Adjust cloud base mass flux 834 ! ------------------------------------------------------------------- 835 836 DO i = 1, ncum 837 work(i) = cbmf(i) 838 cbmf(i) = max(0.0, (1.0-damp)*cbmf(i)+0.1*alpha*dtmin(i)) 839 IF ((work(i)==0.0) .AND. (cbmf(i)==0.0)) THEN 840 iflag(i) = 3 841 END IF 842 END DO 843 844 RETURN 845 END SUBROUTINE cv_closure 846 847 SUBROUTINE cv_mixing(nloc, ncum, nd, icb, nk, inb, inb1, ph, t, q, qs, u, v, & 848 h, lv, qnk, hp, tv, tvp, ep, clw, cbmf, m, ment, qent, uent, vent, nent, & 849 sij, elij) 850 IMPLICIT NONE 851 852 include "cvthermo.h" 853 include "cvparam.h" 854 855 ! inputs: 856 INTEGER ncum, nd, nloc 857 INTEGER icb(nloc), inb(nloc), inb1(nloc), nk(nloc) 858 REAL cbmf(nloc), qnk(nloc) 859 REAL ph(nloc, nd+1) 860 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), lv(nloc, nd) 861 REAL u(nloc, nd), v(nloc, nd), h(nloc, nd), hp(nloc, nd) 862 REAL tv(nloc, nd), tvp(nloc, nd), ep(nloc, nd), clw(nloc, nd) 863 864 ! outputs: 865 INTEGER nent(nloc, nd) 866 REAL m(nloc, nd), ment(nloc, nd, nd), qent(nloc, nd, nd) 867 REAL uent(nloc, nd, nd), vent(nloc, nd, nd) 868 REAL sij(nloc, nd, nd), elij(nloc, nd, nd) 869 870 ! local variables: 871 INTEGER i, j, k, ij 872 INTEGER num1, num2 873 REAL dbo, qti, bf2, anum, denom, dei, altem, cwat, stemp 874 REAL alt, qp1, smid, sjmin, sjmax, delp, delm 875 REAL work(nloc), asij(nloc), smin(nloc), scrit(nloc) 876 REAL bsum(nloc, nd) 877 LOGICAL lwork(nloc) 878 879 ! ===================================================================== 880 ! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS 881 ! ===================================================================== 882 883 DO i = 1, ncum*nlp 884 nent(i, 1) = 0 885 m(i, 1) = 0.0 886 END DO 887 888 DO k = 1, nlp 889 DO j = 1, nlp 890 DO i = 1, ncum 891 qent(i, k, j) = q(i, j) 892 uent(i, k, j) = u(i, j) 893 vent(i, k, j) = v(i, j) 894 elij(i, k, j) = 0.0 895 ment(i, k, j) = 0.0 896 sij(i, k, j) = 0.0 897 END DO 898 END DO 899 END DO 900 901 ! ------------------------------------------------------------------- 902 ! --- Calculate rates of mixing, m(i) 903 ! ------------------------------------------------------------------- 904 905 CALL zilch(work, ncum) 906 907 DO j = minorig + 1, nl 908 DO i = 1, ncum 909 IF ((j>=(icb(i)+1)) .AND. (j<=inb(i))) THEN 910 k = min(j, inb1(i)) 911 dbo = abs(tv(i,k+1)-tvp(i,k+1)-tv(i,k-1)+tvp(i,k-1)) + & 912 entp*0.04*(ph(i,k)-ph(i,k+1)) 913 work(i) = work(i) + dbo 914 m(i, j) = cbmf(i)*dbo 915 END IF 916 END DO 917 END DO 918 DO k = minorig + 1, nl 919 DO i = 1, ncum 920 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i))) THEN 921 m(i, k) = m(i, k)/work(i) 922 END IF 923 END DO 924 END DO 925 926 927 ! ===================================================================== 928 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING 929 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING 930 ! --- FRACTION (sij) 931 ! ===================================================================== 932 933 934 DO i = minorig + 1, nl 935 DO j = minorig + 1, nl 936 DO ij = 1, ncum 937 IF ((i>=(icb(ij)+1)) .AND. (j>=icb(ij)) .AND. (i<=inb(ij)) .AND. (j<= & 938 inb(ij))) THEN 939 qti = qnk(ij) - ep(ij, i)*clw(ij, i) 940 bf2 = 1. + lv(ij, j)*lv(ij, j)*qs(ij, j)/(rrv*t(ij,j)*t(ij,j)*cpd) 941 anum = h(ij, j) - hp(ij, i) + (cpv-cpd)*t(ij, j)*(qti-q(ij,j)) 942 denom = h(ij, i) - hp(ij, i) + (cpd-cpv)*(q(ij,i)-qti)*t(ij, j) 943 dei = denom 944 IF (abs(dei)<0.01) dei = 0.01 945 sij(ij, i, j) = anum/dei 946 sij(ij, i, i) = 1.0 947 altem = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti - qs(ij, j) 948 altem = altem/bf2 949 cwat = clw(ij, j)*(1.-ep(ij,j)) 950 stemp = sij(ij, i, j) 951 IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN 952 anum = anum - lv(ij, j)*(qti-qs(ij,j)-cwat*bf2) 953 denom = denom + lv(ij, j)*(q(ij,i)-qti) 954 IF (abs(denom)<0.01) denom = 0.01 955 sij(ij, i, j) = anum/denom 956 altem = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti - qs(ij, j) 957 altem = altem - (bf2-1.)*cwat 958 END IF 959 IF (sij(ij,i,j)>0.0 .AND. sij(ij,i,j)<0.9) THEN 960 qent(ij, i, j) = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti 961 uent(ij, i, j) = sij(ij, i, j)*u(ij, i) + & 962 (1.-sij(ij,i,j))*u(ij, nk(ij)) 963 vent(ij, i, j) = sij(ij, i, j)*v(ij, i) + & 964 (1.-sij(ij,i,j))*v(ij, nk(ij)) 965 elij(ij, i, j) = altem 966 elij(ij, i, j) = max(0.0, elij(ij,i,j)) 967 ment(ij, i, j) = m(ij, i)/(1.-sij(ij,i,j)) 968 nent(ij, i) = nent(ij, i) + 1 969 END IF 970 sij(ij, i, j) = max(0.0, sij(ij,i,j)) 971 sij(ij, i, j) = min(1.0, sij(ij,i,j)) 972 END IF 973 END DO 974 END DO 975 976 ! *** If no air can entrain at level i assume that updraft detrains 977 ! *** 978 ! *** at that level and calculate detrained air flux and properties 979 ! *** 980 981 DO ij = 1, ncum 982 IF ((i>=(icb(ij)+1)) .AND. (i<=inb(ij)) .AND. (nent(ij,i)==0)) THEN 983 ment(ij, i, i) = m(ij, i) 984 qent(ij, i, i) = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i) 985 uent(ij, i, i) = u(ij, nk(ij)) 986 vent(ij, i, i) = v(ij, nk(ij)) 987 elij(ij, i, i) = clw(ij, i) 988 sij(ij, i, i) = 1.0 989 END IF 990 END DO 991 END DO 992 993 DO i = 1, ncum 994 sij(i, inb(i), inb(i)) = 1.0 995 END DO 996 997 ! ===================================================================== 998 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES 999 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING 1000 ! ===================================================================== 1001 1002 CALL zilch(bsum, ncum*nlp) 1003 DO ij = 1, ncum 1004 lwork(ij) = .FALSE. 1005 END DO 1006 DO i = minorig + 1, nl 1007 1008 num1 = 0 1009 DO ij = 1, ncum 1010 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) num1 = num1 + 1 1011 END DO 1012 IF (num1<=0) GO TO 789 1013 1014 DO ij = 1, ncum 1015 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) THEN 1016 lwork(ij) = (nent(ij,i)/=0) 1017 qp1 = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i) 1018 anum = h(ij, i) - hp(ij, i) - lv(ij, i)*(qp1-qs(ij,i)) 1019 denom = h(ij, i) - hp(ij, i) + lv(ij, i)*(q(ij,i)-qp1) 1020 IF (abs(denom)<0.01) denom = 0.01 1021 scrit(ij) = anum/denom 1022 alt = qp1 - qs(ij, i) + scrit(ij)*(q(ij,i)-qp1) 1023 IF (scrit(ij)<0.0 .OR. alt<0.0) scrit(ij) = 1.0 1024 asij(ij) = 0.0 1025 smin(ij) = 1.0 1026 END IF 1027 END DO 1028 DO j = minorig, nl 1029 1030 num2 = 0 1031 DO ij = 1, ncum 1032 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( & 1033 ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) num2 = num2 + 1 1034 END DO 1035 IF (num2<=0) GO TO 783 1036 1037 DO ij = 1, ncum 1038 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( & 1039 ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) THEN 1040 IF (sij(ij,i,j)>0.0 .AND. sij(ij,i,j)<0.9) THEN 1041 IF (j>i) THEN 1042 smid = min(sij(ij,i,j), scrit(ij)) 1043 sjmax = smid 1044 sjmin = smid 1045 IF (smid<smin(ij) .AND. sij(ij,i,j+1)<smid) THEN 1046 smin(ij) = smid 1047 sjmax = min(sij(ij,i,j+1), sij(ij,i,j), scrit(ij)) 1048 sjmin = max(sij(ij,i,j-1), sij(ij,i,j)) 1049 sjmin = min(sjmin, scrit(ij)) 1050 END IF 1051 ELSE 1052 sjmax = max(sij(ij,i,j+1), scrit(ij)) 1053 smid = max(sij(ij,i,j), scrit(ij)) 1054 sjmin = 0.0 1055 IF (j>1) sjmin = sij(ij, i, j-1) 1056 sjmin = max(sjmin, scrit(ij)) 1057 END IF 1058 delp = abs(sjmax-smid) 1059 delm = abs(sjmin-smid) 1060 asij(ij) = asij(ij) + (delp+delm)*(ph(ij,j)-ph(ij,j+1)) 1061 ment(ij, i, j) = ment(ij, i, j)*(delp+delm)*(ph(ij,j)-ph(ij,j+1)) 1062 END IF 1063 END IF 1064 END DO 1065 783 END DO 1066 DO ij = 1, ncum 1067 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. lwork(ij)) THEN 1068 asij(ij) = max(1.0E-21, asij(ij)) 1069 asij(ij) = 1.0/asij(ij) 1070 bsum(ij, i) = 0.0 1071 END IF 1072 END DO 1073 DO j = minorig, nl + 1 1074 DO ij = 1, ncum 1075 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( & 1076 ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) THEN 1077 ment(ij, i, j) = ment(ij, i, j)*asij(ij) 1078 bsum(ij, i) = bsum(ij, i) + ment(ij, i, j) 1079 END IF 1080 END DO 1081 END DO 1082 DO ij = 1, ncum 1083 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (bsum(ij, & 1084 i)<1.0E-18) .AND. lwork(ij)) THEN 1085 nent(ij, i) = 0 1086 ment(ij, i, i) = m(ij, i) 1087 qent(ij, i, i) = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i) 1088 uent(ij, i, i) = u(ij, nk(ij)) 1089 vent(ij, i, i) = v(ij, nk(ij)) 1090 elij(ij, i, i) = clw(ij, i) 1091 sij(ij, i, i) = 1.0 1092 END IF 1093 END DO 1094 789 END DO 1095 1096 RETURN 1097 END SUBROUTINE cv_mixing 1098 1099 SUBROUTINE cv_unsat(nloc, ncum, nd, inb, t, q, qs, gz, u, v, p, ph, h, lv, & 1100 ep, sigp, clw, m, ment, elij, iflag, mp, qp, up, vp, wt, water, evap) 1101 IMPLICIT NONE 1102 1103 1104 include "cvthermo.h" 1105 include "cvparam.h" 1106 1107 ! inputs: 1108 INTEGER ncum, nd, nloc 1109 INTEGER inb(nloc) 1110 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd) 1111 REAL gz(nloc, nd), u(nloc, nd), v(nloc, nd) 1112 REAL p(nloc, nd), ph(nloc, nd+1), h(nloc, nd) 1113 REAL lv(nloc, nd), ep(nloc, nd), sigp(nloc, nd), clw(nloc, nd) 1114 REAL m(nloc, nd), ment(nloc, nd, nd), elij(nloc, nd, nd) 1115 1116 ! outputs: 1117 INTEGER iflag(nloc) ! also an input 1118 REAL mp(nloc, nd), qp(nloc, nd), up(nloc, nd), vp(nloc, nd) 1119 REAL water(nloc, nd), evap(nloc, nd), wt(nloc, nd) 1120 1121 ! local variables: 1122 INTEGER i, j, k, ij, num1 1123 INTEGER jtt(nloc) 1124 REAL awat, coeff, qsm, afac, sigt, b6, c6, revap 1125 REAL dhdp, fac, qstm, rat 1126 REAL wdtrain(nloc) 1127 LOGICAL lwork(nloc) 1128 1129 ! ===================================================================== 1130 ! --- PRECIPITATING DOWNDRAFT CALCULATION 1131 ! ===================================================================== 1132 1133 ! Initializations: 1134 1135 DO i = 1, ncum 1136 DO k = 1, nl + 1 1137 wt(i, k) = omtsnow 1138 mp(i, k) = 0.0 1139 evap(i, k) = 0.0 1140 water(i, k) = 0.0 1141 END DO 1142 END DO 1143 1144 DO i = 1, ncum 1145 qp(i, 1) = q(i, 1) 1146 up(i, 1) = u(i, 1) 1147 vp(i, 1) = v(i, 1) 1148 END DO 1149 1150 DO k = 2, nl + 1 1151 DO i = 1, ncum 1152 qp(i, k) = q(i, k-1) 1153 up(i, k) = u(i, k-1) 1154 vp(i, k) = v(i, k-1) 1155 END DO 1156 END DO 1157 1158 1159 ! *** Check whether ep(inb)=0, if so, skip precipitating *** 1160 ! *** downdraft calculation *** 1161 1162 1163 ! *** Integrate liquid water equation to find condensed water *** 1164 ! *** and condensed water flux *** 1165 1166 1167 DO i = 1, ncum 1168 jtt(i) = 2 1169 IF (ep(i,inb(i))<=0.0001) iflag(i) = 2 1170 IF (iflag(i)==0) THEN 1171 lwork(i) = .TRUE. 1172 ELSE 1173 lwork(i) = .FALSE. 1174 END IF 1175 END DO 1176 1177 ! *** Begin downdraft loop *** 1178 1179 1180 CALL zilch(wdtrain, ncum) 1181 DO i = nl + 1, 1, -1 1182 1183 num1 = 0 1184 DO ij = 1, ncum 1185 IF ((i<=inb(ij)) .AND. lwork(ij)) num1 = num1 + 1 1186 END DO 1187 IF (num1<=0) GO TO 899 1188 1189 1190 ! *** Calculate detrained precipitation *** 1191 1192 DO ij = 1, ncum 1193 IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN 1194 wdtrain(ij) = g*ep(ij, i)*m(ij, i)*clw(ij, i) 1195 END IF 1196 END DO 1197 1198 IF (i>1) THEN 1199 DO j = 1, i - 1 1200 DO ij = 1, ncum 1201 IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN 1202 awat = elij(ij, j, i) - (1.-ep(ij,i))*clw(ij, i) 1203 awat = max(0.0, awat) 1204 wdtrain(ij) = wdtrain(ij) + g*awat*ment(ij, j, i) 1205 END IF 1206 END DO 1207 END DO 1208 END IF 1209 1210 ! *** Find rain water and evaporation using provisional *** 1211 ! *** estimates of qp(i)and qp(i-1) *** 1212 1213 1214 ! *** Value of terminal velocity and coeffecient of evaporation for snow 1215 ! *** 1216 1217 DO ij = 1, ncum 1218 IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN 1219 coeff = coeffs 1220 wt(ij, i) = omtsnow 1221 1222 ! *** Value of terminal velocity and coeffecient of evaporation for 1223 ! rain *** 1224 1225 IF (t(ij,i)>273.0) THEN 1226 coeff = coeffr 1227 wt(ij, i) = omtrain 1228 END IF 1229 qsm = 0.5*(q(ij,i)+qp(ij,i+1)) 1230 afac = coeff*ph(ij, i)*(qs(ij,i)-qsm)/(1.0E4+2.0E3*ph(ij,i)*qs(ij,i)) 1231 afac = max(afac, 0.0) 1232 sigt = sigp(ij, i) 1233 sigt = max(0.0, sigt) 1234 sigt = min(1.0, sigt) 1235 b6 = 100.*(ph(ij,i)-ph(ij,i+1))*sigt*afac/wt(ij, i) 1236 c6 = (water(ij,i+1)*wt(ij,i+1)+wdtrain(ij)/sigd)/wt(ij, i) 1237 revap = 0.5*(-b6+sqrt(b6*b6+4.*c6)) 1238 evap(ij, i) = sigt*afac*revap 1239 water(ij, i) = revap*revap 1240 1241 ! *** Calculate precipitating downdraft mass flux under *** 1242 ! *** hydrostatic approximation *** 1243 1244 IF (i>1) THEN 1245 dhdp = (h(ij,i)-h(ij,i-1))/(p(ij,i-1)-p(ij,i)) 1246 dhdp = max(dhdp, 10.0) 1247 mp(ij, i) = 100.*ginv*lv(ij, i)*sigd*evap(ij, i)/dhdp 1248 mp(ij, i) = max(mp(ij,i), 0.0) 1249 1250 ! *** Add small amount of inertia to downdraft *** 1251 1252 fac = 20.0/(ph(ij,i-1)-ph(ij,i)) 1253 mp(ij, i) = (fac*mp(ij,i+1)+mp(ij,i))/(1.+fac) 1254 1255 ! *** Force mp to decrease linearly to zero 1256 ! *** 1257 ! *** between about 950 mb and the surface 1258 ! *** 1259 1260 IF (p(ij,i)>(0.949*p(ij,1))) THEN 1261 jtt(ij) = max(jtt(ij), i) 1262 mp(ij, i) = mp(ij, jtt(ij))*(p(ij,1)-p(ij,i))/ & 1263 (p(ij,1)-p(ij,jtt(ij))) 1264 END IF 1265 END IF 1266 1267 ! *** Find mixing ratio of precipitating downdraft *** 1268 1269 IF (i/=inb(ij)) THEN 1270 IF (i==1) THEN 1271 qstm = qs(ij, 1) 1272 ELSE 1273 qstm = qs(ij, i-1) 1274 END IF 1275 IF (mp(ij,i)>mp(ij,i+1)) THEN 1276 rat = mp(ij, i+1)/mp(ij, i) 1277 qp(ij, i) = qp(ij, i+1)*rat + q(ij, i)*(1.0-rat) + & 1278 100.*ginv*sigd*(ph(ij,i)-ph(ij,i+1))*(evap(ij,i)/mp(ij,i)) 1279 up(ij, i) = up(ij, i+1)*rat + u(ij, i)*(1.-rat) 1280 vp(ij, i) = vp(ij, i+1)*rat + v(ij, i)*(1.-rat) 1281 ELSE 1282 IF (mp(ij,i+1)>0.0) THEN 1283 qp(ij, i) = (gz(ij,i+1)-gz(ij,i)+qp(ij,i+1)*(lv(ij,i+1)+t(ij, & 1284 i+1)*(cl-cpd))+cpd*(t(ij,i+1)-t(ij, & 1285 i)))/(lv(ij,i)+t(ij,i)*(cl-cpd)) 1286 up(ij, i) = up(ij, i+1) 1287 vp(ij, i) = vp(ij, i+1) 1288 END IF 1289 END IF 1290 qp(ij, i) = min(qp(ij,i), qstm) 1291 qp(ij, i) = max(qp(ij,i), 0.0) 1292 END IF 1293 END IF 1294 END DO 1295 899 END DO 1296 1297 RETURN 1298 END SUBROUTINE cv_unsat 1299 1300 SUBROUTINE cv_yield(nloc, ncum, nd, nk, icb, inb, delt, t, q, u, v, gz, p, & 1301 ph, h, hp, lv, cpn, ep, clw, frac, m, mp, qp, up, vp, wt, water, evap, & 1302 ment, qent, uent, vent, nent, elij, tv, tvp, iflag, wd, qprime, tprime, & 1303 precip, cbmf, ft, fq, fu, fv, ma, qcondc) 1304 IMPLICIT NONE 1305 1306 include "cvthermo.h" 1307 include "cvparam.h" 1308 1309 ! inputs 1310 INTEGER ncum, nd, nloc 1311 INTEGER nk(nloc), icb(nloc), inb(nloc) 1312 INTEGER nent(nloc, nd) 1313 REAL delt 1314 REAL t(nloc, nd), q(nloc, nd), u(nloc, nd), v(nloc, nd) 1315 REAL gz(nloc, nd) 1316 REAL p(nloc, nd), ph(nloc, nd+1), h(nloc, nd) 1317 REAL hp(nloc, nd), lv(nloc, nd) 1318 REAL cpn(nloc, nd), ep(nloc, nd), clw(nloc, nd), frac(nloc) 1319 REAL m(nloc, nd), mp(nloc, nd), qp(nloc, nd) 1320 REAL up(nloc, nd), vp(nloc, nd) 1321 REAL wt(nloc, nd), water(nloc, nd), evap(nloc, nd) 1322 REAL ment(nloc, nd, nd), qent(nloc, nd, nd), elij(nloc, nd, nd) 1323 REAL uent(nloc, nd, nd), vent(nloc, nd, nd) 1324 REAL tv(nloc, nd), tvp(nloc, nd) 1325 1326 ! outputs 1327 INTEGER iflag(nloc) ! also an input 1328 REAL cbmf(nloc) ! also an input 1329 REAL wd(nloc), tprime(nloc), qprime(nloc) 1330 REAL precip(nloc) 1331 REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd) 1332 REAL ma(nloc, nd) 1333 REAL qcondc(nloc, nd) 1334 1335 ! local variables 1336 INTEGER i, j, ij, k, num1 1337 REAL dpinv, cpinv, awat, fqold, ftold, fuold, fvold, delti 1338 REAL work(nloc), am(nloc), amp1(nloc), ad(nloc) 1339 REAL ents(nloc), uav(nloc), vav(nloc), lvcp(nloc, nd) 1340 REAL qcond(nloc, nd), nqcond(nloc, nd), wa(nloc, nd) ! cld 1341 REAL siga(nloc, nd), ax(nloc, nd), mac(nloc, nd) ! cld 1342 1343 1344 ! -- initializations: 1345 1346 delti = 1.0/delt 1347 1348 DO i = 1, ncum 1349 precip(i) = 0.0 1350 wd(i) = 0.0 1351 tprime(i) = 0.0 1352 qprime(i) = 0.0 1353 DO k = 1, nl + 1 1354 ft(i, k) = 0.0 1355 fu(i, k) = 0.0 1356 fv(i, k) = 0.0 1357 fq(i, k) = 0.0 1358 lvcp(i, k) = lv(i, k)/cpn(i, k) 1359 qcondc(i, k) = 0.0 ! cld 1360 qcond(i, k) = 0.0 ! cld 1361 nqcond(i, k) = 0.0 ! cld 1362 END DO 1363 END DO 1364 1365 1366 ! *** Calculate surface precipitation in mm/day *** 1367 1368 DO i = 1, ncum 1369 IF (iflag(i)<=1) THEN 1370 ! c precip(i)=precip(i)+wt(i,1)*sigd*water(i,1)*3600.*24000. 1371 ! c & /(rowl*g) 1372 ! c precip(i)=precip(i)*delt/86400. 1373 precip(i) = wt(i, 1)*sigd*water(i, 1)*86400/g 1374 END IF 1375 END DO 1376 1377 1378 ! *** Calculate downdraft velocity scale and surface temperature and *** 1379 ! *** water vapor fluctuations *** 1380 1381 DO i = 1, ncum 1382 wd(i) = betad*abs(mp(i,icb(i)))*0.01*rrd*t(i, icb(i))/(sigd*p(i,icb(i))) 1383 qprime(i) = 0.5*(qp(i,1)-q(i,1)) 1384 tprime(i) = lv0*qprime(i)/cpd 1385 END DO 1386 1387 ! *** Calculate tendencies of lowest level potential temperature *** 1388 ! *** and mixing ratio *** 1389 1390 DO i = 1, ncum 1391 work(i) = 0.01/(ph(i,1)-ph(i,2)) 1392 am(i) = 0.0 1393 END DO 1394 DO k = 2, nl 1395 DO i = 1, ncum 1396 IF ((nk(i)==1) .AND. (k<=inb(i)) .AND. (nk(i)==1)) THEN 1397 am(i) = am(i) + m(i, k) 1398 END IF 1399 END DO 1400 END DO 1401 DO i = 1, ncum 1402 IF ((g*work(i)*am(i))>=delti) iflag(i) = 1 1403 ft(i, 1) = ft(i, 1) + g*work(i)*am(i)*(t(i,2)-t(i,1)+(gz(i,2)-gz(i, & 1404 1))/cpn(i,1)) 1405 ft(i, 1) = ft(i, 1) - lvcp(i, 1)*sigd*evap(i, 1) 1406 ft(i, 1) = ft(i, 1) + sigd*wt(i, 2)*(cl-cpd)*water(i, 2)*(t(i,2)-t(i,1))* & 1407 work(i)/cpn(i, 1) 1408 fq(i, 1) = fq(i, 1) + g*mp(i, 2)*(qp(i,2)-q(i,1))*work(i) + & 1409 sigd*evap(i, 1) 1410 fq(i, 1) = fq(i, 1) + g*am(i)*(q(i,2)-q(i,1))*work(i) 1411 fu(i, 1) = fu(i, 1) + g*work(i)*(mp(i,2)*(up(i,2)-u(i,1))+am(i)*(u(i, & 1412 2)-u(i,1))) 1413 fv(i, 1) = fv(i, 1) + g*work(i)*(mp(i,2)*(vp(i,2)-v(i,1))+am(i)*(v(i, & 1414 2)-v(i,1))) 1415 END DO 1416 DO j = 2, nl 1417 DO i = 1, ncum 1418 IF (j<=inb(i)) THEN 1419 fq(i, 1) = fq(i, 1) + g*work(i)*ment(i, j, 1)*(qent(i,j,1)-q(i,1)) 1420 fu(i, 1) = fu(i, 1) + g*work(i)*ment(i, j, 1)*(uent(i,j,1)-u(i,1)) 1421 fv(i, 1) = fv(i, 1) + g*work(i)*ment(i, j, 1)*(vent(i,j,1)-v(i,1)) 1422 END IF 1423 END DO 1424 END DO 1425 1426 ! *** Calculate tendencies of potential temperature and mixing ratio *** 1427 ! *** at levels above the lowest level *** 1428 1429 ! *** First find the net saturated updraft and downdraft mass fluxes *** 1430 ! *** through each level *** 1431 1432 DO i = 2, nl + 1 1433 1434 num1 = 0 1435 DO ij = 1, ncum 1436 IF (i<=inb(ij)) num1 = num1 + 1 1437 END DO 1438 IF (num1<=0) GO TO 1500 1439 1440 CALL zilch(amp1, ncum) 1441 CALL zilch(ad, ncum) 1442 1443 DO k = i + 1, nl + 1 1444 DO ij = 1, ncum 1445 IF ((i>=nk(ij)) .AND. (i<=inb(ij)) .AND. (k<=(inb(ij)+1))) THEN 1446 amp1(ij) = amp1(ij) + m(ij, k) 1447 END IF 1448 END DO 1449 END DO 1450 1451 DO k = 1, i 1452 DO j = i + 1, nl + 1 1453 DO ij = 1, ncum 1454 IF ((j<=(inb(ij)+1)) .AND. (i<=inb(ij))) THEN 1455 amp1(ij) = amp1(ij) + ment(ij, k, j) 1456 END IF 1457 END DO 1458 END DO 1459 END DO 1460 DO k = 1, i - 1 1461 DO j = i, nl + 1 1462 DO ij = 1, ncum 1463 IF ((i<=inb(ij)) .AND. (j<=inb(ij))) THEN 1464 ad(ij) = ad(ij) + ment(ij, j, k) 1465 END IF 1466 END DO 1467 END DO 1468 END DO 1469 1470 DO ij = 1, ncum 1471 IF (i<=inb(ij)) THEN 1472 dpinv = 0.01/(ph(ij,i)-ph(ij,i+1)) 1473 cpinv = 1.0/cpn(ij, i) 1474 1475 ft(ij, i) = ft(ij, i) + g*dpinv*(amp1(ij)*(t(ij,i+1)-t(ij, & 1476 i)+(gz(ij,i+1)-gz(ij,i))*cpinv)-ad(ij)*(t(ij,i)-t(ij, & 1477 i-1)+(gz(ij,i)-gz(ij,i-1))*cpinv)) - sigd*lvcp(ij, i)*evap(ij, i) 1478 ft(ij, i) = ft(ij, i) + g*dpinv*ment(ij, i, i)*(hp(ij,i)-h(ij,i)+t(ij & 1479 ,i)*(cpv-cpd)*(q(ij,i)-qent(ij,i,i)))*cpinv 1480 ft(ij, i) = ft(ij, i) + sigd*wt(ij, i+1)*(cl-cpd)*water(ij, i+1)*(t( & 1481 ij,i+1)-t(ij,i))*dpinv*cpinv 1482 fq(ij, i) = fq(ij, i) + g*dpinv*(amp1(ij)*(q(ij,i+1)-q(ij, & 1483 i))-ad(ij)*(q(ij,i)-q(ij,i-1))) 1484 fu(ij, i) = fu(ij, i) + g*dpinv*(amp1(ij)*(u(ij,i+1)-u(ij, & 1485 i))-ad(ij)*(u(ij,i)-u(ij,i-1))) 1486 fv(ij, i) = fv(ij, i) + g*dpinv*(amp1(ij)*(v(ij,i+1)-v(ij, & 1487 i))-ad(ij)*(v(ij,i)-v(ij,i-1))) 1488 END IF 1489 END DO 1490 DO k = 1, i - 1 1491 DO ij = 1, ncum 1492 IF (i<=inb(ij)) THEN 1493 awat = elij(ij, k, i) - (1.-ep(ij,i))*clw(ij, i) 1494 awat = max(awat, 0.0) 1495 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-awat-q & 1496 (ij,i)) 1497 fu(ij, i) = fu(ij, i) + g*dpinv*ment(ij, k, i)*(uent(ij,k,i)-u(ij,i & 1498 )) 1499 fv(ij, i) = fv(ij, i) + g*dpinv*ment(ij, k, i)*(vent(ij,k,i)-v(ij,i & 1500 )) 1501 ! (saturated updrafts resulting from mixing) ! cld 1502 qcond(ij, i) = qcond(ij, i) + (elij(ij,k,i)-awat) ! cld 1503 nqcond(ij, i) = nqcond(ij, i) + 1. ! cld 1504 END IF 1505 END DO 1506 END DO 1507 DO k = i, nl + 1 1508 DO ij = 1, ncum 1509 IF ((i<=inb(ij)) .AND. (k<=inb(ij))) THEN 1510 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-q(ij,i & 1511 )) 1512 fu(ij, i) = fu(ij, i) + g*dpinv*ment(ij, k, i)*(uent(ij,k,i)-u(ij,i & 1513 )) 1514 fv(ij, i) = fv(ij, i) + g*dpinv*ment(ij, k, i)*(vent(ij,k,i)-v(ij,i & 1515 )) 1516 END IF 1517 END DO 1518 END DO 1519 DO ij = 1, ncum 1520 IF (i<=inb(ij)) THEN 1521 fq(ij, i) = fq(ij, i) + sigd*evap(ij, i) + g*(mp(ij,i+1)*(qp(ij, & 1522 i+1)-q(ij,i))-mp(ij,i)*(qp(ij,i)-q(ij,i-1)))*dpinv 1523 fu(ij, i) = fu(ij, i) + g*(mp(ij,i+1)*(up(ij,i+1)-u(ij, & 1524 i))-mp(ij,i)*(up(ij,i)-u(ij,i-1)))*dpinv 1525 fv(ij, i) = fv(ij, i) + g*(mp(ij,i+1)*(vp(ij,i+1)-v(ij, & 1526 i))-mp(ij,i)*(vp(ij,i)-v(ij,i-1)))*dpinv 1527 ! (saturated downdrafts resulting from mixing) ! cld 1528 DO k = i + 1, inb(ij) ! cld 1529 qcond(ij, i) = qcond(ij, i) + elij(ij, k, i) ! cld 1530 nqcond(ij, i) = nqcond(ij, i) + 1. ! cld 1531 END DO ! cld 1532 ! (particular case: no detraining level is found) ! cld 1533 IF (nent(ij,i)==0) THEN ! cld 1534 qcond(ij, i) = qcond(ij, i) + (1.-ep(ij,i))*clw(ij, i) ! cld 1535 nqcond(ij, i) = nqcond(ij, i) + 1. ! cld 1536 END IF ! cld 1537 IF (nqcond(ij,i)/=0.) THEN ! cld 1538 qcond(ij, i) = qcond(ij, i)/nqcond(ij, i) ! cld 1539 END IF ! cld 1540 END IF 1541 END DO 1542 1500 END DO 1543 1544 ! *** Adjust tendencies at top of convection layer to reflect *** 1545 ! *** actual position of the level zero cape *** 1546 1547 DO ij = 1, ncum 1548 fqold = fq(ij, inb(ij)) 1549 fq(ij, inb(ij)) = fq(ij, inb(ij))*(1.-frac(ij)) 1550 fq(ij, inb(ij)-1) = fq(ij, inb(ij)-1) + frac(ij)*fqold*((ph(ij, & 1551 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij, & 1552 inb(ij))))*lv(ij, inb(ij))/lv(ij, inb(ij)-1) 1553 ftold = ft(ij, inb(ij)) 1554 ft(ij, inb(ij)) = ft(ij, inb(ij))*(1.-frac(ij)) 1555 ft(ij, inb(ij)-1) = ft(ij, inb(ij)-1) + frac(ij)*ftold*((ph(ij, & 1556 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij, & 1557 inb(ij))))*cpn(ij, inb(ij))/cpn(ij, inb(ij)-1) 1558 fuold = fu(ij, inb(ij)) 1559 fu(ij, inb(ij)) = fu(ij, inb(ij))*(1.-frac(ij)) 1560 fu(ij, inb(ij)-1) = fu(ij, inb(ij)-1) + frac(ij)*fuold*((ph(ij, & 1561 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij,inb(ij)))) 1562 fvold = fv(ij, inb(ij)) 1563 fv(ij, inb(ij)) = fv(ij, inb(ij))*(1.-frac(ij)) 1564 fv(ij, inb(ij)-1) = fv(ij, inb(ij)-1) + frac(ij)*fvold*((ph(ij, & 1565 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij,inb(ij)))) 1566 END DO 1567 1568 ! *** Very slightly adjust tendencies to force exact *** 1569 ! *** enthalpy, momentum and tracer conservation *** 1570 1571 DO ij = 1, ncum 1572 ents(ij) = 0.0 1573 uav(ij) = 0.0 1574 vav(ij) = 0.0 1575 DO i = 1, inb(ij) 1576 ents(ij) = ents(ij) + (cpn(ij,i)*ft(ij,i)+lv(ij,i)*fq(ij,i))*(ph(ij,i)- & 1577 ph(ij,i+1)) 1578 uav(ij) = uav(ij) + fu(ij, i)*(ph(ij,i)-ph(ij,i+1)) 1579 vav(ij) = vav(ij) + fv(ij, i)*(ph(ij,i)-ph(ij,i+1)) 1580 END DO 1581 END DO 1582 DO ij = 1, ncum 1583 ents(ij) = ents(ij)/(ph(ij,1)-ph(ij,inb(ij)+1)) 1584 uav(ij) = uav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1)) 1585 vav(ij) = vav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1)) 1586 END DO 1587 DO ij = 1, ncum 1588 DO i = 1, inb(ij) 1589 ft(ij, i) = ft(ij, i) - ents(ij)/cpn(ij, i) 1590 fu(ij, i) = (1.-cu)*(fu(ij,i)-uav(ij)) 1591 fv(ij, i) = (1.-cu)*(fv(ij,i)-vav(ij)) 1592 END DO 1593 END DO 1594 1595 DO k = 1, nl + 1 1596 DO i = 1, ncum 1597 IF ((q(i,k)+delt*fq(i,k))<0.0) iflag(i) = 10 1598 END DO 1599 END DO 1600 1601 1602 DO i = 1, ncum 1603 IF (iflag(i)>2) THEN 1604 precip(i) = 0.0 1605 cbmf(i) = 0.0 1606 END IF 1607 END DO 1608 DO k = 1, nl 1609 DO i = 1, ncum 1610 IF (iflag(i)>2) THEN 1611 ft(i, k) = 0.0 1612 fq(i, k) = 0.0 1613 fu(i, k) = 0.0 1614 fv(i, k) = 0.0 1615 qcondc(i, k) = 0.0 ! cld 1616 END IF 1617 END DO 1618 END DO 1619 1620 DO k = 1, nl + 1 1621 DO i = 1, ncum 1622 ma(i, k) = 0. 1623 END DO 1624 END DO 1625 DO k = nl, 1, -1 1626 DO i = 1, ncum 1627 ma(i, k) = ma(i, k+1) + m(i, k) 1628 END DO 1629 END DO 1630 1631 1632 ! *** diagnose the in-cloud mixing ratio *** ! cld 1633 ! *** of condensed water *** ! cld 1634 ! ! cld 1635 DO ij = 1, ncum ! cld 1636 DO i = 1, nd ! cld 1637 mac(ij, i) = 0.0 ! cld 1638 wa(ij, i) = 0.0 ! cld 1639 siga(ij, i) = 0.0 ! cld 1640 END DO ! cld 1641 DO i = nk(ij), inb(ij) ! cld 1642 DO k = i + 1, inb(ij) + 1 ! cld 1643 mac(ij, i) = mac(ij, i) + m(ij, k) ! cld 1644 END DO ! cld 1645 END DO ! cld 1646 DO i = icb(ij), inb(ij) - 1 ! cld 1647 ax(ij, i) = 0. ! cld 1648 DO j = icb(ij), i ! cld 1649 ax(ij, i) = ax(ij, i) + rrd*(tvp(ij,j)-tv(ij,j)) & ! cld 1650 *(ph(ij,j)-ph(ij,j+1))/p(ij, j) ! cld 1651 END DO ! cld 1652 IF (ax(ij,i)>0.0) THEN ! cld 1653 wa(ij, i) = sqrt(2.*ax(ij,i)) ! cld 1654 END IF ! cld 1655 END DO ! cld 1656 DO i = 1, nl ! cld 1657 IF (wa(ij,i)>0.0) & ! cld 1658 siga(ij, i) = mac(ij, i)/wa(ij, i) & ! cld 1659 *rrd*tvp(ij, i)/p(ij, i)/100./delta ! cld 1660 siga(ij, i) = min(siga(ij,i), 1.0) ! cld 1661 qcondc(ij, i) = siga(ij, i)*clw(ij, i)*(1.-ep(ij,i)) & ! cld 1662 +(1.-siga(ij,i))*qcond(ij, i) ! cld 1663 END DO ! cld 1664 END DO ! cld 1665 1666 RETURN 1667 END SUBROUTINE cv_yield 1668 1669 SUBROUTINE cv_uncompress(nloc, len, ncum, nd, idcum, iflag, precip, cbmf, ft, & 1670 fq, fu, fv, ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, ma1, & 1671 qcondc1) 1672 IMPLICIT NONE 1673 1674 include "cvparam.h" 1675 1676 ! inputs: 1677 INTEGER len, ncum, nd, nloc 1678 INTEGER idcum(nloc) 1679 INTEGER iflag(nloc) 1680 REAL precip(nloc), cbmf(nloc) 1681 REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd) 1682 REAL ma(nloc, nd) 1683 REAL qcondc(nloc, nd) !cld 1684 1685 ! outputs: 1686 INTEGER iflag1(len) 1687 REAL precip1(len), cbmf1(len) 1688 REAL ft1(len, nd), fq1(len, nd), fu1(len, nd), fv1(len, nd) 1689 REAL ma1(len, nd) 1690 REAL qcondc1(len, nd) !cld 1691 1692 ! local variables: 1693 INTEGER i, k 1694 1695 DO i = 1, ncum 1696 precip1(idcum(i)) = precip(i) 1697 cbmf1(idcum(i)) = cbmf(i) 1698 iflag1(idcum(i)) = iflag(i) 1699 END DO 1700 1701 DO k = 1, nl 1702 DO i = 1, ncum 1703 ft1(idcum(i), k) = ft(i, k) 1704 fq1(idcum(i), k) = fq(i, k) 1705 fu1(idcum(i), k) = fu(i, k) 1706 fv1(idcum(i), k) = fv(i, k) 1707 ma1(idcum(i), k) = ma(i, k) 1708 qcondc1(idcum(i), k) = qcondc(i, k) 1709 END DO 1710 END DO 1711 1712 RETURN 1713 END SUBROUTINE cv_uncompress 1714
Note: See TracChangeset
for help on using the changeset viewer.