1 !WRF:MODEL_LAYER:PHYSICS
8 !-------------------------------------------------------------
13 ,dz8w,p8w,XLV,CP,G,r_v &
15 ,CU_ACT_FLAG,warm_rain &
16 ,APR_GR,APR_W,APR_MC,APR_ST,APR_AS &
17 ,APR_CAPMA,APR_CAPME,APR_CAPMI &
18 ,MASS_FLUX,XF_ENS,PR_ENS,HT,XLAND,gsw,edt_out &
20 ,cugd_tten,cugd_qvten ,cugd_qcten &
21 ,cugd_ttens,cugd_qvtens,cugd_avedx,imomentum &
22 ,ensdim,maxiens,maxens,maxens2,maxens3,ichoice &
23 ,ids,ide, jds,jde, kds,kde &
24 ,ims,ime, jms,jme, kms,kme &
25 ,ips,ipe, jps,jpe, kps,kpe &
26 ,its,ite, jts,jte, kts,kte &
27 ,periodic_x,periodic_y &
28 ,RQVCUTEN,RQCCUTEN,RQICUTEN &
29 ,RQVFTEN,RTHFTEN,RTHCUTEN &
30 ,F_QV ,F_QC ,F_QR ,F_QI ,F_QS &
32 !-------------------------------------------------------------
34 !-------------------------------------------------------------
35 INTEGER, INTENT(IN ) :: &
36 ids,ide, jds,jde, kds,kde, &
37 ims,ime, jms,jme, kms,kme, &
38 ips,ipe, jps,jpe, kps,kpe, &
39 its,ite, jts,jte, kts,kte
40 LOGICAL periodic_x,periodic_y
41 integer, parameter :: ens4_spread = 3 ! max(3,cugd_avedx)
42 integer, parameter :: ens4=ens4_spread*ens4_spread
44 integer, intent (in ) :: &
45 ensdim,maxiens,maxens,maxens2,maxens3,ichoice
47 INTEGER, INTENT(IN ) :: STEPCU, ITIMESTEP,cugd_avedx,imomentum
48 LOGICAL, INTENT(IN ) :: warm_rain
50 REAL, INTENT(IN ) :: XLV, R_v
51 REAL, INTENT(IN ) :: CP,G
53 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
65 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
70 REAL, DIMENSION( ims:ime , jms:jme ),INTENT(IN) :: GSW,HT,XLAND
72 REAL, INTENT(IN ) :: DT, DX
75 REAL, DIMENSION( ims:ime , jms:jme ), &
76 INTENT(INOUT) :: pratec,RAINCV, MASS_FLUX, &
77 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
78 edt_out,APR_CAPMA,APR_CAPME,APR_CAPMI,htop,hbot
80 ! REAL, DIMENSION( ims:ime , jms:jme ) :: & !, INTENT(INOUT) :: &
81 ! HTOP, &! highest model layer penetrated by cumulus since last reset in radiation_driver
82 ! HBOT ! lowest model layer penetrated by cumulus since last reset in radiation_driver
83 ! ! HBOT>HTOP follow physics leveling convention
85 LOGICAL, DIMENSION( ims:ime , jms:jme ), &
86 INTENT(INOUT) :: CU_ACT_FLAG
91 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
93 INTENT(INOUT) :: RTHFTEN, &
94 cugd_tten,cugd_qvten,cugd_qcten, &
95 cugd_ttens,cugd_qvtens, &
98 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
106 ! Flags relating to the optional tendency arrays declared above
107 ! Models that carry the optional tendencies will provdide the
108 ! optional arguments at compile time; these flags all the model
109 ! to determine at run-time whether a particular tracer is in
112 LOGICAL, OPTIONAL :: &
122 real, dimension(ims:ime,jms:jme,1:ensdim),intent(inout) :: &
124 real, dimension ( its:ite , jts:jte , 1:ensdim) :: &
125 massflni,xfi_ens,pri_ens
126 REAL, DIMENSION( its:ite , jts:jte ) :: MASSI_FLX, &
127 APRi_GR,APRi_W,APRi_MC,APRi_ST,APRi_AS, &
128 edti_out,APRi_CAPMA,APRi_CAPME,APRi_CAPMI,gswi
129 real, dimension (its:ite,kts:kte) :: &
130 SUBT,SUBQ,OUTT,OUTQ,OUTQC,phh,subm,cupclw
131 real, dimension (its:ite,kts:kte+1) :: phf
132 real, dimension (its:ite) :: &
133 pret, ter11, aa0, fp,xlandi
135 integer, dimension (its:ite) :: &
138 integer, dimension (its:ite,jts:jte) :: &
140 integer :: iens,ibeg,iend,jbeg,jend,n,nn,ens4n
141 integer :: ibegh,iendh,jbegh,jendh
142 integer :: ibegc,iendc,jbegc,jendc
145 ! basic environmental input includes moisture convergence (mconv)
146 ! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
147 ! convection for this call only and at that particular gridpoint
149 real, dimension (its:ite,kts:kte) :: &
150 T2d,q2d,PO,P2d,US,VS,tn,qo
151 real, dimension (ips-2:ipe+2,kps:kpe,jps-2:jpe+2) :: &
153 real, dimension (its:ite,kts:kte,1:ens4) :: &
155 real, dimension (its:ite) :: &
156 Z1,PSUR,AAEQ,direction,cuten,umean,vmean,pmean
157 real, dimension (its:ite,1:ens4) :: &
160 INTEGER :: i,j,k,ICLDCK,ipr,jpr
161 REAL :: tcrit,dp,dq,sub_spread,subcenter
162 INTEGER :: itf,jtf,ktf,iss,jss,nbegin,nend
163 INTEGER :: high_resolution
164 REAL :: rkbcon,rktop !-lxz
166 real, dimension (its:ite) :: tkm
169 if(cugd_avedx.gt.1) high_resolution=1
171 ! subcenter=1./float(cugd_avedx)
172 sub_spread=max(1.,float(cugd_avedx*cugd_avedx-1))
173 sub_spread=(1.-subcenter)/sub_spread
179 ! if(itimestep.eq.8)then
183 IF ( periodic_x ) THEN
194 IF ( periodic_y ) THEN
214 if(high_resolution.eq.1)then
216 ! calculate these on the halo...the incominh tendencies have been exchanged on a 24pt halo
217 ! only neede for high resolution run
223 if(its.eq.ips)ibegh=max(its-1,ids)
224 if(jts.eq.jps)jbegh=max(jts-1,jds)
225 if(jte.eq.jpe)jendh=min(jte+1,jde-1)
226 if(ite.eq.ipe)iendh=min(ite+1,ide-1)
230 ave_f_t(i,k,j)=(rthften(i-1,k,j-1)+rthften(i-1,k,j) + rthften(i-1,k,j+1)+ &
231 rthften(i,k,j-1) +rthften(i,k,j) +rthften(i,k,j+1)+ &
232 rthften(i+1,k,j-1) +rthften(i+1,k,j) +rthften(i+1,k,j+1))/9.
233 ave_f_q(i,k,j)=(rqvften(i-1,k,j-1)+rqvften(i-1,k,j) + rqvften(i-1,k,j+1)+ &
234 rqvften(i,k,j-1) +rqvften(i,k,j) +rqvften(i,k,j+1)+ &
235 rqvften(i+1,k,j-1) +rqvften(i+1,k,j) +rqvften(i+1,k,j+1))/9.
236 ! ave_f_t(i,k,j)=rthften(i,k,j)
237 ! ave_f_q(i,k,j)=rqvften(i,k,j)
248 ! xfi_ens(i,j,n)=xf_ens(i,j,n)
249 ! pri_ens(i,j,n)=pr_ens(i,j,n)
265 APRi_GR(i,j)=apr_gr(i,j)
266 APRi_w(i,j)=apr_w(i,j)
267 APRi_mc(i,j)=apr_mc(i,j)
268 APRi_st(i,j)=apr_st(i,j)
269 APRi_as(i,j)=apr_as(i,j)
270 APRi_capma(i,j)=apr_capma(i,j)
271 APRi_capme(i,j)=apr_capme(i,j)
272 APRi_capmi(i,j)=apr_capmi(i,j)
273 CU_ACT_FLAG(i,j) = .true.
280 cugd_qvtens(i,k,j)=0.
302 ! hydrostatic pressure, first on full levels
304 phf(i,1) = p8w(i,1,j)
306 ! integrate up, dp = -rho * g * dz
309 phf(i,k) = phf(i,k-1) - rho(i,k-1,j) * g * dz8w(i,k-1,j)
312 ! scale factor so that pressure is not zero after integration
314 fp(i) = (p8w(i,kts,j)-p8w(i,kte,j))/(phf(i,kts)-phf(i,kte))
316 ! re-integrate up, dp = -rho * g * dz * scale_factor
319 phf(i,k) = phf(i,k-1) - rho(i,k-1,j) * g * dz8w(i,k-1,j) * fp(i)
322 ! put hydrostatic pressure on half levels
325 phh(i,k) = (phf(i,k) + phf(i,k+1))*0.5
332 PSUR(I)=p8w(I,1,J)*.01
334 #if ( NMM_CORE == 1 )
337 ! PSUR(I)=p(I,1,J)*.01
352 #if ( NMM_CORE == 1 )
361 IF(Q2d(I,K).LT.1.E-08)Q2d(I,K)=1.E-08
367 TN(I,K)=t2d(i,k)+RTHFTEN(i,k,j)*dt
368 QO(I,K)=q2d(i,k)+RQVFTEN(i,k,j)*dt
369 if(high_resolution.eq.1)then
370 TN(I,K)=t2d(i,k)+ave_f_t(i,k,j)*dt
371 QO(I,K)=q2d(i,k)+ave_f_q(i,k,j)*dt
373 IF(TN(I,K).LT.200.)TN(I,K)=T2d(I,K)
374 IF(QO(I,K).LT.1.E-08)QO(I,K)=1.E-08
380 if(ens4_spread.gt.1)then
381 nbegin=-ens4_spread/2
393 omeg(I,K,ens4n)= -g*rho(i,k,j)*w(iss,k,jss)
394 ! omeg(I,K,ens4n)= -g*rho(i,k,j)*w(i,k,j)
395 Tx(I,K,ens4n)=t2d(i,k)+RTHFTEN(iss,k,jss)*dt
396 ! Tx(I,K,ens4n)=t2d(i,k)+RTHFTEN(i,k,j)*dt
397 if(high_resolution.eq.1)Tx(I,K,ens4n)=t2d(i,k)+ave_f_t(iss,k,jss)*dt
398 IF(Tx(I,K,ens4n).LT.200.)Tx(I,K,ens4n)=T2d(I,K)
399 Qx(I,K,ens4n)=q2d(i,k)+RQVFTEN(iss,k,jss)*dt
400 Qx(I,K,ens4n)=q2d(i,k)+RQVFTEN(i,k,j)*dt
401 if(high_resolution.eq.1)qx(I,K,ens4n)=q2d(i,k)+ave_f_q(iss,k,jss)*dt
402 IF(Qx(I,K,ens4n).LT.1.E-08)Qx(I,K,ens4n)=1.E-08
409 if((p2d(i,1)-p2d(i,k)).gt.150.and.p2d(i,k).gt.300)then
410 dp=-.5*(p2d(i,k+1)-p2d(i,k-1))
411 umean(i)=umean(i)+us(i,k)*dp
412 vmean(i)=vmean(i)+vs(i,k)*dp
418 umean(i)=umean(i)/pmean(i)
419 vmean(i)=vmean(i)/pmean(i)
420 direction(i)=(atan2(umean(i),vmean(i))+3.1415926)*57.29578
421 if(direction(i).gt.360.)direction(i)=direction(i)-360.
426 dq=(q2d(i,k+1)-q2d(i,k))
427 mconv(i,n)=mconv(i,n)+omeg(i,k,n)*dq/g
433 if(mconv(i,n).lt.0.)mconv(i,n)=0.
437 !---- CALL CUMULUS PARAMETERIZATION
439 CALL CUP_enss_3d(outqc,j,AAEQ,T2d,Q2d,TER11,subm,TN,QO,PO,PRET,&
440 P2d,OUTT,OUTQ,DT,itimestep,tkm,PSUR,US,VS,tcrit,iens,tx,qx, &
441 mconv,massflni,iact_old_gr,omeg,direction,MASSi_FLX, &
442 maxiens,maxens,maxens2,maxens3,ensdim, &
443 APRi_GR,APRi_W,APRi_MC,APRi_ST,APRi_AS, &
444 APRi_CAPMA,APRi_CAPME,APRi_CAPMI,kbcon,ktop,cupclw, &
445 xfi_ens,pri_ens,XLANDi,gswi,edti_out,subt,subq, &
446 ! ruc lv_p,rv_p,cpd_p,g0_p,ichoice,ipr,jpr, &
447 xlv,r_v,cp,g,ichoice,ipr,jpr,ens4,high_resolution, &
449 its,ite, jts,jte, kts,kte )
452 if(j.lt.jbegc.or.j.gt.jendc)go to 100
455 if(pret(i).gt.0.)then
457 ! raincv(i,j)=pret(i)*dt
462 cugd_ttens(I,K,J)=subt(i,k)*cuten(i)*sub_spread
463 cugd_qvtens(I,K,J)=subq(i,k)*cuten(i)*sub_spread
464 cugd_tten(I,K,J)=outt(i,k)*cuten(i)
465 cugd_qvten(I,K,J)=outq(i,k)*cuten(i)
466 cugd_qcten(I,K,J)=outqc(i,k)*cuten(i)
470 if(pret(i).gt.0.)then
471 raincv(i,j)=pret(i)*dt
473 rkbcon = kte+kts - kbcon(i)
474 rktop = kte+kts - ktop(i)
475 if (ktop(i) > HTOP(i,j)) HTOP(i,j) = ktop(i)+.001
476 if (kbcon(i) < HBOT(i,j)) HBOT(i,j) = kbcon(i)+.001
481 xf_ens(i,j,n)=xfi_ens(i,j,n)
482 pr_ens(i,j,n)=pri_ens(i,j,n)
486 APR_GR(i,j)=apri_gr(i,j)
487 APR_w(i,j)=apri_w(i,j)
488 APR_mc(i,j)=apri_mc(i,j)
489 APR_st(i,j)=apri_st(i,j)
490 APR_as(i,j)=apri_as(i,j)
491 APR_capma(i,j)=apri_capma(i,j)
492 APR_capme(i,j)=apri_capme(i,j)
493 APR_capmi(i,j)=apri_capmi(i,j)
494 mass_flux(i,j)=massi_flx(i,j)
495 edt_out(i,j)=edti_out(i,j)
497 IF(PRESENT(RQCCUTEN)) THEN
501 RQCCUTEN(I,K,J)=outqc(I,K)*cuten(i)
502 IF ( PRESENT( GDC ) ) GDC(I,K,J)=CUPCLW(I,K)*cuten(i)
503 IF ( PRESENT( GDC2 ) ) GDC2(I,K,J)=0.
509 !...... QSTEN STORES GRAUPEL TENDENCY IF IT EXISTS, OTHERISE SNOW (V2)
511 IF(PRESENT(RQICUTEN).AND.PRESENT(RQCCUTEN))THEN
515 if(t2d(i,k).lt.258.)then
516 RQICUTEN(I,K,J)=outqc(I,K)*cuten(i)
519 IF ( PRESENT( GDC2 ) ) GDC2(I,K,J)=CUPCLW(I,K)*cuten(i)
522 RQCCUTEN(I,K,J)=outqc(I,K)*cuten(i)
523 IF ( PRESENT( GDC ) ) GDC(I,K,J)=CUPCLW(I,K)*cuten(i)
534 SUBROUTINE CUP_enss_3d(OUTQC,J,AAEQ,T,Q,Z1,sub_mas, &
535 TN,QO,PO,PRE,P,OUTT,OUTQ,DTIME,ktau,tkmax,PSUR,US,VS, &
536 TCRIT,iens,tx,qx,mconv,massfln,iact, &
537 omeg,direction,massflx,maxiens, &
538 maxens,maxens2,maxens3,ensdim, &
539 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
540 APR_CAPMA,APR_CAPME,APR_CAPMI,kbcon,ktop,cupclw, & !-lxz
541 xf_ens,pr_ens,xland,gsw,edt_out,subt,subq, &
542 xl,rv,cp,g,ichoice,ipr,jpr,ens4,high_resolution, &
544 its,ite, jts,jte, kts,kte )
551 its,ite, jts,jte, kts,kte,ipr,jpr,ens4,high_resolution
552 integer, intent (in ) :: &
553 j,ensdim,maxiens,maxens,maxens2,maxens3,ichoice,iens
557 real, dimension (its:ite,jts:jte,1:ensdim) &
559 massfln,xf_ens,pr_ens
560 real, dimension (its:ite,jts:jte) &
561 ,intent (inout ) :: &
562 APR_GR,APR_W,APR_MC,APR_ST,APR_AS,APR_CAPMA, &
563 APR_CAPME,APR_CAPMI,massflx,edt_out
564 real, dimension (its:ite,jts:jte) &
567 integer, dimension (its:ite,jts:jte) &
570 ! outtem = output temp tendency (per s)
571 ! outq = output q tendency (per s)
572 ! outqc = output qc tendency (per s)
573 ! pre = output precip
574 real, dimension (its:ite,kts:kte) &
575 ,intent (inout ) :: &
576 OUTT,OUTQ,OUTQC,subt,subq,sub_mas,cupclw
577 real, dimension (its:ite) &
581 integer, dimension (its:ite) &
586 ! basic environmental input includes moisture convergence (mconv)
587 ! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
588 ! convection for this call only and at that particular gridpoint
590 real, dimension (its:ite,kts:kte) &
593 real, dimension (its:ite,kts:kte,1:ens4) &
594 ,intent (inout ) :: &
596 real, dimension (its:ite,kts:kte) &
599 real, dimension (its:ite) &
601 Z1,PSUR,AAEQ,direction,tkmax,xland
602 real, dimension (its:ite,1:ens4) &
609 dtime,tcrit,xl,cp,rv,g
613 ! local ensemble dependent variables in this routine
615 real, dimension (its:ite,1:maxens) :: &
617 real, dimension (1:maxens) :: &
619 real, dimension (1:maxens2) :: &
621 real, dimension (its:ite,1:maxens2) :: &
623 real, dimension (its:ite,kts:kte,1:maxens2) :: &
624 dellat_ens,dellaqc_ens,dellaq_ens,pwo_ens,subt_ens,subq_ens
628 !***************** the following are your basic environmental
629 ! variables. They carry a "_cup" if they are
630 ! on model cloud levels (staggered). They carry
631 ! an "o"-ending (z becomes zo), if they are the forced
632 ! variables. They are preceded by x (z becomes xz)
633 ! to indicate modification by some typ of cloud
635 ! z = heights of model levels
636 ! q = environmental mixing ratio
637 ! qes = environmental saturation mixing ratio
638 ! t = environmental temp
639 ! p = environmental pressure
640 ! he = environmental moist static energy
641 ! hes = environmental saturation moist static energy
642 ! z_cup = heights of model cloud levels
643 ! q_cup = environmental q on model cloud levels
644 ! qes_cup = saturation q on model cloud levels
645 ! t_cup = temperature (Kelvin) on model cloud levels
646 ! p_cup = environmental pressure
647 ! he_cup = moist static energy on model cloud levels
648 ! hes_cup = saturation moist static energy on model cloud levels
649 ! gamma_cup = gamma on model cloud levels
652 ! hcd = moist static energy in downdraft
653 ! zd normalized downdraft mass flux
655 ! entr = entrainment rate
656 ! zd = downdraft normalized mass flux
657 ! entr= entrainment rate
658 ! hcd = h in model cloud
660 ! zd = normalized downdraft mass flux
661 ! gamma_cup = gamma on model cloud levels
662 ! mentr_rate = entrainment rate
663 ! qcd = cloud q (including liquid water) after entrainment
664 ! qrch = saturation q in cloud
665 ! pwd = evaporate at that level
666 ! pwev = total normalized integrated evaoprate (I2)
667 ! entr= entrainment rate
668 ! z1 = terrain elevation
669 ! entr = downdraft entrainment rate
670 ! jmin = downdraft originating level
671 ! kdet = level above ground where downdraft start detraining
672 ! psur = surface pressure
673 ! z1 = terrain elevation
674 ! pr_ens = precipitation ensemble
675 ! xf_ens = mass flux ensembles
676 ! massfln = downdraft mass flux ensembles used in next timestep
677 ! omeg = omega from large scale model
678 ! mconv = moisture convergence from large scale model
679 ! zd = downdraft normalized mass flux
680 ! zu = updraft normalized mass flux
681 ! dir = "storm motion"
682 ! mbdt = arbitrary numerical parameter
683 ! dtime = dt over which forcing is applied
684 ! iact_gr_old = flag to tell where convection was active
685 ! kbcon = LFC of parcel from k22
686 ! k22 = updraft originating level
687 ! icoic = flag if only want one closure (usually set to zero!)
689 ! ktop = cloud top (output)
690 ! xmb = total base mass flux
691 ! hc = cloud moist static energy
692 ! hkb = moist static energy at originating level
693 ! mentr_rate = entrainment rate
695 real, dimension (its:ite,kts:kte) :: &
698 xhe,xhes,xqes,xz,xt,xq, &
700 qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup, &
701 qeso_cup,qo_cup,heo_cup,heso_cup,zo_cup,po_cup,gammao_cup, &
703 xqes_cup,xq_cup,xhe_cup,xhes_cup,xz_cup,xp_cup,xgamma_cup, &
706 dby,qc,qrcd,pwd,pw,hcd,qcd,dbyd,hc,qrc,zu,zd,clw_all, &
707 dbyo,qco,qrcdo,pwdo,pwo,hcdo,qcdo,dbydo,hco,qrco,zuo,zdo, &
708 xdby,xqc,xqrcd,xpwd,xpw,xhcd,xqcd,xhc,xqrc,xzu,xzd, &
710 ! cd = detrainment function for updraft
711 ! cdd = detrainment function for downdraft
712 ! dellat = change of temperature per unit mass flux of cloud ensemble
713 ! dellaq = change of q per unit mass flux of cloud ensemble
714 ! dellaqc = change of qc per unit mass flux of cloud ensemble
716 cd,cdd,scr1,DELLAH,DELLAQ,DELLAT,DELLAQC,dsubt,dsubq
718 ! aa0 cloud work function for downdraft
720 ! aa0 = cloud work function without forcing effects
721 ! aa1 = cloud work function with forcing effects
722 ! xaa0 = cloud work function with cloud effects (ensemble dependent)
724 real, dimension (its:ite) :: &
725 edt,edto,edtx,AA1,AA0,XAA0,HKB,HKBO,aad,XHKB,QKB,QKBO, &
726 XMB,XPWAV,XPWEV,PWAV,PWEV,PWAVO,PWEVO,BU,BUO,cap_max,xland1, &
727 cap_max_increment,closure_n
728 real, dimension (its:ite,1:ens4) :: &
730 integer, dimension (its:ite) :: &
731 kzdown,KDET,K22,KB,JMIN,kstabi,kstabm,K22x, & !-lxz
732 KBCONx,KBx,KTOPx,ierr,ierr2,ierr3,KBMAX
735 nall,iedt,nens,nens3,ki,I,K,KK,iresult
737 day,dz,mbdt,entr_rate,radius,entrd_rate,mentr_rate,mentrd_rate, &
738 zcutdown,edtmax,edtmin,depth_min,zkbmax,z_detr,zktop, &
739 massfld,dh,cap_maxs,trash
742 logical :: keep_going
750 if(xland(i).gt.1.5)xland1(i)=0.
751 ! cap_max_increment(i)=50.
752 cap_max_increment(i)=25.
755 !--- specify entrainmentrate and detrainmentrate
758 radius=14000.-float(iens)*2000.
763 !--- gross entrainment rate (these may be changed later on in the
764 !--- program, depending what your detrainment is!!)
768 !--- entrainment of mass
773 !--- initial detrainmentrates
778 cd(i,k)=0.01*entr_rate
783 !--- max/min allowed value for epsilon (ratio downdraft base mass flux/updraft
789 !--- minimum depth (m), clouds must have
793 !--- maximum depth (mb) of capping
794 !--- inversion (larger cap = no convection)
808 if(aaeq(i).lt.-0.1)then
813 !--- first check for upstream convection
817 if(gsw(i,j).lt.1.or.high_resolution.eq.1)cap_max(i)=25.
822 !--- max height(m) above ground where updraft air can originate
826 !--- height(m) above which no downdrafts are allowed to originate
830 !--- depth(m) over which downdraft detrains all its mass
835 mbdt_ens(nens)=(float(nens)-3.)*dtime*1.e-3+dtime*5.E-03
838 edt_ens(nens)=.95-float(nens)*.01
841 !--- environmental conditions, FIRST HEIGHTS
844 if(ierr(i).ne.20)then
845 do k=1,maxens*maxens2*maxens3
846 xf_ens(i,j,(iens-1)*maxens*maxens2*maxens3+k)=0.
847 pr_ens(i,j,(iens-1)*maxens*maxens2*maxens3+k)=0.
852 !--- calculate moist static energy, heights, qes
854 call cup_env(z,qes,he,hes,t,q,p,z1, &
855 psur,ierr,tcrit,0,xl,cp, &
857 its,ite, jts,jte, kts,kte)
858 call cup_env(zo,qeso,heo,heso,tn,qo,po,z1, &
859 psur,ierr,tcrit,0,xl,cp, &
861 its,ite, jts,jte, kts,kte)
863 !--- environmental values on cloud levels
865 call cup_env_clev(t,qes,q,he,hes,z,p,qes_cup,q_cup,he_cup, &
866 hes_cup,z_cup,p_cup,gamma_cup,t_cup,psur, &
869 its,ite, jts,jte, kts,kte)
870 call cup_env_clev(tn,qeso,qo,heo,heso,zo,po,qeso_cup,qo_cup, &
871 heo_cup,heso_cup,zo_cup,po_cup,gammao_cup,tn_cup,psur, &
874 its,ite, jts,jte, kts,kte)
879 if(zo_cup(i,k).gt.zkbmax+z1(i))then
886 !--- level where detrainment for downdraft starts
889 if(zo_cup(i,k).gt.z_detr+z1(i))then
901 !------- DETERMINE LEVEL WITH HIGHEST MOIST STATIC ENERGY CONTENT - K22
903 CALL cup_MAXIMI(HEO_CUP,3,KBMAX,K22,ierr, &
905 its,ite, jts,jte, kts,kte)
907 IF(ierr(I).eq.0.)THEN
908 IF(K22(I).GE.KBMAX(i))ierr(i)=2
912 !--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
914 call cup_kbcon(cap_max_increment,1,k22,kbcon,heo_cup,heso_cup, &
915 ierr,kbmax,po_cup,cap_max, &
917 its,ite, jts,jte, kts,kte)
919 !--- increase detrainment in stable layers
921 CALL cup_minimi(HEso_cup,Kbcon,kstabm,kstabi,ierr, &
923 its,ite, jts,jte, kts,kte)
925 IF(ierr(I).eq.0.)THEN
926 if(kstabm(i)-1.gt.kstabi(i))then
927 do k=kstabi(i),kstabm(i)-1
928 cd(i,k)=cd(i,k-1)+.15*entr_rate
929 if(cd(i,k).gt.1.0*entr_rate)cd(i,k)=1.0*entr_rate
935 !--- calculate incloud moist static energy
937 call cup_up_he(k22,hkb,z_cup,cd,mentr_rate,he_cup,hc, &
938 kbcon,ierr,dby,he,hes_cup, &
940 its,ite, jts,jte, kts,kte)
941 call cup_up_he(k22,hkbo,zo_cup,cd,mentr_rate,heo_cup,hco, &
942 kbcon,ierr,dbyo,heo,heso_cup, &
944 its,ite, jts,jte, kts,kte)
946 !--- DETERMINE CLOUD TOP - KTOP
948 call cup_ktop(1,dbyo,kbcon,ktop,ierr, &
950 its,ite, jts,jte, kts,kte)
954 zktop=(zo_cup(i,ktop(i))-z1(i))*.6
955 zktop=min(zktop+z1(i),zcutdown+z1(i))
957 if(zo_cup(i,k).gt.zktop)then
965 !--- DOWNDRAFT ORIGINATING LEVEL - JMIN
967 call cup_minimi(HEso_cup,K22,kzdown,JMIN,ierr, &
969 its,ite, jts,jte, kts,kte)
971 IF(ierr(I).eq.0.)THEN
973 !--- check whether it would have buoyancy, if there where
974 !--- no entrainment/detrainment
978 do while ( keep_going )
980 if ( jmini - 1 .lt. kdet(i) ) kdet(i) = jmini-1
981 if ( jmini .ge. ktop(i)-1 ) jmini = ktop(i) - 2
983 hcdo(i,ki)=heso_cup(i,ki)
984 DZ=Zo_cup(i,Ki+1)-Zo_cup(i,Ki)
987 hcdo(i,k)=heso_cup(i,jmini)
988 DZ=Zo_cup(i,K+1)-Zo_cup(i,K)
989 dh=dh+dz*(HCDo(i,K)-heso_cup(i,k))
992 if ( jmini .gt. 3 ) then
1002 if ( jmini .le. 3 ) then
1008 ! - Must have at least depth_min m between cloud convective base
1012 IF(ierr(I).eq.0.)THEN
1013 IF(-zo_cup(I,KBCON(I))+zo_cup(I,KTOP(I)).LT.depth_min)then
1020 !c--- normalized updraft mass flux profile
1022 call cup_up_nms(zu,z_cup,mentr_rate,cd,kbcon,ktop,ierr,k22, &
1024 its,ite, jts,jte, kts,kte)
1025 call cup_up_nms(zuo,zo_cup,mentr_rate,cd,kbcon,ktop,ierr,k22, &
1027 its,ite, jts,jte, kts,kte)
1029 !c--- normalized downdraft mass flux profile,also work on bottom detrainment
1030 !--- in this routine
1032 call cup_dd_nms(zd,z_cup,cdd,mentrd_rate,jmin,ierr, &
1035 its,ite, jts,jte, kts,kte)
1036 call cup_dd_nms(zdo,zo_cup,cdd,mentrd_rate,jmin,ierr, &
1039 its,ite, jts,jte, kts,kte)
1041 !--- downdraft moist static energy
1043 call cup_dd_he(hes_cup,zd,hcd,z_cup,cdd,mentrd_rate, &
1044 jmin,ierr,he,dbyd,he_cup, &
1046 its,ite, jts,jte, kts,kte)
1047 call cup_dd_he(heso_cup,zdo,hcdo,zo_cup,cdd,mentrd_rate, &
1048 jmin,ierr,heo,dbydo,he_cup,&
1050 its,ite, jts,jte, kts,kte)
1052 !--- calculate moisture properties of downdraft
1054 call cup_dd_moisture_3d(zd,hcd,hes_cup,qcd,qes_cup, &
1055 pwd,q_cup,z_cup,cdd,mentrd_rate,jmin,ierr,gamma_cup, &
1056 pwev,bu,qrcd,q,he,t_cup,2,xl,high_resolution, &
1058 its,ite, jts,jte, kts,kte)
1059 call cup_dd_moisture_3d(zdo,hcdo,heso_cup,qcdo,qeso_cup, &
1060 pwdo,qo_cup,zo_cup,cdd,mentrd_rate,jmin,ierr,gammao_cup, &
1061 pwevo,bu,qrcdo,qo,heo,tn_cup,1,xl,high_resolution, &
1063 its,ite, jts,jte, kts,kte)
1065 !--- calculate moisture properties of updraft
1067 call cup_up_moisture(ierr,z_cup,qc,qrc,pw,pwav, &
1068 kbcon,ktop,cd,dby,mentr_rate,clw_all, &
1069 q,GAMMA_cup,zu,qes_cup,k22,q_cup,xl, &
1071 its,ite, jts,jte, kts,kte)
1074 cupclw(i,k)=qrc(i,k)
1077 call cup_up_moisture(ierr,zo_cup,qco,qrco,pwo,pwavo, &
1078 kbcon,ktop,cd,dbyo,mentr_rate,clw_all, &
1079 qo,GAMMAo_cup,zuo,qeso_cup,k22,qo_cup,xl,&
1081 its,ite, jts,jte, kts,kte)
1083 !--- calculate workfunctions for updrafts
1085 call cup_up_aa0(aa0,z,zu,dby,GAMMA_CUP,t_cup, &
1088 its,ite, jts,jte, kts,kte)
1089 call cup_up_aa0(aa1,zo,zuo,dbyo,GAMMAo_CUP,tn_cup, &
1092 its,ite, jts,jte, kts,kte)
1094 if(ierr(i).eq.0)then
1095 if(aa1(i).eq.0.)then
1100 call cup_axx(tcrit,kbmax,z1,p,psur,xl,rv,cp,tx,qx,axx,ierr, &
1101 cap_max,cap_max_increment,entr_rate,mentr_rate,&
1103 its,ite, jts,jte, kts,kte,ens4)
1106 !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
1108 call cup_dd_edt(ierr,us,vs,zo,ktop,kbcon,edt,po,pwavo, &
1109 pwevo,edtmax,edtmin,maxens2,edtc, &
1111 its,ite, jts,jte, kts,kte)
1112 do 250 iedt=1,maxens2
1114 if(ierr(i).eq.0)then
1116 edto(i)=edtc(i,iedt)
1117 edtx(i)=edtc(i,iedt)
1118 edt_out(i,j)=edtc(i,2)
1119 if(high_resolution.eq.1)then
1123 edt_out(i,j)=edtc(i,3)
1129 subt_ens(i,k,iedt)=0.
1130 subq_ens(i,k,iedt)=0.
1131 dellat_ens(i,k,iedt)=0.
1132 dellaq_ens(i,k,iedt)=0.
1133 dellaqc_ens(i,k,iedt)=0.
1134 pwo_ens(i,k,iedt)=0.
1138 if(j.eq.jpr.and.iedt.eq.1.and.ipr.gt.its.and.ipr.lt.ite)then
1141 ! write(0,*)'in 250 loop ',iedt,edt(ipr),ierr(ipr)
1142 ! if(ierr(i).eq.0.or.ierr(i).eq.3)then
1143 write(0,*)'250',k22(I),kbcon(i),ktop(i),jmin(i)
1144 write(0,*)edt(i),aa0(i),aa1(i)
1146 write(0,*)k,z(i,k),he(i,k),hes(i,k)
1148 write(0,*)'end 250 loop ',iedt,edt(ipr),ierr(ipr)
1150 write(0,*)zu(i,k),zd(i,k),pw(i,k),pwd(i,k)
1158 !--- change per unit mass that a model cloud would modify the environment
1160 !--- 1. in bottom layer
1162 call cup_dellabot(ipr,jpr,heo_cup,ierr,zo_cup,po,hcdo,edto, &
1163 zdo,cdd,heo,dellah,dsubt,j,mentrd_rate,zo,g, &
1165 its,ite, jts,jte, kts,kte)
1166 call cup_dellabot(ipr,jpr,qo_cup,ierr,zo_cup,po,qrcdo,edto, &
1167 zdo,cdd,qo,dellaq,dsubq,j,mentrd_rate,zo,g,&
1169 its,ite, jts,jte, kts,kte)
1171 !--- 2. everywhere else
1173 call cup_dellas_3d(ierr,zo_cup,po_cup,hcdo,edto,zdo,cdd, &
1174 heo,dellah,dsubt,j,mentrd_rate,zuo,g, &
1175 cd,hco,ktop,k22,kbcon,mentr_rate,jmin,heo_cup,kdet, &
1176 k22,ipr,jpr,'deep',high_resolution, &
1178 its,ite, jts,jte, kts,kte)
1180 !-- take out cloud liquid water for detrainment
1187 if(ierr(i).eq.0)then
1188 scr1(i,k)=qco(i,k)-qrco(i,k)
1189 if(k.eq.ktop(i)-0)dellaqc(i,k)= &
1190 .01*zuo(i,ktop(i))*qrco(i,ktop(i))* &
1191 9.81/(po_cup(i,k)-po_cup(i,k+1))
1192 if(k.lt.ktop(i).and.k.gt.kbcon(i))then
1193 dz=zo_cup(i,k+1)-zo_cup(i,k)
1194 dellaqc(i,k)=.01*9.81*cd(i,k)*dz*zuo(i,k) &
1195 *.5*(qrco(i,k)+qrco(i,k+1))/ &
1196 (po_cup(i,k)-po_cup(i,k+1))
1201 call cup_dellas_3d(ierr,zo_cup,po_cup,qrcdo,edto,zdo,cdd, &
1202 qo,dellaq,dsubq,j,mentrd_rate,zuo,g, &
1203 cd,qco,ktop,k22,kbcon,mentr_rate,jmin,qo_cup,kdet, &
1204 k22,ipr,jpr,'deep',high_resolution, &
1206 its,ite, jts,jte, kts,kte )
1208 !--- using dellas, calculate changed environmental profiles
1210 ! do 200 nens=1,maxens
1219 write(0,*)'xt',xl,'DELLAH(I,K),DELLAQ(I,K),dsubq(I,K),dsubt(i,k)'
1224 if(ierr(i).eq.0)then
1226 XHE(I,K)=(dsubt(i,k)+DELLAH(I,K))*MBDT+HEO(I,K)
1227 XQ(I,K)=(dsubq(i,k)+DELLAQ(I,K))*MBDT+QO(I,K)
1228 DELLAT(I,K)=(1./cp)*(DELLAH(I,K)-xl*DELLAQ(I,K))
1229 dSUBT(I,K)=(1./cp)*(dsubt(i,k)-xl*dsubq(i,k))
1230 XT(I,K)= (DELLAT(I,K)+dsubt(i,k))*MBDT+TN(I,K)
1231 IF(XQ(I,K).LE.0.)XQ(I,K)=1.E-08
1232 if(i.eq.ipr.and.j.eq.jpr)then
1233 write(0,*)k,trash,DELLAQ(I,K),dsubq(I,K),dsubt(i,k)
1239 if(ierr(i).eq.0)then
1240 XHE(I,ktf)=HEO(I,ktf)
1243 IF(XQ(I,ktf).LE.0.)XQ(I,ktf)=1.E-08
1247 !--- calculate moist static energy, heights, qes
1249 call cup_env(xz,xqes,xhe,xhes,xt,xq,po,z1, &
1250 psur,ierr,tcrit,2,xl,cp, &
1252 its,ite, jts,jte, kts,kte)
1254 !--- environmental values on cloud levels
1256 call cup_env_clev(xt,xqes,xq,xhe,xhes,xz,po,xqes_cup,xq_cup, &
1257 xhe_cup,xhes_cup,xz_cup,po_cup,gamma_cup,xt_cup,psur, &
1260 its,ite, jts,jte, kts,kte)
1263 !**************************** static control
1265 !--- moist static energy inside cloud
1268 if(ierr(i).eq.0)then
1269 xhkb(i)=xhe(i,k22(i))
1272 call cup_up_he(k22,xhkb,xz_cup,cd,mentr_rate,xhe_cup,xhc, &
1273 kbcon,ierr,xdby,xhe,xhes_cup, &
1275 its,ite, jts,jte, kts,kte)
1277 !c--- normalized mass flux profile
1279 call cup_up_nms(xzu,xz_cup,mentr_rate,cd,kbcon,ktop,ierr,k22, &
1281 its,ite, jts,jte, kts,kte)
1283 !--- moisture downdraft
1285 call cup_dd_nms(xzd,xz_cup,cdd,mentrd_rate,jmin,ierr, &
1288 its,ite, jts,jte, kts,kte)
1289 call cup_dd_he(xhes_cup,xzd,xhcd,xz_cup,cdd,mentrd_rate, &
1290 jmin,ierr,xhe,dbyd,xhe_cup,&
1292 its,ite, jts,jte, kts,kte)
1293 call cup_dd_moisture_3d(xzd,xhcd,xhes_cup,xqcd,xqes_cup, &
1294 xpwd,xq_cup,xz_cup,cdd,mentrd_rate,jmin,ierr,gamma_cup, &
1295 xpwev,bu,xqrcd,xq,xhe,xt_cup,3,xl,high_resolution, &
1297 its,ite, jts,jte, kts,kte)
1300 !------- MOISTURE updraft
1302 call cup_up_moisture(ierr,xz_cup,xqc,xqrc,xpw,xpwav, &
1303 kbcon,ktop,cd,xdby,mentr_rate,clw_all, &
1304 xq,GAMMA_cup,xzu,xqes_cup,k22,xq_cup,xl, &
1306 its,ite, jts,jte, kts,kte)
1308 !--- workfunctions for updraft
1310 call cup_up_aa0(xaa0,xz,xzu,xdby,GAMMA_CUP,xt_cup, &
1313 its,ite, jts,jte, kts,kte)
1314 do 200 nens=1,maxens
1316 if(ierr(i).eq.0)then
1317 xaa0_ens(i,nens)=xaa0(i)
1318 nall=(iens-1)*maxens3*maxens*maxens2 &
1319 +(iedt-1)*maxens*maxens3 &
1322 if(k.le.ktop(i))then
1326 pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3) &
1327 +edto(i)*pwdo(i,k) &
1330 else if(nens3.eq.8)then
1331 pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3)+ &
1334 else if(nens3.eq.9)then
1335 pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3) &
1336 +.5*edto(i)*pwdo(i,k) &
1339 pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3)+ &
1340 pwo(i,k)+edto(i)*pwdo(i,k)
1345 if(pr_ens(i,j,nall+7).lt.1.e-6)then
1348 pr_ens(i,j,nall+nens3)=0.
1352 if(pr_ens(i,j,nall+nens3).lt.1.e-4)then
1353 pr_ens(i,j,nall+nens3)=0.
1360 !--- LARGE SCALE FORCING
1363 !------- CHECK wether aa0 should have been zero
1366 CALL cup_MAXIMI(HEO_CUP,3,KBMAX,K22x,ierr, &
1368 its,ite, jts,jte, kts,kte)
1373 call cup_kbcon(cap_max_increment,2,k22x,kbconx,heo_cup, &
1374 heso_cup,ierr2,kbmax,po_cup,cap_max, &
1376 its,ite, jts,jte, kts,kte)
1377 call cup_kbcon(cap_max_increment,3,k22x,kbconx,heo_cup, &
1378 heso_cup,ierr3,kbmax,po_cup,cap_max, &
1380 its,ite, jts,jte, kts,kte)
1382 !--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
1385 call cup_forcing_ens_3d(closure_n,xland1,aa0,aa1,xaa0_ens,mbdt_ens,dtime, &
1386 ierr,ierr2,ierr3,xf_ens,j,'deeps',axx, &
1387 maxens,iens,iedt,maxens2,maxens3,mconv, &
1388 po_cup,ktop,omeg,zdo,k22,zuo,pr_ens,edto,kbcon, &
1389 massflx,iact,direction,ensdim,massfln,ichoice,edt_out, &
1390 high_resolution,itf,jtf,ktf, &
1391 its,ite, jts,jte, kts,kte,ens4,ktau)
1395 if(ierr(i).eq.0)then
1396 subt_ens(i,k,iedt)=dsubt(i,k)
1397 subq_ens(i,k,iedt)=dsubq(i,k)
1398 dellat_ens(i,k,iedt)=dellat(i,k)
1399 dellaq_ens(i,k,iedt)=dellaq(i,k)
1400 dellaqc_ens(i,k,iedt)=dellaqc(i,k)
1401 pwo_ens(i,k,iedt)=pwo(i,k)+edt(i)*pwdo(i,k)
1403 subt_ens(i,k,iedt)=0.
1404 subq_ens(i,k,iedt)=0.
1405 dellat_ens(i,k,iedt)=0.
1406 dellaq_ens(i,k,iedt)=0.
1407 dellaqc_ens(i,k,iedt)=0.
1408 pwo_ens(i,k,iedt)=0.
1410 if(i.eq.ipr.and.j.eq.jpr)then
1411 write(0,*)'1',iens,iedt,dellat(i,k),dellat_ens(i,k,iedt), &
1412 dellaq(i,k), dellaqc(i,k)
1413 write(0,*)'2',k,subt_ens(i,k,iedt),subq_ens(i,k,iedt)
1421 call cup_output_ens_3d(xf_ens,ierr,dellat_ens,dellaq_ens, &
1422 dellaqc_ens,subt_ens,subq_ens,subt,subq,outt, &
1423 outq,outqc,zuo,sub_mas,pre,pwo_ens,xmb,ktop, &
1424 j,'deep',maxens2,maxens,iens,ierr2,ierr3, &
1425 pr_ens,maxens3,ensdim,massfln, &
1426 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
1427 APR_CAPMA,APR_CAPME,APR_CAPMI,closure_n,xland1, &
1429 its,ite, jts,jte, kts,kte)
1432 PRE(I)=MAX(PRE(I),0.)
1433 if(i.eq.ipr.and.j.eq.jpr)then
1434 write(0,*)'i,j,pre(i),aa0(i),aa1(i)'
1435 write(0,*)i,j,pre(i),aa0(i)
1439 !---------------------------done------------------------------
1442 if(ierr(i).eq.0)then
1443 if(i.eq.ipr.and.j.eq.jpr)then
1444 write(0,*)'on output, pre =',pre(i),its,itf,kts,ktf
1446 write(0,*)z(i,k),outt(i,k)*86400.,subt(i,k)*86400.
1448 write(0,*)i,j,(axx(i,k),k=1,ens4)
1452 ! print *,'ierr(i) = ',ierr(i),pre(i)
1454 END SUBROUTINE CUP_enss_3d
1457 SUBROUTINE cup_dd_aa0(edt,ierr,aa0,jmin,gamma_cup,t_cup, &
1460 its,ite, jts,jte, kts,kte )
1467 ! only local wrf dimensions are need as of now in this routine
1472 its,ite, jts,jte, kts,kte
1473 ! aa0 cloud work function for downdraft
1474 ! gamma_cup = gamma on model cloud levels
1475 ! t_cup = temperature (Kelvin) on model cloud levels
1476 ! hes_cup = saturation moist static energy on model cloud levels
1477 ! hcd = moist static energy in downdraft
1479 ! zd normalized downdraft mass flux
1480 ! z = heights of model levels
1481 ! ierr error value, maybe modified in this routine
1483 real, dimension (its:ite,kts:kte) &
1485 z,zd,gamma_cup,t_cup,hes_cup,hcd
1486 real, dimension (its:ite) &
1489 integer, dimension (its:ite) &
1497 integer, dimension (its:ite) &
1498 ,intent (inout) :: &
1500 real, dimension (its:ite) &
1504 ! local variables in this routine
1519 IF(ierr(I).eq.0.and.k.lt.jmin(i))then
1524 DZ=(Z(I,KK)-Z(I,KK+1))
1525 AA0(I)=AA0(I)+zd(i,kk)*EDT(I)*DZ*(9.81/(1004.*T_cup(I,KK))) &
1526 *((hcd(i,kk)-hes_cup(i,kk))/(1.+GAMMA_cup(i,kk)))
1531 END SUBROUTINE CUP_dd_aa0
1534 SUBROUTINE cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, &
1535 pwev,edtmax,edtmin,maxens2,edtc, &
1537 its,ite, jts,jte, kts,kte )
1544 its,ite, jts,jte, kts,kte
1545 integer, intent (in ) :: &
1548 ! ierr error value, maybe modified in this routine
1550 real, dimension (its:ite,kts:kte) &
1553 real, dimension (its:ite,1:maxens2) &
1556 real, dimension (its:ite) &
1559 real, dimension (its:ite) &
1565 integer, dimension (its:ite) &
1568 integer, dimension (its:ite) &
1569 ,intent (inout) :: &
1572 ! local variables in this routine
1576 real einc,pef,pefb,prezk,zkbc
1577 real, dimension (its:ite) :: &
1581 !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
1583 ! */ calculate an average wind shear over the depth of the cloud
1598 IF(ierr(i).ne.0)GO TO 62
1599 if (kk .le. min0(ktop(i),ktf) .and. kk .ge. kbcon(i)) then
1601 (abs((us(i,kk+1)-us(i,kk))/(z(i,kk+1)-z(i,kk))) &
1602 + abs((vs(i,kk+1)-vs(i,kk))/(z(i,kk+1)-z(i,kk)))) * &
1603 (p(i,kk) - p(i,kk+1))
1604 sdp(i) = sdp(i) + p(i,kk) - p(i,kk+1)
1606 if (kk .eq. ktf)vshear(i) = 1.e3 * vws(i) / sdp(i)
1610 IF(ierr(i).eq.0)then
1611 pef=(1.591-.639*VSHEAR(I)+.0953*(VSHEAR(I)**2) &
1612 -.00496*(VSHEAR(I)**3))
1616 !--- cloud base precip efficiency
1618 zkbc=z(i,kbcon(i))*3.281e-3
1621 prezk=.96729352+zkbc*(-.70034167+zkbc*(.162179896+zkbc &
1622 *(- 1.2569798E-2+zkbc*(4.2772E-4-zkbc*5.44E-6))))
1628 if(pefb.gt.1.)pefb=1.
1629 if(pefb.lt.0.)pefb=0.
1630 EDT(I)=1.-.5*(pefb+pef)
1631 !--- edt here is 1-precipeff!
1634 edtc(i,k)=edt(i)+float(k-2)*einc
1639 IF(ierr(i).eq.0)then
1641 EDTC(I,K)=-EDTC(I,K)*PWAV(I)/PWEV(I)
1642 IF(EDTC(I,K).GT.edtmax)EDTC(I,K)=edtmax
1643 IF(EDTC(I,K).LT.edtmin)EDTC(I,K)=edtmin
1648 END SUBROUTINE cup_dd_edt
1651 SUBROUTINE cup_dd_he(hes_cup,zd,hcd,z_cup,cdd,entr, &
1652 jmin,ierr,he,dby,he_cup, &
1654 its,ite, jts,jte, kts,kte )
1661 ! only local wrf dimensions are need as of now in this routine
1666 its,ite, jts,jte, kts,kte
1667 ! hcd = downdraft moist static energy
1668 ! he = moist static energy on model levels
1669 ! he_cup = moist static energy on model cloud levels
1670 ! hes_cup = saturation moist static energy on model cloud levels
1671 ! dby = buoancy term
1672 ! cdd= detrainment function
1673 ! z_cup = heights of model cloud levels
1674 ! entr = entrainment rate
1675 ! zd = downdraft normalized mass flux
1677 real, dimension (its:ite,kts:kte) &
1679 he,he_cup,hes_cup,z_cup,cdd,zd
1680 ! entr= entrainment rate
1684 integer, dimension (its:ite) &
1691 ! ierr error value, maybe modified in this routine
1693 integer, dimension (its:ite) &
1694 ,intent (inout) :: &
1697 real, dimension (its:ite,kts:kte) &
1701 ! local variables in this routine
1713 IF(ierr(I).eq.0)then
1714 hcd(i,k)=hes_cup(i,k)
1720 IF(ierr(I).eq.0)then
1722 hcd(i,k)=hes_cup(i,k)
1723 dby(i,k)=hcd(i,jmin(i))-hes_cup(i,k)
1725 do ki=jmin(i)-1,1,-1
1726 DZ=Z_cup(i,Ki+1)-Z_cup(i,Ki)
1727 HCD(i,Ki)=(HCD(i,Ki+1)*(1.-.5*CDD(i,Ki)*DZ) &
1729 )/(1.+entr*DZ-.5*CDD(i,Ki)*DZ)
1730 dby(i,ki)=HCD(i,Ki)-hes_cup(i,ki)
1734 !--- end loop over i
1738 END SUBROUTINE cup_dd_he
1741 SUBROUTINE cup_dd_moisture_3d(zd,hcd,hes_cup,qcd,qes_cup, &
1742 pwd,q_cup,z_cup,cdd,entr,jmin,ierr, &
1743 gamma_cup,pwev,bu,qrcd, &
1744 q,he,t_cup,iloop,xl,high_resolution, &
1746 its,ite, jts,jte, kts,kte )
1753 its,ite, jts,jte, kts,kte,high_resolution
1754 ! cdd= detrainment function
1755 ! q = environmental q on model levels
1756 ! q_cup = environmental q on model cloud levels
1757 ! qes_cup = saturation q on model cloud levels
1758 ! hes_cup = saturation h on model cloud levels
1759 ! hcd = h in model cloud
1761 ! zd = normalized downdraft mass flux
1762 ! gamma_cup = gamma on model cloud levels
1763 ! mentr_rate = entrainment rate
1764 ! qcd = cloud q (including liquid water) after entrainment
1765 ! qrch = saturation q in cloud
1766 ! pwd = evaporate at that level
1767 ! pwev = total normalized integrated evaoprate (I2)
1768 ! entr= entrainment rate
1770 real, dimension (its:ite,kts:kte) &
1772 zd,t_cup,hes_cup,hcd,qes_cup,q_cup,z_cup,cdd,gamma_cup,q,he
1779 integer, dimension (its:ite) &
1782 integer, dimension (its:ite) &
1783 ,intent (inout) :: &
1785 real, dimension (its:ite,kts:kte) &
1788 real, dimension (its:ite) &
1792 ! local variables in this routine
1815 IF(ierr(I).eq.0)then
1817 DZ=Z_cup(i,K+1)-Z_cup(i,K)
1819 if(high_resolution.eq.1)qcd(i,k)=.5*(qes_cup(i,k)+q_cup(i,k))
1820 qrcd(i,k)=qes_cup(i,k)
1821 pwd(i,jmin(i))=min(0.,qcd(i,k)-qrcd(i,k))
1822 pwev(i)=pwev(i)+pwd(i,jmin(i))
1823 qcd(i,k)=qes_cup(i,k)
1825 DH=HCD(I,k)-HES_cup(I,K)
1827 do ki=jmin(i)-1,1,-1
1828 DZ=Z_cup(i,Ki+1)-Z_cup(i,Ki)
1829 QCD(i,Ki)=(qCD(i,Ki+1)*(1.-.5*CDD(i,Ki)*DZ) &
1831 )/(1.+entr*DZ-.5*CDD(i,Ki)*DZ)
1833 !--- to be negatively buoyant, hcd should be smaller than hes!
1835 DH=HCD(I,ki)-HES_cup(I,Ki)
1837 QRCD(I,Ki)=qes_cup(i,ki)+(1./XL)*(GAMMA_cup(i,ki) &
1838 /(1.+GAMMA_cup(i,ki)))*DH
1839 dqeva=qcd(i,ki)-qrcd(i,ki)
1840 if(dqeva.gt.0.)dqeva=0.
1841 pwd(i,ki)=zd(i,ki)*dqeva
1842 qcd(i,ki)=qrcd(i,ki)
1843 pwev(i)=pwev(i)+pwd(i,ki)
1844 ! if(iloop.eq.1.and.i.eq.102.and.j.eq.62)then
1845 ! print *,'in cup_dd_moi ', hcd(i,ki),HES_cup(I,Ki),dh,dqeva
1849 !--- end loop over i
1850 if(pwev(I).eq.0.and.iloop.eq.1)then
1851 ! print *,'problem with buoy in cup_dd_moisture',i
1854 if(BU(I).GE.0.and.iloop.eq.1)then
1855 ! print *,'problem with buoy in cup_dd_moisture',i
1861 END SUBROUTINE cup_dd_moisture_3d
1864 SUBROUTINE cup_dd_nms(zd,z_cup,cdd,entr,jmin,ierr, &
1867 its,ite, jts,jte, kts,kte )
1874 ! only local wrf dimensions are need as of now in this routine
1879 its,ite, jts,jte, kts,kte
1880 ! z_cup = height of cloud model level
1881 ! z1 = terrain elevation
1882 ! entr = downdraft entrainment rate
1883 ! jmin = downdraft originating level
1884 ! kdet = level above ground where downdraft start detraining
1885 ! itest = flag to whether to calculate cdd
1887 real, dimension (its:ite,kts:kte) &
1890 real, dimension (its:ite) &
1896 integer, dimension (its:ite) &
1906 ! ierr error value, maybe modified in this routine
1908 integer, dimension (its:ite) &
1909 ,intent (inout) :: &
1911 ! zd is the normalized downdraft mass flux
1912 ! cdd is the downdraft detrainmen function
1914 real, dimension (its:ite,kts:kte) &
1917 real, dimension (its:ite,kts:kte) &
1918 ,intent (inout) :: &
1921 ! local variables in this routine
1930 !--- perc is the percentage of mass left when hitting the ground
1937 if(itest.eq.0)cdd(i,k)=0.
1945 IF(ierr(I).eq.0)then
1948 !--- integrate downward, specify detrainment(cdd)!
1950 do ki=jmin(i)-1,1,-1
1951 DZ=Z_cup(i,Ki+1)-Z_cup(i,Ki)
1952 if(ki.le.kdet(i).and.itest.eq.0)then
1953 cdd(i,ki)=entr+(1.- (a*(z_cup(i,ki)-z1(i)) &
1954 +perc*(z_cup(i,kdet(i))-z1(i)) ) &
1955 /(a*(z_cup(i,ki+1)-z1(i)) &
1956 +perc*(z_cup(i,kdet(i))-z1(i))))/dz
1958 zd(i,ki)=zd(i,ki+1)*(1.+(entr-cdd(i,ki))*dz)
1962 !--- end loop over i
1965 END SUBROUTINE cup_dd_nms
1968 SUBROUTINE cup_dellabot(ipr,jpr,he_cup,ierr,z_cup,p_cup, &
1969 hcd,edt,zd,cdd,he,della,subs,j,mentrd_rate,z,g, &
1971 its,ite, jts,jte, kts,kte )
1978 its,ite, jts,jte, kts,kte
1979 integer, intent (in ) :: &
1982 ! ierr error value, maybe modified in this routine
1984 real, dimension (its:ite,kts:kte) &
1987 real, dimension (its:ite,kts:kte) &
1989 z_cup,p_cup,hcd,zd,cdd,he,z,he_cup
1990 real, dimension (its:ite) &
1996 integer, dimension (its:ite) &
1997 ,intent (inout) :: &
2000 ! local variables in this routine
2004 real detdo,detdo1,detdo2,entdo,dp,dz,subin, &
2011 if(ierr(i).ne.0)go to 100
2012 dz=z_cup(i,2)-z_cup(i,1)
2013 DP=100.*(p_cup(i,1)-P_cup(i,2))
2014 detdo1=edt(i)*zd(i,2)*CDD(i,1)*DZ
2015 detdo2=edt(i)*zd(i,1)
2016 entdo=edt(i)*zd(i,2)*mentrd_rate*dz
2017 subin=-EDT(I)*zd(i,2)
2018 detdo=detdo1+detdo2-entdo+subin
2019 DELLA(I,1)=(detdo1*.5*(HCD(i,1)+HCD(i,2)) &
2021 +subin*he_cup(i,2) &
2022 -entdo*he(i,1))*g/dp
2024 if(i.eq.ipr.and.j.eq.jpr)then
2025 write(0,*)'db1',della(i,1),subs(i,1),subin,entdo
2026 write(0,*)'db2',detdo1,detdo2,detdo1+detdo2-entdo+subin
2030 END SUBROUTINE cup_dellabot
2033 SUBROUTINE cup_dellas_3d(ierr,z_cup,p_cup,hcd,edt,zd,cdd, &
2034 he,della,subs,j,mentrd_rate,zu,g, &
2035 cd,hc,ktop,k22,kbcon,mentr_rate,jmin,he_cup,kdet,kpbl, &
2036 ipr,jpr,name,high_res, &
2038 its,ite, jts,jte, kts,kte )
2045 its,ite, jts,jte, kts,kte
2046 integer, intent (in ) :: &
2049 ! ierr error value, maybe modified in this routine
2051 real, dimension (its:ite,kts:kte) &
2054 real, dimension (its:ite,kts:kte) &
2056 z_cup,p_cup,hcd,zd,cdd,he,hc,cd,zu,he_cup
2057 real, dimension (its:ite) &
2062 g,mentrd_rate,mentr_rate
2063 integer, dimension (its:ite) &
2065 kbcon,ktop,k22,jmin,kdet,kpbl
2066 integer, dimension (its:ite) &
2067 ,intent (inout) :: &
2069 character *(*), intent (in) :: &
2072 ! local variables in this routine
2076 real detdo1,detdo2,entdo,dp,dz,subin,detdo,entup, &
2077 detup,subdown,entdoj,entupk,detupk,totmas
2087 DO 100 k=kts+1,ktf-1
2089 IF(ierr(i).ne.0)GO TO 100
2090 IF(K.Gt.KTOP(I))GO TO 100
2092 !--- SPECIFY DETRAINMENT OF DOWNDRAFT, HAS TO BE CONSISTENT
2093 !--- WITH ZD CALCULATIONS IN SOUNDD.
2095 DZ=Z_cup(I,K+1)-Z_cup(I,K)
2096 detdo=edt(i)*CDD(i,K)*DZ*ZD(i,k+1)
2097 entdo=edt(i)*mentrd_rate*dz*zd(i,k+1)
2098 !3d subin=zu(i,k+1)-zd(i,k+1)*edt(i)
2099 subin=-zd(i,k+1)*edt(i)
2102 if(k.ge.kbcon(i).and.k.lt.ktop(i))then
2103 entup=mentr_rate*dz*zu(i,k)
2104 detup=CD(i,K+1)*DZ*ZU(i,k)
2106 !3d subdown=(zu(i,k)-zd(i,k)*edt(i))
2107 subdown=-zd(i,k)*edt(i)
2112 if(k.eq.jmin(i))then
2113 entdoj=edt(i)*zd(i,k)
2116 if(k.eq.k22(i)-1)then
2117 entupk=zu(i,kpbl(i))
2118 subin=zu(i,k+1)-zd(i,k+1)*edt(i)
2119 if(high_res.eq.1)subin=-zd(i,k+1)*edt(i)
2120 ! subin=-zd(i,k+1)*edt(i)
2123 if(k.gt.kdet(i))then
2127 if(k.eq.ktop(i)-0)then
2128 detupk=zu(i,ktop(i))
2131 ! this subsidene for ktop now in subs term!
2135 if(k.lt.kbcon(i))then
2139 !C--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT
2141 totmas=subin-subdown+detup-entup-entdo+ &
2142 detdo-entupk-entdoj+detupk
2143 ! if(j.eq.jpr.and.i.eq.ipr)print *,'k,totmas,sui,sud = ',k,
2144 ! 1 totmas,subin,subdown
2145 ! if(j.eq.jpr.and.i.eq.ipr)print *,'updr stuff = ',detup,
2146 ! 1 entup,entupk,detupk
2147 ! if(j.eq.jpr.and.i.eq.ipr)print *,'dddr stuff = ',entdo,
2149 if(abs(totmas).gt.1.e-6)then
2150 ! print *,'*********************',i,j,k,totmas,name
2151 ! print *,kpbl(i),k22(i),kbcon(i),ktop(i)
2152 !c print *,'updr stuff = ',subin,
2153 !c 1 subdown,detup,entup,entupk,detupk
2154 !c print *,'dddr stuff = ',entdo,
2156 ! call wrf_error_fatal ( 'totmas .gt.1.e-6' )
2158 dp=100.*(p_cup(i,k-1)-p_cup(i,k))
2159 della(i,k)=(detup*.5*(HC(i,K+1)+HC(i,K)) &
2160 +detdo*.5*(HCD(i,K+1)+HCD(i,K)) &
2163 +subin*he_cup(i,k+1) &
2164 -subdown*he_cup(i,k) &
2165 +detupk*(hc(i,ktop(i))-he_cup(i,ktop(i))) &
2166 -entupk*he_cup(i,k22(i)) &
2167 -entdoj*he_cup(i,jmin(i)) &
2169 if(high_res.eq.1)then
2170 ! the first term includes entr and detr into/from updraft as well as (entup-detup)*he(i,k) from
2171 ! neighbouring point, to make things mass consistent....
2172 ! if(k.ge.k22(i))then
2174 detup*.5*(HC(i,K+1)+HC(i,K))-entup*he(i,k)+(entup-detup)*he(i,k) &
2175 +detdo*.5*(HCD(i,K+1)+HCD(i,K)) &
2177 +subin*he_cup(i,k+1) &
2178 -subdown*he_cup(i,k) &
2179 +detupk*(hc(i,ktop(i))-he(i,ktop(i))) &
2180 -entdoj*he_cup(i,jmin(i)) &
2181 -entupk*he_cup(i,k22(i))+entupk*he(i,k) &
2183 ! else if(k.eq.k22(i)-1)then
2184 ! della(i,k)=(-entupk*he_cup(i,k22(i))+entupk*he(i,k))*g/dp
2186 !3d subin=zu(i,k+1)-zd(i,k+1)*edt(i)
2188 ! updraft subsidence only
2190 if(k.ge.k22(i).and.k.lt.ktop(i))then
2191 subs(i,k)=(zu(i,k+1)*he_cup(i,k+1) &
2192 -zu(i,k)*he_cup(i,k))*g/dp
2193 ! else if(k.eq.ktop(i))then
2194 ! subs(i,k)=-detupk*he_cup(i,k)*g/dp
2197 ! in igh res case, subsidence terms are for meighbouring points only. This has to be
2198 ! done mass consistent with the della term
2199 if(high_res.eq.1)then
2200 if(k.ge.k22(i).and.k.lt.ktop(i))then
2201 subs(i,k)=(zu(i,k+1)*he_cup(i,k+1)-zu(i,k)*he_cup(i,k)-(entup-detup)*he(i,k))*g/dp
2202 else if(k.eq.ktop(i))then
2203 subs(i,k)=detupk*(he(i,ktop(i))-he_cup(i,ktop(i)))*g/dp
2204 else if(k.eq.k22(i)-1)then
2205 subs(i,k)=(entupk*he(i,k)-entupk*he_cup(i,k))*g/dp
2208 if(i.eq.ipr.and.j.eq.jpr)then
2209 write(0,*)'d',k,della(i,k),subs(i,k),subin,subdown
2210 ! write(0,*)'d',detup,entup,entdo,entupk,entdoj
2211 ! print *,k,della(i,k),subin*he_cup(i,k+1),subdown*he_cup(i,k),
2212 ! 1 detdo*.5*(HCD(i,K+1)+HCD(i,K))
2213 ! print *,k,detup*.5*(HC(i,K+1)+HC(i,K)),detupk*hc(i,ktop(i)),
2214 ! 1 entup*he(i,k),entdo*he(i,k)
2215 ! print *,k,he_cup(i,k+1),he_cup(i,k),entupk*he_cup(i,k)
2220 END SUBROUTINE cup_dellas_3d
2223 SUBROUTINE cup_direction2(i,j,dir,id,massflx, &
2224 iresult,imass,massfld, &
2226 its,ite, jts,jte, kts,kte )
2233 its,ite, jts,jte, kts,kte
2234 integer, intent (in ) :: &
2236 integer, intent (out ) :: &
2239 ! ierr error value, maybe modified in this routine
2241 integer, dimension (its:ite,jts:jte) &
2244 real, dimension (its:ite,jts:jte) &
2247 real, dimension (its:ite) &
2248 ,intent (inout) :: &
2254 ! local variables in this routine
2257 integer k,ia,ja,ib,jb
2263 massfld=massflx(i,j)
2268 if(dir(i).lt.22.5)dir(i)=360.+dir(i)
2269 if(id(i,j).eq.1)iresult=1
2278 if(dir(i).gt.90.-diff.and.dir(i).le.90.+diff)then
2279 !--- steering flow from the east
2280 if(id(ib,j).eq.1)then
2283 massfld=max(massflx(ib,j),massflx(i,j))
2287 else if(dir(i).gt.135.-diff.and.dir(i).le.135.+diff)then
2288 !--- steering flow from the south-east
2289 if(id(ib,ja).eq.1)then
2292 massfld=max(massflx(ib,ja),massflx(i,j))
2296 !--- steering flow from the south
2297 else if(dir(i).gt.180.-diff.and.dir(i).le.180.+diff)then
2298 if(id(i,ja).eq.1)then
2301 massfld=max(massflx(i,ja),massflx(i,j))
2305 !--- steering flow from the south west
2306 else if(dir(i).gt.225.-diff.and.dir(i).le.225.+diff)then
2307 if(id(ia,ja).eq.1)then
2310 massfld=max(massflx(ia,ja),massflx(i,j))
2314 !--- steering flow from the west
2315 else if(dir(i).gt.270.-diff.and.dir(i).le.270.+diff)then
2316 if(id(ia,j).eq.1)then
2319 massfld=max(massflx(ia,j),massflx(i,j))
2323 !--- steering flow from the north-west
2324 else if(dir(i).gt.305.-diff.and.dir(i).le.305.+diff)then
2325 if(id(ia,jb).eq.1)then
2328 massfld=max(massflx(ia,jb),massflx(i,j))
2332 !--- steering flow from the north
2333 else if(dir(i).gt.360.-diff.and.dir(i).le.360.+diff)then
2334 if(id(i,jb).eq.1)then
2337 massfld=max(massflx(i,jb),massflx(i,j))
2341 !--- steering flow from the north-east
2342 else if(dir(i).gt.45.-diff.and.dir(i).le.45.+diff)then
2343 if(id(ib,jb).eq.1)then
2346 massfld=max(massflx(ib,jb),massflx(i,j))
2352 END SUBROUTINE cup_direction2
2355 SUBROUTINE cup_env(z,qes,he,hes,t,q,p,z1, &
2356 psur,ierr,tcrit,itest,xl,cp, &
2358 its,ite, jts,jte, kts,kte )
2365 its,ite, jts,jte, kts,kte
2367 ! ierr error value, maybe modified in this routine
2368 ! q = environmental mixing ratio
2369 ! qes = environmental saturation mixing ratio
2370 ! t = environmental temp
2371 ! tv = environmental virtual temp
2372 ! p = environmental pressure
2373 ! z = environmental heights
2374 ! he = environmental moist static energy
2375 ! hes = environmental saturation moist static energy
2376 ! psur = surface pressure
2377 ! z1 = terrain elevation
2380 real, dimension (its:ite,kts:kte) &
2383 real, dimension (its:ite,kts:kte) &
2386 real, dimension (its:ite,kts:kte) &
2387 ,intent (inout) :: &
2389 real, dimension (its:ite) &
2395 integer, dimension (its:ite) &
2396 ,intent (inout) :: &
2402 ! local variables in this routine
2407 real, dimension (1:2) :: AE,BE,HT
2408 real, dimension (its:ite,kts:kte) :: tv
2409 real :: tcrit,e,tvbar
2414 BE(1)=.622*HT(1)/.286
2415 AE(1)=BE(1)/273.+ALOG(610.71)
2416 BE(2)=.622*HT(2)/.286
2417 AE(2)=BE(2)/273.+ALOG(610.71)
2418 ! print *, 'TCRIT = ', tcrit,its,ite
2421 if(ierr(i).eq.0)then
2422 !Csgb - IPH is for phase, dependent on TCRIT (water or ice)
2424 IF(T(I,K).LE.TCRIT)IPH=2
2425 ! print *, 'AE(IPH),BE(IPH) = ',AE(IPH),BE(IPH),AE(IPH)-BE(IPH),T(i,k),i,k
2426 E=EXP(AE(IPH)-BE(IPH)/T(I,K))
2427 ! print *, 'P, E = ', P(I,K), E
2428 QES(I,K)=.622*E/(100.*P(I,K)-E)
2429 IF(QES(I,K).LE.1.E-08)QES(I,K)=1.E-08
2430 IF(Q(I,K).GT.QES(I,K))Q(I,K)=QES(I,K)
2431 TV(I,K)=T(I,K)+.608*Q(I,K)*T(I,K)
2436 !--- z's are calculated with changed h's and q's and t's
2441 if(ierr(i).eq.0)then
2442 Z(I,1)=max(0.,Z1(I))-(ALOG(P(I,1))- &
2443 ALOG(PSUR(I)))*287.*TV(I,1)/9.81
2447 ! --- calculate heights
2450 if(ierr(i).eq.0)then
2451 TVBAR=.5*TV(I,K)+.5*TV(I,K-1)
2452 Z(I,K)=Z(I,K-1)-(ALOG(P(I,K))- &
2453 ALOG(P(I,K-1)))*287.*TVBAR/9.81
2460 if(ierr(i).eq.0)then
2461 z(i,k)=(he(i,k)-1004.*t(i,k)-2.5e6*q(i,k))/9.81
2462 z(i,k)=max(1.e-3,z(i,k))
2468 !--- calculate moist static energy - HE
2469 ! saturated moist static energy - HES
2473 if(ierr(i).eq.0)then
2474 if(itest.eq.0)HE(I,K)=9.81*Z(I,K)+1004.*T(I,K)+2.5E06*Q(I,K)
2475 HES(I,K)=9.81*Z(I,K)+1004.*T(I,K)+2.5E06*QES(I,K)
2476 IF(HE(I,K).GE.HES(I,K))HE(I,K)=HES(I,K)
2481 END SUBROUTINE cup_env
2484 SUBROUTINE cup_env_clev(t,qes,q,he,hes,z,p,qes_cup,q_cup, &
2485 he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup,psur, &
2488 its,ite, jts,jte, kts,kte )
2495 its,ite, jts,jte, kts,kte
2497 ! ierr error value, maybe modified in this routine
2498 ! q = environmental mixing ratio
2499 ! q_cup = environmental mixing ratio on cloud levels
2500 ! qes = environmental saturation mixing ratio
2501 ! qes_cup = environmental saturation mixing ratio on cloud levels
2502 ! t = environmental temp
2503 ! t_cup = environmental temp on cloud levels
2504 ! p = environmental pressure
2505 ! p_cup = environmental pressure on cloud levels
2506 ! z = environmental heights
2507 ! z_cup = environmental heights on cloud levels
2508 ! he = environmental moist static energy
2509 ! he_cup = environmental moist static energy on cloud levels
2510 ! hes = environmental saturation moist static energy
2511 ! hes_cup = environmental saturation moist static energy on cloud levels
2512 ! gamma_cup = gamma on cloud levels
2513 ! psur = surface pressure
2514 ! z1 = terrain elevation
2517 real, dimension (its:ite,kts:kte) &
2520 real, dimension (its:ite,kts:kte) &
2522 qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup
2523 real, dimension (its:ite) &
2529 integer, dimension (its:ite) &
2530 ,intent (inout) :: &
2533 ! local variables in this routine
2542 if(ierr(i).eq.0)then
2543 qes_cup(i,k)=.5*(qes(i,k-1)+qes(i,k))
2544 q_cup(i,k)=.5*(q(i,k-1)+q(i,k))
2545 hes_cup(i,k)=.5*(hes(i,k-1)+hes(i,k))
2546 he_cup(i,k)=.5*(he(i,k-1)+he(i,k))
2547 if(he_cup(i,k).gt.hes_cup(i,k))he_cup(i,k)=hes_cup(i,k)
2548 z_cup(i,k)=.5*(z(i,k-1)+z(i,k))
2549 p_cup(i,k)=.5*(p(i,k-1)+p(i,k))
2550 t_cup(i,k)=.5*(t(i,k-1)+t(i,k))
2551 gamma_cup(i,k)=(xl/cp)*(xl/(rv*t_cup(i,k) &
2552 *t_cup(i,k)))*qes_cup(i,k)
2557 if(ierr(i).eq.0)then
2558 qes_cup(i,1)=qes(i,1)
2560 hes_cup(i,1)=hes(i,1)
2562 z_cup(i,1)=.5*(z(i,1)+z1(i))
2563 p_cup(i,1)=.5*(p(i,1)+psur(i))
2565 gamma_cup(i,1)=xl/cp*(xl/(rv*t_cup(i,1) &
2566 *t_cup(i,1)))*qes_cup(i,1)
2570 END SUBROUTINE cup_env_clev
2573 SUBROUTINE cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2,ierr3,&
2574 xf_ens,j,name,axx,maxens,iens,iedt,maxens2,maxens3,mconv, &
2575 p_cup,ktop,omeg,zd,k22,zu,pr_ens,edt,kbcon,massflx, &
2576 iact_old_gr,dir,ensdim,massfln,icoic,edt_out, &
2577 high_resolution,itf,jtf,ktf, &
2578 its,ite, jts,jte, kts,kte,ens4,ktau )
2585 its,ite, jts,jte, kts,kte,ens4,high_resolution,ktau
2586 integer, intent (in ) :: &
2587 j,ensdim,maxens,iens,iedt,maxens2,maxens3
2589 ! ierr error value, maybe modified in this routine
2590 ! pr_ens = precipitation ensemble
2591 ! xf_ens = mass flux ensembles
2592 ! massfln = downdraft mass flux ensembles used in next timestep
2593 ! omeg = omega from large scale model
2594 ! mconv = moisture convergence from large scale model
2595 ! zd = downdraft normalized mass flux
2596 ! zu = updraft normalized mass flux
2597 ! aa0 = cloud work function without forcing effects
2598 ! aa1 = cloud work function with forcing effects
2599 ! xaa0 = cloud work function with cloud effects (ensemble dependent)
2601 ! dir = "storm motion"
2602 ! mbdt = arbitrary numerical parameter
2603 ! dtime = dt over which forcing is applied
2604 ! iact_gr_old = flag to tell where convection was active
2605 ! kbcon = LFC of parcel from k22
2606 ! k22 = updraft originating level
2607 ! icoic = flag if only want one closure (usually set to zero!)
2608 ! name = deep or shallow convection flag
2610 real, dimension (its:ite,jts:jte,1:ensdim) &
2611 ,intent (inout) :: &
2613 real, dimension (its:ite,jts:jte,1:ensdim) &
2616 real, dimension (its:ite,jts:jte) &
2617 ,intent (inout ) :: &
2619 real, dimension (its:ite,jts:jte) &
2622 real, dimension (its:ite,kts:kte) &
2625 real, dimension (its:ite,kts:kte,1:ens4) &
2628 real, dimension (its:ite,1:maxens) &
2631 real, dimension (its:ite) &
2634 real, dimension (its:ite,1:ens4) &
2637 real, dimension (its:ite) &
2638 ,intent (inout) :: &
2640 real, dimension (1:maxens) &
2646 integer, dimension (its:ite,jts:jte) &
2649 integer, dimension (its:ite) &
2652 integer, dimension (its:ite) &
2653 ,intent (inout) :: &
2658 character *(*), intent (in) :: &
2661 ! local variables in this routine
2664 real, dimension (1:maxens3) :: &
2666 real, dimension (1:maxens) :: &
2669 i,k,nall,n,ne,nens,nens3,iresult,iresultd,iresulte,mkxcrt,kclim
2670 parameter (mkxcrt=15)
2672 fens4,a1,massfld,a_ave,xff0,xff00,xxx,xomg,aclim1,aclim2,aclim3,aclim4
2673 real, dimension(1:mkxcrt) :: &
2676 integer :: nall2,ixxx,irandom
2677 integer, dimension (8) :: seed
2680 DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
2681 350.,300.,250.,200.,150./
2682 DATA ACRIT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
2683 .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
2684 ! GDAS DERIVED ACRIT
2685 DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
2686 .743,.813,.886,.947,1.138,1.377,1.896/
2693 if(high_resolution.eq.1)irandom=0
2697 !--- LARGE SCALE FORCING
2700 if(name.eq.'deeps'.and.ierr(i).gt.995)then
2704 IF(ierr(i).eq.0)then
2708 if(name.eq.'deeps')then
2712 a_ave=a_ave+axx(i,ne)
2714 a_ave=max(0.,a_ave/fens4)
2715 a_ave=min(a_ave,aa1(i))
2720 xff0= (AA1(I)-AA0(I))/DTIME
2721 if(high_resolution.eq.1)xff0= (a_ave-AA0(I))/DTIME
2722 xff_ens3(1)=(AA1(I)-AA0(I))/dtime
2723 xff_ens3(2)=(a_ave-AA0(I))/dtime
2724 if(irandom.eq.1)then
2726 call random_seed (PUT=seed)
2727 call random_number (xxx)
2728 ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
2729 xff_ens3(3)=(axx(i,ixxx)-AA0(I))/dtime
2730 call random_number (xxx)
2731 ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
2732 xff_ens3(13)=(axx(i,ixxx)-AA0(I))/dtime
2734 xff_ens3(3)=(AA1(I)-AA0(I))/dtime
2735 xff_ens3(13)=(AA1(I)-AA0(I))/dtime
2737 if(high_resolution.eq.1)then
2738 xff_ens3(1)=(a_ave-AA0(I))/dtime
2739 xff_ens3(2)=(a_ave-AA0(I))/dtime
2740 xff_ens3(3)=(a_ave-AA0(I))/dtime
2741 xff_ens3(13)=(a_ave-AA0(I))/dtime
2744 !--- more original Arakawa-Schubert (climatologic value of aa0)
2747 !--- omeg is in bar/s, mconv done with omeg in Pa/s
2748 ! more like Brown (1979), or Frank-Cohen (199?)
2752 xff_ens3(14)=xff_ens3(14)-omeg(i,k22(i),ne)/(fens4*9.81)
2754 if(xff_ens3(14).lt.0.)xff_ens3(14)=0.
2757 xff_ens3(5)=xff_ens3(5)-omeg(i,kbcon(i),ne)/(fens4*9.81)
2759 if(xff_ens3(5).lt.0.)xff_ens3(5)=0.
2761 ! minimum below kbcon
2763 if(high_resolution.eq.0)then
2764 xff_ens3(4)=-omeg(i,2,1)/9.81
2767 xomg=-omeg(i,k,ne)/9.81
2768 if(xomg.lt.xff_ens3(4))xff_ens3(4)=xomg
2771 if(xff_ens3(4).lt.0.)xff_ens3(4)=0.
2774 xff_ens3(6)=-omeg(i,2,1)/9.81
2777 xomg=-omeg(i,k,ne)/9.81
2778 if(xomg.gt.xff_ens3(6))xff_ens3(6)=xomg
2781 if(xff_ens3(6).lt.0.)xff_ens3(6)=0.
2783 if(high_resolution.eq.1)then
2784 xff_ens3(5)=min(xff_ens3(5),xff_ens3(14))
2785 xff_ens3(4)=xff_ens3(5)
2786 xff_ens3(6)=xff_ens3(5)
2789 !--- more like Krishnamurti et al.; pick max and average values
2791 xff_ens3(7)=mconv(i,1)
2792 xff_ens3(8)=mconv(i,1)
2793 xff_ens3(9)=mconv(i,1)
2796 if (mconv(i,ne).gt.xff_ens3(7))xff_ens3(7)=mconv(i,ne)
2799 if (mconv(i,ne).lt.xff_ens3(8))xff_ens3(8)=mconv(i,ne)
2802 xff_ens3(9)=xff_ens3(9)+mconv(i,ne)
2804 xff_ens3(9)=xff_ens3(9)/fens4
2806 if(high_resolution.eq.1)then
2807 xff_ens3(7)=xff_ens3(9)
2808 xff_ens3(8)=xff_ens3(9)
2809 xff_ens3(15)=xff_ens3(9)
2812 if(high_resolution.eq.0)then
2813 if(irandom.eq.1)then
2815 call random_seed (PUT=seed)
2816 call random_number (xxx)
2817 ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
2818 xff_ens3(15)=mconv(i,ixxx)
2820 xff_ens3(15)=mconv(i,1)
2824 !--- more like Fritsch Chappel or Kain Fritsch (plus triggers)
2826 xff_ens3(10)=A_AVE/(60.*40.)
2827 xff_ens3(11)=AA1(I)/(60.*40.)
2828 if(irandom.eq.1)then
2830 call random_seed (PUT=seed)
2831 call random_number (xxx)
2832 ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
2833 xff_ens3(12)=AXX(I,ixxx)/(60.*40.)
2835 xff_ens3(12)=AA1(I)/(60.*40.)
2837 if(high_resolution.eq.1)then
2838 xff_ens3(11)=xff_ens3(10)
2839 xff_ens3(12)=xff_ens3(10)
2842 !--- more original Arakawa-Schubert (climatologic value of aa0)
2860 XK(nens)=(XAA0(I,nens)-AA1(I))/MBDT(2)
2861 if(xk(nens).le.0.and.xk(nens).gt.-1.e-6) &
2863 if(xk(nens).gt.0.and.xk(nens).lt.1.e-6) &
2867 !--- add up all ensembles
2871 !--- for every xk, we have maxens3 xffs
2872 !--- iens is from outermost ensemble (most expensive!
2874 !--- iedt (maxens2 belongs to it)
2875 !--- is from second, next outermost, not so expensive
2877 !--- so, for every outermost loop, we have maxens*maxens2*3
2878 !--- ensembles!!! nall would be 0, if everything is on first
2879 !--- loop index, then ne would start counting, then iedt, then iens....
2884 nall=(iens-1)*maxens3*maxens*maxens2 &
2885 +(iedt-1)*maxens*maxens3 &
2888 ! over water, enfor!e small cap for some of the closures
2890 if(xland(i).lt.0.1)then
2891 if(ierr2(i).gt.0.or.ierr3(i).gt.0)then
2893 massfln(i,j,nall+1)=0.
2895 massfln(i,j,nall+2)=0.
2897 massfln(i,j,nall+3)=0.
2899 massfln(i,j,nall+10)=0.
2901 massfln(i,j,nall+11)=0.
2903 massfln(i,j,nall+12)=0.
2905 massfln(i,j,nall+7)=0.
2907 massfln(i,j,nall+8)=0.
2909 massfln(i,j,nall+9)=0.
2910 closure_n(i)=closure_n(i)-1.
2912 massfln(i,j,nall+13)=0.
2914 massfln(i,j,nall+15)=0.
2918 ! end water treatment
2921 !--- check for upwind convection
2925 ! call cup_direction2(i,j,dir,iact_old_gr, &
2926 ! massflx,iresult,1, &
2929 ! ims,ime, jms,jme, kms,kme, &
2930 ! its,ite, jts,jte, kts,kte )
2931 ! if(i.eq.ipr.and.j.eq.jpr.and.iedt.eq.1.and.ne.eq.1)then
2932 ! if(iedt.eq.1.and.ne.eq.1)then
2933 ! print *,massfld,ne,iedt,iens
2934 ! print *,xk(ne),xff_ens3(1),xff_ens3(2),xff_ens3(3)
2936 ! print *,i,j,massfld,aa0(i),aa1(i)
2937 IF(XK(ne).lt.0.and.xff0.gt.0.)iresultd=1
2938 iresulte=max(iresult,iresultd)
2940 if(iresulte.eq.1)then
2942 !--- special treatment for stability closures
2946 xf_ens(i,j,nall+1)=massfld
2947 xf_ens(i,j,nall+2)=massfld
2948 xf_ens(i,j,nall+3)=massfld
2949 xf_ens(i,j,nall+13)=massfld
2950 if(xff_ens3(1).gt.0)xf_ens(i,j,nall+1)=max(0.,-xff_ens3(1)/xk(ne)) &
2952 if(xff_ens3(2).gt.0)xf_ens(i,j,nall+2)=max(0.,-xff_ens3(2)/xk(ne)) &
2954 if(xff_ens3(3).gt.0)xf_ens(i,j,nall+3)=max(0.,-xff_ens3(3)/xk(ne)) &
2956 if(xff_ens3(13).gt.0)xf_ens(i,j,nall+13)=max(0.,-xff_ens3(13)/xk(ne)) &
2960 xf_ens(i,j,nall+1)=massfld
2961 xf_ens(i,j,nall+2)=massfld
2962 xf_ens(i,j,nall+3)=massfld
2963 xf_ens(i,j,nall+13)=massfld
2966 !--- if iresult.eq.1, following independent of xff0
2968 xf_ens(i,j,nall+4)=max(0.,xff_ens3(4) &
2970 xf_ens(i,j,nall+5)=max(0.,xff_ens3(5) &
2972 xf_ens(i,j,nall+6)=max(0.,xff_ens3(6) &
2974 xf_ens(i,j,nall+14)=max(0.,xff_ens3(14) &
2976 a1=max(1.e-3,pr_ens(i,j,nall+7))
2977 xf_ens(i,j,nall+7)=max(0.,xff_ens3(7) &
2979 a1=max(1.e-3,pr_ens(i,j,nall+8))
2980 xf_ens(i,j,nall+8)=max(0.,xff_ens3(8) &
2982 a1=max(1.e-3,pr_ens(i,j,nall+9))
2983 xf_ens(i,j,nall+9)=max(0.,xff_ens3(9) &
2985 a1=max(1.e-3,pr_ens(i,j,nall+15))
2986 xf_ens(i,j,nall+15)=max(0.,xff_ens3(15) &
2988 if(XK(ne).lt.0.)then
2989 xf_ens(i,j,nall+10)=max(0., &
2990 -xff_ens3(10)/xk(ne)) &
2992 xf_ens(i,j,nall+11)=max(0., &
2993 -xff_ens3(11)/xk(ne)) &
2995 xf_ens(i,j,nall+12)=max(0., &
2996 -xff_ens3(12)/xk(ne)) &
2999 xf_ens(i,j,nall+10)=massfld
3000 xf_ens(i,j,nall+11)=massfld
3001 xf_ens(i,j,nall+12)=massfld
3005 xf_ens(i,j,nall+1)=xf_ens(i,j,nall+icoic)
3006 xf_ens(i,j,nall+2)=xf_ens(i,j,nall+icoic)
3007 xf_ens(i,j,nall+3)=xf_ens(i,j,nall+icoic)
3008 xf_ens(i,j,nall+4)=xf_ens(i,j,nall+icoic)
3009 xf_ens(i,j,nall+5)=xf_ens(i,j,nall+icoic)
3010 xf_ens(i,j,nall+6)=xf_ens(i,j,nall+icoic)
3011 xf_ens(i,j,nall+7)=xf_ens(i,j,nall+icoic)
3012 xf_ens(i,j,nall+8)=xf_ens(i,j,nall+icoic)
3013 xf_ens(i,j,nall+9)=xf_ens(i,j,nall+icoic)
3014 xf_ens(i,j,nall+10)=xf_ens(i,j,nall+icoic)
3015 xf_ens(i,j,nall+11)=xf_ens(i,j,nall+icoic)
3016 xf_ens(i,j,nall+12)=xf_ens(i,j,nall+icoic)
3017 xf_ens(i,j,nall+13)=xf_ens(i,j,nall+icoic)
3018 xf_ens(i,j,nall+14)=xf_ens(i,j,nall+icoic)
3019 xf_ens(i,j,nall+15)=xf_ens(i,j,nall+icoic)
3020 xf_ens(i,j,nall+16)=xf_ens(i,j,nall+icoic)
3023 ! 16 is a randon pick from the oher 15
3025 if(irandom.eq.1)then
3026 call random_number (xxx)
3027 ixxx=min(15,max(1,int(15.*xxx+1.e-8)))
3028 xf_ens(i,j,nall+16)=xf_ens(i,j,nall+ixxx)
3030 xf_ens(i,j,nall+16)=xf_ens(i,j,nall+1)
3034 !--- store new for next time step
3037 massfln(i,j,nall+nens3)=edt(i) &
3038 *xf_ens(i,j,nall+nens3)
3039 massfln(i,j,nall+nens3)=max(0., &
3040 massfln(i,j,nall+nens3))
3044 !--- do some more on the caps!!! ne=1 for 175, ne=2 for 100,....
3046 ! do not care for caps here for closure groups 1 and 5,
3047 ! they are fine, do not turn them off here
3050 if(ne.eq.2.and.ierr2(i).gt.0)then
3051 xf_ens(i,j,nall+1) =0.
3052 xf_ens(i,j,nall+2) =0.
3053 xf_ens(i,j,nall+3) =0.
3054 xf_ens(i,j,nall+4) =0.
3055 xf_ens(i,j,nall+5) =0.
3056 xf_ens(i,j,nall+6) =0.
3057 xf_ens(i,j,nall+7) =0.
3058 xf_ens(i,j,nall+8) =0.
3059 xf_ens(i,j,nall+9) =0.
3060 xf_ens(i,j,nall+10)=0.
3061 xf_ens(i,j,nall+11)=0.
3062 xf_ens(i,j,nall+12)=0.
3063 xf_ens(i,j,nall+13)=0.
3064 xf_ens(i,j,nall+14)=0.
3065 xf_ens(i,j,nall+15)=0.
3066 xf_ens(i,j,nall+16)=0.
3067 massfln(i,j,nall+1)=0.
3068 massfln(i,j,nall+2)=0.
3069 massfln(i,j,nall+3)=0.
3070 massfln(i,j,nall+4)=0.
3071 massfln(i,j,nall+5)=0.
3072 massfln(i,j,nall+6)=0.
3073 massfln(i,j,nall+7)=0.
3074 massfln(i,j,nall+8)=0.
3075 massfln(i,j,nall+9)=0.
3076 massfln(i,j,nall+10)=0.
3077 massfln(i,j,nall+11)=0.
3078 massfln(i,j,nall+12)=0.
3079 massfln(i,j,nall+13)=0.
3080 massfln(i,j,nall+14)=0.
3081 massfln(i,j,nall+15)=0.
3082 massfln(i,j,nall+16)=0.
3084 if(ne.eq.3.and.ierr3(i).gt.0)then
3085 xf_ens(i,j,nall+1) =0.
3086 xf_ens(i,j,nall+2) =0.
3087 xf_ens(i,j,nall+3) =0.
3088 xf_ens(i,j,nall+4) =0.
3089 xf_ens(i,j,nall+5) =0.
3090 xf_ens(i,j,nall+6) =0.
3091 xf_ens(i,j,nall+7) =0.
3092 xf_ens(i,j,nall+8) =0.
3093 xf_ens(i,j,nall+9) =0.
3094 xf_ens(i,j,nall+10)=0.
3095 xf_ens(i,j,nall+11)=0.
3096 xf_ens(i,j,nall+12)=0.
3097 xf_ens(i,j,nall+13)=0.
3098 xf_ens(i,j,nall+14)=0.
3099 xf_ens(i,j,nall+15)=0.
3100 xf_ens(i,j,nall+16)=0.
3101 massfln(i,j,nall+1)=0.
3102 massfln(i,j,nall+2)=0.
3103 massfln(i,j,nall+3)=0.
3104 massfln(i,j,nall+4)=0.
3105 massfln(i,j,nall+5)=0.
3106 massfln(i,j,nall+6)=0.
3107 massfln(i,j,nall+7)=0.
3108 massfln(i,j,nall+8)=0.
3109 massfln(i,j,nall+9)=0.
3110 massfln(i,j,nall+10)=0.
3111 massfln(i,j,nall+11)=0.
3112 massfln(i,j,nall+12)=0.
3113 massfln(i,j,nall+13)=0.
3114 massfln(i,j,nall+14)=0.
3115 massfln(i,j,nall+15)=0.
3116 massfln(i,j,nall+16)=0.
3123 nall=(iens-1)*maxens3*maxens*maxens2 &
3124 +(iedt-1)*maxens*maxens3
3127 nall2=(iens-1)*maxens3*maxens*maxens2 &
3128 +(iedt-1)*maxens*maxens3 &
3130 xf_ens(i,j,nall+4) = xf_ens(i,j,nall2+4)
3131 xf_ens(i,j,nall+5) =xf_ens(i,j,nall2+5)
3132 xf_ens(i,j,nall+6) =xf_ens(i,j,nall2+6)
3133 xf_ens(i,j,nall+14) =xf_ens(i,j,nall2+14)
3134 xf_ens(i,j,nall+7) =xf_ens(i,j,nall2+7)
3135 xf_ens(i,j,nall+8) =xf_ens(i,j,nall2+8)
3136 xf_ens(i,j,nall+9) =xf_ens(i,j,nall2+9)
3137 xf_ens(i,j,nall+15) =xf_ens(i,j,nall2+15)
3138 xf_ens(i,j,nall+10)=xf_ens(i,j,nall2+10)
3139 xf_ens(i,j,nall+11)=xf_ens(i,j,nall2+11)
3140 xf_ens(i,j,nall+12)=xf_ens(i,j,nall2+12)
3143 elseif(ierr(i).ne.20.and.ierr(i).ne.0)then
3151 END SUBROUTINE cup_forcing_ens_3d
3154 SUBROUTINE cup_kbcon(cap_inc,iloop,k22,kbcon,he_cup,hes_cup, &
3155 ierr,kbmax,p_cup,cap_max, &
3157 its,ite, jts,jte, kts,kte )
3162 ! only local wrf dimensions are need as of now in this routine
3167 its,ite, jts,jte, kts,kte
3171 ! ierr error value, maybe modified in this routine
3173 real, dimension (its:ite,kts:kte) &
3175 he_cup,hes_cup,p_cup
3176 real, dimension (its:ite) &
3179 integer, dimension (its:ite) &
3182 integer, dimension (its:ite) &
3183 ,intent (inout) :: &
3189 ! local variables in this routine
3197 !--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
3201 IF(ierr(I).ne.0)GO TO 27
3206 IF(KBCON(I).GT.KBMAX(i)+2)THEN
3207 if(iloop.lt.4)ierr(i)=3
3208 ! if(iloop.lt.4)ierr(i)=997
3212 IF(HE_cup(I,K22(I)).LT.HES_cup(I,KBCON(I)))GO TO 31
3214 ! cloud base pressure and max moist static energy pressure
3215 ! i.e., the depth (in mb) of the layer of negative buoyancy
3216 if(KBCON(I)-K22(I).eq.1)go to 27
3217 PBCDIF=-P_cup(I,KBCON(I))+P_cup(I,K22(I))
3218 plus=max(25.,cap_max(i)-float(iloop-1)*cap_inc(i))
3219 if(iloop.eq.4)plus=cap_max(i)
3220 IF(PBCDIF.GT.plus)THEN
3227 END SUBROUTINE cup_kbcon
3230 SUBROUTINE cup_ktop(ilo,dby,kbcon,ktop,ierr, &
3232 its,ite, jts,jte, kts,kte )
3239 ! only local wrf dimensions are need as of now in this routine
3244 its,ite, jts,jte, kts,kte
3245 ! dby = buoancy term
3246 ! ktop = cloud top (output)
3248 ! ierr error value, maybe modified in this routine
3250 real, dimension (its:ite,kts:kte) &
3251 ,intent (inout) :: &
3253 integer, dimension (its:ite) &
3259 integer, dimension (its:ite) &
3262 integer, dimension (its:ite) &
3263 ,intent (inout) :: &
3266 ! local variables in this routine
3274 IF(ierr(I).EQ.0)then
3275 DO 40 K=KBCON(I)+1,ktf-1
3276 IF(DBY(I,K).LE.0.)THEN
3281 if(ilo.eq.1)ierr(i)=5
3282 ! if(ilo.eq.2)ierr(i)=998
3291 END SUBROUTINE cup_ktop
3294 SUBROUTINE cup_MAXIMI(ARRAY,KS,KE,MAXX,ierr, &
3296 its,ite, jts,jte, kts,kte )
3303 ! only local wrf dimensions are need as of now in this routine
3308 its,ite, jts,jte, kts,kte
3310 ! x output array with return values
3311 ! kt output array of levels
3312 ! ks,kend check-range
3313 real, dimension (its:ite,kts:kte) &
3316 integer, dimension (its:ite) &
3322 integer, dimension (its:ite) &
3325 real, dimension (its:ite) :: &
3334 if(ierr(i).eq.0)then
3339 IF(XAR.GE.X(I)) THEN
3347 END SUBROUTINE cup_MAXIMI
3350 SUBROUTINE cup_minimi(ARRAY,KS,KEND,KT,ierr, &
3352 its,ite, jts,jte, kts,kte )
3359 ! only local wrf dimensions are need as of now in this routine
3364 its,ite, jts,jte, kts,kte
3366 ! x output array with return values
3367 ! kt output array of levels
3368 ! ks,kend check-range
3369 real, dimension (its:ite,kts:kte) &
3372 integer, dimension (its:ite) &
3375 integer, dimension (its:ite) &
3378 real, dimension (its:ite) :: &
3385 if(ierr(i).eq.0)then
3387 KSTOP=MAX(KS(I)+1,KEND(I))
3389 DO 100 K=KS(I)+1,KSTOP
3390 IF(ARRAY(I,K).LT.X(I)) THEN
3398 END SUBROUTINE cup_MINIMI
3401 SUBROUTINE cup_output_ens_3d(xf_ens,ierr,dellat,dellaq,dellaqc, &
3402 subt_ens,subq_ens,subt,subq,outtem,outq,outqc, &
3403 zu,sub_mas,pre,pw,xmb,ktop, &
3404 j,name,nx,nx2,iens,ierr2,ierr3,pr_ens, &
3405 maxens3,ensdim,massfln, &
3406 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
3407 APR_CAPMA,APR_CAPME,APR_CAPMI,closure_n,xland1, &
3409 its,ite, jts,jte, kts,kte)
3416 ! only local wrf dimensions are need as of now in this routine
3421 its,ite, jts,jte, kts,kte
3422 integer, intent (in ) :: &
3423 j,ensdim,nx,nx2,iens,maxens3
3424 ! xf_ens = ensemble mass fluxes
3425 ! pr_ens = precipitation ensembles
3426 ! dellat = change of temperature per unit mass flux of cloud ensemble
3427 ! dellaq = change of q per unit mass flux of cloud ensemble
3428 ! dellaqc = change of qc per unit mass flux of cloud ensemble
3429 ! outtem = output temp tendency (per s)
3430 ! outq = output q tendency (per s)
3431 ! outqc = output qc tendency (per s)
3432 ! pre = output precip
3433 ! xmb = total base mass flux
3434 ! xfac1 = correction factor
3435 ! pw = pw -epsilon*pd (ensemble dependent)
3436 ! ierr error value, maybe modified in this routine
3438 real, dimension (its:ite,jts:jte,1:ensdim) &
3439 ,intent (inout) :: &
3440 xf_ens,pr_ens,massfln
3441 real, dimension (its:ite,jts:jte) &
3442 ,intent (inout) :: &
3443 APR_GR,APR_W,APR_MC,APR_ST,APR_AS,APR_CAPMA, &
3446 real, dimension (its:ite,kts:kte) &
3448 outtem,outq,outqc,subt,subq,sub_mas
3449 real, dimension (its:ite,kts:kte) &
3452 real, dimension (its:ite) &
3455 real, dimension (its:ite) &
3456 ,intent (inout ) :: &
3458 real, dimension (its:ite,kts:kte,1:nx) &
3460 subt_ens,subq_ens,dellat,dellaqc,dellaq,pw
3461 integer, dimension (its:ite) &
3464 integer, dimension (its:ite) &
3465 ,intent (inout) :: &
3468 ! local variables in this routine
3474 outtes,ddtes,dtt,dtq,dtqc,dtpw,tuning,prerate,clos_wei,xmbhelp
3477 real, dimension (its:ite) :: &
3479 real, dimension (its:ite):: &
3480 xmb_ske,xmb_ave,xmb_std,xmb_cur,xmbweight
3481 real, dimension (its:ite):: &
3482 pr_ske,pr_ave,pr_std,pr_cur
3483 real, dimension (its:ite,jts:jte):: &
3484 pr_gr,pr_w,pr_mc,pr_st,pr_as,pr_capma, &
3486 real, dimension (5) :: weight,wm,wm1,wm2,wm3
3487 real, dimension (its:ite,5) :: xmb_w
3490 character *(*), intent (in) :: &
3493 weight(1) = -999. !this will turn off weights
3517 IF(ierr(i).eq.0)then
3518 do n=(iens-1)*nx*nx2*maxens3+1,iens*nx*nx2*maxens3
3519 if(pr_ens(i,j,n).le.0.)then
3526 !--- calculate ensemble average mass fluxes
3528 call massflx_stats(xf_ens,ensdim,nx2,nx,maxens3, &
3529 xmb_ave,xmb_std,xmb_cur,xmb_ske,j,ierr,1, &
3530 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
3531 APR_CAPMA,APR_CAPME,APR_CAPMI, &
3532 pr_gr,pr_w,pr_mc,pr_st,pr_as, &
3533 pr_capma,pr_capme,pr_capmi, &
3535 its,ite, jts,jte, kts,kte )
3537 call massflx_stats(pr_ens,ensdim,nx2,nx,maxens3, &
3538 pr_ave,pr_std,pr_cur,pr_ske,j,ierr,2, &
3539 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
3540 APR_CAPMA,APR_CAPME,APR_CAPMI, &
3541 pr_gr,pr_w,pr_mc,pr_st,pr_as, &
3542 pr_capma,pr_capme,pr_capmi, &
3544 its,ite, jts,jte, kts,kte )
3550 if(ierr(i).eq.0)then
3551 if(xmb_ave(i).le.0.)then
3555 xmb(i)=max(.1*xmb_ave(i),xmb_ave(i)-tuning*xmb_std(i))
3556 ! --- Now use proper count of how many closures were actually
3557 ! used in cup_forcing_ens (including screening of some
3558 ! closures over water) to properly normalize xmb
3559 clos_wei=16./max(1.,closure_n(i))
3560 if (xland1(i).lt.0.5)xmb(i)=xmb(i)*clos_wei
3561 if(xmb(i).eq.0.)then
3564 if(xmb(i).gt.100.)then
3571 ! if(weight(1).lt.-100.)xfac1(i)=xmb_ave(i)
3572 ! if(weight(1).lt.-100.)xfac2(i)=xmb_ave(i)
3582 IF(ierr(i).eq.0.and.k.le.ktop(i))then
3584 dtt=dtt+dellat(i,k,n)
3585 dtts=dtts+subt_ens(i,k,n)
3586 dtq=dtq+dellaq(i,k,n)
3587 dtqs=dtqs+subq_ens(i,k,n)
3588 dtqc=dtqc+dellaqc(i,k,n)
3591 OUTTEM(I,K)=XMB(I)*dtt/float(nx)
3592 SUBT(I,K)=XMB(I)*dtts/float(nx)
3593 OUTQ(I,K)=XMB(I)*dtq/float(nx)
3594 SUBQ(I,K)=XMB(I)*dtqs/float(nx)
3595 OUTQC(I,K)=XMB(I)*dtqc/float(nx)
3596 PRE(I)=PRE(I)+XMB(I)*dtpw/float(nx)
3597 sub_mas(i,k)=zu(i,k)*xmb(i)
3603 if(ierr(i).eq.0)then
3604 do k=(iens-1)*nx*nx2*maxens3+1,iens*nx*nx2*maxens3
3605 massfln(i,j,k)=massfln(i,j,k)*xfac1(i)
3606 xf_ens(i,j,k)=xf_ens(i,j,k)*xfac1(i)
3611 END SUBROUTINE cup_output_ens_3d
3614 SUBROUTINE cup_up_aa0(aa0,z,zu,dby,GAMMA_CUP,t_cup, &
3617 its,ite, jts,jte, kts,kte )
3624 ! only local wrf dimensions are need as of now in this routine
3629 its,ite, jts,jte, kts,kte
3630 ! aa0 cloud work function
3631 ! gamma_cup = gamma on model cloud levels
3632 ! t_cup = temperature (Kelvin) on model cloud levels
3633 ! dby = buoancy term
3634 ! zu= normalized updraft mass flux
3635 ! z = heights of model levels
3636 ! ierr error value, maybe modified in this routine
3638 real, dimension (its:ite,kts:kte) &
3640 z,zu,gamma_cup,t_cup,dby
3641 integer, dimension (its:ite) &
3649 integer, dimension (its:ite) &
3650 ,intent (inout) :: &
3652 real, dimension (its:ite) &
3656 ! local variables in this routine
3669 IF(ierr(i).ne.0)GO TO 100
3670 IF(K.LE.KBCON(I))GO TO 100
3671 IF(K.Gt.KTOP(I))GO TO 100
3673 da=zu(i,k)*DZ*(9.81/(1004.*( &
3674 (T_cup(I,K)))))*DBY(I,K-1)/ &
3676 IF(K.eq.KTOP(I).and.da.le.0.)go to 100
3678 if(aa0(i).lt.0.)aa0(i)=0.
3681 END SUBROUTINE cup_up_aa0
3684 SUBROUTINE cup_up_he(k22,hkb,z_cup,cd,entr,he_cup,hc, &
3685 kbcon,ierr,dby,he,hes_cup, &
3687 its,ite, jts,jte, kts,kte )
3694 ! only local wrf dimensions are need as of now in this routine
3699 its,ite, jts,jte, kts,kte
3700 ! hc = cloud moist static energy
3701 ! hkb = moist static energy at originating level
3702 ! he = moist static energy on model levels
3703 ! he_cup = moist static energy on model cloud levels
3704 ! hes_cup = saturation moist static energy on model cloud levels
3705 ! dby = buoancy term
3706 ! cd= detrainment function
3707 ! z_cup = heights of model cloud levels
3708 ! entr = entrainment rate
3710 real, dimension (its:ite,kts:kte) &
3712 he,he_cup,hes_cup,z_cup,cd
3713 ! entr= entrainment rate
3717 integer, dimension (its:ite) &
3724 ! ierr error value, maybe modified in this routine
3726 integer, dimension (its:ite) &
3727 ,intent (inout) :: &
3730 real, dimension (its:ite,kts:kte) &
3733 real, dimension (its:ite) &
3737 ! local variables in this routine
3745 !--- moist static energy inside cloud
3757 if(ierr(i).eq.0.)then
3758 hkb(i)=he_cup(i,k22(i))
3763 do k=k22(i),kbcon(i)-1
3769 DBY(I,Kbcon(i))=Hkb(I)-HES_cup(I,K)
3774 if(k.gt.kbcon(i).and.ierr(i).eq.0.)then
3775 DZ=Z_cup(i,K)-Z_cup(i,K-1)
3776 HC(i,K)=(HC(i,K-1)*(1.-.5*CD(i,K)*DZ)+entr* &
3777 DZ*HE(i,K-1))/(1.+entr*DZ-.5*cd(i,k)*dz)
3778 DBY(I,K)=HC(I,K)-HES_cup(I,K)
3784 END SUBROUTINE cup_up_he
3787 SUBROUTINE cup_up_moisture(ierr,z_cup,qc,qrc,pw,pwav, &
3788 kbcon,ktop,cd,dby,mentr_rate,clw_all, &
3789 q,GAMMA_cup,zu,qes_cup,k22,qe_cup,xl, &
3791 its,ite, jts,jte, kts,kte )
3798 ! only local wrf dimensions are need as of now in this routine
3803 its,ite, jts,jte, kts,kte
3804 ! cd= detrainment function
3805 ! q = environmental q on model levels
3806 ! qe_cup = environmental q on model cloud levels
3807 ! qes_cup = saturation q on model cloud levels
3808 ! dby = buoancy term
3809 ! cd= detrainment function
3810 ! zu = normalized updraft mass flux
3811 ! gamma_cup = gamma on model cloud levels
3812 ! mentr_rate = entrainment rate
3814 real, dimension (its:ite,kts:kte) &
3816 q,zu,gamma_cup,qe_cup,dby,qes_cup,z_cup,cd
3817 ! entr= entrainment rate
3821 integer, dimension (its:ite) &
3828 ! ierr error value, maybe modified in this routine
3830 integer, dimension (its:ite) &
3831 ,intent (inout) :: &
3833 ! qc = cloud q (including liquid water) after entrainment
3834 ! qrch = saturation q in cloud
3835 ! qrc = liquid water content in cloud after rainout
3836 ! pw = condensate that will fall out at that level
3837 ! pwav = totan normalized integrated condensate (I1)
3838 ! c0 = conversion rate (cloud to rain)
3840 real, dimension (its:ite,kts:kte) &
3843 real, dimension (its:ite) &
3847 ! local variables in this routine
3853 dh,qrch,c0,dz,radius
3858 !--- no precip for small clouds
3860 if(mentr_rate.gt.0.)then
3861 radius=.2/mentr_rate
3862 if(radius.lt.900.)c0=0.
3863 ! if(radius.lt.900.)iall=0
3872 if(ierr(i).eq.0)qc(i,k)=qes_cup(i,k)
3878 if(ierr(i).eq.0.)then
3879 do k=k22(i),kbcon(i)-1
3880 qc(i,k)=qe_cup(i,k22(i))
3887 IF(ierr(i).ne.0)GO TO 100
3888 IF(K.Lt.KBCON(I))GO TO 100
3889 IF(K.Gt.KTOP(I))GO TO 100
3890 DZ=Z_cup(i,K)-Z_cup(i,K-1)
3892 !------ 1. steady state plume equation, for what could
3893 !------ be in cloud without condensation
3896 QC(i,K)=(QC(i,K-1)*(1.-.5*CD(i,K)*DZ)+mentr_rate* &
3897 DZ*Q(i,K-1))/(1.+mentr_rate*DZ-.5*cd(i,k)*dz)
3899 !--- saturation in cloud, this is what is allowed to be in it
3901 QRCH=QES_cup(I,K)+(1./XL)*(GAMMA_cup(i,k) &
3902 /(1.+GAMMA_cup(i,k)))*DBY(I,K)
3904 !------- LIQUID WATER CONTENT IN cloud after rainout
3906 clw_all(i,k)=QC(I,K)-QRCH
3907 QRC(I,K)=(QC(I,K)-QRCH)/(1.+C0*DZ)
3908 if(qrc(i,k).lt.0.)then
3912 !------- 3.Condensation
3914 PW(i,k)=c0*dz*QRC(I,K)*zu(i,k)
3917 pw(i,k)=(QC(I,K)-QRCH)*zu(i,k)
3918 if(pw(i,k).lt.0.)pw(i,k)=0.
3921 !----- set next level
3923 QC(I,K)=QRC(I,K)+qrch
3925 !--- integrated normalized ondensate
3927 PWAV(I)=PWAV(I)+PW(I,K)
3930 END SUBROUTINE cup_up_moisture
3933 SUBROUTINE cup_up_nms(zu,z_cup,entr,cd,kbcon,ktop,ierr,k22, &
3935 its,ite, jts,jte, kts,kte )
3943 ! only local wrf dimensions are need as of now in this routine
3948 its,ite, jts,jte, kts,kte
3949 ! cd= detrainment function
3950 real, dimension (its:ite,kts:kte) &
3953 ! entr= entrainment rate
3957 integer, dimension (its:ite) &
3964 ! ierr error value, maybe modified in this routine
3966 integer, dimension (its:ite) &
3967 ,intent (inout) :: &
3969 ! zu is the normalized mass flux
3971 real, dimension (its:ite,kts:kte) &
3975 ! local variables in this routine
3983 ! initialize for this go around
3991 ! do normalized mass budget
3994 IF(ierr(I).eq.0)then
3995 do k=k22(i),kbcon(i)
3998 DO K=KBcon(i)+1,KTOP(i)
3999 DZ=Z_cup(i,K)-Z_cup(i,K-1)
4000 ZU(i,K)=ZU(i,K-1)*(1.+(entr-cd(i,k))*DZ)
4005 END SUBROUTINE cup_up_nms
4007 !====================================================================
4008 SUBROUTINE g3init(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
4009 MASS_FLUX,cp,restart, &
4010 P_QC,P_QI,P_FIRST_SCALAR, &
4012 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
4013 APR_CAPMA,APR_CAPME,APR_CAPMI, &
4014 cugd_tten,cugd_ttens,cugd_qvten, &
4015 cugd_qvtens,cugd_qcten, &
4017 ids, ide, jds, jde, kds, kde, &
4018 ims, ime, jms, jme, kms, kme, &
4019 its, ite, jts, jte, kts, kte )
4020 !--------------------------------------------------------------------
4022 !--------------------------------------------------------------------
4023 LOGICAL , INTENT(IN) :: restart,allowed_to_read
4024 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
4025 ims, ime, jms, jme, kms, kme, &
4026 its, ite, jts, jte, kts, kte
4027 INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
4028 REAL, INTENT(IN) :: cp
4030 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
4036 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
4042 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
4046 REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(OUT) :: &
4047 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
4048 APR_CAPMA,APR_CAPME,APR_CAPMI, &
4051 INTEGER :: i, j, k, itf, jtf, ktf
4057 IF(.not.restart)THEN
4070 cugd_ttens(i,k,j)=0.
4071 cugd_qvten(i,k,j)=0.
4072 cugd_qvtens(i,k,j)=0.
4086 IF (P_QC .ge. P_FIRST_SCALAR) THEN
4091 cugd_qcten(i,k,j)=0.
4097 IF (P_QI .ge. P_FIRST_SCALAR) THEN
4127 END SUBROUTINE g3init
4130 SUBROUTINE massflx_stats(xf_ens,ensdim,maxens,maxens2,maxens3, &
4131 xt_ave,xt_std,xt_cur,xt_ske,j,ierr,itest, &
4132 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
4133 APR_CAPMA,APR_CAPME,APR_CAPMI, &
4134 pr_gr,pr_w,pr_mc,pr_st,pr_as, &
4135 pr_capma,pr_capme,pr_capmi, &
4137 its,ite, jts,jte, kts,kte)
4141 integer, intent (in ) :: &
4142 j,ensdim,maxens3,maxens,maxens2,itest
4143 INTEGER, INTENT(IN ) :: &
4145 its,ite, jts,jte, kts,kte
4148 real, dimension (its:ite) &
4149 , intent(inout) :: &
4150 xt_ave,xt_cur,xt_std,xt_ske
4151 integer, dimension (its:ite), intent (in) :: &
4153 real, dimension (its:ite,jts:jte,1:ensdim) &
4156 real, dimension (its:ite,jts:jte) &
4157 , intent(inout) :: &
4158 APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
4159 APR_CAPMA,APR_CAPME,APR_CAPMI
4160 real, dimension (its:ite,jts:jte) &
4161 , intent(inout) :: &
4162 pr_gr,pr_w,pr_mc,pr_st,pr_as, &
4163 pr_capma,pr_capme,pr_capmi
4168 real, dimension (its:ite , 1:maxens3 ) :: &
4169 x_ave,x_cur,x_std,x_ske
4170 real, dimension (its:ite , 1:maxens ) :: &
4174 integer, dimension (1:maxens3) :: nc1
4176 integer :: num,kk,num2,iedt
4216 if(ierr(i).eq.0)then
4217 x_ave(i,k)=x_ave(i,k)+xf_ens(i,j,maxens3*(kk-1)+k)
4226 if(ierr(i).eq.0)then
4227 x_ave_cap(i,k)=x_ave_cap(i,k) &
4228 +xf_ens(i,j,maxens3*(k-1)+(iedt-1)*maxens*maxens3+kk)
4236 if(ierr(i).eq.0)then
4237 x_ave_cap(i,k)=x_ave_cap(i,k)/float(num2)
4244 if(ierr(i).eq.0)then
4245 x_ave(i,k)=x_ave(i,k)/float(num)
4251 if(ierr(i).eq.0)then
4252 xt_ave(i)=xt_ave(i)+x_ave(i,k)
4257 if(ierr(i).eq.0)then
4258 xt_ave(i)=xt_ave(i)/float(maxens3)
4262 !--- now do std, skewness,curtosis
4267 if(ierr(i).eq.0.and.x_ave(i,k).gt.0.)then
4268 ! print *,i,j,k,kk,x_std(i,k),xf_ens(i,j,maxens3*(kk-1)+k),x_ave(i,k)
4269 x_std(i,k)=x_std(i,k)+(xf_ens(i,j,maxens3*(kk-1)+k)-x_ave(i,k))**2
4270 x_ske(i,k)=x_ske(i,k)+(xf_ens(i,j,maxens3*(kk-1)+k)-x_ave(i,k))**3
4271 x_cur(i,k)=x_cur(i,k)+(xf_ens(i,j,maxens3*(kk-1)+k)-x_ave(i,k))**4
4278 if(ierr(i).eq.0.and.xt_ave(i).gt.0.)then
4279 xt_std(i)=xt_std(i)+(x_ave(i,k)-xt_ave(i))**2
4280 xt_ske(i)=xt_ske(i)+(x_ave(i,k)-xt_ave(i))**3
4281 xt_cur(i)=xt_cur(i)+(x_ave(i,k)-xt_ave(i))**4
4287 if(ierr(i).eq.0.and.x_std(i,k).gt.0.)then
4288 x_std(i,k)=x_std(i,k)/float(num)
4289 a3=max(1.e-6,x_std(i,k))
4291 a3=max(1.e-6,x_std(i,k)**3)
4292 a4=max(1.e-6,x_std(i,k)**4)
4293 x_ske(i,k)=x_ske(i,k)/float(num)/a3
4294 x_cur(i,k)=x_cur(i,k)/float(num)/a4
4297 ! print*,'Some statistics at gridpoint i,j, ierr',i,j,ierr(i)
4298 ! print*,'statistics for closure number ',k
4299 ! print*,'Average= ',x_ave(i,k),' Std= ',x_std(i,k)
4300 ! print*,'Skewness= ',x_ske(i,k),' Curtosis= ',x_cur(i,k)
4306 if(ierr(i).eq.0.and.xt_std(i).gt.0.)then
4307 xt_std(i)=xt_std(i)/float(maxens3)
4308 a3=max(1.e-6,xt_std(i))
4310 a3=max(1.e-6,xt_std(i)**3)
4311 a4=max(1.e-6,xt_std(i)**4)
4312 xt_ske(i)=xt_ske(i)/float(maxens3)/a3
4313 xt_cur(i)=xt_cur(i)/float(maxens3)/a4
4315 ! print*,'Total ensemble independent statistics at i =',i
4316 ! print*,'Average= ',xt_ave(i),' Std= ',xt_std(i)
4317 ! print*,'Skewness= ',xt_ske(i),' Curtosis= ',xt_cur(i)
4320 ! first go around: store massflx for different closures/caps
4323 pr_gr(i,j) = .25*(x_ave(i,1)+x_ave(i,2)+x_ave(i,3)+x_ave(i,13))
4324 pr_w(i,j) = .25*(x_ave(i,4)+x_ave(i,5)+x_ave(i,6)+x_ave(i,14))
4325 pr_mc(i,j) = .25*(x_ave(i,7)+x_ave(i,8)+x_ave(i,9)+x_ave(i,15))
4326 pr_st(i,j) = .333*(x_ave(i,10)+x_ave(i,11)+x_ave(i,12))
4327 pr_as(i,j) = x_ave(i,16)
4328 pr_capma(i,j) = x_ave_cap(i,1)
4329 pr_capme(i,j) = x_ave_cap(i,2)
4330 pr_capmi(i,j) = x_ave_cap(i,3)
4332 ! second go around: store preciprates (mm/hour) for different closures/caps
4334 else if (itest.eq.2)then
4335 APR_GR(i,j)=.25*(x_ave(i,1)+x_ave(i,2)+x_ave(i,3)+x_ave(i,13))* &
4336 3600.*pr_gr(i,j) +APR_GR(i,j)
4337 APR_W(i,j)=.25*(x_ave(i,4)+x_ave(i,5)+x_ave(i,6)+x_ave(i,14))* &
4338 3600.*pr_w(i,j) +APR_W(i,j)
4339 APR_MC(i,j)=.25*(x_ave(i,7)+x_ave(i,8)+x_ave(i,9)+x_ave(i,15))* &
4340 3600.*pr_mc(i,j) +APR_MC(i,j)
4341 APR_ST(i,j)=.333*(x_ave(i,10)+x_ave(i,11)+x_ave(i,12))* &
4342 3600.*pr_st(i,j) +APR_ST(i,j)
4343 APR_AS(i,j)=x_ave(i,16)* &
4344 3600.*pr_as(i,j) +APR_AS(i,j)
4345 APR_CAPMA(i,j) = x_ave_cap(i,1)* &
4346 3600.*pr_capma(i,j) +APR_CAPMA(i,j)
4347 APR_CAPME(i,j) = x_ave_cap(i,2)* &
4348 3600.*pr_capme(i,j) +APR_CAPME(i,j)
4349 APR_CAPMI(i,j) = x_ave_cap(i,3)* &
4350 3600.*pr_capmi(i,j) +APR_CAPMI(i,j)
4355 END SUBROUTINE massflx_stats
4357 SUBROUTINE cup_axx(tcrit,kbmax,z1,p,psur,xl,rv,cp,tx,qx,axx,ierr, &
4358 cap_max,cap_max_increment,entr_rate,mentr_rate,&
4360 its,ite, jts,jte, kts,kte,ens4)
4362 INTEGER, INTENT(IN ) :: &
4364 its,ite, jts,jte, kts,kte,ens4
4365 real, dimension (its:ite,kts:kte,1:ens4) &
4366 , intent(inout) :: &
4368 real, dimension (its:ite,kts:kte) &
4371 real, dimension (its:ite) &
4373 z1,psur,cap_max,cap_max_increment
4374 real, intent(in) :: &
4375 tcrit,xl,rv,cp,mentr_rate,entr_rate
4376 real, dimension (its:ite,1:ens4) &
4379 integer, dimension (its:ite), intent (in) :: &
4381 integer, dimension (its:ite) :: &
4382 ierrxx,k22xx,kbconxx,ktopxx,kstabm,kstabi
4383 real, dimension (1:2) :: AE,BE,HT
4384 real, dimension (its:ite,kts:kte) :: tv
4387 real, dimension (its:ite,kts:kte) :: &
4389 qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup, &
4391 dby,qc,qrcd,pwd,pw,hcd,qcd,dbyd,hc,qrc,zu,zd,cd
4393 real, dimension (its:ite) :: &
4403 BE(1)=.622*HT(1)/.286
4404 AE(1)=BE(1)/273.+ALOG(610.71)
4405 BE(2)=.622*HT(2)/.286
4406 AE(2)=BE(2)/273.+ALOG(610.71)
4413 cd(i,k)=0.1*entr_rate
4427 if(ierrxx(i).eq.0)then
4429 IF(Tx(I,K,n).LE.TCRIT)IPH=2
4430 E=EXP(AE(IPH)-BE(IPH)/TX(I,K,N))
4431 QES(I,K)=.622*E/(100.*P(I,K)-E)
4432 IF(QES(I,K).LE.1.E-08)QES(I,K)=1.E-08
4433 IF(Qx(I,K,N).GT.QES(I,K))Qx(I,K,N)=QES(I,K)
4434 TV(I,K)=Tx(I,K,N)+.608*Qx(I,K,N)*Tx(I,K,N)
4440 if(ierrxx(i).eq.0)then
4441 Z(I,KTS)=max(0.,Z1(I))-(ALOG(P(I,KTS))- &
4442 ALOG(PSUR(I)))*287.*TV(I,KTS)/9.81
4446 ! --- calculate heights
4449 if(ierrxx(i).eq.0)then
4450 TVBAR=.5*TV(I,K)+.5*TV(I,K-1)
4451 Z(I,K)=Z(I,K-1)-(ALOG(P(I,K))- &
4452 ALOG(P(I,K-1)))*287.*TVBAR/9.81
4457 !--- calculate moist static energy - HE
4458 ! saturated moist static energy - HES
4462 if(ierrxx(i).eq.0)then
4463 HE(I,K)=9.81*Z(I,K)+1004.*Tx(I,K,n)+2.5E06*Qx(I,K,n)
4464 HES(I,K)=9.81*Z(I,K)+1004.*Tx(I,K,n)+2.5E06*QES(I,K)
4465 IF(HE(I,K).GE.HES(I,K))HE(I,K)=HES(I,K)
4474 if(ierrxx(i).eq.0)then
4475 qes_cup(i,k)=.5*(qes(i,k-1)+qes(i,k))
4476 q_cup(i,k)=.5*(qx(i,k-1,n)+qx(i,k,n))
4477 hes_cup(i,k)=.5*(hes(i,k-1)+hes(i,k))
4478 he_cup(i,k)=.5*(he(i,k-1)+he(i,k))
4479 if(he_cup(i,k).gt.hes_cup(i,k))he_cup(i,k)=hes_cup(i,k)
4480 z_cup(i,k)=.5*(z(i,k-1)+z(i,k))
4481 p_cup(i,k)=.5*(p(i,k-1)+p(i,k))
4482 t_cup(i,k)=.5*(tx(i,k-1,n)+tx(i,k,n))
4483 gamma_cup(i,k)=(xl/cp)*(xl/(rv*t_cup(i,k) &
4484 *t_cup(i,k)))*qes_cup(i,k)
4489 if(ierrxx(i).eq.0)then
4490 qes_cup(i,1)=qes(i,1)
4491 q_cup(i,1)=qx(i,1,n)
4492 hes_cup(i,1)=hes(i,1)
4494 z_cup(i,1)=.5*(z(i,1)+z1(i))
4495 p_cup(i,1)=.5*(p(i,1)+psur(i))
4496 t_cup(i,1)=tx(i,1,n)
4497 gamma_cup(i,1)=xl/cp*(xl/(rv*t_cup(i,1) &
4498 *t_cup(i,1)))*qes_cup(i,1)
4503 !------- DETERMINE LEVEL WITH HIGHEST MOIST STATIC ENERGY CONTENT - K22
4505 CALL cup_MAXIMI(HE_CUP,3,KBMAX,K22XX,ierrxx, &
4507 its,ite, jts,jte, kts,kte)
4509 IF(ierrxx(I).eq.0.)THEN
4510 IF(K22xx(I).GE.KBMAX(i))ierrxx(i)=2
4514 !--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
4516 call cup_kbcon(cap_max_increment,1,k22xx,kbconxx,he_cup,hes_cup, &
4517 ierrxx,kbmax,p_cup,cap_max, &
4519 its,ite, jts,jte, kts,kte)
4521 !--- increase detrainment in stable layers
4523 CALL cup_minimi(HEs_cup,Kbconxx,kstabm,kstabi,ierrxx, &
4525 its,ite, jts,jte, kts,kte)
4527 IF(ierrxx(I).eq.0.)THEN
4528 if(kstabm(i)-1.gt.kstabi(i))then
4529 do k=kstabi(i),kstabm(i)-1
4530 cd(i,k)=cd(i,k-1)+1.5*entr_rate
4531 if(cd(i,k).gt.10.0*entr_rate)cd(i,k)=10.0*entr_rate
4537 !--- calculate incloud moist static energy
4539 call cup_up_he(k22xx,hkb,z_cup,cd,mentr_rate,he_cup,hc, &
4540 kbconxx,ierrxx,dby,he,hes_cup, &
4542 its,ite, jts,jte, kts,kte)
4544 !--- DETERMINE CLOUD TOP - KTOP
4546 call cup_ktop(1,dby,kbconxx,ktopxx,ierrxx, &
4548 its,ite, jts,jte, kts,kte)
4550 !c--- normalized updraft mass flux profile
4552 call cup_up_nms(zu,z_cup,mentr_rate,cd,kbconxx,ktopxx,ierrxx,k22xx, &
4554 its,ite, jts,jte, kts,kte)
4556 !--- calculate workfunctions for updrafts
4558 call cup_up_aa0(aa0,z,zu,dby,GAMMA_CUP,t_cup, &
4559 kbconxx,ktopxx,ierrxx, &
4561 its,ite, jts,jte, kts,kte)
4563 if(ierrxx(i).eq.0)axx(i,n)=aa0(i)
4566 END SUBROUTINE cup_axx
4568 SUBROUTINE conv_grell_spread3d(rthcuten,rqvcuten,rqccuten,raincv, &
4569 & cugd_avedx,cugd_tten,cugd_qvten,rqicuten,cugd_ttens, &
4570 & cugd_qvtens,cugd_qcten,pi_phy,moist_qv,pratec,dt,num_tiles,&
4571 & imomentum,F_QV ,F_QC ,F_QR ,F_QI ,F_QS, &
4572 & ids, ide, jds, jde, kds, kde, &
4573 & ips, ipe, jps, jpe, kps, kpe, &
4574 & ims, ime, jms, jme, kms, kme, &
4575 & i_start,i_end,j_start,j_end,kts,kte )
4579 INTEGER, INTENT(IN ) :: num_tiles,imomentum
4580 INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
4581 & i_start,i_end,j_start,j_end
4582 INTEGER, INTENT(IN ) :: ids, ide, jds, jde, kds, kde,&
4583 ims,ime, jms,jme, kms,kme, &
4584 ips,ipe, jps,jpe, kps,kpe, &
4586 REAL, DIMENSION (ims:ime,kms:kme,jms:jme), optional,INTENT (INOUT) :: &
4587 & rthcuten,rqvcuten,rqccuten,rqicuten,cugd_tten, &
4588 & cugd_qvten,cugd_ttens,cugd_qvtens,cugd_qcten
4589 REAL, DIMENSION (ims:ime,kms:kme,jms:jme),INTENT (IN) :: &
4591 REAL, DIMENSION (ims:ime,kms:kme,jms:jme), INTENT (IN) :: &
4593 REAL, DIMENSION (ims:ime,jms:jme), INTENT (INOUT) :: &
4595 REAL, INTENT(IN) :: dt
4596 INTEGER :: ikk1,ikk2,ikk11,i,j,k,kk,nn,smoothh,smoothv
4597 INTEGER :: ifs,ife,jfs,jfe,its,ite,jts,jte,ido,jdo,cugd_spread
4600 ! Flags relating to the optional tendency arrays declared above
4601 ! Models that carry the optional tendencies will provdide the
4602 ! optional arguments at compile time; these flags all the model
4603 ! to determine at run-time whether a particular tracer is in
4606 LOGICAL, OPTIONAL :: &
4612 REAL, DIMENSION (ips-2:ipe+2,kps:kpe,jps-2:jpe+2) :: &
4614 real, dimension (ips-2:ipe+2,jps-2:jpe+2) :: qmem
4615 real, dimension (ips-1:ipe+1,jps-1:jpe+1) :: smtt,smtq
4616 real, dimension (kps:kpe) :: conv_trasht,conv_trashq
4617 REAL :: qmem1,qmem2,qmemf,thresh
4620 cugd_spread=cugd_avedx/2
4621 ! SET START AND END POINTS FOR TILES
4623 !$OMP PRIVATE ( ij ,ifs,ife,jfs,jfe,its,ite,jts,jte, i,j,k,kk,nn,ikk1,ikk2,ikk11) &
4624 !$OMP PRIVATE ( ido,jdo,qmemf,qmem1,qmem2,qmem,thresh,conv_trasht,conv_trashq,smtt,smtq)
4626 DO ij = 1 , num_tiles
4628 ite = min(i_end(ij),ide-1)
4630 jte = min(j_end(ij),jde-1)
4667 ! prelims finished, now go real for every grid point
4673 if(cugd_spread.gt.0.or.smoothh.eq.1)then
4674 if(its.eq.ips)ifs=max(its-1,ids)
4675 if(ite.eq.ipe)ife=min(ite+1,ide-1)
4676 if(jts.eq.jps)jfs=max(jts-1,jds)
4677 if(jte.eq.jpe)jfe=min(jte+1,jde-1)
4683 rthcutent(i,k,j)=cugd_tten(i,k,j)
4684 rqvcutent(i,k,j)=cugd_qvten(i,k,j)
4687 ! for high res run, spread the subsidence
4688 ! this is tricky......only consider grid points where there was no rain,
4689 ! so cugd_tten and such are zero!
4691 if(cugd_spread.gt.0)then
4699 rthcutent(i,k,j)=rthcutent(i,k,j) &
4700 +qmem(ido,jdo)*cugd_ttens(ido,k,jdo)
4701 rqvcutent(i,k,j)=rqvcutent(i,k,j) &
4702 +qmem(ido,jdo)*cugd_qvtens(ido,k,jdo)
4710 if(cugd_spread.eq.0)then
4712 rthcutent(i,k,j)=rthcutent(i,k,j)+cugd_ttens(i,k,j)
4713 rqvcutent(i,k,j)=rqvcutent(i,k,j)+cugd_qvtens(i,k,j)
4720 if(smoothh.eq.0)then
4727 rthcuten(i,k,j)=rthcutent(i,k,j)
4728 rqvcuten(i,k,j)=rqvcutent(i,k,j)
4731 else if(smoothh.eq.1)then ! smooth
4736 ! we need an extra row for j (halo comp)
4737 if(jts.eq.jps)jfs=max(jts-1,jds)
4738 if(jte.eq.jpe)jfe=min(jte+1,jde-1)
4741 smtt(i,j)=.25*(rthcutent(i-1,k,j)+2.*rthcutent(i,k,j)+rthcutent(i+1,k,j))
4742 smtq(i,j)=.25*(rqvcutent(i-1,k,j)+2.*rqvcutent(i,k,j)+rqvcutent(i+1,k,j))
4751 rthcuten(i,k,j)=.25*(smtt(i,j-1)+2.*smtt(i,j)+smtt(i,j+1))
4752 rqvcuten(i,k,j)=.25*(smtq(i,j-1)+2.*smtq(i,j)+smtq(i,j+1))
4759 ! check moistening rates
4770 if(rqvcuten(i,k,j).lt.0.)then
4772 qmem1=moist_qv(i,k,j)+rqvcuten(i,k,j)*dt
4773 if(qmem1.lt.thresh)then
4774 qmem1=rqvcuten(i,k,j)
4775 qmem2=(thresh-moist_qv(i,k,j))/dt
4776 qmemf=min(qmemf,qmem2/qmem1)
4784 rqvcuten(i,k,j)=rqvcuten(i,k,j)*qmemf
4785 rthcuten(i,k,j)=rthcuten(i,k,j)*qmemf
4787 if(present(rqccuten))then
4790 rqccuten(i,k,j)=rqccuten(i,k,j)*qmemf
4794 if(present(rqicuten))then
4797 rqicuten(i,k,j)=rqicuten(i,k,j)*qmemf
4801 RAINCV(I,J)=RAINCV(I,J)*qmemf
4802 PRATEC(I,J)=PRATEC(I,J)*qmemf
4804 ! check heating rates
4811 qmem1=abs(rthcuten(i,k,j))*86400.
4813 if(qmem1.gt.thresh)then
4815 qmemf=min(qmemf,qmem2)
4820 RAINCV(I,J)=RAINCV(I,J)*qmemf
4821 PRATEC(I,J)=PRATEC(I,J)*qmemf
4823 rqvcuten(i,k,j)=rqvcuten(i,k,j)*qmemf
4824 rthcuten(i,k,j)=rthcuten(i,k,j)*qmemf
4826 if(present(rqccuten))then
4829 rqccuten(i,k,j)=rqccuten(i,k,j)*qmemf
4833 if(present(rqicuten))then
4836 rqicuten(i,k,j)=rqicuten(i,k,j)*qmemf
4840 if(smoothv.eq.1)then
4845 conv_trasht(k)= .25*(rthcuten(i,k-1,j)+2.*rthcuten(i,k,j)+rthcuten(i,k+1,j))
4846 conv_trashq(k)= .25*(rqvcuten(i,k-1,j)+2.*rqvcuten(i,k,j)+rqvcuten(i,k+1,j))
4849 rthcuten(i,k,j)=conv_trasht(k)
4850 rqvcuten(i,k,j)=conv_trashq(k)
4854 rthcuten(i,k,j)=rthcuten(i,k,j)/pi_phy(i,k,j)
4859 !$OMP END PARALLEL DO
4862 END SUBROUTINE CONV_GRELL_SPREAD3D
4863 !-------------------------------------------------------
4864 END MODULE module_cu_g3