6 !-----------------------------------------------------------------
7 SUBROUTINE CU_SAS(DT,ITIMESTEP,STEPCU, &
8 RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
10 RAINCV,PRATEC,HTOP,HBOT, &
11 U3D,V3D,W,T3D,QV3D,QC3D,QI3D,PI3D,RHO3D, &
12 DZ8W,PCPS,P8W,XLAND,CU_ACT_FLAG, &
14 MOMMIX, & ! gopal's doing
15 PGCON,sas_mass_flux, &
16 shalconv,shal_pgcon, &
17 HPBL2D,EVAP2D,HEAT2D, & !Kwon for shallow convection
18 P_QI,P_FIRST_SCALAR, &
19 CUDT, CURR_SECS, ADAPT_STEP_FLAG, &
21 ids,ide, jds,jde, kds,kde, &
22 ims,ime, jms,jme, kms,kme, &
23 its,ite, jts,jte, kts,kte )
25 !-------------------------------------------------------------------
26 USE MODULE_GFS_MACHINE , ONLY : kind_phys
27 USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys
28 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
29 &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
30 &, CVAP => con_CVAP, CLIQ => con_CLIQ &
31 &, EPS => con_eps, EPSM1 => con_epsm1 &
32 &, ROVCP => con_rocp, RD => con_rd
33 !-------------------------------------------------------------------
35 !-------------------------------------------------------------------
36 !-- U3D 3D u-velocity interpolated to theta points (m/s)
37 !-- V3D 3D v-velocity interpolated to theta points (m/s)
38 !-- TH3D 3D potential temperature (K)
39 !-- T3D temperature (K)
40 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
41 !-- QC3D 3D cloud mixing ratio (Kg/Kg)
42 !-- QI3D 3D ice mixing ratio (Kg/Kg)
43 !-- P8w 3D pressure at full levels (Pa)
44 !-- Pcps 3D pressure (Pa)
45 !-- PI3D 3D exner function (dimensionless)
46 !-- rr3D 3D dry air density (kg/m^3)
47 !-- RUBLTEN U tendency due to
48 ! PBL parameterization (m/s^2)
49 !-- RVBLTEN V tendency due to
50 ! PBL parameterization (m/s^2)
51 !-- RTHBLTEN Theta tendency due to
52 ! PBL parameterization (K/s)
53 !-- RQVBLTEN Qv tendency due to
54 ! PBL parameterization (kg/kg/s)
55 !-- RQCBLTEN Qc tendency due to
56 ! PBL parameterization (kg/kg/s)
57 !-- RQIBLTEN Qi tendency due to
58 ! PBL parameterization (kg/kg/s)
60 !-- MOMMIX MOMENTUM MIXING COEFFICIENT (can be set in the namelist)
61 !-- RUCUTEN U tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
62 !-- RVCUTEN V tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
64 !-- CP heat capacity at constant pressure for dry air (J/kg/K)
65 !-- GRAV acceleration due to gravity (m/s^2)
67 !-- RD gas constant for dry air (J/kg/K)
69 !-- P_QI species index for cloud ice
70 !-- dz8w dz between full levels (m)
71 !-- z height above sea level (m)
72 !-- PSFC pressure at the surface (Pa)
73 !-- UST u* in similarity theory (m/s)
74 !-- PBL PBL height (m)
75 !-- PSIM similarity stability function for momentum
76 !-- PSIH similarity stability function for heat
77 !-- HFX upward heat flux at the surface (W/m^2)
78 !-- QFX upward moisture flux at the surface (kg/m^2/s)
79 !-- TSK surface temperature (K)
80 !-- GZ1OZ0 log(z/z0) where z0 is roughness length
81 !-- WSPD wind speed at lowest model level (m/s)
82 !-- BR bulk Richardson number in surface layer
84 !-- rvovrd R_v divided by R_d (dimensionless)
85 !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
86 !-- KARMAN Von Karman constant
87 !-- ids start index for i in domain
88 !-- ide end index for i in domain
89 !-- jds start index for j in domain
90 !-- jde end index for j in domain
91 !-- kds start index for k in domain
92 !-- kde end index for k in domain
93 !-- ims start index for i in memory
94 !-- ime end index for i in memory
95 !-- jms start index for j in memory
96 !-- jme end index for j in memory
97 !-- kms start index for k in memory
98 !-- kme end index for k in memory
99 !-- its start index for i in tile
100 !-- ite end index for i in tile
101 !-- jts start index for j in tile
102 !-- jte end index for j in tile
103 !-- kts start index for k in tile
104 !-- kte end index for k in tile
105 !-------------------------------------------------------------------
109 INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
110 ims,ime, jms,jme, kms,kme, &
111 its,ite, jts,jte, kts,kte, &
118 REAL, INTENT(IN) :: &
121 REAL, OPTIONAL, INTENT(IN) :: PGCON,sas_mass_flux,shal_pgcon
122 INTEGER, OPTIONAL, INTENT(IN) :: shalconv
123 REAL(kind=kind_phys) :: PGCON_USE,SHAL_PGCON_USE,massf
124 INTEGER :: shalconv_use
125 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
130 REAL, DIMENSION(ims:ime, jms:jme, kms:kme), INTENT(INOUT) :: &
133 REAL, OPTIONAL, INTENT(IN) :: MOMMIX
135 REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
136 INTENT(IN) :: HPBL2D,EVAP2D,HEAT2D !Kwon for sha
138 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
141 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
144 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
148 LOGICAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: &
152 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
166 ! Adaptive time-step variables
167 REAL, INTENT(IN ) :: CUDT
168 REAL, INTENT(IN ) :: CURR_SECS
169 LOGICAL,INTENT(IN ) , OPTIONAL :: ADAPT_STEP_FLAG
170 REAL, INTENT (INOUT) :: CUDTACTTIME
172 !--------------------------- LOCAL VARS ------------------------------
174 REAL, DIMENSION(ims:ime, jms:jme) :: &
178 REAL (kind=kind_phys) :: &
184 REAL (kind=kind_phys), DIMENSION(its:ite) :: &
190 HPBL,EVAP,HEAT !Kwon for shallow convection
192 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte+1) :: &
195 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte) :: &
208 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte, 2) :: &
211 INTEGER, DIMENSION(its:ite) :: &
228 LOGICAL :: run_param , doing_adapt_dt , decided
232 !-----------------------------------------------------------------------
234 !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
237 ! Initialization for adaptive time step.
239 doing_adapt_dt = .FALSE.
240 IF ( PRESENT(adapt_step_flag) ) THEN
241 IF ( adapt_step_flag ) THEN
242 doing_adapt_dt = .TRUE.
243 IF ( cudtacttime .EQ. 0. ) THEN
244 cudtacttime = curr_secs + cudt*60.
249 ! Do we run through this scheme or not?
251 ! Test 1: If this is the initial model time, then yes.
253 ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
255 ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
256 ! MOD(ITIMESTEP,STEPCU)=0
257 ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
258 ! CURR_SECS >= CUDTACTTIME
260 ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
261 ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
262 ! We only proceed to other tests if the previous tests all have left decided as FALSE.
264 ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
269 IF ( ( .NOT. decided ) .AND. &
270 ( itimestep .EQ. 1 ) ) THEN
275 IF ( ( .NOT. decided ) .AND. &
276 ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
281 IF ( ( .NOT. decided ) .AND. &
282 ( .NOT. doing_adapt_dt ) .AND. &
283 ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
288 IF ( ( .NOT. decided ) .AND. &
289 ( doing_adapt_dt ) .AND. &
290 ( curr_secs .GE. cudtacttime ) ) THEN
293 cudtacttime = curr_secs + cudt*60
296 !-----------------------------------------------------------------------
298 if(present(shalconv)) then
299 shalconv_use=shalconv
312 if(present(pgcon)) then
315 ! pgcon_use = 0.7 ! Gregory et al. (1997, QJRMS)
316 pgcon_use = 0.55 ! Zhang & Wu (2003,JAS), used in GFS (25km res spectral)
317 ! pgcon_use = 0.2 ! HWRF, for model tuning purposes
318 ! pgcon_use = 0.3 ! GFDL, or so I am told
320 ! For those attempting to tune pgcon:
322 ! The value of 0.55 comes from an observational study of
323 ! synoptic-scale deep convection and 0.7 came from an
324 ! incorrect fit to the same data. That value is likely
325 ! correct for deep convection at gridscales near that of GFS,
326 ! but is questionable in shallow convection, or for scales
327 ! much finer than synoptic scales.
329 ! Then again, the assumptions of SAS break down when the
330 ! gridscale is near the convection scale anyway. In a large
331 ! storm such as a hurricane, there is often no environment to
332 ! detrain into since adjancent gridsquares are also undergoing
333 ! active convection. Each gridsquare will no longer have many
334 ! updrafts and downdrafts. At sub-convective timescales, you
335 ! will find unstable columns for many (say, 5 second length)
336 ! timesteps in a real atmosphere during a convection cell's
337 ! lifetime, so forcing it to be neutrally stable is unphysical.
339 ! Hence, in scales near the convection scale (cells have
340 ! ~0.5-4km diameter in hurricanes), this parameter is more of a
341 ! tuning parameter to get a scheme that is inappropriate for
342 ! that resolution to do a reasonable job.
344 ! Your mileage might vary.
349 if(present(sas_mass_flux)) then
351 ! Use this to reduce the fluxes added by SAS to prevent
352 ! computational instability as a result of large fluxes.
354 massf=9e9 ! large number to disable check
357 if(present(shal_pgcon)) then
358 if(shal_pgcon>=0) then
359 shal_pgcon_use = shal_pgcon
361 ! shal_pgcon<0 means use deep pgcon
362 shal_pgcon_use = pgcon_use
365 ! Default: Same as deep convection pgcon
366 shal_pgcon_use = pgcon_use
367 ! Read the warning above though. It may be advisable for
368 ! these to be different.
371 if_run_param: IF(run_param) THEN
375 CU_ACT_FLAG(I,J)=.TRUE.
390 PSFC(i,j)=P8w(i,kms,j)
394 if(igpvs.eq.0) CALL GFUNCPHYS
397 !------------- J LOOP (OUTER) --------------------------------------------------
399 big_outer_j_loop: DO J=jts,jte
401 ! --------------- compute zi and zl -----------------------------------------
409 ZI(I,K)=ZI(I,KM)+dz8w(i,km,j)
416 ZL(I,KM)=(ZI(I,K)+ZI(I,KM))*0.5
421 ZL(I,KTE)=2.*ZI(I,KTE)-ZL(I,KTE-1)
424 ! --------------- end compute zi and zl -------------------------------------
429 SLIMSK(i)=ABS(XLAND(i,j)-2.)
433 if(shalconv_use==1) then
435 HPBL(I) = HPBL2D(I,J) !kwon for shallow convection
436 EVAP(I) = EVAP2D(I,J) !kwon for shallow convection
437 HEAT(I) = HEAT2D(I,J) !kwon for shallow convection
449 PRSL(I,K)=Pcps(i,k,j)*.001
450 PHIL(I,K)=ZL(I,K)*GRAV
451 DOT(i,k)=-5.0E-4*GRAV*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
457 DEL(i,k)=PRSL(i,k)*GRAV/RD*dz8w(i,k,j)/T3D(i,k,j)
460 Q1(i,k)=QV3D(i,k,j)/(1.+QV3D(i,k,j))
462 QL(i,k,1)=QI3D(i,k,j)/(1.+QI3D(i,k,j))
463 QL(i,k,2)=QC3D(i,k,j)/(1.+QC3D(i,k,j))
464 PRSLK(I,K)=(PRSL(i,k)*.01)**ROVCP
471 PRSI(i,k)=PRSI(i,km)-del(i,km)
475 CALL SASCNVN(IM,IM,KX,JCAP,DELT,DEL,PRSL,PS,PHIL, &
476 QL,Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT, &
477 KTOP,KCNV,SLIMSK,DOT,NCLOUD,PGCON_USE,massf)
479 if_shallow_conv: if(shalconv_use==1) then
481 ! NMM calls the new shallow convection developed by J Han
482 ! (Added to WRF by Y.Kwon)
483 call shalcnv(im,im,kx,jcap,delt,del,prsl,ps,phil,ql, &
484 & q1,t1,u1,v1,rcs,rn,kbot,ktop,kcnv,slimsk, &
485 & dot,ncloud,hpbl,heat,evap,shal_pgcon_use)
488 ! NOTE: ARW should be able to call the new shalcnv here, but
489 ! they need to add the three new variables, so I'm leaving the
490 ! old shallow convection call here - Sam Trahan
491 CALL OLD_ARW_SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KCNV,Q1,T1,DPSHC)
493 ! Shallow convection is untested for other cores.
496 endif if_shallow_conv
499 RAINCV(I,J)=RN(I)*1000./STEPCU
500 PRATEC(I,J)=RN(I)*1000./(STEPCU * DT)
507 RTHCUTEN(I,K,J)=(T1(I,K)-T3D(I,K,J))/PI3D(I,K,J)*RDELT
508 RQVCUTEN(I,K,J)=(Q1(I,K)/(1.-q1(i,k))-QV3D(I,K,J))*RDELT
512 !===============================================================================
513 ! ADD MOMENTUM MIXING TERM AS TENDENCIES. This is gopal's doing for SAS
514 ! MOMMIX is the reduction factor set to 0.7 by default. Because NMM has
515 ! divergence damping term, a reducion factor for cumulum mixing may be
516 ! required otherwise storms were too weak.
517 !===============================================================================
522 ! RUCUTEN(I,J,K)=MOMMIX*(U1(I,K)-U3D(I,K,J))*RDELT
523 ! RVCUTEN(I,J,K)=MOMMIX*(V1(I,K)-V3D(I,K,J))*RDELT
524 RUCUTEN(I,J,K)=(U1(I,K)-U3D(I,K,J))*RDELT
525 RVCUTEN(I,J,K)=(V1(I,K)-V3D(I,K,J))*RDELT
531 IF(P_QC .ge. P_FIRST_SCALAR)THEN
534 RQCCUTEN(I,K,J)=(QL(I,K,2)/(1.-ql(i,k,2))-QC3D(I,K,J))*RDELT
539 IF(P_QI .ge. P_FIRST_SCALAR)THEN
542 RQICUTEN(I,K,J)=(QL(I,K,1)/(1.-ql(i,k,1))-QI3D(I,K,J))*RDELT
547 ENDDO big_outer_j_loop ! Outer most J loop
551 END SUBROUTINE CU_SAS
553 !====================================================================
554 SUBROUTINE sasinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
556 RESTART,P_QC,P_QI,P_FIRST_SCALAR, &
558 ids, ide, jds, jde, kds, kde, &
559 ims, ime, jms, jme, kms, kme, &
560 its, ite, jts, jte, kts, kte )
561 !--------------------------------------------------------------------
563 !--------------------------------------------------------------------
564 LOGICAL , INTENT(IN) :: allowed_to_read,restart
565 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
566 ims, ime, jms, jme, kms, kme, &
567 its, ite, jts, jte, kts, kte
568 INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
570 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
575 REAL, DIMENSION( ims:ime , jms:jme , kms:kme ) , INTENT(OUT) :: &
576 RUCUTEN, & ! gopal's doing for SAS
579 INTEGER :: i, j, k, itf, jtf, ktf
587 IF(.not.restart .or. .not.allowed_to_read)THEN
588 !end of zhang's doing
603 IF (P_QC .ge. P_FIRST_SCALAR) THEN
613 IF (P_QI .ge. P_FIRST_SCALAR) THEN
624 END SUBROUTINE sasinit
626 ! ------------------------------------------------------------------------
628 SUBROUTINE SASCNV(IM,IX,KM,JCAP,DELT,DEL,PRSL,PS,PHIL,QL, &
629 ! SUBROUTINE SASCNV(IM,IX,KM,JCAP,DLT,DEL,PRSL,PHIL,QL, &
630 & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK, &
632 ! for cloud water version
633 ! parameter(ncloud=0)
634 ! SUBROUTINE SASCNV(KM,JCAP,DELT,DEL,SL,SLK,PS,QL,
635 ! & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK,
638 USE MODULE_GFS_MACHINE , ONLY : kind_phys
639 USE MODULE_GFS_FUNCPHYS ,ONLY : fpvs
640 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
641 &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
642 &, CVAP => con_CVAP, CLIQ => con_CLIQ &
643 &, EPS => con_eps, EPSM1 => con_epsm1
647 ! include 'constant.h'
649 integer IM, IX, KM, JCAP, ncloud, &
650 & KBOT(IM), KTOP(IM), KUO(IM), J
651 real(kind=kind_phys) DELT
652 real(kind=kind_phys) PS(IM), DEL(IX,KM), PRSL(IX,KM), &
653 ! real(kind=kind_phys) DEL(IX,KM), PRSL(IX,KM),
654 & QL(IX,KM,2), Q1(IX,KM), T1(IX,KM), &
655 & U1(IX,KM), V1(IX,KM), RCS(IM), &
656 & CLDWRK(IM), RN(IM), SLIMSK(IM), &
657 & DOT(IX,KM), XKT2(IM), PHIL(IX,KM)
659 integer I, INDX, jmn, k, knumb, latd, lond, km1
661 real(kind=kind_phys) adw, alpha, alphal, alphas, &
662 & aup, beta, betal, betas, &
663 & c0, cpoel, dellat, delta, &
664 & desdt, deta, detad, dg, &
665 & dh, dhh, dlnsig, dp, &
666 & dq, dqsdp, dqsdt, dt, &
667 & dt2, dtmax, dtmin, dv1, &
668 & dv1q, dv2, dv2q, dv1u, &
669 & dv1v, dv2u, dv2v, dv3u, &
670 & dv3v, dv3, dv3q, dvq1, &
671 & dz, dz1, e1, edtmax, &
672 & edtmaxl, edtmaxs, el2orc, elocp, &
674 & evef, evfact, evfactl, fact1, &
675 & fact2, factor, fjcap, fkm, &
676 & fuv, g, gamma, onemf, &
677 & onemfu, pdetrn, pdpdwn, pprime, &
678 & qc, qlk, qrch, qs, &
679 & rain, rfact, shear, tem1, &
680 & tem2, terr, val, val1, &
681 & val2, w1, w1l, w1s, &
682 & w2, w2l, w2s, w3, &
683 & w3l, w3s, w4, w4l, &
684 & w4s, xdby, xpw, xpwd, &
685 & xqc, xqrch, xlambu, mbdt, &
689 integer JMIN(IM), KB(IM), KBCON(IM), KBDTR(IM), &
690 & KT2(IM), KTCON(IM), LMIN(IM), &
691 & kbm(IM), kbmax(IM), kmax(IM)
693 real(kind=kind_phys) AA1(IM), ACRT(IM), ACRTFCT(IM), &
694 & DELHBAR(IM), DELQ(IM), DELQ2(IM), &
695 & DELQBAR(IM), DELQEV(IM), DELTBAR(IM), &
696 & DELTV(IM), DTCONV(IM), EDT(IM), &
697 & EDTO(IM), EDTX(IM), FLD(IM), &
698 & HCDO(IM), HKBO(IM), HMAX(IM), &
699 & HMIN(IM), HSBAR(IM), UCDO(IM), &
700 & UKBO(IM), VCDO(IM), VKBO(IM), &
701 & PBCDIF(IM), PDOT(IM), PO(IM,KM), &
702 & PWAVO(IM), PWEVO(IM), &
703 ! & PSFC(IM), PWAVO(IM), PWEVO(IM), &
704 & QCDO(IM), QCOND(IM), QEVAP(IM), &
705 & QKBO(IM), RNTOT(IM), VSHEAR(IM), &
706 & XAA0(IM), XHCD(IM), XHKB(IM), &
707 & XK(IM), XLAMB(IM), XLAMD(IM), &
708 & XMB(IM), XMBMAX(IM), XPWAV(IM), &
709 & XPWEV(IM), XQCD(IM), XQKB(IM)
711 ! PHYSICAL PARAMETERS
713 PARAMETER(CPOEL=CP/HVAP,ELOCP=HVAP/CP, &
714 & EL2ORC=HVAP*HVAP/(RV*CP))
715 PARAMETER(TERR=0.,C0=.002,DELTA=fv)
716 PARAMETER(FACT1=(CVAP-CLIQ)/RV,FACT2=HVAP/RV-FACT1*T0C)
717 ! LOCAL VARIABLES AND ARRAYS
718 real(kind=kind_phys) PFLD(IM,KM), TO(IM,KM), QO(IM,KM), &
719 & UO(IM,KM), VO(IM,KM), QESO(IM,KM)
721 real(kind=kind_phys) QLKO_KTCON(IM), DELLAL(IM), TVO(IM,KM), &
722 & DBYO(IM,KM), ZO(IM,KM), SUMZ(IM,KM), &
723 & SUMH(IM,KM), HEO(IM,KM), HESO(IM,KM), &
724 & QRCD(IM,KM), DELLAH(IM,KM), DELLAQ(IM,KM),&
725 & DELLAU(IM,KM), DELLAV(IM,KM), HCKO(IM,KM), &
726 & UCKO(IM,KM), VCKO(IM,KM), QCKO(IM,KM), &
727 & ETA(IM,KM), ETAU(IM,KM), ETAD(IM,KM), &
728 & QRCDO(IM,KM), PWO(IM,KM), PWDO(IM,KM), &
731 LOGICAL TOTFLG, CNVFLG(IM), DWNFLG(IM), DWNFLG2(IM), FLG(IM)
733 real(kind=kind_phys) PCRIT(15), ACRITT(15), ACRIT(15)
735 DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
736 & 350.,300.,250.,200.,150./
737 DATA ACRITT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
738 & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
740 ! DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
741 ! & .743,.813,.886,.947,1.138,1.377,1.896/
743 real(kind=kind_phys) TF, TCR, TCRF, RZERO, RONE
744 parameter (TF=233.16, TCR=263.16, TCRF=1.0/(TCR-TF))
745 parameter (RZERO=0.0,RONE=1.0)
746 !-----------------------------------------------------------------------
766 ACRIT(K) = ACRITT(K) * (975. - PCRIT(K))
769 !cmr dtmin = max(dt2,1200.)
771 dtmin = max(dt2, val )
772 !cmr dtmax = max(dt2,3600.)
774 dtmax = max(dt2, val )
775 ! MODEL TUNABLE PARAMETERS ARE ALL HERE
785 ! change for hurricane model
791 ! change for hurricane model
806 fjcap = (float(jcap) / 126.) ** 2
807 !cmr fjcap = max(fjcap,1.)
809 fjcap = max(fjcap,val)
810 fkm = (float(km) / 28.) ** 2
811 !cmr fkm = max(fkm,1.)
821 !CCCC IF(IM.EQ.384) THEN
824 !CCCC ELSEIF(IM.EQ.768) THEN
830 ! DEFINE TOP LAYER FOR SEARCH OF THE DOWNDRAFT ORIGINATING LAYER
831 ! AND THE MAXIMUM THETAE FOR UPDRAFT
842 IF (prSL(I,K)*tx1(I) .GT. 0.45) KBMAX(I) = K + 1
843 IF (prSL(I,K)*tx1(I) .GT. 0.70) KBM(I) = K + 1
844 IF (prSL(I,K)*tx1(I) .GT. 0.04) KMAX(I) = MIN(KM,K + 1)
848 KBMAX(I) = MIN(KBMAX(I),KMAX(I))
849 KBM(I) = MIN(KBM(I),KMAX(I))
852 ! CONVERT SURFACE PRESSURE TO MB FROM CB
857 if (K .le. kmax(i)) then
858 PFLD(I,k) = PRSL(I,K) * 10.0
874 ! P IS PRESSURE OF THE LAYER (MB)
875 ! T IS TEMPERATURE AT T-DT (K)..TN
876 ! Q IS MIXING RATIO AT T-DT (KG/KG)..QN
877 ! TO IS TEMPERATURE AT T+DT (K)... THIS IS AFTER ADVECTION AND TURBULAN
878 ! QO IS MIXING RATIO AT T+DT (KG/KG)..Q1
882 if (k .le. kmax(i)) then
883 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
885 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
887 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
888 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
890 QESO(I,k) = MAX(QESO(I,k), val1)
891 !cmr QO(I,k) = max(QO(I,k),1.e-10)
893 QO(I,k) = max(QO(I,k), val2 )
894 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
895 TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
901 ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
905 ZO(I,k) = PHIL(I,k) / G
908 ! COMPUTE MOIST STATIC ENERGY
911 if (K .le. kmax(i)) then
912 ! tem = G * ZO(I,k) + CP * TO(I,k)
913 tem = PHIL(I,k) + CP * TO(I,k)
914 HEO(I,k) = tem + HVAP * QO(I,k)
915 HESO(I,k) = tem + HVAP * QESO(I,k)
916 ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
921 ! DETERMINE LEVEL WITH LARGEST MOIST STATIC ENERGY
922 ! THIS IS THE LEVEL WHERE UPDRAFT STARTS
931 if (k .le. kbm(i)) then
932 IF(HEO(I,k).GT.HMAX(I).AND.CNVFLG(I)) THEN
940 ! TOL(k) = .5 * (TO(I,k) + TO(I,k+1))
941 ! QOL(k) = .5 * (QO(I,k) + QO(I,k+1))
942 ! QESOL(I,k) = .5 * (QESO(I,k) + QESO(I,k+1))
943 ! HEOL(I,k) = .5 * (HEO(I,k) + HEO(I,k+1))
944 ! HESOL(I,k) = .5 * (HESO(I,k) + HESO(I,k+1))
948 if (k .le. kmax(i)-1) then
949 DZ = .5 * (ZO(I,k+1) - ZO(I,k))
950 DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
951 !jfe ES = 10. * FPVS(TO(I,k+1))
953 ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
955 PPRIME = PFLD(I,k+1) + EPSM1 * ES
956 QS = EPS * ES / PPRIME
957 DQSDP = - QS / PPRIME
958 DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
959 DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
960 GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
961 DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
962 DQ = DQSDT * DT + DQSDP * DP
963 TO(I,k) = TO(I,k+1) + DT
964 QO(I,k) = QO(I,k+1) + DQ
965 PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
972 if (k .le. kmax(I)-1) then
973 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
975 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
977 QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1*QESO(I,k))
978 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
980 QESO(I,k) = MAX(QESO(I,k), val1)
981 !cmr QO(I,k) = max(QO(I,k),1.e-10)
983 QO(I,k) = max(QO(I,k), val2 )
984 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
985 HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
986 & CP * TO(I,k) + HVAP * QO(I,k)
987 HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
988 & CP * TO(I,k) + HVAP * QESO(I,k)
989 UO(I,k) = .5 * (UO(I,k) + UO(I,k+1))
990 VO(I,k) = .5 * (VO(I,k) + VO(I,k+1))
995 ! HEO(I,k) = HEO(I,k)
996 ! hesol(k) = HESO(I,k)
997 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
999 ! PRINT 6001, (HEO(I,K),K=1,KMAX)
1000 ! PRINT *, ' HESO ='
1001 ! PRINT 6001, (HESO(I,K),K=1,KMAX)
1003 ! PRINT 6002, (TO(I,K)-273.16,K=1,KMAX)
1005 ! PRINT 6003, (QO(I,K),K=1,KMAX)
1007 ! PRINT 6003, (QESO(I,K),K=1,KMAX)
1010 ! LOOK FOR CONVECTIVE CLOUD BASE AS THE LEVEL OF FREE CONVECTION
1015 HKBO(I) = HEO(I,INDX)
1016 QKBO(I) = QO(I,INDX)
1017 UKBO(I) = UO(I,INDX)
1018 VKBO(I) = VO(I,INDX)
1026 if (k .le. kbmax(i)) then
1027 IF(FLG(I).AND.K.GT.KB(I)) THEN
1028 HSBAR(I) = HESO(I,k)
1029 IF(HKBO(I).GT.HSBAR(I)) THEN
1039 PBCDIF(I) = -PFLD(I,KBCON(I)) + PFLD(I,KB(I))
1040 PDOT(I) = 10.* DOT(I,KBCON(I))
1041 IF(PBCDIF(I).GT.150.) CNVFLG(I) = .FALSE.
1042 IF(KBCON(I).EQ.KMAX(I)) CNVFLG(I) = .FALSE.
1048 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1051 ! FOUND LFC, CAN DEFINE REST OF VARIABLES
1052 6001 FORMAT(2X,-2P10F12.2)
1053 6002 FORMAT(2X,10F12.2)
1054 6003 FORMAT(2X,3P10F12.2)
1057 ! DETERMINE ENTRAINMENT RATE BETWEEN KB AND KBCON
1061 if(SLIMSK(I).eq.1.) alpha = alphal
1064 DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) - ZO(I,1)
1066 DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) &
1067 & - .5 * (ZO(I,KB(I)) + ZO(I,KB(I)-1))
1069 IF(KBCON(I).NE.KB(I)) THEN
1070 !cmr XLAMB(I) = -ALOG(ALPHA) / DZ
1071 XLAMB(I) = - LOG(ALPHA) / DZ
1077 ! DETERMINE UPDRAFT MASS FLUX
1080 if (k .le. kmax(i) .and. CNVFLG(I)) then
1088 if (k .le. kbmax(i)) then
1089 IF(CNVFLG(I).AND.K.LT.KBCON(I).AND.K.GE.KB(I)) THEN
1090 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1091 ETA(I,k) = ETA(I,k+1) * EXP(-XLAMB(I) * DZ)
1092 ETAU(I,k) = ETA(I,k)
1098 IF(CNVFLG(I).AND.KB(I).EQ.1.AND.KBCON(I).GT.1) THEN
1099 DZ = .5 * (ZO(I,2) - ZO(I,1))
1100 ETA(I,1) = ETA(I,2) * EXP(-XLAMB(I) * DZ)
1101 ETAU(I,1) = ETA(I,1)
1105 ! WORK UP UPDRAFT CLOUD PROPERTIES
1110 HCKO(I,INDX) = HKBO(I)
1111 QCKO(I,INDX) = QKBO(I)
1112 UCKO(I,INDX) = UKBO(I)
1113 VCKO(I,INDX) = VKBO(I)
1118 ! CLOUD PROPERTY BELOW CLOUD BASE IS MODIFIED BY THE ENTRAINMENT PROCES
1122 if (k .le. kmax(i)-1) then
1123 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
1124 FACTOR = ETA(I,k-1) / ETA(I,k)
1126 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1127 & .5 * (HEO(I,k) + HEO(I,k+1))
1128 UCKO(I,k) = FACTOR * UCKO(I,k-1) + ONEMF * &
1129 & .5 * (UO(I,k) + UO(I,k+1))
1130 VCKO(I,k) = FACTOR * VCKO(I,k-1) + ONEMF * &
1131 & .5 * (VO(I,k) + VO(I,k+1))
1132 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1134 IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
1135 HCKO(I,k) = HCKO(I,k-1)
1136 UCKO(I,k) = UCKO(I,k-1)
1137 VCKO(I,k) = VCKO(I,k-1)
1138 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1143 ! DETERMINE CLOUD TOP
1150 ! IF(DBYO(I,kK).GE.0..AND.FLG(I).AND.KK.GT.KBCON(I)) THEN
1157 if (k .le. kmax(i)) then
1158 IF(DBYO(I,k).LT.0..AND.FLG(I).AND.K.GT.KBCON(I)) THEN
1166 IF(CNVFLG(I).AND.(PFLD(I,KBCON(I)) - PFLD(I,KTCON(I))).LT.150.) &
1167 & CNVFLG(I) = .FALSE.
1171 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1175 ! SEARCH FOR DOWNDRAFT ORIGINATING LEVEL ABOVE THETA-E MINIMUM
1178 HMIN(I) = HEO(I,KBCON(I))
1183 DO K = KBCON(I), KBMAX(I)
1184 IF(HEO(I,k).LT.HMIN(I).AND.CNVFLG(I)) THEN
1191 ! Make sure that JMIN(I) is within the cloud
1195 JMIN(I) = MIN(LMIN(I),KTCON(I)-1)
1197 JMIN(I) = MAX(JMIN(I),KBCON(I)+1)
1205 if (k .le. kmax(i)-1) then
1206 if(CNVFLG(I).and.k.gt.JMIN(I).and.k.le.KTCON(I)) THEN
1207 SUMZ(I,k) = SUMZ(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1))
1208 SUMH(I,k) = SUMH(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1)) &
1217 ! call random_number(XKT2)
1220 KT2(I) = nint(XKT2(I)*float(KTCON(I)-JMIN(I))-.5)+JMIN(I)+1
1221 ! KT2(I) = nint(sqrt(XKT2(I))*float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
1222 ! KT2(I) = nint(ranf() *float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
1223 tem1 = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
1224 tem2 = (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
1225 if (abs(tem2) .gt. 0.000001) THEN
1226 XLAMB(I) = tem1 / tem2
1230 ! XLAMB(I) = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
1231 ! & / (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
1232 XLAMB(I) = max(XLAMB(I),RZERO)
1233 XLAMB(I) = min(XLAMB(I),2.3/SUMZ(I,KT2(I)))
1238 DWNFLG(I) = CNVFLG(I)
1239 DWNFLG2(I) = CNVFLG(I)
1241 if(KT2(I).ge.KTCON(I)) DWNFLG(I) = .false.
1242 if(XLAMB(I).le.1.e-30.or.HCKO(I,JMIN(I))-HESO(I,KT2(I)).le.1.e-30)&
1243 & DWNFLG(I) = .false.
1244 do k = JMIN(I), KT2(I)
1245 if(DWNFLG(I).and.HEO(I,k).gt.HESO(I,KT2(I))) DWNFLG(I)=.false.
1247 ! IF(CNVFLG(I).AND.(PFLD(KBCON(I))-PFLD(KTCON(I))).GT.PDETRN)
1248 ! & DWNFLG(I)=.FALSE.
1249 IF(CNVFLG(I).AND.(PFLD(I,KBCON(I))-PFLD(I,KTCON(I))).LT.PDPDWN) &
1250 & DWNFLG2(I)=.FALSE.
1256 if (k .le. kmax(i)-1) then
1257 IF(DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
1258 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1259 ! ETA(I,k) = ETA(I,k-1) * EXP( XLAMB(I) * DZ)
1260 ! to simplify matter, we will take the linear approach here
1262 ETA(I,k) = ETA(I,k-1) * (1. + XLAMB(I) * dz)
1263 ETAU(I,k) = ETAU(I,k-1) * (1. + (XLAMB(I)+xlambu) * dz)
1271 if (k .le. kmax(i)-1) then
1272 ! IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
1273 IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KTCON(I)) THEN
1274 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1275 ETAU(I,k) = ETAU(I,k-1) * (1. + xlambu * dz)
1280 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1281 ! PRINT *, ' LMIN(I), KT2(I)=', LMIN(I), KT2(I)
1282 ! PRINT *, ' KBOT, KTOP, JMIN(I) =', KBCON(I), KTCON(I), JMIN(I)
1284 ! IF(LAT.EQ.LATD.AND.lon.eq.lond) THEN
1285 ! print *, ' xlamb =', xlamb
1286 ! print *, ' eta =', (eta(k),k=1,KT2(I))
1287 ! print *, ' ETAU =', (ETAU(I,k),k=1,KT2(I))
1288 ! print *, ' HCKO =', (HCKO(I,k),k=1,KT2(I))
1289 ! print *, ' SUMZ =', (SUMZ(I,k),k=1,KT2(I))
1290 ! print *, ' SUMH =', (SUMH(I,k),k=1,KT2(I))
1298 ! CLOUD PROPERTY ABOVE CLOUD Base IS MODIFIED BY THE DETRAINMENT PROCESS
1302 if (k .le. kmax(i)-1) then
1304 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1305 !jfe IF(K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1306 FACTOR = ETA(I,k-1) / ETA(I,k)
1308 fuv = ETAU(I,k-1) / ETAU(I,k)
1310 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1311 & .5 * (HEO(I,k) + HEO(I,k+1))
1312 UCKO(I,k) = fuv * UCKO(I,k-1) + ONEMFu * &
1313 & .5 * (UO(I,k) + UO(I,k+1))
1314 VCKO(I,k) = fuv * VCKO(I,k-1) + ONEMFu * &
1315 & .5 * (VO(I,k) + VO(I,k+1))
1316 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1321 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1322 ! PRINT *, ' UCKO=', (UCKO(I,k),k=KBCON(I)+1,KTCON(I))
1323 ! PRINT *, ' uenv=', (.5*(UO(I,k)+UO(I,k-1)),k=KBCON(I)+1,KTCON(I))
1326 if(CNVFLG(I).and.DWNFLG2(I).and.JMIN(I).le.KBCON(I)) &
1330 DWNFLG2(I) = .false.
1336 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1341 ! COMPUTE CLOUD MOISTURE PROPERTY AND PRECIPITATION
1349 if (k .le. kmax(i)) then
1350 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
1351 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1352 DZ1 = (ZO(I,k) - ZO(I,k-1))
1353 GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
1355 & + GAMMA * DBYO(I,k) / (HVAP * (1. + GAMMA))
1356 FACTOR = ETA(I,k-1) / ETA(I,k)
1358 QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
1359 & .5 * (QO(I,k) + QO(I,k+1))
1360 DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * QRCH
1361 RHBAR(I) = RHBAR(I) + QO(I,k) / QESO(I,k)
1363 ! BELOW LFC CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
1366 ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
1367 QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
1368 AA1(I) = AA1(I) - DZ1 * G * QLK
1370 PWO(I,k) = ETAH * C0 * DZ * QLK
1372 PWAVO(I) = PWAVO(I) + PWO(I,k)
1379 RHBAR(I) = RHBAR(I) / float(KTCON(I) - KB(I) - 1)
1382 ! this section is ready for cloud water
1384 if(ncloud.gt.0) THEN
1386 ! compute liquid and vapor separation at cloud top
1391 GAMMA = EL2ORC * QESO(I,K) / (TO(I,K)**2)
1393 & + GAMMA * DBYO(I,K) / (HVAP * (1. + GAMMA))
1394 DQ = QCKO(I,K-1) - QRCH
1396 ! CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
1406 ! CALCULATE CLOUD WORK FUNCTION AT T+DT
1410 if (k .le. kmax(i)) then
1411 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1412 DZ1 = ZO(I,k) - ZO(I,k-1)
1413 GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
1414 RFACT = 1. + DELTA * CP * GAMMA &
1415 & * TO(I,k-1) / HVAP
1417 & DZ1 * (G / (CP * TO(I,k-1))) &
1418 & * DBYO(I,k-1) / (1. + GAMMA) &
1422 & DZ1 * G * DELTA * &
1423 !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
1424 & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
1430 IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG(I) = .FALSE.
1431 IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
1432 IF(CNVFLG(I).AND.AA1(I).LE.0.) CNVFLG(I) = .FALSE.
1437 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1441 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1442 !cccc PRINT *, ' AA1(I) BEFORE DWNDRFT =', AA1(I)
1445 !------- DOWNDRAFT CALCULATIONS
1448 !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
1457 if (k .le. kmax(i)) then
1458 IF(K.GE.KB(I).AND.K.LE.KTCON(I).AND.CNVFLG(I)) THEN
1459 shear=rcs(I) * sqrt((UO(I,k+1)-UO(I,k)) ** 2 &
1460 & + (VO(I,k+1)-VO(I,k)) ** 2)
1461 VSHEAR(I) = VSHEAR(I) + SHEAR
1469 KNUMB = KTCON(I) - KB(I) + 1
1470 KNUMB = MAX(KNUMB,1)
1471 VSHEAR(I) = 1.E3 * VSHEAR(I) / (ZO(I,KTCON(I))-ZO(I,KB(I)))
1472 E1=1.591-.639*VSHEAR(I) &
1473 & +.0953*(VSHEAR(I)**2)-.00496*(VSHEAR(I)**3)
1475 !cmr EDT(I) = MIN(EDT(I),.9)
1477 EDT(I) = MIN(EDT(I),val)
1478 !cmr EDT(I) = MAX(EDT(I),.0)
1480 EDT(I) = MAX(EDT(I),val)
1485 ! DETERMINE DETRAINMENT RATE BETWEEN 1 AND KBDTR
1489 if(SLIMSK(I).eq.1.) beta = betal
1492 KBDTR(I) = MAX(KBDTR(I),1)
1494 IF(KBDTR(I).GT.1) THEN
1495 DZ = .5 * ZO(I,KBDTR(I)) + .5 * ZO(I,KBDTR(I)-1) &
1497 XLAMD(I) = LOG(BETA) / DZ
1501 ! DETERMINE DOWNDRAFT MASS FLUX
1504 IF(k .le. kmax(i)) then
1514 if (k .le. kbmax(i)) then
1515 IF(CNVFLG(I).AND.K.LT.KBDTR(I)) THEN
1516 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1517 ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
1524 IF(CNVFLG(I).AND.KBDTR(I).GT.1) THEN
1525 DZ = .5 * (ZO(I,2) - ZO(I,1))
1526 ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
1530 !--- DOWNDRAFT MOISTURE PROPERTIES
1539 HCDO(I) = HEO(I,JMN)
1541 QRCDO(I,JMN) = QESO(I,JMN)
1548 if (k .le. kmax(i)-1) then
1549 IF(CNVFLG(I).AND.K.LT.JMIN(I)) THEN
1552 GAMMA = EL2ORC * DQ / DT**2
1553 DH = HCDO(I) - HESO(I,k)
1554 QRCDO(I,k) = DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
1555 DETAD = ETAD(I,k+1) - ETAD(I,k)
1556 PWDO(I,k) = ETAD(I,k+1) * QCDO(I) - &
1557 & ETAD(I,k) * QRCDO(I,k)
1558 PWDO(I,k) = PWDO(I,k) - DETAD * &
1559 & .5 * (QRCDO(I,k) + QRCDO(I,k+1))
1560 QCDO(I) = QRCDO(I,k)
1561 PWEVO(I) = PWEVO(I) + PWDO(I,k)
1566 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG(I)) THEN
1567 ! PRINT *, ' PWAVO(I), PWEVO(I) =', PWAVO(I), PWEVO(I)
1570 !--- FINAL DOWNDRAFT STRENGTH DEPENDENT ON PRECIP
1571 !--- EFFICIENCY (EDT), NORMALIZED CONDENSATE (PWAV), AND
1572 !--- EVAPORATE (PWEV)
1576 if(SLIMSK(I).eq.0.) edtmax = edtmaxs
1578 IF(PWEVO(I).LT.0.) THEN
1579 EDTO(I) = -EDTO(I) * PWAVO(I) / PWEVO(I)
1580 EDTO(I) = MIN(EDTO(I),EDTMAX)
1590 !--- DOWNDRAFT CLOUDWORK FUNCTIONS
1595 if (k .le. kmax(i)-1) then
1596 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1597 GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
1602 DZ=-1.*(ZO(I,k+1)-ZO(I,k))
1603 AA1(I)=AA1(I)+EDTO(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
1604 & *(1.+DELTA*CP*DG*DT/HVAP)
1606 AA1(I)=AA1(I)+EDTO(I)* &
1607 !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
1608 & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
1613 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
1614 !cccc PRINT *, ' AA1(I) AFTER DWNDRFT =', AA1(I)
1617 IF(AA1(I).LE.0.) CNVFLG(I) = .FALSE.
1618 IF(AA1(I).LE.0.) DWNFLG(I) = .FALSE.
1619 IF(AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
1624 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1630 !--- WHAT WOULD THE CHANGE BE, THAT A CLOUD WITH UNIT MASS
1631 !--- WILL DO TO THE ENVIRONMENT?
1635 IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1645 DP = 1000. * DEL(I,1)
1646 DELLAH(I,1) = EDTO(I) * ETAD(I,1) * (HCDO(I) &
1647 & - HEO(I,1)) * G / DP
1648 DELLAQ(I,1) = EDTO(I) * ETAD(I,1) * (QCDO(I) &
1649 & - QO(I,1)) * G / DP
1650 DELLAU(I,1) = EDTO(I) * ETAD(I,1) * (UCDO(I) &
1651 & - UO(I,1)) * G / DP
1652 DELLAV(I,1) = EDTO(I) * ETAD(I,1) * (VCDO(I) &
1653 & - VO(I,1)) * G / DP
1657 !--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT
1661 if (k .le. kmax(i)-1) then
1662 IF(CNVFLG(I).AND.K.LT.KTCON(I)) THEN
1664 IF(K.LE.KB(I)) AUP = 0.
1666 IF(K.GT.JMIN(I)) ADW = 0.
1668 DV2 = .5 * (HEO(I,k) + HEO(I,k+1))
1671 DV2Q = .5 * (QO(I,k) + QO(I,k+1))
1674 DV2U = .5 * (UO(I,k) + UO(I,k+1))
1677 DV2V = .5 * (VO(I,k) + VO(I,k+1))
1679 DP = 1000. * DEL(I,K)
1680 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1681 DETA = ETA(I,k) - ETA(I,k-1)
1682 DETAD = ETAD(I,k) - ETAD(I,k-1)
1683 DELLAH(I,k) = DELLAH(I,k) + &
1684 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1 &
1685 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3 &
1686 & - AUP * DETA * DV2 &
1687 & + ADW * EDTO(I) * DETAD * HCDO(I)) * G / DP
1688 DELLAQ(I,k) = DELLAQ(I,k) + &
1689 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1Q &
1690 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3Q &
1691 & - AUP * DETA * DV2Q &
1692 & +ADW*EDTO(I)*DETAD*.5*(QRCDO(I,k)+QRCDO(I,k-1))) * G / DP
1693 DELLAU(I,k) = DELLAU(I,k) + &
1694 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1U &
1695 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3U &
1696 & - AUP * DETA * DV2U &
1697 & + ADW * EDTO(I) * DETAD * UCDO(I) &
1699 DELLAV(I,k) = DELLAV(I,k) + &
1700 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1V &
1701 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3V &
1702 & - AUP * DETA * DV2V &
1703 & + ADW * EDTO(I) * DETAD * VCDO(I) &
1715 DP = 1000. * DEL(I,INDX)
1717 DELLAH(I,INDX) = ETA(I,INDX-1) * &
1718 & (HCKO(I,INDX-1) - DV1) * G / DP
1720 DELLAQ(I,INDX) = ETA(I,INDX-1) * &
1721 & (QCKO(I,INDX-1) - DVQ1) * G / DP
1723 DELLAU(I,INDX) = ETA(I,INDX-1) * &
1724 & (UCKO(I,INDX-1) - DV1U) * G / DP
1726 DELLAV(I,INDX) = ETA(I,INDX-1) * &
1727 & (VCKO(I,INDX-1) - DV1V) * G / DP
1731 DELLAL(I) = ETA(I,INDX-1) * QLKO_KTCON(I) * g / dp
1735 !------- FINAL CHANGED VARIABLE PER UNIT MASS FLUX
1739 if (k .le. kmax(i)) then
1740 IF(CNVFLG(I).and.k.gt.KTCON(I)) THEN
1746 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
1747 QO(I,k) = DELLAQ(I,k) * MBDT + Q1(I,k)
1748 DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
1749 TO(I,k) = DELLAT * MBDT + T1(I,k)
1750 !cmr QO(I,k) = max(QO(I,k),1.e-10)
1752 QO(I,k) = max(QO(I,k), val )
1757 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1759 !--- THE ABOVE CHANGED ENVIRONMENT IS NOW USED TO CALULATE THE
1760 !--- EFFECT THE ARBITRARY CLOUD (WITH UNIT MASS FLUX)
1761 !--- WOULD HAVE ON THE STABILITY,
1762 !--- WHICH THEN IS USED TO CALCULATE THE REAL MASS FLUX,
1763 !--- NECESSARY TO KEEP THIS CHANGE IN BALANCE WITH THE LARGE-SCALE
1764 !--- DESTABILIZATION.
1766 !--- ENVIRONMENTAL CONDITIONS AGAIN, FIRST HEIGHTS
1770 IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1771 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
1773 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
1775 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k)+EPSM1*QESO(I,k))
1776 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
1778 QESO(I,k) = MAX(QESO(I,k), val )
1779 TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
1790 ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
1793 ! IF(CNVFLG(I)) THEN
1794 ! DLNSIG = LOG(PRSL(I,1)/PS(I))
1795 ! ZO(I,1) = TERR - DLNSIG * RD / G * TVO(I,1)
1800 ! IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1801 ! DLNSIG = LOG(PRSL(I,K) / PRSL(I,K-1))
1802 ! ZO(I,k) = ZO(I,k-1) - DLNSIG * RD / G
1803 ! & * .5 * (TVO(I,k) + TVO(I,k-1))
1808 !--- MOIST STATIC ENERGY
1812 IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
1813 DZ = .5 * (ZO(I,k+1) - ZO(I,k))
1814 DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
1815 !jfe ES = 10. * FPVS(TO(I,k+1))
1817 ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
1819 PPRIME = PFLD(I,k+1) + EPSM1 * ES
1820 QS = EPS * ES / PPRIME
1821 DQSDP = - QS / PPRIME
1822 DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
1823 DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
1824 GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
1825 DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
1826 DQ = DQSDT * DT + DQSDP * DP
1827 TO(I,k) = TO(I,k+1) + DT
1828 QO(I,k) = QO(I,k+1) + DQ
1829 PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
1835 IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
1836 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
1838 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
1840 QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1 * QESO(I,k))
1841 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
1843 QESO(I,k) = MAX(QESO(I,k), val1)
1844 !cmr QO(I,k) = max(QO(I,k),1.e-10)
1846 QO(I,k) = max(QO(I,k), val2 )
1847 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
1848 HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
1849 & CP * TO(I,k) + HVAP * QO(I,k)
1850 HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
1851 & CP * TO(I,k) + HVAP * QESO(I,k)
1858 HEO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QO(I,k)
1859 HESO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QESO(I,k)
1860 ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
1866 XHKB(I) = HEO(I,INDX)
1867 XQKB(I) = QO(I,INDX)
1868 HCKO(I,INDX) = XHKB(I)
1869 QCKO(I,INDX) = XQKB(I)
1874 !**************************** STATIC CONTROL
1877 !------- MOISTURE AND CLOUD WORK FUNCTIONS
1881 if (k .le. kmax(i)-1) then
1882 ! IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
1883 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KTCON(I)) THEN
1884 FACTOR = ETA(I,k-1) / ETA(I,k)
1886 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1887 & .5 * (HEO(I,k) + HEO(I,k+1))
1889 ! IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
1890 ! HEO(I,k) = HEO(I,k-1)
1897 if (k .le. kmax(i)-1) then
1898 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
1899 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1900 GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
1901 XDBY = HCKO(I,k) - HESO(I,k)
1902 !cmr XDBY = MAX(XDBY,0.)
1904 XDBY = MAX(XDBY,val)
1906 & + GAMMA * XDBY / (HVAP * (1. + GAMMA))
1907 FACTOR = ETA(I,k-1) / ETA(I,k)
1909 QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
1910 & .5 * (QO(I,k) + QO(I,k+1))
1911 DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * XQRCH
1913 ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
1914 QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
1915 XAA0(I) = XAA0(I) - (ZO(I,k) - ZO(I,k-1)) * G * QLK
1917 XPW = ETAH * C0 * DZ * QLK
1919 XPWAV(I) = XPWAV(I) + XPW
1922 ! IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LT.KTCON(I)) THEN
1923 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1924 DZ1 = ZO(I,k) - ZO(I,k-1)
1925 GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
1926 RFACT = 1. + DELTA * CP * GAMMA &
1927 & * TO(I,k-1) / HVAP
1928 XDBY = HCKO(I,k-1) - HESO(I,k-1)
1930 & + DZ1 * (G / (CP * TO(I,k-1))) &
1931 & * XDBY / (1. + GAMMA) &
1935 & DZ1 * G * DELTA * &
1936 !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
1937 & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
1942 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1943 !cccc PRINT *, ' XAA BEFORE DWNDRFT =', XAA0(I)
1946 !------- DOWNDRAFT CALCULATIONS
1949 !--- DOWNDRAFT MOISTURE PROPERTIES
1957 XHCD(I) = HEO(I,JMN)
1959 QRCD(I,JMN) = QESO(I,JMN)
1964 if (k .le. kmax(i)-1) then
1965 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1968 GAMMA = EL2ORC * DQ / DT**2
1969 DH = XHCD(I) - HESO(I,k)
1970 QRCD(I,k)=DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
1971 DETAD = ETAD(I,k+1) - ETAD(I,k)
1972 XPWD = ETAD(I,k+1) * QRCD(I,k+1) - &
1973 & ETAD(I,k) * QRCD(I,k)
1974 XPWD = XPWD - DETAD * &
1975 & .5 * (QRCD(I,k) + QRCD(I,k+1))
1976 XPWEV(I) = XPWEV(I) + XPWD
1984 if(SLIMSK(I).eq.0.) edtmax = edtmaxs
1986 IF(XPWEV(I).GE.0.) THEN
1989 EDTX(I) = -EDTX(I) * XPWAV(I) / XPWEV(I)
1990 EDTX(I) = MIN(EDTX(I),EDTMAX)
1999 !--- DOWNDRAFT CLOUDWORK FUNCTIONS
2004 if (k .le. kmax(i)-1) then
2005 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
2006 GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
2011 DZ=-1.*(ZO(I,k+1)-ZO(I,k))
2012 XAA0(I)=XAA0(I)+EDTX(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
2013 & *(1.+DELTA*CP*DG*DT/HVAP)
2015 XAA0(I)=XAA0(I)+EDTX(I)* &
2016 !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
2017 & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
2022 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
2023 !cccc PRINT *, ' XAA AFTER DWNDRFT =', XAA0(I)
2026 ! CALCULATE CRITICAL CLOUD WORK FUNCTION
2031 ! IF(CNVFLG(I).AND.SLIMSK(I).NE.1.) THEN
2032 IF(PFLD(I,KTCON(I)).LT.PCRIT(15))THEN
2033 ACRT(I)=ACRIT(15)*(975.-PFLD(I,KTCON(I))) &
2035 ELSE IF(PFLD(I,KTCON(I)).GT.PCRIT(1))THEN
2038 !cmr K = IFIX((850. - PFLD(I,KTCON(I)))/50.) + 2
2039 K = int((850. - PFLD(I,KTCON(I)))/50.) + 2
2042 ACRT(I)=ACRIT(K)+(ACRIT(K-1)-ACRIT(K))* &
2043 & (PFLD(I,KTCON(I))-PCRIT(K))/(PCRIT(K-1)-PCRIT(K))
2046 ! ACRT(I) = .5 * (PFLD(I,KBCON(I)) - PFLD(I,KTCON(I)))
2052 if(SLIMSK(I).eq.1.) THEN
2063 !C IF(CNVFLG(I).AND.SLIMSK(I).EQ.1.) THEN
2064 ! ACRTFCT(I) = PDOT(I) / W3
2066 ! modify critical cloud workfunction by cloud base vertical velocity
2068 IF(PDOT(I).LE.W4) THEN
2069 ACRTFCT(I) = (PDOT(I) - W4) / (W3 - W4)
2070 ELSEIF(PDOT(I).GE.-W4) THEN
2071 ACRTFCT(I) = - (PDOT(I) + W4) / (W4 - W3)
2075 !cmr ACRTFCT(I) = MAX(ACRTFCT(I),-1.)
2077 ACRTFCT(I) = MAX(ACRTFCT(I),val1)
2078 !cmr ACRTFCT(I) = MIN(ACRTFCT(I),1.)
2080 ACRTFCT(I) = MIN(ACRTFCT(I),val2)
2081 ACRTFCT(I) = 1. - ACRTFCT(I)
2083 ! modify ACRTFCT(I) by colume mean rh if RHBAR(I) is greater than 80 percent
2085 ! if(RHBAR(I).ge..8) THEN
2086 ! ACRTFCT(I) = ACRTFCT(I) * (.9 - min(RHBAR(I),.9)) * 10.
2089 ! modify adjustment time scale by cloud base vertical velocity
2091 DTCONV(I) = DT2 + max((1800. - DT2),RZERO) * &
2092 & (PDOT(I) - W2) / (W1 - W2)
2093 ! DTCONV(I) = MAX(DTCONV(I), DT2)
2094 ! DTCONV(I) = 1800. * (PDOT(I) - w2) / (w1 - w2)
2095 DTCONV(I) = max(DTCONV(I),dtmin)
2096 DTCONV(I) = min(DTCONV(I),dtmax)
2101 !--- LARGE SCALE FORCING
2106 ! F = AA1(I) / DTCONV(I)
2107 FLD(I) = (AA1(I) - ACRT(I) * ACRTFCT(I)) / DTCONV(I)
2108 IF(FLD(I).LE.0.) FLG(I) = .FALSE.
2112 ! XAA0(I) = MAX(XAA0(I),0.)
2113 XK(I) = (XAA0(I) - AA1(I)) / MBDT
2114 IF(XK(I).GE.0.) FLG(I) = .FALSE.
2117 !--- KERNEL, CLOUD BASE MASS FLUX
2121 XMB(I) = -FLD(I) / XK(I)
2122 XMB(I) = MIN(XMB(I),XMBMAX(I))
2125 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
2126 ! print *, ' RHBAR(I), ACRTFCT(I) =', RHBAR(I), ACRTFCT(I)
2127 ! PRINT *, ' A1, XA =', AA1(I), XAA0(I)
2128 ! PRINT *, ' XMB(I), ACRT =', XMB(I), ACRT
2132 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
2136 ! restore t0 and QO to t1 and q1 in case convection stops
2140 if (k .le. kmax(i)) then
2143 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
2145 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
2147 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
2148 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
2150 QESO(I,k) = MAX(QESO(I,k), val )
2154 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2156 !--- FEEDBACK: SIMPLY THE CHANGES FROM THE CLOUD WITH UNIT MASS FLUX
2157 !--- MULTIPLIED BY THE MASS FLUX NECESSARY TO KEEP THE
2158 !--- EQUILIBRIUM WITH THE LARGER-SCALE.
2168 if (k .le. kmax(i)) then
2169 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2171 IF(K.Le.KB(I)) AUP = 0.
2173 IF(K.GT.JMIN(I)) ADW = 0.
2174 DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
2175 T1(I,k) = T1(I,k) + DELLAT * XMB(I) * DT2
2176 Q1(I,k) = Q1(I,k) + DELLAQ(I,k) * XMB(I) * DT2
2177 U1(I,k) = U1(I,k) + DELLAU(I,k) * XMB(I) * DT2
2178 V1(I,k) = V1(I,k) + DELLAV(I,k) * XMB(I) * DT2
2179 DP = 1000. * DEL(I,K)
2180 DELHBAR(I) = DELHBAR(I) + DELLAH(I,k)*XMB(I)*DP/G
2181 DELQBAR(I) = DELQBAR(I) + DELLAQ(I,k)*XMB(I)*DP/G
2182 DELTBAR(I) = DELTBAR(I) + DELLAT*XMB(I)*DP/G
2189 if (k .le. kmax(i)) then
2190 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2191 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
2193 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
2195 QESO(I,k) = EPS * QESO(I,k)/(PFLD(I,k) + EPSM1*QESO(I,k))
2196 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
2198 QESO(I,k) = MAX(QESO(I,k), val )
2202 if(ncloud.gt.0.and.CNVFLG(I).and.k.eq.KTCON(I)) THEN
2203 tem = DELLAL(I) * XMB(I) * dt2
2204 tem1 = MAX(RZERO, MIN(RONE, (TCR-t1(I,K))*TCRF))
2205 if (QL(I,k,2) .gt. -999.0) then
2206 QL(I,k,1) = QL(I,k,1) + tem * tem1 ! Ice
2207 QL(I,k,2) = QL(I,k,2) + tem *(1.0-tem1) ! Water
2209 tem2 = QL(I,k,1) + tem
2210 QL(I,k,1) = tem2 * tem1 ! Ice
2211 QL(I,k,2) = tem2 - QL(I,k,1) ! Water
2213 ! QL(I,k) = QL(I,k) + DELLAL(I) * XMB(I) * dt2
2214 dp = 1000. * del(i,k)
2215 DELLAL(I) = DELLAL(I) * XMB(I) * dp / g
2221 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
2222 ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
2223 ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
2224 ! PRINT *, ' DELLBAR ='
2225 ! PRINT 6003, HVAP*DELLbar
2226 ! PRINT *, ' DELLAQ ='
2227 ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
2228 ! PRINT *, ' DELLAT ='
2229 ! PRINT 6003, (DELLAH(i,k)*XMB(I)-HVAP*DELLAQ(I,k)*XMB(I), &
2240 if (k .le. kmax(i)) then
2241 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2243 IF(K.Le.KB(I)) AUP = 0.
2245 IF(K.GT.JMIN(I)) ADW = 0.
2246 rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
2247 RNTOT(I) = RNTOT(I) + rain * XMB(I) * .001 * dt2
2254 if (k .le. kmax(i)) then
2258 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2260 IF(K.Le.KB(I)) AUP = 0.
2262 IF(K.GT.JMIN(I)) ADW = 0.
2263 rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
2264 RN(I) = RN(I) + rain * XMB(I) * .001 * dt2
2266 IF(FLG(I).AND.K.LE.KTCON(I)) THEN
2267 evef = EDT(I) * evfact
2268 if(SLIMSK(I).eq.1.) evef=EDT(I) * evfactl
2269 ! if(SLIMSK(I).eq.1.) evef=.07
2270 ! if(SLIMSK(I).ne.1.) evef = 0.
2271 QCOND(I) = EVEF * (Q1(I,k) - QESO(I,k)) &
2272 & / (1. + EL2ORC * QESO(I,k) / T1(I,k)**2)
2273 DP = 1000. * DEL(I,K)
2274 IF(RN(I).GT.0..AND.QCOND(I).LT.0.) THEN
2275 QEVAP(I) = -QCOND(I) * (1.-EXP(-.32*SQRT(DT2*RN(I))))
2276 QEVAP(I) = MIN(QEVAP(I), RN(I)*1000.*G/DP)
2277 DELQ2(I) = DELQEV(I) + .001 * QEVAP(I) * dp / g
2279 if(RN(I).gt.0..and.QCOND(I).LT.0..and. &
2280 & DELQ2(I).gt.RNTOT(I)) THEN
2281 QEVAP(I) = 1000.* g * (RNTOT(I) - DELQEV(I)) / dp
2284 IF(RN(I).GT.0..AND.QEVAP(I).gt.0.) THEN
2285 Q1(I,k) = Q1(I,k) + QEVAP(I)
2286 T1(I,k) = T1(I,k) - ELOCP * QEVAP(I)
2287 RN(I) = RN(I) - .001 * QEVAP(I) * DP / G
2288 DELTV(I) = - ELOCP*QEVAP(I)/DT2
2289 DELQ(I) = + QEVAP(I)/DT2
2290 DELQEV(I) = DELQEV(I) + .001*dp*QEVAP(I)/g
2292 DELLAQ(I,k) = DELLAQ(I,k) + DELQ(I) / XMB(I)
2293 DELQBAR(I) = DELQBAR(I) + DELQ(I)*DP/G
2294 DELTBAR(I) = DELTBAR(I) + DELTV(I)*DP/G
2299 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
2300 ! PRINT *, ' DELLAH ='
2301 ! PRINT 6003, (DELLAH(k)*XMB(I),K=1,KMAX)
2302 ! PRINT *, ' DELLAQ ='
2303 ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
2304 ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
2305 ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
2306 ! PRINT *, ' PRECIP =', HVAP*RN(I)*1000./DT2
2307 !CCCC PRINT *, ' DELLBAR ='
2308 !CCCC PRINT *, HVAP*DELLbar
2311 ! PRECIPITATION RATE CONVERTED TO ACTUAL PRECIP
2312 ! IN UNIT OF M INSTEAD OF KG
2317 ! IN THE EVENT OF UPPER LEVEL RAIN EVAPORATION AND LOWER LEVEL DOWNDRAF
2318 ! MOISTENING, RN CAN BECOME NEGATIVE, IN THIS CASE, WE BACK OUT OF TH
2319 ! HEATING AND THE MOISTENING
2321 if(RN(I).lt.0..and..not.FLG(I)) RN(I) = 0.
2322 IF(RN(I).LE.0.) THEN
2334 if (k .le. kmax(i)) then
2335 IF(CNVFLG(I).AND.RN(I).LE.0.) THEN
2344 END SUBROUTINE SASCNV
2346 ! ------------------------------------------------------------------------
2348 SUBROUTINE OLD_ARW_SHALCV(IM,IX,KM,DT,DEL,PRSI,PRSL,PRSLK,KUO,Q,T,DPSHC)
2350 USE MODULE_GFS_MACHINE , ONLY : kind_phys
2351 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
2356 ! include 'constant.h'
2358 integer IM, IX, KM, KUO(IM)
2359 real(kind=kind_phys) DEL(IX,KM), PRSI(IX,KM+1), PRSL(IX,KM), &
2361 & Q(IX,KM), T(IX,KM), DT, DPSHC
2365 real(kind=kind_phys) ck, cpdt, dmse, dsdz1, dsdz2, &
2366 & dsig, dtodsl, dtodsu, eldq, g, &
2369 integer k,k1,k2,kliftl,kliftu,kt,N2,I,iku,ik1,ik,ii
2370 integer INDEX2(IM), KLCL(IM), KBOT(IM), KTOP(IM),kk &
2373 ! PHYSICAL PARAMETERS
2374 PARAMETER(G=GRAV, GOCP=G/CP)
2375 ! BOUNDS OF PARCEL ORIGIN
2376 PARAMETER(KLIFTL=2,KLIFTU=2)
2378 real(kind=kind_phys) Q2(IM*KM), T2(IM*KM), &
2379 & PRSL2(IM*KM), PRSLK2(IM*KM), &
2380 & AL(IM*(KM-1)), AD(IM*KM), AU(IM*(KM-1))
2381 !-----------------------------------------------------------------------
2382 ! COMPRESS FIELDS TO POINTS WITH NO DEEP CONVECTION
2383 ! AND MOIST STATIC INSTABILITY.
2389 IF(KUO(I).EQ.0) THEN
2390 ELDQ = HVAP*(Q(I,K)-Q(I,K+1))
2391 CPDT = CP*(T(I,K)-T(I,K+1))
2392 RTDLS = (PRSL(I,K)-PRSL(I,K+1)) / &
2393 & PRSI(I,K+1)*RD*0.5*(T(I,K)+T(I,K+1))
2394 DMSE = ELDQ+CPDT-RTDLS
2395 LSHC(I) = LSHC(I).OR.DMSE.GT.0.
2414 PRSL2(IK) = PRSL(II,K)
2415 PRSLK2(IK) = PRSLK(II,K)
2424 if (prsi(ii,1)-prsi(ii,k) .le. dpshc) ktopm(i) = k
2428 !-----------------------------------------------------------------------
2429 ! COMPUTE MOIST ADIABAT AND DETERMINE LIMITS OF SHALLOW CONVECTION.
2430 ! CHECK FOR MOIST STATIC INSTABILITY AGAIN WITHIN CLOUD.
2431 CALL MSTADBT3(N2,KM-1,KLIFTL,KLIFTU,PRSL2,PRSLK2,T2,Q2, &
2432 & KLCL,KBOT,KTOP,AL,AU)
2434 KBOT(I) = min(KLCL(I)-1, ktopm(i)-1)
2435 KTOP(I) = min(KTOP(I)+1, ktopm(i))
2441 IF(K.GE.KBOT(I).AND.K.LT.KTOP(I)) THEN
2444 ELDQ = HVAP * (Q2(IK)-Q2(IKU))
2445 CPDT = CP * (T2(IK)-T2(IKU))
2446 RTDLS = (PRSL2(IK)-PRSL2(IKU)) / &
2447 & PRSI(index2(i),K+1)*RD*0.5*(T2(IK)+T2(IKU))
2448 DMSE = ELDQ + CPDT - RTDLS
2449 LSHC(I) = LSHC(I).OR.DMSE.GT.0.
2457 IF(.NOT.LSHC(I)) THEN
2461 K1 = MIN(K1,KBOT(I))
2462 K2 = MAX(K2,KTOP(I))
2466 !-----------------------------------------------------------------------
2467 ! SET EDDY VISCOSITY COEFFICIENT CKU AT SIGMA INTERFACES.
2468 ! COMPUTE DIAGONALS AND RHS FOR TRIDIAGONAL MATRIX SOLVER.
2469 ! EXPAND FINAL FIELDS.
2479 ! DTODSU= DT/DEL(K+1)
2480 ! DSIG=SL(K)-SL(K+1)
2484 DTODSL = DT/DEL(II,K)
2485 DTODSU = DT/DEL(II,K+1)
2486 DSIG = PRSL(II,K) - PRSL(II,K+1)
2489 IF(K.EQ.KBOT(I)) THEN
2491 ELSEIF(K.EQ.KTOP(I)-1) THEN
2493 ELSEIF(K.EQ.KTOP(I)-2) THEN
2495 ELSEIF(K.GT.KBOT(I).AND.K.LT.KTOP(I)-2) THEN
2500 DSDZ1 = CK*DSIG*AU(IK)*GOCP
2501 DSDZ2 = CK*DSIG*AU(IK)*AU(IK)
2502 AU(IK) = -DTODSL*DSDZ2
2503 AL(IK) = -DTODSU*DSDZ2
2504 AD(IK) = AD(IK)-AU(IK)
2506 T2(IK) = T2(IK)+DTODSL*DSDZ1
2507 T2(IKU) = T2(IKU)-DTODSU*DSDZ1
2511 CALL TRIDI2T3(N2,KT,AL(IK1),AD(IK1),AU(IK1),Q2(IK1),T2(IK1), &
2512 & AU(IK1),Q2(IK1),T2(IK1))
2517 Q(INDEX2(I),K) = Q2(IK)
2518 T(INDEX2(I),K) = T2(IK)
2521 !-----------------------------------------------------------------------
2523 END SUBROUTINE OLD_ARW_SHALCV
2525 !-----------------------------------------------------------------------
2526 SUBROUTINE TRIDI2T3(L,N,CL,CM,CU,R1,R2,AU,A1,A2)
2527 !yt INCLUDE DBTRIDI2;
2529 USE MODULE_GFS_MACHINE , ONLY : kind_phys
2532 real(kind=kind_phys) fk
2534 real(kind=kind_phys) &
2535 & CL(L,2:N),CM(L,N),CU(L,N-1),R1(L,N),R2(L,N), &
2536 & AU(L,N-1),A1(L,N),A2(L,N)
2537 !-----------------------------------------------------------------------
2546 FK=1./(CM(I,K)-CL(I,K)*AU(I,K-1))
2548 A1(I,K)=FK*(R1(I,K)-CL(I,K)*A1(I,K-1))
2549 A2(I,K)=FK*(R2(I,K)-CL(I,K)*A2(I,K-1))
2553 FK=1./(CM(I,N)-CL(I,N)*AU(I,N-1))
2554 A1(I,N)=FK*(R1(I,N)-CL(I,N)*A1(I,N-1))
2555 A2(I,N)=FK*(R2(I,N)-CL(I,N)*A2(I,N-1))
2559 A1(I,K)=A1(I,K)-AU(I,K)*A1(I,K+1)
2560 A2(I,K)=A2(I,K)-AU(I,K)*A2(I,K+1)
2563 !-----------------------------------------------------------------------
2565 END SUBROUTINE TRIDI2T3
2566 !-----------------------------------------------------------------------
2568 SUBROUTINE MSTADBT3(IM,KM,K1,K2,PRSL,PRSLK,TENV,QENV, &
2569 & KLCL,KBOT,KTOP,TCLD,QCLD)
2570 !yt INCLUDE DBMSTADB;
2572 USE MODULE_GFS_MACHINE, ONLY : kind_phys
2573 USE MODULE_GFS_FUNCPHYS, ONLY : FTDP, FTHE, FTLCL, STMA
2574 USE MODULE_GFS_PHYSCONS, EPS => con_eps, EPSM1 => con_epsm1, FV => con_FVirt
2578 ! include 'constant.h'
2580 integer k,k1,k2,km,i,im
2581 real(kind=kind_phys) pv,qma,slklcl,tdpd,thelcl,tlcl
2582 real(kind=kind_phys) tma,tvcld,tvenv
2584 real(kind=kind_phys) PRSL(IM,KM), PRSLK(IM,KM), TENV(IM,KM), &
2585 & QENV(IM,KM), TCLD(IM,KM), QCLD(IM,KM)
2586 INTEGER KLCL(IM), KBOT(IM), KTOP(IM)
2588 real(kind=kind_phys) SLKMA(IM), THEMA(IM)
2589 !-----------------------------------------------------------------------
2590 ! DETERMINE WARMEST POTENTIAL WET-BULB TEMPERATURE BETWEEN K1 AND K2.
2591 ! COMPUTE ITS LIFTING CONDENSATION LEVEL.
2599 PV = 1000.0 * PRSL(I,K)*QENV(I,K)/(EPS-EPSM1*QENV(I,K))
2600 TDPD = TENV(I,K)-FTDP(PV)
2602 TLCL = FTLCL(TENV(I,K),TDPD)
2603 SLKLCL = PRSLK(I,K)*TLCL/TENV(I,K)
2608 THELCL=FTHE(TLCL,SLKLCL)
2609 IF(THELCL.GT.THEMA(I)) THEN
2615 !-----------------------------------------------------------------------
2616 ! SET CLOUD TEMPERATURES AND HUMIDITIES WHEREVER THE PARCEL LIFTED UP
2617 ! THE MOIST ADIABAT IS BUOYANT WITH RESPECT TO THE ENVIRONMENT.
2631 IF(PRSLK(I,K).LE.SLKMA(I)) THEN
2632 KLCL(I)=MIN(KLCL(I),K)
2633 CALL STMA(THEMA(I),PRSLK(I,K),TMA,QMA)
2634 ! TMA=FTMA(THEMA(I),PRSLK(I,K),QMA)
2635 TVCLD=TMA*(1.+FV*QMA)
2636 TVENV=TENV(I,K)*(1.+FV*QENV(I,K))
2637 IF(TVCLD.GT.TVENV) THEN
2638 KBOT(I)=MIN(KBOT(I),K)
2639 KTOP(I)=MAX(KTOP(I),K)
2640 TCLD(I,K)=TMA-TENV(I,K)
2641 QCLD(I,K)=QMA-QENV(I,K)
2646 !-----------------------------------------------------------------------
2648 END SUBROUTINE MSTADBT3
2650 subroutine sascnvn(im,ix,km,jcap,delt,del,prsl,ps,phil,ql, &
2651 & q1,t1,u1,v1,rcs,cldwrk,rn,kbot,ktop,kcnv,slimsk, &
2652 & dot,ncloud,pgcon,sas_mass_flux)
2653 ! & dot,ncloud,ud_mf,dd_mf,dt_mf)
2654 ! & dot,ncloud,ud_mf,dd_mf,dt_mf,me)
2656 ! use machine , only : kind_phys
2657 ! use funcphys , only : fpvs
2658 ! use physcons, grav => con_g, cp => con_cp, hvap => con_hvap &
2659 USE MODULE_GFS_MACHINE, ONLY : kind_phys
2660 USE MODULE_GFS_FUNCPHYS, ONLY : fpvs
2661 USE MODULE_GFS_PHYSCONS, grav => con_g, cp => con_cp &
2662 &, hvap => con_hvap &
2663 &, rv => con_rv, fv => con_fvirt, t0c => con_t0c &
2664 &, cvap => con_cvap, cliq => con_cliq &
2665 &, eps => con_eps, epsm1 => con_epsm1
2668 integer im, ix, km, jcap, ncloud, &
2669 & kbot(im), ktop(im), kcnv(im)
2671 real(kind=kind_phys) delt,sas_mass_flux
2672 real(kind=kind_phys) ps(im), del(ix,km), prsl(ix,km), &
2673 & ql(ix,km,2),q1(ix,km), t1(ix,km), &
2674 & u1(ix,km), v1(ix,km), rcs(im), &
2675 & cldwrk(im), rn(im), slimsk(im), &
2676 & dot(ix,km), phil(ix,km)
2677 ! hchuang code change mass flux output
2678 ! &, ud_mf(im,km),dd_mf(im,km),dt_mf(im,km)
2680 integer i, j, indx, jmn, k, kk, latd, lond, km1
2682 real(kind=kind_phys) clam, cxlamu, xlamde, xlamdd
2684 real(kind=kind_phys) adw, aup, aafac, &
2685 & beta, betal, betas, &
2686 & c0, cpoel, dellat, delta, &
2687 & desdt, deta, detad, dg, &
2688 & dh, dhh, dlnsig, dp, &
2689 & dq, dqsdp, dqsdt, dt, &
2690 & dt2, dtmax, dtmin, dv1h, &
2691 & dv1q, dv2h, dv2q, dv1u, &
2692 & dv1v, dv2u, dv2v, dv3q, &
2693 & dv3h, dv3u, dv3v, &
2694 & dz, dz1, e1, edtmax, &
2695 & edtmaxl, edtmaxs, el2orc, elocp, &
2696 & es, etah, cthk, dthk, &
2697 & evef, evfact, evfactl, fact1, &
2698 & fact2, factor, fjcap, fkm, &
2699 & g, gamma, pprime, &
2700 & qlk, qrch, qs, c1, &
2701 & rain, rfact, shear, tem1, &
2702 & tem2, terr, val, val1, &
2703 & val2, w1, w1l, w1s, &
2704 & w2, w2l, w2s, w3, &
2705 & w3l, w3s, w4, w4l, &
2706 & w4s, xdby, xpw, xpwd, &
2707 & xqrch, mbdt, tem, &
2710 real(kind=kind_phys), intent(in) :: pgcon
2712 integer kb(im), kbcon(im), kbcon1(im), &
2713 & ktcon(im), ktcon1(im), &
2714 & jmin(im), lmin(im), kbmax(im), &
2717 real(kind=kind_phys) aa1(im), acrt(im), acrtfct(im), &
2718 & delhbar(im), delq(im), delq2(im), &
2719 & delqbar(im), delqev(im), deltbar(im), &
2720 & deltv(im), dtconv(im), edt(im), &
2721 & edto(im), edtx(im), fld(im), &
2722 & hcdo(im,km), hmax(im), hmin(im), &
2723 & ucdo(im,km), vcdo(im,km),aa2(im), &
2724 & pbcdif(im), pdot(im), po(im,km), &
2725 & pwavo(im), pwevo(im), xlamud(im), &
2726 & qcdo(im,km), qcond(im), qevap(im), &
2727 & rntot(im), vshear(im), xaa0(im), &
2728 & xk(im), xlamd(im), &
2729 & xmb(im), xmbmax(im), xpwav(im), &
2730 & xpwev(im), delubar(im),delvbar(im)
2732 real(kind=kind_phys) cincr, cincrmax, cincrmin
2733 real(kind=kind_phys) xmbmx1
2735 !c physical parameters
2737 parameter(cpoel=cp/hvap,elocp=hvap/cp, &
2738 & el2orc=hvap*hvap/(rv*cp))
2739 parameter(terr=0.,c0=.002,c1=.002,delta=fv)
2740 parameter(fact1=(cvap-cliq)/rv,fact2=hvap/rv-fact1*t0c)
2741 parameter(cthk=150.,cincrmax=180.,cincrmin=120.,dthk=25.)
2742 !c local variables and arrays
2743 real(kind=kind_phys) pfld(im,km),to(im,km), qo(im,km), &
2744 & uo(im,km), vo(im,km), qeso(im,km)
2746 real(kind=kind_phys)qlko_ktcon(im),dellal(im,km),tvo(im,km), &
2747 & dbyo(im,km), zo(im,km), xlamue(im,km), &
2748 & fent1(im,km),fent2(im,km), frh(im,km), &
2749 & heo(im,km), heso(im,km), &
2750 & qrcd(im,km), dellah(im,km), dellaq(im,km), &
2751 & dellau(im,km),dellav(im,km), hcko(im,km), &
2752 & ucko(im,km), vcko(im,km), qcko(im,km), &
2753 & eta(im,km), etad(im,km), zi(im,km), &
2754 & qrcdo(im,km),pwo(im,km), pwdo(im,km), &
2758 logical totflg, cnvflg(im), flg(im)
2760 real(kind=kind_phys) pcrit(15), acritt(15), acrit(15)
2761 ! save pcrit, acritt
2762 data pcrit/850.,800.,750.,700.,650.,600.,550.,500.,450.,400.,&
2763 & 350.,300.,250.,200.,150./
2764 data acritt/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
2765 & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
2766 !c gdas derived acrit
2767 !c data acritt/.203,.515,.521,.566,.625,.665,.659,.688,
2768 !c & .743,.813,.886,.947,1.138,1.377,1.896/
2769 real(kind=kind_phys) tf, tcr, tcrf
2770 parameter (tf=233.16, tcr=263.16, tcrf=1.0/(tcr-tf))
2772 !c-----------------------------------------------------------------------
2777 !c initialize arrays
2808 ! hchuang code change
2818 acrit(k) = acritt(k) * (975. - pcrit(k))
2822 dtmin = max(dt2, val )
2824 dtmax = max(dt2, val )
2825 !c model tunable parameters are all here
2838 #if ( EM_CORE == 1 )
2850 fjcap = (float(jcap) / 126.) ** 2
2852 fjcap = max(fjcap,val)
2853 fkm = (float(km) / 28.) ** 2
2864 !c define top layer for search of the downdraft originating layer
2865 !c and the maximum thetae for updraft
2871 tx1(i) = 1.0 / ps(i)
2876 IF (prSL(I,K)*tx1(I) .GT. 0.04) KMAX(I) = MIN(KM,K + 1)
2877 !2011bugfix if (prsl(i,k)*tx1(i) .gt. 0.04) kmax(i) = k + 1
2878 if (prsl(i,k)*tx1(i) .gt. 0.45) kbmax(i) = k + 1
2879 if (prsl(i,k)*tx1(i) .gt. 0.70) kbm(i) = k + 1
2883 kbmax(i) = min(kbmax(i),kmax(i))
2884 kbm(i) = min(kbm(i),kmax(i))
2887 !c hydrostatic height assume zero terr and initially assume
2888 !c updraft entrainment rate as an inverse function of height
2892 zo(i,k) = phil(i,k) / g
2897 zi(i,k) = 0.5*(zo(i,k)+zo(i,k+1))
2898 xlamue(i,k) = clam / zi(i,k)
2902 !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2903 !c convert surface pressure to mb from cb
2907 if (k .le. kmax(i)) then
2908 pfld(i,k) = prsl(i,k) * 10.0
2930 uo(i,k) = u1(i,k) * rcs(i)
2931 vo(i,k) = v1(i,k) * rcs(i)
2937 !c p is pressure of the layer (mb)
2938 !c t is temperature at t-dt (k)..tn
2939 !c q is mixing ratio at t-dt (kg/kg)..qn
2940 !c to is temperature at t+dt (k)... this is after advection and turbulan
2941 !c qo is mixing ratio at t+dt (kg/kg)..q1
2945 if (k .le. kmax(i)) then
2946 qeso(i,k) = 0.01 * fpvs(to(i,k)) ! fpvs is in pa
2947 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k) + epsm1*qeso(i,k))
2949 qeso(i,k) = max(qeso(i,k), val1)
2951 qo(i,k) = max(qo(i,k), val2 )
2952 ! qo(i,k) = min(qo(i,k),qeso(i,k))
2953 ! tvo(i,k) = to(i,k) + delta * to(i,k) * qo(i,k)
2958 !c compute moist static energy
2962 if (k .le. kmax(i)) then
2963 ! tem = g * zo(i,k) + cp * to(i,k)
2964 tem = phil(i,k) + cp * to(i,k)
2965 heo(i,k) = tem + hvap * qo(i,k)
2966 heso(i,k) = tem + hvap * qeso(i,k)
2967 !c heo(i,k) = min(heo(i,k),heso(i,k))
2972 !c determine level with largest moist static energy
2973 !c this is the level where updraft starts
2981 if (k .le. kbm(i)) then
2982 if(heo(i,k).gt.hmax(i)) then
2992 if (k .le. kmax(i)-1) then
2993 dz = .5 * (zo(i,k+1) - zo(i,k))
2994 dp = .5 * (pfld(i,k+1) - pfld(i,k))
2995 es = 0.01 * fpvs(to(i,k+1)) ! fpvs is in pa
2996 pprime = pfld(i,k+1) + epsm1 * es
2997 qs = eps * es / pprime
2998 dqsdp = - qs / pprime
2999 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
3000 dqsdt = qs * pfld(i,k+1) * desdt / (es * pprime)
3001 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
3002 dt = (g * dz + hvap * dqsdp * dp) / (cp * (1. + gamma))
3003 dq = dqsdt * dt + dqsdp * dp
3004 to(i,k) = to(i,k+1) + dt
3005 qo(i,k) = qo(i,k+1) + dq
3006 po(i,k) = .5 * (pfld(i,k) + pfld(i,k+1))
3013 if (k .le. kmax(i)-1) then
3014 qeso(i,k) = 0.01 * fpvs(to(i,k)) ! fpvs is in pa
3015 qeso(i,k) = eps * qeso(i,k) / (po(i,k) + epsm1*qeso(i,k))
3017 qeso(i,k) = max(qeso(i,k), val1)
3019 qo(i,k) = max(qo(i,k), val2 )
3020 ! qo(i,k) = min(qo(i,k),qeso(i,k))
3022 frh(i,k) = 1. - min(qo(i,k)/qeso(i,k), val1)
3023 heo(i,k) = .5 * g * (zo(i,k) + zo(i,k+1)) + &
3024 & cp * to(i,k) + hvap * qo(i,k)
3025 heso(i,k) = .5 * g * (zo(i,k) + zo(i,k+1)) + &
3026 & cp * to(i,k) + hvap * qeso(i,k)
3027 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
3028 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
3033 !c look for the level of free convection as cloud base
3041 if (flg(i).and.k.le.kbmax(i)) then
3042 if(k.gt.kb(i).and.heo(i,kb(i)).gt.heso(i,k)) then
3051 if(kbcon(i).eq.kmax(i)) cnvflg(i) = .false.
3056 totflg = totflg .and. (.not. cnvflg(i))
3061 !c determine critical convective inhibition
3062 !c as a function of vertical velocity at cloud base.
3066 pdot(i) = 10.* dot(i,kbcon(i))
3071 if(slimsk(i).eq.1.) then
3082 if(pdot(i).le.w4) then
3083 tem = (pdot(i) - w4) / (w3 - w4)
3084 elseif(pdot(i).ge.-w4) then
3085 tem = - (pdot(i) + w4) / (w4 - w3)
3094 tem1= .5*(cincrmax-cincrmin)
3095 cincr = cincrmax - tem * tem1
3096 pbcdif(i) = pfld(i,kb(i)) - pfld(i,kbcon(i))
3097 if(pbcdif(i).gt.cincr) then
3105 totflg = totflg .and. (.not. cnvflg(i))
3110 !c assume that updraft entrainment rate above cloud base is
3111 !c same as that at cloud base
3116 & (k.gt.kbcon(i).and.k.lt.kmax(i))) then
3117 xlamue(i,k) = xlamue(i,kbcon(i))
3122 !c assume the detrainment rate for the updrafts to be same as
3123 !c the entrainment rate at cloud base
3127 xlamud(i) = xlamue(i,kbcon(i))
3131 !c functions rapidly decreasing with height, mimicking a cloud ensemble
3132 !c (Bechtold et al., 2008)
3137 & (k.gt.kbcon(i).and.k.lt.kmax(i))) then
3138 tem = qeso(i,k)/qeso(i,kbcon(i))
3145 !c final entrainment rate as the sum of turbulent part and organized entrainment
3146 !c depending on the environmental relative humidity
3147 !c (Bechtold et al., 2008)
3152 & (k.ge.kbcon(i).and.k.lt.kmax(i))) then
3153 tem = cxlamu * frh(i,k) * fent2(i,k)
3154 xlamue(i,k) = xlamue(i,k)*fent1(i,k) + tem
3159 !c determine updraft mass flux for the subcloud layers
3164 if(k.lt.kbcon(i).and.k.ge.kb(i)) then
3165 dz = zi(i,k+1) - zi(i,k)
3166 ptem = 0.5*(xlamue(i,k)+xlamue(i,k+1))-xlamud(i)
3167 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
3173 !c compute mass flux above cloud base
3178 if(k.gt.kbcon(i).and.k.lt.kmax(i)) then
3179 dz = zi(i,k) - zi(i,k-1)
3180 ptem = 0.5*(xlamue(i,k)+xlamue(i,k-1))-xlamud(i)
3181 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
3187 !c compute updraft cloud properties
3192 hcko(i,indx) = heo(i,indx)
3193 ucko(i,indx) = uo(i,indx)
3194 vcko(i,indx) = vo(i,indx)
3199 !c cloud property is modified by the entrainment process
3204 if(k.gt.kb(i).and.k.lt.kmax(i)) then
3205 dz = zi(i,k) - zi(i,k-1)
3206 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
3207 tem1 = 0.5 * xlamud(i) * dz
3208 factor = 1. + tem - tem1
3209 ptem = 0.5 * tem + pgcon
3210 ptem1= 0.5 * tem - pgcon
3211 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
3212 & (heo(i,k)+heo(i,k-1)))/factor
3213 ucko(i,k) = ((1.-tem1)*ucko(i,k-1)+ptem*uo(i,k) &
3214 & +ptem1*uo(i,k-1))/factor
3215 vcko(i,k) = ((1.-tem1)*vcko(i,k-1)+ptem*vo(i,k) &
3216 & +ptem1*vo(i,k-1))/factor
3217 dbyo(i,k) = hcko(i,k) - heso(i,k)
3223 !c taking account into convection inhibition due to existence of
3224 !c dry layers below cloud base
3232 if (flg(i).and.k.lt.kmax(i)) then
3233 if(k.ge.kbcon(i).and.dbyo(i,k).gt.0.) then
3242 if(kbcon1(i).eq.kmax(i)) cnvflg(i) = .false.
3247 tem = pfld(i,kbcon(i)) - pfld(i,kbcon1(i))
3248 if(tem.gt.dthk) then
3256 totflg = totflg .and. (.not. cnvflg(i))
3261 !c determine first guess cloud top as the level of zero buoyancy
3269 if (flg(i).and.k .lt. kmax(i)) then
3270 if(k.gt.kbcon1(i).and.dbyo(i,k).lt.0.) then
3280 tem = pfld(i,kbcon(i))-pfld(i,ktcon(i))
3281 if(tem.lt.cthk) cnvflg(i) = .false.
3287 totflg = totflg .and. (.not. cnvflg(i))
3292 !c search for downdraft originating level above theta-e minimum
3296 hmin(i) = heo(i,kbcon1(i))
3303 if (cnvflg(i) .and. k .le. kbmax(i)) then
3304 if(k.gt.kbcon1(i).and.heo(i,k).lt.hmin(i)) then
3312 !c make sure that jmin(i) is within the cloud
3316 jmin(i) = min(lmin(i),ktcon(i)-1)
3317 jmin(i) = max(jmin(i),kbcon1(i)+1)
3318 if(jmin(i).ge.ktcon(i)) cnvflg(i) = .false.
3322 !c specify upper limit of mass flux at cloud base
3329 dp = 1000. * del(i,k)
3330 xmbmax(i) = dp / (g * dt2)
3331 xmbmax(i) = min(sas_mass_flux,xmbmax(i))
3333 ! tem = dp / (g * dt2)
3334 ! xmbmax(i) = min(tem, xmbmax(i))
3338 !c compute cloud moisture property and precipitation
3343 qcko(i,kb(i)) = qo(i,kb(i))
3350 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
3351 dz = zi(i,k) - zi(i,k-1)
3352 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3354 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
3356 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
3357 tem1 = 0.5 * xlamud(i) * dz
3358 factor = 1. + tem - tem1
3359 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
3360 & (qo(i,k)+qo(i,k-1)))/factor
3362 dq = eta(i,k) * (qcko(i,k) - qrch)
3364 ! rhbar(i) = rhbar(i) + qo(i,k) / qeso(i,k)
3366 !c check if there is excess moisture to release latent heat
3368 if(k.ge.kbcon(i).and.dq.gt.0.) then
3369 etah = .5 * (eta(i,k) + eta(i,k-1))
3370 if(ncloud.gt.0..and.k.gt.jmin(i)) then
3371 dp = 1000. * del(i,k)
3372 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
3373 dellal(i,k) = etah * c1 * dz * qlk * g / dp
3375 qlk = dq / (eta(i,k) + etah * c0 * dz)
3377 aa1(i) = aa1(i) - dz * g * qlk
3378 qcko(i,k) = qlk + qrch
3379 pwo(i,k) = etah * c0 * dz * qlk
3380 pwavo(i) = pwavo(i) + pwo(i,k)
3388 ! if(cnvflg(i)) then
3389 ! indx = ktcon(i) - kb(i) - 1
3390 ! rhbar(i) = rhbar(i) / float(indx)
3394 !c calculate cloud work function
3399 if(k.ge.kbcon(i).and.k.lt.ktcon(i)) then
3400 dz1 = zo(i,k+1) - zo(i,k)
3401 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3402 rfact = 1. + delta * cp * gamma &
3405 & dz1 * (g / (cp * to(i,k))) &
3406 & * dbyo(i,k) / (1. + gamma) &
3410 & dz1 * g * delta * &
3411 & max(val,(qeso(i,k) - qo(i,k)))
3417 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
3422 totflg = totflg .and. (.not. cnvflg(i))
3427 !c estimate the onvective overshooting as the level
3428 !c where the [aafac * cloud work function] becomes zero,
3429 !c which is the final cloud top
3433 aa2(i) = aafac * aa1(i)
3439 ktcon1(i) = kmax(i) - 1
3444 if(k.ge.ktcon(i).and.k.lt.kmax(i)) then
3445 dz1 = zo(i,k+1) - zo(i,k)
3446 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3447 rfact = 1. + delta * cp * gamma &
3450 & dz1 * (g / (cp * to(i,k))) &
3451 & * dbyo(i,k) / (1. + gamma) &
3453 if(aa2(i).lt.0.) then
3462 !c compute cloud moisture property, detraining cloud water
3463 !c and precipitation in overshooting layers
3468 if(k.ge.ktcon(i).and.k.lt.ktcon1(i)) then
3469 dz = zi(i,k) - zi(i,k-1)
3470 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3472 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
3474 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
3475 tem1 = 0.5 * xlamud(i) * dz
3476 factor = 1. + tem - tem1
3477 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
3478 & (qo(i,k)+qo(i,k-1)))/factor
3480 dq = eta(i,k) * (qcko(i,k) - qrch)
3482 !c check if there is excess moisture to release latent heat
3485 etah = .5 * (eta(i,k) + eta(i,k-1))
3486 if(ncloud.gt.0.) then
3487 dp = 1000. * del(i,k)
3488 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
3489 dellal(i,k) = etah * c1 * dz * qlk * g / dp
3491 qlk = dq / (eta(i,k) + etah * c0 * dz)
3493 qcko(i,k) = qlk + qrch
3494 pwo(i,k) = etah * c0 * dz * qlk
3495 pwavo(i) = pwavo(i) + pwo(i,k)
3502 !c exchange ktcon with ktcon1
3507 ktcon(i) = ktcon1(i)
3512 !c this section is ready for cloud water
3514 if(ncloud.gt.0) then
3516 !c compute liquid and vapor separation at cloud top
3521 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3523 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
3524 dq = qcko(i,k) - qrch
3526 !c check if there is excess moisture to release latent heat
3536 !ccccc if(lat.eq.latd.and.lon.eq.lond.and.cnvflg(i)) then
3537 !ccccc print *, ' aa1(i) before dwndrft =', aa1(i)
3540 !c------- downdraft calculations
3542 !c--- compute precipitation efficiency in terms of windshear
3552 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3553 shear= sqrt((uo(i,k)-uo(i,k-1)) ** 2 &
3554 & + (vo(i,k)-vo(i,k-1)) ** 2)
3555 vshear(i) = vshear(i) + shear
3562 vshear(i) = 1.e3 * vshear(i) / (zi(i,ktcon(i))-zi(i,kb(i)))
3563 e1=1.591-.639*vshear(i) &
3564 & +.0953*(vshear(i)**2)-.00496*(vshear(i)**3)
3567 edt(i) = min(edt(i),val)
3569 edt(i) = max(edt(i),val)
3575 !c determine detrainment rate between 1 and kbcon
3584 if(cnvflg(i).and.k.ge.1.and.k.lt.kbcon(i)) then
3585 dz = zi(i,k+1) - zi(i,k)
3586 sumx(i) = sumx(i) + dz
3592 if(slimsk(i).eq.1.) beta = betal
3594 dz = (sumx(i)+zi(i,1))/float(kbcon(i))
3595 tem = 1./float(kbcon(i))
3596 xlamd(i) = (1.-beta**tem)/dz
3600 !c determine downdraft mass flux
3604 if (cnvflg(i) .and. k .le. kmax(i)-1) then
3605 if(k.lt.jmin(i).and.k.ge.kbcon(i)) then
3606 dz = zi(i,k+1) - zi(i,k)
3607 ptem = xlamdd - xlamde
3608 etad(i,k) = etad(i,k+1) * (1. - ptem * dz)
3609 else if(k.lt.kbcon(i)) then
3610 dz = zi(i,k+1) - zi(i,k)
3611 ptem = xlamd(i) + xlamdd - xlamde
3612 etad(i,k) = etad(i,k+1) * (1. - ptem * dz)
3618 !c--- downdraft moisture properties
3623 hcdo(i,jmn) = heo(i,jmn)
3624 qcdo(i,jmn) = qo(i,jmn)
3625 qrcdo(i,jmn)= qeso(i,jmn)
3626 ucdo(i,jmn) = uo(i,jmn)
3627 vcdo(i,jmn) = vo(i,jmn)
3634 if (cnvflg(i) .and. k.lt.jmin(i)) then
3635 dz = zi(i,k+1) - zi(i,k)
3636 if(k.ge.kbcon(i)) then
3638 tem1 = 0.5 * xlamdd * dz
3641 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
3643 factor = 1. + tem - tem1
3644 ptem = 0.5 * tem - pgcon
3645 ptem1= 0.5 * tem + pgcon
3646 hcdo(i,k) = ((1.-tem1)*hcdo(i,k+1)+tem*0.5* &
3647 & (heo(i,k)+heo(i,k+1)))/factor
3648 ucdo(i,k) = ((1.-tem1)*ucdo(i,k+1)+ptem*uo(i,k+1) &
3649 & +ptem1*uo(i,k))/factor
3650 vcdo(i,k) = ((1.-tem1)*vcdo(i,k+1)+ptem*vo(i,k+1) &
3651 & +ptem1*vo(i,k))/factor
3652 dbyo(i,k) = hcdo(i,k) - heso(i,k)
3659 if (cnvflg(i).and.k.lt.jmin(i)) then
3660 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3661 qrcdo(i,k) = qeso(i,k)+ &
3662 & (1./hvap)*(gamma/(1.+gamma))*dbyo(i,k)
3663 ! detad = etad(i,k+1) - etad(i,k)
3665 dz = zi(i,k+1) - zi(i,k)
3666 if(k.ge.kbcon(i)) then
3668 tem1 = 0.5 * xlamdd * dz
3671 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
3673 factor = 1. + tem - tem1
3674 qcdo(i,k) = ((1.-tem1)*qcdo(i,k+1)+tem*0.5* &
3675 & (qo(i,k)+qo(i,k+1)))/factor
3677 ! pwdo(i,k) = etad(i,k+1) * qcdo(i,k+1) -
3678 ! & etad(i,k) * qrcdo(i,k)
3679 ! pwdo(i,k) = pwdo(i,k) - detad *
3680 ! & .5 * (qrcdo(i,k) + qrcdo(i,k+1))
3682 pwdo(i,k) = etad(i,k+1) * (qcdo(i,k) - qrcdo(i,k))
3683 qcdo(i,k) = qrcdo(i,k)
3684 pwevo(i) = pwevo(i) + pwdo(i,k)
3689 !c--- final downdraft strength dependent on precip
3690 !c--- efficiency (edt), normalized condensate (pwav), and
3691 !c--- evaporate (pwev)
3695 if(slimsk(i).eq.0.) edtmax = edtmaxs
3697 if(pwevo(i).lt.0.) then
3698 edto(i) = -edto(i) * pwavo(i) / pwevo(i)
3699 edto(i) = min(edto(i),edtmax)
3706 !c--- downdraft cloudwork functions
3710 if (cnvflg(i) .and. k .lt. jmin(i)) then
3711 gamma = el2orc * qeso(i,k) / to(i,k)**2
3716 dz=-1.*(zo(i,k+1)-zo(i,k))
3717 aa1(i)=aa1(i)+edto(i)*dz*(g/(cp*dt))*((dhh-dh)/(1.+dg)) &
3718 & *(1.+delta*cp*dg*dt/hvap)
3720 aa1(i)=aa1(i)+edto(i)* &
3721 & dz*g*delta*max(val,(qeso(i,k)-qo(i,k)))
3726 if(cnvflg(i).and.aa1(i).le.0.) then
3733 totflg = totflg .and. (.not. cnvflg(i))
3738 !c--- what would the change be, that a cloud with unit mass
3739 !c--- will do to the environment?
3743 if(cnvflg(i) .and. k .le. kmax(i)) then
3753 dp = 1000. * del(i,1)
3754 dellah(i,1) = edto(i) * etad(i,1) * (hcdo(i,1) &
3755 & - heo(i,1)) * g / dp
3756 dellaq(i,1) = edto(i) * etad(i,1) * (qcdo(i,1) &
3757 & - qo(i,1)) * g / dp
3758 dellau(i,1) = edto(i) * etad(i,1) * (ucdo(i,1) &
3759 & - uo(i,1)) * g / dp
3760 dellav(i,1) = edto(i) * etad(i,1) * (vcdo(i,1) &
3761 & - vo(i,1)) * g / dp
3765 !c--- changed due to subsidence and entrainment
3769 if (cnvflg(i).and.k.lt.ktcon(i)) then
3771 if(k.le.kb(i)) aup = 0.
3773 if(k.gt.jmin(i)) adw = 0.
3774 dp = 1000. * del(i,k)
3775 dz = zi(i,k) - zi(i,k-1)
3778 dv2h = .5 * (heo(i,k) + heo(i,k-1))
3781 dv2q = .5 * (qo(i,k) + qo(i,k-1))
3784 dv2u = .5 * (uo(i,k) + uo(i,k-1))
3787 dv2v = .5 * (vo(i,k) + vo(i,k-1))
3790 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1))
3793 if(k.le.kbcon(i)) then
3795 ptem1 = xlamd(i)+xlamdd
3801 dellah(i,k) = dellah(i,k) + &
3802 & ((aup*eta(i,k)-adw*edto(i)*etad(i,k))*dv1h &
3803 & - (aup*eta(i,k-1)-adw*edto(i)*etad(i,k-1))*dv3h &
3804 & - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2h*dz &
3805 & + aup*tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz &
3806 & + adw*edto(i)*ptem1*etad(i,k)*.5*(hcdo(i,k)+hcdo(i,k-1)) &
3809 dellaq(i,k) = dellaq(i,k) + &
3810 & ((aup*eta(i,k)-adw*edto(i)*etad(i,k))*dv1q &
3811 & - (aup*eta(i,k-1)-adw*edto(i)*etad(i,k-1))*dv3q &
3812 & - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2q*dz &
3813 & + aup*tem1*eta(i,k-1)*.5*(qcko(i,k)+qcko(i,k-1))*dz &
3814 & + adw*edto(i)*ptem1*etad(i,k)*.5*(qrcdo(i,k)+qrcdo(i,k-1)) &
3816 !23456789012345678901234567890123456789012345678901234567890123456789012
3818 dellau(i,k) = dellau(i,k) + &
3819 & ((aup*eta(i,k)-adw*edto(i)*etad(i,k))*dv1u &
3820 & - (aup*eta(i,k-1)-adw*edto(i)*etad(i,k-1))*dv3u &
3821 & - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2u*dz &
3822 & + aup*tem1*eta(i,k-1)*.5*(ucko(i,k)+ucko(i,k-1))*dz &
3823 & + adw*edto(i)*ptem1*etad(i,k)*.5*(ucdo(i,k)+ucdo(i,k-1))*dz &
3824 & - pgcon*(aup*eta(i,k-1)-adw*edto(i)*etad(i,k))*(dv1u-dv3u) &
3827 dellav(i,k) = dellav(i,k) + &
3828 & ((aup*eta(i,k)-adw*edto(i)*etad(i,k))*dv1v &
3829 & - (aup*eta(i,k-1)-adw*edto(i)*etad(i,k-1))*dv3v &
3830 & - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2v*dz &
3831 & + aup*tem1*eta(i,k-1)*.5*(vcko(i,k)+vcko(i,k-1))*dz &
3832 & + adw*edto(i)*ptem1*etad(i,k)*.5*(vcdo(i,k)+vcdo(i,k-1))*dz &
3833 & - pgcon*(aup*eta(i,k-1)-adw*edto(i)*etad(i,k))*(dv1v-dv3v) &
3845 dp = 1000. * del(i,indx)
3846 dv1h = heo(i,indx-1)
3847 dellah(i,indx) = eta(i,indx-1) * &
3848 & (hcko(i,indx-1) - dv1h) * g / dp
3850 dellaq(i,indx) = eta(i,indx-1) * &
3851 & (qcko(i,indx-1) - dv1q) * g / dp
3853 dellau(i,indx) = eta(i,indx-1) * &
3854 & (ucko(i,indx-1) - dv1u) * g / dp
3856 dellav(i,indx) = eta(i,indx-1) * &
3857 & (vcko(i,indx-1) - dv1v) * g / dp
3861 dellal(i,indx) = eta(i,indx-1) * &
3862 & qlko_ktcon(i) * g / dp
3866 !c------- final changed variable per unit mass flux
3870 if (cnvflg(i).and.k .le. kmax(i)) then
3871 if(k.gt.ktcon(i)) then
3875 if(k.le.ktcon(i)) then
3876 qo(i,k) = dellaq(i,k) * mbdt + q1(i,k)
3877 dellat = (dellah(i,k) - hvap * dellaq(i,k)) / cp
3878 to(i,k) = dellat * mbdt + t1(i,k)
3880 qo(i,k) = max(qo(i,k), val )
3885 !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3887 !c--- the above changed environment is now used to calulate the
3888 !c--- effect the arbitrary cloud (with unit mass flux)
3889 !c--- would have on the stability,
3890 !c--- which then is used to calculate the real mass flux,
3891 !c--- necessary to keep this change in balance with the large-scale
3892 !c--- destabilization.
3894 !c--- environmental conditions again, first heights
3898 if(cnvflg(i) .and. k .le. kmax(i)) then
3899 qeso(i,k) = 0.01 * fpvs(to(i,k)) ! fpvs is in pa
3900 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k)+epsm1*qeso(i,k))
3902 qeso(i,k) = max(qeso(i,k), val )
3903 ! tvo(i,k) = to(i,k) + delta * to(i,k) * qo(i,k)
3908 !c--- moist static energy
3912 if(cnvflg(i) .and. k .le. kmax(i)-1) then
3913 dz = .5 * (zo(i,k+1) - zo(i,k))
3914 dp = .5 * (pfld(i,k+1) - pfld(i,k))
3915 es = 0.01 * fpvs(to(i,k+1)) ! fpvs is in pa
3916 pprime = pfld(i,k+1) + epsm1 * es
3917 qs = eps * es / pprime
3918 dqsdp = - qs / pprime
3919 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
3920 dqsdt = qs * pfld(i,k+1) * desdt / (es * pprime)
3921 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
3922 dt = (g * dz + hvap * dqsdp * dp) / (cp * (1. + gamma))
3923 dq = dqsdt * dt + dqsdp * dp
3924 to(i,k) = to(i,k+1) + dt
3925 qo(i,k) = qo(i,k+1) + dq
3926 po(i,k) = .5 * (pfld(i,k) + pfld(i,k+1))
3932 if(cnvflg(i) .and. k .le. kmax(i)-1) then
3933 qeso(i,k) = 0.01 * fpvs(to(i,k)) ! fpvs is in pa
3934 qeso(i,k) = eps * qeso(i,k) / (po(i,k) + epsm1 * qeso(i,k))
3936 qeso(i,k) = max(qeso(i,k), val1)
3938 qo(i,k) = max(qo(i,k), val2 )
3939 ! qo(i,k) = min(qo(i,k),qeso(i,k))
3940 heo(i,k) = .5 * g * (zo(i,k) + zo(i,k+1)) + &
3941 & cp * to(i,k) + hvap * qo(i,k)
3942 heso(i,k) = .5 * g * (zo(i,k) + zo(i,k+1)) + &
3943 & cp * to(i,k) + hvap * qeso(i,k)
3950 heo(i,k) = g * zo(i,k) + cp * to(i,k) + hvap * qo(i,k)
3951 heso(i,k) = g * zo(i,k) + cp * to(i,k) + hvap * qeso(i,k)
3952 !c heo(i,k) = min(heo(i,k),heso(i,k))
3956 !c**************************** static control
3958 !c------- moisture and cloud work functions
3970 hcko(i,indx) = heo(i,indx)
3971 qcko(i,indx) = qo(i,indx)
3977 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3978 dz = zi(i,k) - zi(i,k-1)
3979 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
3980 tem1 = 0.5 * xlamud(i) * dz
3981 factor = 1. + tem - tem1
3982 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
3983 & (heo(i,k)+heo(i,k-1)))/factor
3991 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
3992 dz = zi(i,k) - zi(i,k-1)
3993 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3994 xdby = hcko(i,k) - heso(i,k)
3996 & + gamma * xdby / (hvap * (1. + gamma))
3998 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
3999 tem1 = 0.5 * xlamud(i) * dz
4000 factor = 1. + tem - tem1
4001 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
4002 & (qo(i,k)+qo(i,k-1)))/factor
4004 dq = eta(i,k) * (qcko(i,k) - xqrch)
4006 if(k.ge.kbcon(i).and.dq.gt.0.) then
4007 etah = .5 * (eta(i,k) + eta(i,k-1))
4008 if(ncloud.gt.0..and.k.gt.jmin(i)) then
4009 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
4011 qlk = dq / (eta(i,k) + etah * c0 * dz)
4013 if(k.lt.ktcon1(i)) then
4014 xaa0(i) = xaa0(i) - dz * g * qlk
4016 qcko(i,k) = qlk + xqrch
4017 xpw = etah * c0 * dz * qlk
4018 xpwav(i) = xpwav(i) + xpw
4021 if(k.ge.kbcon(i).and.k.lt.ktcon1(i)) then
4022 dz1 = zo(i,k+1) - zo(i,k)
4023 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
4024 rfact = 1. + delta * cp * gamma &
4027 & + dz1 * (g / (cp * to(i,k))) &
4028 & * xdby / (1. + gamma) &
4032 & dz1 * g * delta * &
4033 & max(val,(qeso(i,k) - qo(i,k)))
4039 !c------- downdraft calculations
4041 !c--- downdraft moisture properties
4046 hcdo(i,jmn) = heo(i,jmn)
4047 qcdo(i,jmn) = qo(i,jmn)
4048 qrcd(i,jmn) = qeso(i,jmn)
4055 if (cnvflg(i) .and. k.lt.jmin(i)) then
4056 dz = zi(i,k+1) - zi(i,k)
4057 if(k.ge.kbcon(i)) then
4059 tem1 = 0.5 * xlamdd * dz
4062 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
4064 factor = 1. + tem - tem1
4065 hcdo(i,k) = ((1.-tem1)*hcdo(i,k+1)+tem*0.5* &
4066 & (heo(i,k)+heo(i,k+1)))/factor
4073 if (cnvflg(i) .and. k .lt. jmin(i)) then
4076 gamma = el2orc * dq / dt**2
4077 dh = hcdo(i,k) - heso(i,k)
4078 qrcd(i,k)=dq+(1./hvap)*(gamma/(1.+gamma))*dh
4079 ! detad = etad(i,k+1) - etad(i,k)
4081 dz = zi(i,k+1) - zi(i,k)
4082 if(k.ge.kbcon(i)) then
4084 tem1 = 0.5 * xlamdd * dz
4087 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
4089 factor = 1. + tem - tem1
4090 qcdo(i,k) = ((1.-tem1)*qcdo(i,k+1)+tem*0.5* &
4091 & (qo(i,k)+qo(i,k+1)))/factor
4093 ! xpwd = etad(i,k+1) * qcdo(i,k+1) -
4094 ! & etad(i,k) * qrcd(i,k)
4095 ! xpwd = xpwd - detad *
4096 ! & .5 * (qrcd(i,k) + qrcd(i,k+1))
4098 xpwd = etad(i,k+1) * (qcdo(i,k) - qrcd(i,k))
4099 qcdo(i,k)= qrcd(i,k)
4100 xpwev(i) = xpwev(i) + xpwd
4107 if(slimsk(i).eq.0.) edtmax = edtmaxs
4109 if(xpwev(i).ge.0.) then
4112 edtx(i) = -edtx(i) * xpwav(i) / xpwev(i)
4113 edtx(i) = min(edtx(i),edtmax)
4119 !c--- downdraft cloudwork functions
4124 if (cnvflg(i) .and. k.lt.jmin(i)) then
4125 gamma = el2orc * qeso(i,k) / to(i,k)**2
4130 dz=-1.*(zo(i,k+1)-zo(i,k))
4131 xaa0(i)=xaa0(i)+edtx(i)*dz*(g/(cp*dt))*((dhh-dh)/(1.+dg)) &
4132 & *(1.+delta*cp*dg*dt/hvap)
4134 xaa0(i)=xaa0(i)+edtx(i)* &
4135 & dz*g*delta*max(val,(qeso(i,k)-qo(i,k)))
4140 !c calculate critical cloud work function
4144 if(pfld(i,ktcon(i)).lt.pcrit(15))then
4145 acrt(i)=acrit(15)*(975.-pfld(i,ktcon(i))) &
4147 else if(pfld(i,ktcon(i)).gt.pcrit(1))then
4150 k = int((850. - pfld(i,ktcon(i)))/50.) + 2
4153 acrt(i)=acrit(k)+(acrit(k-1)-acrit(k))* &
4154 & (pfld(i,ktcon(i))-pcrit(k))/(pcrit(k-1)-pcrit(k))
4160 if(slimsk(i).eq.1.) then
4172 !c modify critical cloud workfunction by cloud base vertical velocity
4174 if(pdot(i).le.w4) then
4175 acrtfct(i) = (pdot(i) - w4) / (w3 - w4)
4176 elseif(pdot(i).ge.-w4) then
4177 acrtfct(i) = - (pdot(i) + w4) / (w4 - w3)
4182 acrtfct(i) = max(acrtfct(i),val1)
4184 acrtfct(i) = min(acrtfct(i),val2)
4185 acrtfct(i) = 1. - acrtfct(i)
4187 !c modify acrtfct(i) by colume mean rh if rhbar(i) is greater than 80 percent
4189 !c if(rhbar(i).ge..8) then
4190 !c acrtfct(i) = acrtfct(i) * (.9 - min(rhbar(i),.9)) * 10.
4193 !c modify adjustment time scale by cloud base vertical velocity
4196 dtconv(i) = dt2 + max((1800. - dt2),val1) * &
4197 & (pdot(i) - w2) / (w1 - w2)
4198 !c dtconv(i) = max(dtconv(i), dt2)
4199 !c dtconv(i) = 1800. * (pdot(i) - w2) / (w1 - w2)
4200 dtconv(i) = max(dtconv(i),dtmin)
4201 dtconv(i) = min(dtconv(i),dtmax)
4206 !c--- large scale forcing
4211 fld(i)=(aa1(i)-acrt(i)* acrtfct(i))/dtconv(i)
4212 if(fld(i).le.0.) cnvflg(i) = .false.
4215 !c xaa0(i) = max(xaa0(i),0.)
4216 xk(i) = (xaa0(i) - aa1(i)) / mbdt
4217 if(xk(i).ge.0.) cnvflg(i) = .false.
4220 !c--- kernel, cloud base mass flux
4223 xmb(i) = -fld(i) / xk(i)
4224 xmb(i) = min(xmb(i),xmbmax(i))
4225 xmbmx1=max(xmbmx1,xmb(i))
4228 ! if(xmbmx1.gt.0.4)print*,'qingfu test xmbmx1=',xmbmx1
4232 totflg = totflg .and. (.not. cnvflg(i))
4237 !c restore to,qo,uo,vo to t1,q1,u1,v1 in case convection stops
4241 if (cnvflg(i) .and. k .le. kmax(i)) then
4246 qeso(i,k) = 0.01 * fpvs(t1(i,k)) ! fpvs is in pa
4247 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k) + epsm1*qeso(i,k))
4249 qeso(i,k) = max(qeso(i,k), val )
4253 !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4255 !c--- feedback: simply the changes from the cloud with unit mass flux
4256 !c--- multiplied by the mass flux necessary to keep the
4257 !c--- equilibrium with the larger-scale.
4269 if (cnvflg(i) .and. k .le. kmax(i)) then
4270 if(k.le.ktcon(i)) then
4271 dellat = (dellah(i,k) - hvap * dellaq(i,k)) / cp
4272 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
4273 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
4275 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2 * tem
4276 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2 * tem
4277 dp = 1000. * del(i,k)
4278 delhbar(i) = delhbar(i) + dellah(i,k)*xmb(i)*dp/g
4279 delqbar(i) = delqbar(i) + dellaq(i,k)*xmb(i)*dp/g
4280 deltbar(i) = deltbar(i) + dellat*xmb(i)*dp/g
4281 delubar(i) = delubar(i) + dellau(i,k)*xmb(i)*dp/g
4282 delvbar(i) = delvbar(i) + dellav(i,k)*xmb(i)*dp/g
4289 if (cnvflg(i) .and. k .le. kmax(i)) then
4290 if(k.le.ktcon(i)) then
4291 qeso(i,k) = 0.01 * fpvs(t1(i,k)) ! fpvs is in pa
4292 qeso(i,k) = eps * qeso(i,k)/(pfld(i,k) + epsm1*qeso(i,k))
4294 qeso(i,k) = max(qeso(i,k), val )
4308 if (cnvflg(i) .and. k .le. kmax(i)) then
4309 if(k.lt.ktcon(i)) then
4311 if(k.le.kb(i)) aup = 0.
4313 if(k.ge.jmin(i)) adw = 0.
4314 rain = aup * pwo(i,k) + adw * edto(i) * pwdo(i,k)
4315 rntot(i) = rntot(i) + rain * xmb(i) * .001 * dt2
4322 if (k .le. kmax(i)) then
4326 if(cnvflg(i).and.k.lt.ktcon(i)) then
4328 if(k.le.kb(i)) aup = 0.
4330 if(k.ge.jmin(i)) adw = 0.
4331 rain = aup * pwo(i,k) + adw * edto(i) * pwdo(i,k)
4332 rn(i) = rn(i) + rain * xmb(i) * .001 * dt2
4334 if(flg(i).and.k.lt.ktcon(i)) then
4335 evef = edt(i) * evfact
4336 if(slimsk(i).eq.1.) evef=edt(i) * evfactl
4337 ! if(slimsk(i).eq.1.) evef=.07
4338 !c if(slimsk(i).ne.1.) evef = 0.
4339 qcond(i) = evef * (q1(i,k) - qeso(i,k)) &
4340 & / (1. + el2orc * qeso(i,k) / t1(i,k)**2)
4341 dp = 1000. * del(i,k)
4342 if(rn(i).gt.0..and.qcond(i).lt.0.) then
4343 qevap(i) = -qcond(i) * (1.-exp(-.32*sqrt(dt2*rn(i))))
4344 qevap(i) = min(qevap(i), rn(i)*1000.*g/dp)
4345 delq2(i) = delqev(i) + .001 * qevap(i) * dp / g
4347 if(rn(i).gt.0..and.qcond(i).lt.0..and. &
4348 & delq2(i).gt.rntot(i)) then
4349 qevap(i) = 1000.* g * (rntot(i) - delqev(i)) / dp
4352 if(rn(i).gt.0..and.qevap(i).gt.0.) then
4353 q1(i,k) = q1(i,k) + qevap(i)
4354 t1(i,k) = t1(i,k) - elocp * qevap(i)
4355 rn(i) = rn(i) - .001 * qevap(i) * dp / g
4356 deltv(i) = - elocp*qevap(i)/dt2
4357 delq(i) = + qevap(i)/dt2
4358 delqev(i) = delqev(i) + .001*dp*qevap(i)/g
4360 dellaq(i,k) = dellaq(i,k) + delq(i) / xmb(i)
4361 delqbar(i) = delqbar(i) + delq(i)*dp/g
4362 deltbar(i) = deltbar(i) + deltv(i)*dp/g
4369 ! if(me.eq.31.and.cnvflg(i)) then
4370 ! if(cnvflg(i)) then
4371 ! print *, ' deep delhbar, delqbar, deltbar = ',
4372 ! & delhbar(i),hvap*delqbar(i),cp*deltbar(i)
4373 ! print *, ' deep delubar, delvbar = ',delubar(i),delvbar(i)
4374 ! print *, ' precip =', hvap*rn(i)*1000./dt2
4375 ! print*,'pdif= ',pfld(i,kbcon(i))-pfld(i,ktcon(i))
4379 !c precipitation rate converted to actual precip
4380 !c in unit of m instead of kg
4385 !c in the event of upper level rain evaporation and lower level downdraft
4386 !c moistening, rn can become negative, in this case, we back out of the
4387 !c heating and the moistening
4389 if(rn(i).lt.0..and..not.flg(i)) rn(i) = 0.
4390 if(rn(i).le.0.) then
4403 if (ncloud.gt.0) then
4409 if (cnvflg(i) .and. rn(i).gt.0.) then
4410 if (k.gt.kb(i).and.k.le.ktcon(i)) then
4411 tem = dellal(i,k) * xmb(i) * dt2
4412 tem1 = max(val2, min(val1, (tcr-t1(i,k))*tcrf))
4413 if (ql(i,k,2) .gt. -999.0) then
4414 ql(i,k,1) = ql(i,k,1) + tem * tem1 ! ice
4415 ql(i,k,2) = ql(i,k,2) + tem *(1.0-tem1) ! water
4417 ql(i,k,1) = ql(i,k,1) + tem
4428 if(cnvflg(i).and.rn(i).le.0.) then
4429 if (k .le. kmax(i)) then
4439 ! hchuang code change
4443 ! if(cnvflg(i).and.rn(i).gt.0.) then
4444 ! if(k.ge.kb(i) .and. k.lt.ktop(i)) then
4445 ! ud_mf(i,k) = eta(i,k) * xmb(i) * dt2
4451 ! if(cnvflg(i).and.rn(i).gt.0.) then
4453 ! dt_mf(i,k) = ud_mf(i,k)
4458 ! if(cnvflg(i).and.rn(i).gt.0.) then
4459 ! if(k.ge.1 .and. k.le.jmin(i)) then
4460 ! dd_mf(i,k) = edto(i) * etad(i,k) * xmb(i) * dt2
4467 end subroutine sascnvn
4469 subroutine shalcnv(im,ix,km,jcap,delt,del,prsl,ps,phil,ql, &
4470 & q1,t1,u1,v1,rcs,rn,kbot,ktop,kcnv,slimsk, &
4471 & dot,ncloud,hpbl,heat,evap,pgcon)
4473 use MODULE_GFS_machine , only : kind_phys
4474 use MODULE_GFS_funcphys , only : fpvs
4475 use MODULE_GFS_physcons, grav => con_g, cp => con_cp, hvap => con_hvap &
4476 &, rv => con_rv, fv => con_fvirt, t0c => con_t0c &
4477 &, rd => con_rd, cvap => con_cvap, cliq => con_cliq &
4478 &, eps => con_eps, epsm1 => con_epsm1
4481 integer im, ix, km, jcap, ncloud, &
4482 & kbot(im), ktop(im), kcnv(im)
4483 real(kind=kind_phys) delt
4484 real(kind=kind_phys) ps(im), del(ix,km), prsl(ix,km), &
4485 & ql(ix,km,2),q1(ix,km), t1(ix,km), &
4486 & u1(ix,km), v1(ix,km), rcs(im), &
4487 & rn(im), slimsk(im), &
4488 & dot(ix,km), phil(ix,km), hpbl(im), &
4489 & heat(im), evap(im)
4490 ! &, ud_mf(im,km),dt_mf(im,km)
4492 real ud_mf(im,km),dt_mf(im,km)
4494 integer i,j,indx, jmn, k, kk, latd, lond, km1
4497 real(kind=kind_phys) c0, cpoel, dellat, delta, &
4498 & desdt, deta, detad, dg, &
4499 & dh, dhh, dlnsig, dp, &
4500 & dq, dqsdp, dqsdt, dt, &
4501 & dt2, dtmax, dtmin, dv1h, &
4502 & dv1q, dv2h, dv2q, dv1u, &
4503 & dv1v, dv2u, dv2v, dv3q, &
4504 & dv3h, dv3u, dv3v, clam, &
4506 & el2orc, elocp, aafac, &
4507 & es, etah, h1, dthk, &
4508 & evef, evfact, evfactl, fact1, &
4509 & fact2, factor, fjcap, &
4510 & g, gamma, pprime, betaw, &
4511 & qlk, qrch, qs, c1, &
4512 & rain, rfact, shear, tem1, &
4513 & tem2, terr, val, val1, &
4514 & val2, w1, w1l, w1s, &
4515 & w2, w2l, w2s, w3, &
4516 & w3l, w3s, w4, w4l, &
4517 & w4s, tem, ptem, ptem1, &
4520 integer kb(im), kbcon(im), kbcon1(im), &
4521 & ktcon(im), ktcon1(im), &
4524 real(kind=kind_phys) aa1(im), &
4525 & delhbar(im), delq(im), delq2(im), &
4526 & delqbar(im), delqev(im), deltbar(im), &
4527 & deltv(im), edt(im), &
4528 & wstar(im), sflx(im), &
4529 & pdot(im), po(im,km), &
4530 & qcond(im), qevap(im), hmax(im), &
4531 & rntot(im), vshear(im), &
4532 & xlamud(im), xmb(im), xmbmax(im), &
4533 & delubar(im), delvbar(im)
4535 real(kind=kind_phys) cincr, cincrmax, cincrmin
4537 !c physical parameters
4539 parameter(cpoel=cp/hvap,elocp=hvap/cp, &
4540 & el2orc=hvap*hvap/(rv*cp))
4541 parameter(terr=0.,c0=.002,c1=5.e-4,delta=fv)
4542 parameter(fact1=(cvap-cliq)/rv,fact2=hvap/rv-fact1*t0c)
4543 parameter(cincrmax=180.,cincrmin=120.,dthk=25.)
4544 parameter(h1=0.33333333)
4545 !c local variables and arrays
4546 real(kind=kind_phys) pfld(im,km), to(im,km), qo(im,km), &
4547 & uo(im,km), vo(im,km), qeso(im,km)
4549 real(kind=kind_phys) qlko_ktcon(im), dellal(im,km), &
4550 & dbyo(im,km), zo(im,km), xlamue(im,km), &
4551 & heo(im,km), heso(im,km), &
4552 & dellah(im,km), dellaq(im,km), &
4553 & dellau(im,km), dellav(im,km), hcko(im,km), &
4554 & ucko(im,km), vcko(im,km), qcko(im,km), &
4555 & eta(im,km), zi(im,km), pwo(im,km), &
4558 logical totflg, cnvflg(im), flg(im)
4560 real(kind=kind_phys) tf, tcr, tcrf
4561 parameter (tf=233.16, tcr=263.16, tcrf=1.0/(tcr-tf))
4563 !c-----------------------------------------------------------------------
4567 !c compute surface buoyancy flux
4570 sflx(i) = heat(i)+fv*t1(i,1)*evap(i)
4573 !c initialize arrays
4577 if(kcnv(i).eq.1) cnvflg(i) = .false.
4578 if(sflx(i).le.0.) cnvflg(i) = .false.
4593 ! hchuang code change
4603 totflg = totflg .and. (.not. cnvflg(i))
4610 dtmin = max(dt2, val )
4612 dtmax = max(dt2, val )
4613 !c model tunable parameters are all here
4621 fjcap = (float(jcap) / 126.) ** 2
4623 fjcap = max(fjcap,val)
4633 !c define top layer for search of the downdraft originating layer
4634 !c and the maximum thetae for updraft
4639 tx1(i) = 1.0 / ps(i)
4644 if (prsl(i,k)*tx1(i) .gt. 0.70) kbm(i) = k + 1
4645 if (prsl(i,k)*tx1(i) .gt. 0.60) kmax(i) = k + 1
4649 kbm(i) = min(kbm(i),kmax(i))
4652 !!c hydrostatic height assume zero terr and compute
4653 !c updraft entrainment rate as an inverse function of height
4657 zo(i,k) = phil(i,k) / g
4662 zi(i,k) = 0.5*(zo(i,k)+zo(i,k+1))
4663 xlamue(i,k) = clam / zi(i,k)
4667 xlamue(i,km) = xlamue(i,km1)
4678 if (flg(i).and.zo(i,k).le.hpbl(i)) then
4686 kpbl(i)= min(kpbl(i),kbm(i))
4689 !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4690 !c convert surface pressure to mb from cb
4694 if (cnvflg(i) .and. k .le. kmax(i)) then
4695 pfld(i,k) = prsl(i,k) * 10.0
4706 uo(i,k) = u1(i,k) * rcs(i)
4707 vo(i,k) = v1(i,k) * rcs(i)
4713 !c p is pressure of the layer (mb)
4714 !c t is temperature at t-dt (k)..tn
4715 !c q is mixing ratio at t-dt (kg/kg)..qn
4716 !c to is temperature at t+dt (k)... this is after advection and turbulan
4717 !c qo is mixing ratio at t+dt (kg/kg)..q1
4721 if (cnvflg(i) .and. k .le. kmax(i)) then
4722 qeso(i,k) = 0.01 * fpvs(to(i,k)) ! fpvs is in pa
4723 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k) + epsm1*qeso(i,k))
4725 qeso(i,k) = max(qeso(i,k), val1)
4727 qo(i,k) = max(qo(i,k), val2 )
4728 ! qo(i,k) = min(qo(i,k),qeso(i,k))
4729 ! tvo(i,k) = to(i,k) + delta * to(i,k) * qo(i,k)
4734 !c compute moist static energy
4738 if (cnvflg(i) .and. k .le. kmax(i)) then
4739 ! tem = g * zo(i,k) + cp * to(i,k)
4740 tem = phil(i,k) + cp * to(i,k)
4741 heo(i,k) = tem + hvap * qo(i,k)
4742 heso(i,k) = tem + hvap * qeso(i,k)
4743 !c heo(i,k) = min(heo(i,k),heso(i,k))
4748 !c determine level with largest moist static energy within pbl
4749 !c this is the level where updraft starts
4759 if (cnvflg(i).and.k.le.kpbl(i)) then
4760 if(heo(i,k).gt.hmax(i)) then
4770 if (cnvflg(i) .and. k .le. kmax(i)-1) then
4771 dz = .5 * (zo(i,k+1) - zo(i,k))
4772 dp = .5 * (pfld(i,k+1) - pfld(i,k))
4773 es = 0.01 * fpvs(to(i,k+1)) ! fpvs is in pa
4774 pprime = pfld(i,k+1) + epsm1 * es
4775 qs = eps * es / pprime
4776 dqsdp = - qs / pprime
4777 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
4778 dqsdt = qs * pfld(i,k+1) * desdt / (es * pprime)
4779 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
4780 dt = (g * dz + hvap * dqsdp * dp) / (cp * (1. + gamma))
4781 dq = dqsdt * dt + dqsdp * dp
4782 to(i,k) = to(i,k+1) + dt
4783 qo(i,k) = qo(i,k+1) + dq
4784 po(i,k) = .5 * (pfld(i,k) + pfld(i,k+1))
4791 if (cnvflg(i) .and. k .le. kmax(i)-1) then
4792 qeso(i,k) = 0.01 * fpvs(to(i,k)) ! fpvs is in pa
4793 qeso(i,k) = eps * qeso(i,k) / (po(i,k) + epsm1*qeso(i,k))
4795 qeso(i,k) = max(qeso(i,k), val1)
4797 qo(i,k) = max(qo(i,k), val2 )
4798 ! qo(i,k) = min(qo(i,k),qeso(i,k))
4799 heo(i,k) = .5 * g * (zo(i,k) + zo(i,k+1)) + &
4800 & cp * to(i,k) + hvap * qo(i,k)
4801 heso(i,k) = .5 * g * (zo(i,k) + zo(i,k+1)) + &
4802 & cp * to(i,k) + hvap * qeso(i,k)
4803 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
4804 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
4809 !c look for the level of free convection as cloud base
4813 if(flg(i)) kbcon(i) = kmax(i)
4817 if (flg(i).and.k.lt.kbm(i)) then
4818 if(k.gt.kb(i).and.heo(i,kb(i)).gt.heso(i,k)) then
4828 if(kbcon(i).eq.kmax(i)) cnvflg(i) = .false.
4834 totflg = totflg .and. (.not. cnvflg(i))
4839 !c determine critical convective inhibition
4840 !c as a function of vertical velocity at cloud base.
4844 pdot(i) = 10.* dot(i,kbcon(i))
4849 if(slimsk(i).eq.1.) then
4860 if(pdot(i).le.w4) then
4861 ptem = (pdot(i) - w4) / (w3 - w4)
4862 elseif(pdot(i).ge.-w4) then
4863 ptem = - (pdot(i) + w4) / (w4 - w3)
4868 ptem = max(ptem,val1)
4870 ptem = min(ptem,val2)
4872 ptem1= .5*(cincrmax-cincrmin)
4873 cincr = cincrmax - ptem * ptem1
4874 tem1 = pfld(i,kb(i)) - pfld(i,kbcon(i))
4875 if(tem1.gt.cincr) then
4883 totflg = totflg .and. (.not. cnvflg(i))
4888 !c assume the detrainment rate for the updrafts to be same as
4889 !c the entrainment rate at cloud base
4893 xlamud(i) = xlamue(i,kbcon(i))
4897 !c determine updraft mass flux for the subcloud layers
4902 if(k.lt.kbcon(i).and.k.ge.kb(i)) then
4903 dz = zi(i,k+1) - zi(i,k)
4904 ptem = 0.5*(xlamue(i,k)+xlamue(i,k+1))-xlamud(i)
4905 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
4911 !c compute mass flux above cloud base
4916 if(k.gt.kbcon(i).and.k.lt.kmax(i)) then
4917 dz = zi(i,k) - zi(i,k-1)
4918 ptem = 0.5*(xlamue(i,k)+xlamue(i,k-1))-xlamud(i)
4919 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
4925 !c compute updraft cloud property
4930 hcko(i,indx) = heo(i,indx)
4931 ucko(i,indx) = uo(i,indx)
4932 vcko(i,indx) = vo(i,indx)
4939 if(k.gt.kb(i).and.k.lt.kmax(i)) then
4940 dz = zi(i,k) - zi(i,k-1)
4941 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
4942 tem1 = 0.5 * xlamud(i) * dz
4943 factor = 1. + tem - tem1
4944 ptem = 0.5 * tem + pgcon
4945 ptem1= 0.5 * tem - pgcon
4946 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
4947 & (heo(i,k)+heo(i,k-1)))/factor
4948 ucko(i,k) = ((1.-tem1)*ucko(i,k-1)+ptem*uo(i,k) &
4949 & +ptem1*uo(i,k-1))/factor
4950 vcko(i,k) = ((1.-tem1)*vcko(i,k-1)+ptem*vo(i,k) &
4951 & +ptem1*vo(i,k-1))/factor
4952 dbyo(i,k) = hcko(i,k) - heso(i,k)
4958 !c taking account into convection inhibition due to existence of
4959 !c dry layers below cloud base
4967 if (flg(i).and.k.lt.kbm(i)) then
4968 if(k.ge.kbcon(i).and.dbyo(i,k).gt.0.) then
4977 if(kbcon1(i).eq.kmax(i)) cnvflg(i) = .false.
4982 tem = pfld(i,kbcon(i)) - pfld(i,kbcon1(i))
4983 if(tem.gt.dthk) then
4991 totflg = totflg .and. (.not. cnvflg(i))
4996 !c determine first guess cloud top as the level of zero buoyancy
4997 !c limited to the level of sigma=0.7
5001 if(flg(i)) ktcon(i) = kbm(i)
5005 if (flg(i).and.k .lt. kbm(i)) then
5006 if(k.gt.kbcon1(i).and.dbyo(i,k).lt.0.) then
5014 !c turn off shallow convection if cloud top is less than pbl top
5017 ! if(cnvflg(i)) then
5019 ! if(ktcon(i).le.kk) cnvflg(i) = .false.
5025 ! totflg = totflg .and. (.not. cnvflg(i))
5030 !c specify upper limit of mass flux at cloud base
5037 dp = 1000. * del(i,k)
5038 xmbmax(i) = dp / (g * dt2)
5040 ! tem = dp / (g * dt2)
5041 ! xmbmax(i) = min(tem, xmbmax(i))
5045 !c compute cloud moisture property and precipitation
5050 qcko(i,kb(i)) = qo(i,kb(i))
5056 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
5057 dz = zi(i,k) - zi(i,k-1)
5058 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
5060 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
5062 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
5063 tem1 = 0.5 * xlamud(i) * dz
5064 factor = 1. + tem - tem1
5065 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
5066 & (qo(i,k)+qo(i,k-1)))/factor
5068 dq = eta(i,k) * (qcko(i,k) - qrch)
5070 ! rhbar(i) = rhbar(i) + qo(i,k) / qeso(i,k)
5072 !c below lfc check if there is excess moisture to release latent heat
5074 if(k.ge.kbcon(i).and.dq.gt.0.) then
5075 etah = .5 * (eta(i,k) + eta(i,k-1))
5076 if(ncloud.gt.0.) then
5077 dp = 1000. * del(i,k)
5078 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
5079 dellal(i,k) = etah * c1 * dz * qlk * g / dp
5081 qlk = dq / (eta(i,k) + etah * c0 * dz)
5083 aa1(i) = aa1(i) - dz * g * qlk
5084 qcko(i,k)= qlk + qrch
5085 pwo(i,k) = etah * c0 * dz * qlk
5092 !c calculate cloud work function
5097 if(k.ge.kbcon(i).and.k.lt.ktcon(i)) then
5098 dz1 = zo(i,k+1) - zo(i,k)
5099 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
5100 rfact = 1. + delta * cp * gamma &
5103 & dz1 * (g / (cp * to(i,k))) &
5104 & * dbyo(i,k) / (1. + gamma) &
5108 & dz1 * g * delta * &
5109 & max(val,(qeso(i,k) - qo(i,k)))
5115 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
5120 totflg = totflg .and. (.not. cnvflg(i))
5125 !c estimate the onvective overshooting as the level
5126 !c where the [aafac * cloud work function] becomes zero,
5127 !c which is the final cloud top
5128 !c limited to the level of sigma=0.7
5132 aa1(i) = aafac * aa1(i)
5143 if(k.ge.ktcon(i).and.k.lt.kbm(i)) then
5144 dz1 = zo(i,k+1) - zo(i,k)
5145 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
5146 rfact = 1. + delta * cp * gamma &
5149 & dz1 * (g / (cp * to(i,k))) &
5150 & * dbyo(i,k) / (1. + gamma) &
5152 if(aa1(i).lt.0.) then
5161 !c compute cloud moisture property, detraining cloud water
5162 !c and precipitation in overshooting layers
5167 if(k.ge.ktcon(i).and.k.lt.ktcon1(i)) then
5168 dz = zi(i,k) - zi(i,k-1)
5169 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
5171 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
5173 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
5174 tem1 = 0.5 * xlamud(i) * dz
5175 factor = 1. + tem - tem1
5176 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
5177 & (qo(i,k)+qo(i,k-1)))/factor
5179 dq = eta(i,k) * (qcko(i,k) - qrch)
5181 !c check if there is excess moisture to release latent heat
5184 etah = .5 * (eta(i,k) + eta(i,k-1))
5185 if(ncloud.gt.0.) then
5186 dp = 1000. * del(i,k)
5187 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
5188 dellal(i,k) = etah * c1 * dz * qlk * g / dp
5190 qlk = dq / (eta(i,k) + etah * c0 * dz)
5192 qcko(i,k) = qlk + qrch
5193 pwo(i,k) = etah * c0 * dz * qlk
5200 !c exchange ktcon with ktcon1
5205 ktcon(i) = ktcon1(i)
5210 !c this section is ready for cloud water
5212 if(ncloud.gt.0) then
5214 !c compute liquid and vapor separation at cloud top
5219 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
5221 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
5222 dq = qcko(i,k) - qrch
5224 !c check if there is excess moisture to release latent heat
5234 !c--- compute precipitation efficiency in terms of windshear
5244 if(k.gt.kb(i).and.k.le.ktcon(i)) then
5245 shear= sqrt((uo(i,k)-uo(i,k-1)) ** 2 &
5246 & + (vo(i,k)-vo(i,k-1)) ** 2)
5247 vshear(i) = vshear(i) + shear
5254 vshear(i) = 1.e3 * vshear(i) / (zi(i,ktcon(i))-zi(i,kb(i)))
5255 e1=1.591-.639*vshear(i) &
5256 & +.0953*(vshear(i)**2)-.00496*(vshear(i)**3)
5259 edt(i) = min(edt(i),val)
5261 edt(i) = max(edt(i),val)
5265 !c--- what would the change be, that a cloud with unit mass
5266 !c--- will do to the environment?
5270 if(cnvflg(i) .and. k .le. kmax(i)) then
5279 !c--- changed due to subsidence and entrainment
5284 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
5285 dp = 1000. * del(i,k)
5286 dz = zi(i,k) - zi(i,k-1)
5289 dv2h = .5 * (heo(i,k) + heo(i,k-1))
5292 dv2q = .5 * (qo(i,k) + qo(i,k-1))
5295 dv2u = .5 * (uo(i,k) + uo(i,k-1))
5298 dv2v = .5 * (vo(i,k) + vo(i,k-1))
5301 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1))
5304 dellah(i,k) = dellah(i,k) + &
5305 & ( eta(i,k)*dv1h - eta(i,k-1)*dv3h &
5306 & - tem*eta(i,k-1)*dv2h*dz &
5307 & + tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz &
5310 dellaq(i,k) = dellaq(i,k) + &
5311 & ( eta(i,k)*dv1q - eta(i,k-1)*dv3q &
5312 & - tem*eta(i,k-1)*dv2q*dz &
5313 & + tem1*eta(i,k-1)*.5*(qcko(i,k)+qcko(i,k-1))*dz &
5316 dellau(i,k) = dellau(i,k) + &
5317 & ( eta(i,k)*dv1u - eta(i,k-1)*dv3u &
5318 & - tem*eta(i,k-1)*dv2u*dz &
5319 & + tem1*eta(i,k-1)*.5*(ucko(i,k)+ucko(i,k-1))*dz &
5320 & - pgcon*eta(i,k-1)*(dv1u-dv3u) &
5323 dellav(i,k) = dellav(i,k) + &
5324 & ( eta(i,k)*dv1v - eta(i,k-1)*dv3v &
5325 & - tem*eta(i,k-1)*dv2v*dz &
5326 & + tem1*eta(i,k-1)*.5*(vcko(i,k)+vcko(i,k-1))*dz &
5327 & - pgcon*eta(i,k-1)*(dv1v-dv3v) &
5340 dp = 1000. * del(i,indx)
5341 dv1h = heo(i,indx-1)
5342 dellah(i,indx) = eta(i,indx-1) * &
5343 & (hcko(i,indx-1) - dv1h) * g / dp
5345 dellaq(i,indx) = eta(i,indx-1) * &
5346 & (qcko(i,indx-1) - dv1q) * g / dp
5348 dellau(i,indx) = eta(i,indx-1) * &
5349 & (ucko(i,indx-1) - dv1u) * g / dp
5351 dellav(i,indx) = eta(i,indx-1) * &
5352 & (vcko(i,indx-1) - dv1v) * g / dp
5356 dellal(i,indx) = eta(i,indx-1) * &
5357 & qlko_ktcon(i) * g / dp
5361 !c mass flux at cloud base for shallow convection
5367 ! ptem = g*sflx(i)*zi(i,k)/t1(i,1)
5368 ptem = g*sflx(i)*hpbl(i)/t1(i,1)
5370 tem = po(i,k)*100. / (rd*t1(i,k))
5371 xmb(i) = betaw*tem*wstar(i)
5372 xmb(i) = min(xmb(i),xmbmax(i))
5376 !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5380 if (cnvflg(i) .and. k .le. kmax(i)) then
5381 qeso(i,k) = 0.01 * fpvs(t1(i,k)) ! fpvs is in pa
5382 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k) + epsm1*qeso(i,k))
5384 qeso(i,k) = max(qeso(i,k), val )
5388 !c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5401 if(k.gt.kb(i).and.k.le.ktcon(i)) then
5402 dellat = (dellah(i,k) - hvap * dellaq(i,k)) / cp
5403 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
5404 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
5406 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2 * tem
5407 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2 * tem
5408 dp = 1000. * del(i,k)
5409 delhbar(i) = delhbar(i) + dellah(i,k)*xmb(i)*dp/g
5410 delqbar(i) = delqbar(i) + dellaq(i,k)*xmb(i)*dp/g
5411 deltbar(i) = deltbar(i) + dellat*xmb(i)*dp/g
5412 delubar(i) = delubar(i) + dellau(i,k)*xmb(i)*dp/g
5413 delvbar(i) = delvbar(i) + dellav(i,k)*xmb(i)*dp/g
5421 if(k.gt.kb(i).and.k.le.ktcon(i)) then
5422 qeso(i,k) = 0.01 * fpvs(t1(i,k)) ! fpvs is in pa
5423 qeso(i,k) = eps * qeso(i,k)/(pfld(i,k) + epsm1*qeso(i,k))
5425 qeso(i,k) = max(qeso(i,k), val )
5440 if(k.lt.ktcon(i).and.k.gt.kb(i)) then
5441 rntot(i) = rntot(i) + pwo(i,k) * xmb(i) * .001 * dt2
5451 if (k .le. kmax(i)) then
5456 if(k.lt.ktcon(i).and.k.gt.kb(i)) then
5457 rn(i) = rn(i) + pwo(i,k) * xmb(i) * .001 * dt2
5460 if(flg(i).and.k.lt.ktcon(i)) then
5461 evef = edt(i) * evfact
5462 if(slimsk(i).eq.1.) evef=edt(i) * evfactl
5463 ! if(slimsk(i).eq.1.) evef=.07
5464 !c if(slimsk(i).ne.1.) evef = 0.
5465 qcond(i) = evef * (q1(i,k) - qeso(i,k)) &
5466 & / (1. + el2orc * qeso(i,k) / t1(i,k)**2)
5467 dp = 1000. * del(i,k)
5468 if(rn(i).gt.0..and.qcond(i).lt.0.) then
5469 qevap(i) = -qcond(i) * (1.-exp(-.32*sqrt(dt2*rn(i))))
5470 qevap(i) = min(qevap(i), rn(i)*1000.*g/dp)
5471 delq2(i) = delqev(i) + .001 * qevap(i) * dp / g
5473 if(rn(i).gt.0..and.qcond(i).lt.0..and. &
5474 & delq2(i).gt.rntot(i)) then
5475 qevap(i) = 1000.* g * (rntot(i) - delqev(i)) / dp
5478 if(rn(i).gt.0..and.qevap(i).gt.0.) then
5480 tem1 = qevap(i) * tem
5481 if(tem1.gt.rn(i)) then
5482 qevap(i) = rn(i) / tem
5485 rn(i) = rn(i) - tem1
5487 q1(i,k) = q1(i,k) + qevap(i)
5488 t1(i,k) = t1(i,k) - elocp * qevap(i)
5489 deltv(i) = - elocp*qevap(i)/dt2
5490 delq(i) = + qevap(i)/dt2
5491 delqev(i) = delqev(i) + .001*dp*qevap(i)/g
5493 dellaq(i,k) = dellaq(i,k) + delq(i) / xmb(i)
5494 delqbar(i) = delqbar(i) + delq(i)*dp/g
5495 deltbar(i) = deltbar(i) + deltv(i)*dp/g
5502 ! if(me.eq.31.and.cnvflg(i)) then
5503 ! if(cnvflg(i)) then
5504 ! print *, ' shallow delhbar, delqbar, deltbar = ',
5505 ! & delhbar(i),hvap*delqbar(i),cp*deltbar(i)
5506 ! print *, ' shallow delubar, delvbar = ',delubar(i),delvbar(i)
5507 ! print *, ' precip =', hvap*rn(i)*1000./dt2
5508 ! print*,'pdif= ',pfld(i,kbcon(i))-pfld(i,ktcon(i))
5514 if(rn(i).lt.0..or..not.flg(i)) rn(i) = 0.
5523 if (ncloud.gt.0) then
5530 if (k.gt.kb(i).and.k.le.ktcon(i)) then
5531 tem = dellal(i,k) * xmb(i) * dt2
5532 ! tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf))
5533 tem1 = max(val2, min(val1, (tcr-t1(i,k))*tcrf))
5534 if (ql(i,k,2) .gt. -999.0) then
5535 ql(i,k,1) = ql(i,k,1) + tem * tem1 ! ice
5536 ql(i,k,2) = ql(i,k,2) + tem *(1.0-tem1) ! water
5538 ql(i,k,1) = ql(i,k,1) + tem
5547 ! hchuang code change
5552 if(k.ge.kb(i) .and. k.lt.ktop(i)) then
5553 ud_mf(i,k) = eta(i,k) * xmb(i) * dt2
5561 dt_mf(i,k) = ud_mf(i,k)
5566 end subroutine shalcnv
5567 END MODULE module_cu_sas