6 !-----------------------------------------------------------------
7 SUBROUTINE CU_SAS(DT,ITIMESTEP,STEPCU, &
8 RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
9 RUCUTEN,RVCUTEN, & ! gopal's doing for SAS
10 RAINCV,PRATEC,HTOP,HBOT, &
11 U3D,V3D,W,T3D,QV3D,QC3D,QI3D,PI3D,RHO3D, &
12 DZ8W,PCPS,P8W,XLAND,CU_ACT_FLAG, &
15 STORE_RAND,MOMMIX, & ! gopal's doing
17 P_QI,P_FIRST_SCALAR, &
18 CUDT, CURR_SECS, ADAPT_STEP_FLAG, &
19 ids,ide, jds,jde, kds,kde, &
20 ims,ime, jms,jme, kms,kme, &
21 its,ite, jts,jte, kts,kte )
23 !-------------------------------------------------------------------
24 USE MODULE_GFS_MACHINE , ONLY : kind_phys
25 USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys
26 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
27 &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
28 &, CVAP => con_CVAP, CLIQ => con_CLIQ &
29 &, EPS => con_eps, EPSM1 => con_epsm1 &
30 &, ROVCP => con_rocp, RD => con_rd
31 !-------------------------------------------------------------------
33 !-------------------------------------------------------------------
34 !-- U3D 3D u-velocity interpolated to theta points (m/s)
35 !-- V3D 3D v-velocity interpolated to theta points (m/s)
36 !-- TH3D 3D potential temperature (K)
37 !-- T3D temperature (K)
38 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
39 !-- QC3D 3D cloud mixing ratio (Kg/Kg)
40 !-- QI3D 3D ice mixing ratio (Kg/Kg)
41 !-- P8w 3D pressure at full levels (Pa)
42 !-- Pcps 3D pressure (Pa)
43 !-- PI3D 3D exner function (dimensionless)
44 !-- rr3D 3D dry air density (kg/m^3)
45 !-- RUBLTEN U tendency due to
46 ! PBL parameterization (m/s^2)
47 !-- RVBLTEN V tendency due to
48 ! PBL parameterization (m/s^2)
49 !-- RTHBLTEN Theta tendency due to
50 ! PBL parameterization (K/s)
51 !-- RQVBLTEN Qv tendency due to
52 ! PBL parameterization (kg/kg/s)
53 !-- RQCBLTEN Qc tendency due to
54 ! PBL parameterization (kg/kg/s)
55 !-- RQIBLTEN Qi tendency due to
56 ! PBL parameterization (kg/kg/s)
58 !-- MOMMIX MOMENTUM MIXING COEFFICIENT (can be set in the namelist)
59 !-- RUCUTEN U tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
60 !-- RVCUTEN V tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
62 !-- CP heat capacity at constant pressure for dry air (J/kg/K)
63 !-- GRAV acceleration due to gravity (m/s^2)
65 !-- RD gas constant for dry air (J/kg/K)
67 !-- P_QI species index for cloud ice
68 !-- dz8w dz between full levels (m)
69 !-- z height above sea level (m)
70 !-- PSFC pressure at the surface (Pa)
71 !-- UST u* in similarity theory (m/s)
72 !-- PBL PBL height (m)
73 !-- PSIM similarity stability function for momentum
74 !-- PSIH similarity stability function for heat
75 !-- HFX upward heat flux at the surface (W/m^2)
76 !-- QFX upward moisture flux at the surface (kg/m^2/s)
77 !-- TSK surface temperature (K)
78 !-- GZ1OZ0 log(z/z0) where z0 is roughness length
79 !-- WSPD wind speed at lowest model level (m/s)
80 !-- BR bulk Richardson number in surface layer
82 !-- rvovrd R_v divided by R_d (dimensionless)
83 !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
84 !-- KARMAN Von Karman constant
85 !-- ids start index for i in domain
86 !-- ide end index for i in domain
87 !-- jds start index for j in domain
88 !-- jde end index for j in domain
89 !-- kds start index for k in domain
90 !-- kde end index for k in domain
91 !-- ims start index for i in memory
92 !-- ime end index for i in memory
93 !-- jms start index for j in memory
94 !-- jme end index for j in memory
95 !-- kms start index for k in memory
96 !-- kme end index for k in memory
97 !-- its start index for i in tile
98 !-- ite end index for i in tile
99 !-- jts start index for j in tile
100 !-- jte end index for j in tile
101 !-- kts start index for k in tile
102 !-- kte end index for k in tile
103 !-------------------------------------------------------------------
107 INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
108 ims,ime, jms,jme, kms,kme, &
109 its,ite, jts,jte, kts,kte, &
116 REAL, INTENT(IN) :: &
120 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
125 REAL, DIMENSION(ims:ime, jms:jme, kms:kme), INTENT(INOUT) :: &
126 RUCUTEN, & ! gopal's doing for SAS
127 RVCUTEN ! gopal's doing for SAS
129 REAL, INTENT(IN) :: MOMMIX
130 REAL, DIMENSION( ims:ime , jms:jme ), &
131 INTENT(IN) :: STORE_RAND
135 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
138 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
141 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
145 LOGICAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: &
149 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
163 ! Adaptive time-step variables
164 REAL, INTENT(IN ) :: CUDT
165 REAL, INTENT(IN ) :: CURR_SECS
166 LOGICAL,INTENT(IN ) :: ADAPT_STEP_FLAG
168 !--------------------------- LOCAL VARS ------------------------------
170 REAL, DIMENSION(ims:ime, jms:jme) :: &
174 REAL (kind=kind_phys) :: &
180 REAL (kind=kind_phys), DIMENSION(its:ite) :: &
188 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte+1) :: &
191 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte) :: &
204 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte, 2) :: &
207 INTEGER, DIMENSION(its:ite) :: &
228 !-----------------------------------------------------------------------
230 !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
232 if (adapt_step_flag) then
233 if ( (ITIMESTEP .eq. 0) .or. (cudt .eq. 0) .or. &
234 ( CURR_SECS + dt >= ( int( CURR_SECS / ( cudt * 60 ) ) + 1 ) * cudt * 60 ) ) then
241 if (MOD(ITIMESTEP,STEPCU) .EQ. 0 .or. ITIMESTEP .eq. 0) then
248 !-----------------------------------------------------------------------
255 CU_ACT_FLAG(I,J)=.TRUE.
270 PSFC(i,j)=P8w(i,kms,j)
274 if(igpvs.eq.0) CALL GFUNCPHYS
277 !------------- J LOOP (OUTER) --------------------------------------------------
281 ! --------------- compute zi and zl -----------------------------------------
289 ZI(I,K)=ZI(I,KM)+dz8w(i,km,j)
296 ZL(I,KM)=(ZI(I,K)+ZI(I,KM))*0.5
301 ZL(I,KTE)=2.*ZI(I,KTE)-ZL(I,KTE-1)
304 ! --------------- end compute zi and zl -------------------------------------
306 ! Based on some important findings from Morris Bender, XKT2 was defined in
307 ! terms of random number instead of random number based cloud tops
308 ! Also, these random numbers are stored and are changed only once in
309 ! approximately 5 minutes interval now. This is gopal's doing for HWRF.
311 ! call random_number(XKT2)
314 ! XKT2 was defined in terms of random number instead of random number based cloud tops
316 call init_random_seed()
317 call random_number(XKT2)
326 XKT2(i) = STORE_RAND(i,j)
333 SLIMSK(i)=ABS(XLAND(i,j)-2.)
343 PRSL(I,K)=Pcps(i,k,j)*.001
344 PHIL(I,K)=ZL(I,K)*GRAV
345 DOT(i,k)=-5.0E-4*GRAV*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
351 DEL(i,k)=PRSL(i,k)*GRAV/RD*dz8w(i,k,j)/T3D(i,k,j)
354 Q1(i,k)=QV3D(i,k,j)/(1.+QV3D(i,k,j))
356 QL(i,k,1)=QI3D(i,k,j)/(1.+QI3D(i,k,j))
357 QL(i,k,2)=QC3D(i,k,j)/(1.+QC3D(i,k,j))
358 PRSLK(I,K)=(PRSL(i,k)*.01)**ROVCP
365 PRSI(i,k)=PRSI(i,km)-del(i,km)
370 CALL SASCNV(IM,IM,KX,JCAP,DELT,DEL,PRSL,PS,PHIL, &
371 QL,Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT, &
372 KTOP,KUO,SLIMSK,DOT,XKT2,NCLOUD)
374 !!! make more like GFDL ... eliminate shallow convection.....
375 !!! CALL SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KUO,Q1,T1,DPSHC)
377 CALL SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KUO,Q1,T1,DPSHC)
381 RAINCV(I,J)=RN(I)*1000./STEPCU
382 PRATEC(I,J)=RN(I)*1000./(STEPCU * DT)
389 RTHCUTEN(I,K,J)=(T1(I,K)-T3D(I,K,J))/PI3D(I,K,J)*RDELT
390 RQVCUTEN(I,K,J)=(Q1(I,K)/(1.-q1(i,k))-QV3D(I,K,J))*RDELT
394 !===============================================================================
395 ! ADD MOMENTUM MIXING TERM AS TENDENCIES. This is gopal's doing for SAS
396 ! MOMMIX is the reduction factor set to 0.7 by default. Because NMM has
397 ! divergence damping term, a reducion factor for cumulum mixing may be
398 ! required otherwise storms were too weak.
399 !===============================================================================
404 RUCUTEN(I,J,K)=MOMMIX*(U1(I,K)-U3D(I,K,J))*RDELT
405 RVCUTEN(I,J,K)=MOMMIX*(V1(I,K)-V3D(I,K,J))*RDELT
411 IF(P_QC .ge. P_FIRST_SCALAR)THEN
414 RQCCUTEN(I,K,J)=(QL(I,K,2)/(1.-ql(i,k,2))-QC3D(I,K,J))*RDELT
419 IF(P_QI .ge. P_FIRST_SCALAR)THEN
422 RQICUTEN(I,K,J)=(QL(I,K,1)/(1.-ql(i,k,1))-QI3D(I,K,J))*RDELT
427 ENDDO ! Outer most J loop
431 END SUBROUTINE CU_SAS
433 !====================================================================
434 SUBROUTINE sasinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
435 RUCUTEN,RVCUTEN, & ! gopal's doing for SAS
436 RESTART,P_QC,P_QI,P_FIRST_SCALAR, &
438 ids, ide, jds, jde, kds, kde, &
439 ims, ime, jms, jme, kms, kme, &
440 its, ite, jts, jte, kts, kte )
441 !--------------------------------------------------------------------
443 !--------------------------------------------------------------------
444 LOGICAL , INTENT(IN) :: allowed_to_read,restart
445 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
446 ims, ime, jms, jme, kms, kme, &
447 its, ite, jts, jte, kts, kte
448 INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
450 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
455 REAL, DIMENSION( ims:ime , jms:jme , kms:kme ) , INTENT(OUT) :: &
456 RUCUTEN, & ! gopal's doing for SAS
459 INTEGER :: i, j, k, itf, jtf, ktf
467 IF(.not.restart .or. .not.allowed_to_read)THEN
468 !end of zhang's doing
477 RUCUTEN(i,j,k)=0. ! gopal's doing for SAS
478 RVCUTEN(i,j,k)=0. ! gopal's doing for SAS
483 IF (P_QC .ge. P_FIRST_SCALAR) THEN
493 IF (P_QI .ge. P_FIRST_SCALAR) THEN
504 END SUBROUTINE sasinit
506 ! ------------------------------------------------------------------------
508 SUBROUTINE SASCNV(IM,IX,KM,JCAP,DELT,DEL,PRSL,PS,PHIL,QL, &
509 ! SUBROUTINE SASCNV(IM,IX,KM,JCAP,DLT,DEL,PRSL,PHIL,QL, &
510 & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK, &
512 ! for cloud water version
513 ! parameter(ncloud=0)
514 ! SUBROUTINE SASCNV(KM,JCAP,DELT,DEL,SL,SLK,PS,QL,
515 ! & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK,
518 USE MODULE_GFS_MACHINE , ONLY : kind_phys
519 USE MODULE_GFS_FUNCPHYS ,ONLY : fpvs
520 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
521 &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
522 &, CVAP => con_CVAP, CLIQ => con_CLIQ &
523 &, EPS => con_eps, EPSM1 => con_epsm1
527 ! include 'constant.h'
529 integer IM, IX, KM, JCAP, ncloud, &
530 & KBOT(IM), KTOP(IM), KUO(IM), J
531 real(kind=kind_phys) DELT
532 real(kind=kind_phys) PS(IM), DEL(IX,KM), PRSL(IX,KM), &
533 ! real(kind=kind_phys) DEL(IX,KM), PRSL(IX,KM),
534 & QL(IX,KM,2), Q1(IX,KM), T1(IX,KM), &
535 & U1(IX,KM), V1(IX,KM), RCS(IM), &
536 & CLDWRK(IM), RN(IM), SLIMSK(IM), &
537 & DOT(IX,KM), XKT2(IM), PHIL(IX,KM)
539 integer I, INDX, jmn, k, knumb, latd, lond, km1
541 real(kind=kind_phys) adw, alpha, alphal, alphas, &
542 & aup, beta, betal, betas, &
543 & c0, cpoel, dellat, delta, &
544 & desdt, deta, detad, dg, &
545 & dh, dhh, dlnsig, dp, &
546 & dq, dqsdp, dqsdt, dt, &
547 & dt2, dtmax, dtmin, dv1, &
548 & dv1q, dv2, dv2q, dv1u, &
549 & dv1v, dv2u, dv2v, dv3u, &
550 & dv3v, dv3, dv3q, dvq1, &
551 & dz, dz1, e1, edtmax, &
552 & edtmaxl, edtmaxs, el2orc, elocp, &
554 & evef, evfact, evfactl, fact1, &
555 & fact2, factor, fjcap, fkm, &
556 & fuv, g, gamma, onemf, &
557 & onemfu, pdetrn, pdpdwn, pprime, &
558 & qc, qlk, qrch, qs, &
559 & rain, rfact, shear, tem1, &
560 & tem2, terr, val, val1, &
561 & val2, w1, w1l, w1s, &
562 & w2, w2l, w2s, w3, &
563 & w3l, w3s, w4, w4l, &
564 & w4s, xdby, xpw, xpwd, &
565 & xqc, xqrch, xlambu, mbdt, &
569 integer JMIN(IM), KB(IM), KBCON(IM), KBDTR(IM), &
570 & KT2(IM), KTCON(IM), LMIN(IM), &
571 & kbm(IM), kbmax(IM), kmax(IM)
573 real(kind=kind_phys) AA1(IM), ACRT(IM), ACRTFCT(IM), &
574 & DELHBAR(IM), DELQ(IM), DELQ2(IM), &
575 & DELQBAR(IM), DELQEV(IM), DELTBAR(IM), &
576 & DELTV(IM), DTCONV(IM), EDT(IM), &
577 & EDTO(IM), EDTX(IM), FLD(IM), &
578 & HCDO(IM), HKBO(IM), HMAX(IM), &
579 & HMIN(IM), HSBAR(IM), UCDO(IM), &
580 & UKBO(IM), VCDO(IM), VKBO(IM), &
581 & PBCDIF(IM), PDOT(IM), PO(IM,KM), &
582 & PWAVO(IM), PWEVO(IM), &
583 ! & PSFC(IM), PWAVO(IM), PWEVO(IM), &
584 & QCDO(IM), QCOND(IM), QEVAP(IM), &
585 & QKBO(IM), RNTOT(IM), VSHEAR(IM), &
586 & XAA0(IM), XHCD(IM), XHKB(IM), &
587 & XK(IM), XLAMB(IM), XLAMD(IM), &
588 & XMB(IM), XMBMAX(IM), XPWAV(IM), &
589 & XPWEV(IM), XQCD(IM), XQKB(IM)
591 ! PHYSICAL PARAMETERS
593 PARAMETER(CPOEL=CP/HVAP,ELOCP=HVAP/CP, &
594 & EL2ORC=HVAP*HVAP/(RV*CP))
595 PARAMETER(TERR=0.,C0=.002,DELTA=fv)
596 PARAMETER(FACT1=(CVAP-CLIQ)/RV,FACT2=HVAP/RV-FACT1*T0C)
597 ! LOCAL VARIABLES AND ARRAYS
598 real(kind=kind_phys) PFLD(IM,KM), TO(IM,KM), QO(IM,KM), &
599 & UO(IM,KM), VO(IM,KM), QESO(IM,KM)
601 real(kind=kind_phys) QLKO_KTCON(IM), DELLAL(IM), TVO(IM,KM), &
602 & DBYO(IM,KM), ZO(IM,KM), SUMZ(IM,KM), &
603 & SUMH(IM,KM), HEO(IM,KM), HESO(IM,KM), &
604 & QRCD(IM,KM), DELLAH(IM,KM), DELLAQ(IM,KM),&
605 & DELLAU(IM,KM), DELLAV(IM,KM), HCKO(IM,KM), &
606 & UCKO(IM,KM), VCKO(IM,KM), QCKO(IM,KM), &
607 & ETA(IM,KM), ETAU(IM,KM), ETAD(IM,KM), &
608 & QRCDO(IM,KM), PWO(IM,KM), PWDO(IM,KM), &
611 LOGICAL TOTFLG, CNVFLG(IM), DWNFLG(IM), DWNFLG2(IM), FLG(IM)
613 real(kind=kind_phys) PCRIT(15), ACRITT(15), ACRIT(15)
615 DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
616 & 350.,300.,250.,200.,150./
617 DATA ACRITT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
618 & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
620 ! DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
621 ! & .743,.813,.886,.947,1.138,1.377,1.896/
623 real(kind=kind_phys) TF, TCR, TCRF, RZERO, RONE
624 parameter (TF=233.16, TCR=263.16, TCRF=1.0/(TCR-TF))
625 parameter (RZERO=0.0,RONE=1.0)
626 !-----------------------------------------------------------------------
646 ACRIT(K) = ACRITT(K) * (975. - PCRIT(K))
649 !cmr dtmin = max(dt2,1200.)
651 dtmin = max(dt2, val )
652 !cmr dtmax = max(dt2,3600.)
654 dtmax = max(dt2, val )
655 ! MODEL TUNABLE PARAMETERS ARE ALL HERE
665 ! change for hurricane model
671 ! change for hurricane model
686 fjcap = (float(jcap) / 126.) ** 2
687 !cmr fjcap = max(fjcap,1.)
689 fjcap = max(fjcap,val)
690 fkm = (float(km) / 28.) ** 2
691 !cmr fkm = max(fkm,1.)
701 !CCCC IF(IM.EQ.384) THEN
704 !CCCC ELSEIF(IM.EQ.768) THEN
710 ! DEFINE TOP LAYER FOR SEARCH OF THE DOWNDRAFT ORIGINATING LAYER
711 ! AND THE MAXIMUM THETAE FOR UPDRAFT
722 IF (prSL(I,K)*tx1(I) .GT. 0.45) KBMAX(I) = K + 1
723 IF (prSL(I,K)*tx1(I) .GT. 0.70) KBM(I) = K + 1
724 IF (prSL(I,K)*tx1(I) .GT. 0.04) KMAX(I) = MIN(KM,K + 1)
728 KBMAX(I) = MIN(KBMAX(I),KMAX(I))
729 KBM(I) = MIN(KBM(I),KMAX(I))
732 ! CONVERT SURFACE PRESSURE TO MB FROM CB
737 if (K .le. kmax(i)) then
738 PFLD(I,k) = PRSL(I,K) * 10.0
754 ! P IS PRESSURE OF THE LAYER (MB)
755 ! T IS TEMPERATURE AT T-DT (K)..TN
756 ! Q IS MIXING RATIO AT T-DT (KG/KG)..QN
757 ! TO IS TEMPERATURE AT T+DT (K)... THIS IS AFTER ADVECTION AND TURBULAN
758 ! QO IS MIXING RATIO AT T+DT (KG/KG)..Q1
762 if (k .le. kmax(i)) then
763 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
765 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
767 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
768 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
770 QESO(I,k) = MAX(QESO(I,k), val1)
771 !cmr QO(I,k) = max(QO(I,k),1.e-10)
773 QO(I,k) = max(QO(I,k), val2 )
774 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
775 TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
781 ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
785 ZO(I,k) = PHIL(I,k) / G
788 ! COMPUTE MOIST STATIC ENERGY
791 if (K .le. kmax(i)) then
792 ! tem = G * ZO(I,k) + CP * TO(I,k)
793 tem = PHIL(I,k) + CP * TO(I,k)
794 HEO(I,k) = tem + HVAP * QO(I,k)
795 HESO(I,k) = tem + HVAP * QESO(I,k)
796 ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
801 ! DETERMINE LEVEL WITH LARGEST MOIST STATIC ENERGY
802 ! THIS IS THE LEVEL WHERE UPDRAFT STARTS
811 if (k .le. kbm(i)) then
812 IF(HEO(I,k).GT.HMAX(I).AND.CNVFLG(I)) THEN
820 ! TOL(k) = .5 * (TO(I,k) + TO(I,k+1))
821 ! QOL(k) = .5 * (QO(I,k) + QO(I,k+1))
822 ! QESOL(I,k) = .5 * (QESO(I,k) + QESO(I,k+1))
823 ! HEOL(I,k) = .5 * (HEO(I,k) + HEO(I,k+1))
824 ! HESOL(I,k) = .5 * (HESO(I,k) + HESO(I,k+1))
828 if (k .le. kmax(i)-1) then
829 DZ = .5 * (ZO(I,k+1) - ZO(I,k))
830 DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
831 !jfe ES = 10. * FPVS(TO(I,k+1))
833 ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
835 PPRIME = PFLD(I,k+1) + EPSM1 * ES
836 QS = EPS * ES / PPRIME
837 DQSDP = - QS / PPRIME
838 DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
839 DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
840 GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
841 DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
842 DQ = DQSDT * DT + DQSDP * DP
843 TO(I,k) = TO(I,k+1) + DT
844 QO(I,k) = QO(I,k+1) + DQ
845 PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
852 if (k .le. kmax(I)-1) then
853 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
855 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
857 QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1*QESO(I,k))
858 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
860 QESO(I,k) = MAX(QESO(I,k), val1)
861 !cmr QO(I,k) = max(QO(I,k),1.e-10)
863 QO(I,k) = max(QO(I,k), val2 )
864 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
865 HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
866 & CP * TO(I,k) + HVAP * QO(I,k)
867 HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
868 & CP * TO(I,k) + HVAP * QESO(I,k)
869 UO(I,k) = .5 * (UO(I,k) + UO(I,k+1))
870 VO(I,k) = .5 * (VO(I,k) + VO(I,k+1))
875 ! HEO(I,k) = HEO(I,k)
876 ! hesol(k) = HESO(I,k)
877 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
879 ! PRINT 6001, (HEO(I,K),K=1,KMAX)
881 ! PRINT 6001, (HESO(I,K),K=1,KMAX)
883 ! PRINT 6002, (TO(I,K)-273.16,K=1,KMAX)
885 ! PRINT 6003, (QO(I,K),K=1,KMAX)
887 ! PRINT 6003, (QESO(I,K),K=1,KMAX)
890 ! LOOK FOR CONVECTIVE CLOUD BASE AS THE LEVEL OF FREE CONVECTION
895 HKBO(I) = HEO(I,INDX)
906 if (k .le. kbmax(i)) then
907 IF(FLG(I).AND.K.GT.KB(I)) THEN
909 IF(HKBO(I).GT.HSBAR(I)) THEN
919 PBCDIF(I) = -PFLD(I,KBCON(I)) + PFLD(I,KB(I))
920 PDOT(I) = 10.* DOT(I,KBCON(I))
921 IF(PBCDIF(I).GT.150.) CNVFLG(I) = .FALSE.
922 IF(KBCON(I).EQ.KMAX(I)) CNVFLG(I) = .FALSE.
928 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
931 ! FOUND LFC, CAN DEFINE REST OF VARIABLES
932 6001 FORMAT(2X,-2P10F12.2)
933 6002 FORMAT(2X,10F12.2)
934 6003 FORMAT(2X,3P10F12.2)
937 ! DETERMINE ENTRAINMENT RATE BETWEEN KB AND KBCON
941 if(SLIMSK(I).eq.1.) alpha = alphal
944 DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) - ZO(I,1)
946 DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) &
947 & - .5 * (ZO(I,KB(I)) + ZO(I,KB(I)-1))
949 IF(KBCON(I).NE.KB(I)) THEN
950 !cmr XLAMB(I) = -ALOG(ALPHA) / DZ
951 XLAMB(I) = - LOG(ALPHA) / DZ
957 ! DETERMINE UPDRAFT MASS FLUX
960 if (k .le. kmax(i) .and. CNVFLG(I)) then
968 if (k .le. kbmax(i)) then
969 IF(CNVFLG(I).AND.K.LT.KBCON(I).AND.K.GE.KB(I)) THEN
970 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
971 ETA(I,k) = ETA(I,k+1) * EXP(-XLAMB(I) * DZ)
978 IF(CNVFLG(I).AND.KB(I).EQ.1.AND.KBCON(I).GT.1) THEN
979 DZ = .5 * (ZO(I,2) - ZO(I,1))
980 ETA(I,1) = ETA(I,2) * EXP(-XLAMB(I) * DZ)
985 ! WORK UP UPDRAFT CLOUD PROPERTIES
990 HCKO(I,INDX) = HKBO(I)
991 QCKO(I,INDX) = QKBO(I)
992 UCKO(I,INDX) = UKBO(I)
993 VCKO(I,INDX) = VKBO(I)
998 ! CLOUD PROPERTY BELOW CLOUD BASE IS MODIFIED BY THE ENTRAINMENT PROCES
1002 if (k .le. kmax(i)-1) then
1003 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
1004 FACTOR = ETA(I,k-1) / ETA(I,k)
1006 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1007 & .5 * (HEO(I,k) + HEO(I,k+1))
1008 UCKO(I,k) = FACTOR * UCKO(I,k-1) + ONEMF * &
1009 & .5 * (UO(I,k) + UO(I,k+1))
1010 VCKO(I,k) = FACTOR * VCKO(I,k-1) + ONEMF * &
1011 & .5 * (VO(I,k) + VO(I,k+1))
1012 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1014 IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
1015 HCKO(I,k) = HCKO(I,k-1)
1016 UCKO(I,k) = UCKO(I,k-1)
1017 VCKO(I,k) = VCKO(I,k-1)
1018 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1023 ! DETERMINE CLOUD TOP
1030 ! IF(DBYO(I,kK).GE.0..AND.FLG(I).AND.KK.GT.KBCON(I)) THEN
1037 if (k .le. kmax(i)) then
1038 IF(DBYO(I,k).LT.0..AND.FLG(I).AND.K.GT.KBCON(I)) THEN
1046 IF(CNVFLG(I).AND.(PFLD(I,KBCON(I)) - PFLD(I,KTCON(I))).LT.150.) &
1047 & CNVFLG(I) = .FALSE.
1051 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1055 ! SEARCH FOR DOWNDRAFT ORIGINATING LEVEL ABOVE THETA-E MINIMUM
1058 HMIN(I) = HEO(I,KBCON(I))
1063 DO K = KBCON(I), KBMAX(I)
1064 IF(HEO(I,k).LT.HMIN(I).AND.CNVFLG(I)) THEN
1071 ! Make sure that JMIN(I) is within the cloud
1075 JMIN(I) = MIN(LMIN(I),KTCON(I)-1)
1077 JMIN(I) = MAX(JMIN(I),KBCON(I)+1)
1085 if (k .le. kmax(i)-1) then
1086 if(CNVFLG(I).and.k.gt.JMIN(I).and.k.le.KTCON(I)) THEN
1087 SUMZ(I,k) = SUMZ(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1))
1088 SUMH(I,k) = SUMH(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1)) &
1097 ! call random_number(XKT2)
1100 KT2(I) = nint(XKT2(I)*float(KTCON(I)-JMIN(I))-.5)+JMIN(I)+1
1101 ! KT2(I) = nint(sqrt(XKT2(I))*float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
1102 ! KT2(I) = nint(ranf() *float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
1103 tem1 = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
1104 tem2 = (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
1105 if (abs(tem2) .gt. 0.000001) THEN
1106 XLAMB(I) = tem1 / tem2
1110 ! XLAMB(I) = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
1111 ! & / (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
1112 XLAMB(I) = max(XLAMB(I),RZERO)
1113 XLAMB(I) = min(XLAMB(I),2.3/SUMZ(I,KT2(I)))
1118 DWNFLG(I) = CNVFLG(I)
1119 DWNFLG2(I) = CNVFLG(I)
1121 if(KT2(I).ge.KTCON(I)) DWNFLG(I) = .false.
1122 if(XLAMB(I).le.1.e-30.or.HCKO(I,JMIN(I))-HESO(I,KT2(I)).le.1.e-30)&
1123 & DWNFLG(I) = .false.
1124 do k = JMIN(I), KT2(I)
1125 if(DWNFLG(I).and.HEO(I,k).gt.HESO(I,KT2(I))) DWNFLG(I)=.false.
1127 ! IF(CNVFLG(I).AND.(PFLD(KBCON(I))-PFLD(KTCON(I))).GT.PDETRN)
1128 ! & DWNFLG(I)=.FALSE.
1129 IF(CNVFLG(I).AND.(PFLD(I,KBCON(I))-PFLD(I,KTCON(I))).LT.PDPDWN) &
1130 & DWNFLG2(I)=.FALSE.
1136 if (k .le. kmax(i)-1) then
1137 IF(DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
1138 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1139 ! ETA(I,k) = ETA(I,k-1) * EXP( XLAMB(I) * DZ)
1140 ! to simplify matter, we will take the linear approach here
1142 ETA(I,k) = ETA(I,k-1) * (1. + XLAMB(I) * dz)
1143 ETAU(I,k) = ETAU(I,k-1) * (1. + (XLAMB(I)+xlambu) * dz)
1151 if (k .le. kmax(i)-1) then
1152 ! IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
1153 IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KTCON(I)) THEN
1154 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1155 ETAU(I,k) = ETAU(I,k-1) * (1. + xlambu * dz)
1160 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1161 ! PRINT *, ' LMIN(I), KT2(I)=', LMIN(I), KT2(I)
1162 ! PRINT *, ' KBOT, KTOP, JMIN(I) =', KBCON(I), KTCON(I), JMIN(I)
1164 ! IF(LAT.EQ.LATD.AND.lon.eq.lond) THEN
1165 ! print *, ' xlamb =', xlamb
1166 ! print *, ' eta =', (eta(k),k=1,KT2(I))
1167 ! print *, ' ETAU =', (ETAU(I,k),k=1,KT2(I))
1168 ! print *, ' HCKO =', (HCKO(I,k),k=1,KT2(I))
1169 ! print *, ' SUMZ =', (SUMZ(I,k),k=1,KT2(I))
1170 ! print *, ' SUMH =', (SUMH(I,k),k=1,KT2(I))
1178 ! CLOUD PROPERTY ABOVE CLOUD Base IS MODIFIED BY THE DETRAINMENT PROCESS
1182 if (k .le. kmax(i)-1) then
1184 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1185 !jfe IF(K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1186 FACTOR = ETA(I,k-1) / ETA(I,k)
1188 fuv = ETAU(I,k-1) / ETAU(I,k)
1190 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1191 & .5 * (HEO(I,k) + HEO(I,k+1))
1192 UCKO(I,k) = fuv * UCKO(I,k-1) + ONEMFu * &
1193 & .5 * (UO(I,k) + UO(I,k+1))
1194 VCKO(I,k) = fuv * VCKO(I,k-1) + ONEMFu * &
1195 & .5 * (VO(I,k) + VO(I,k+1))
1196 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1201 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1202 ! PRINT *, ' UCKO=', (UCKO(I,k),k=KBCON(I)+1,KTCON(I))
1203 ! PRINT *, ' uenv=', (.5*(UO(I,k)+UO(I,k-1)),k=KBCON(I)+1,KTCON(I))
1206 if(CNVFLG(I).and.DWNFLG2(I).and.JMIN(I).le.KBCON(I)) &
1210 DWNFLG2(I) = .false.
1216 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1221 ! COMPUTE CLOUD MOISTURE PROPERTY AND PRECIPITATION
1229 if (k .le. kmax(i)) then
1230 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
1231 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1232 DZ1 = (ZO(I,k) - ZO(I,k-1))
1233 GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
1235 & + GAMMA * DBYO(I,k) / (HVAP * (1. + GAMMA))
1236 FACTOR = ETA(I,k-1) / ETA(I,k)
1238 QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
1239 & .5 * (QO(I,k) + QO(I,k+1))
1240 DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * QRCH
1241 RHBAR(I) = RHBAR(I) + QO(I,k) / QESO(I,k)
1243 ! BELOW LFC CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
1246 ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
1247 QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
1248 AA1(I) = AA1(I) - DZ1 * G * QLK
1250 PWO(I,k) = ETAH * C0 * DZ * QLK
1252 PWAVO(I) = PWAVO(I) + PWO(I,k)
1259 RHBAR(I) = RHBAR(I) / float(KTCON(I) - KB(I) - 1)
1262 ! this section is ready for cloud water
1264 if(ncloud.gt.0) THEN
1266 ! compute liquid and vapor separation at cloud top
1271 GAMMA = EL2ORC * QESO(I,K) / (TO(I,K)**2)
1273 & + GAMMA * DBYO(I,K) / (HVAP * (1. + GAMMA))
1274 DQ = QCKO(I,K-1) - QRCH
1276 ! CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
1286 ! CALCULATE CLOUD WORK FUNCTION AT T+DT
1290 if (k .le. kmax(i)) then
1291 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1292 DZ1 = ZO(I,k) - ZO(I,k-1)
1293 GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
1294 RFACT = 1. + DELTA * CP * GAMMA &
1295 & * TO(I,k-1) / HVAP
1297 & DZ1 * (G / (CP * TO(I,k-1))) &
1298 & * DBYO(I,k-1) / (1. + GAMMA) &
1302 & DZ1 * G * DELTA * &
1303 !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
1304 & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
1310 IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG(I) = .FALSE.
1311 IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
1312 IF(CNVFLG(I).AND.AA1(I).LE.0.) CNVFLG(I) = .FALSE.
1317 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1321 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1322 !cccc PRINT *, ' AA1(I) BEFORE DWNDRFT =', AA1(I)
1325 !------- DOWNDRAFT CALCULATIONS
1328 !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
1337 if (k .le. kmax(i)) then
1338 IF(K.GE.KB(I).AND.K.LE.KTCON(I).AND.CNVFLG(I)) THEN
1339 shear=rcs(I) * sqrt((UO(I,k+1)-UO(I,k)) ** 2 &
1340 & + (VO(I,k+1)-VO(I,k)) ** 2)
1341 VSHEAR(I) = VSHEAR(I) + SHEAR
1349 KNUMB = KTCON(I) - KB(I) + 1
1350 KNUMB = MAX(KNUMB,1)
1351 VSHEAR(I) = 1.E3 * VSHEAR(I) / (ZO(I,KTCON(I))-ZO(I,KB(I)))
1352 E1=1.591-.639*VSHEAR(I) &
1353 & +.0953*(VSHEAR(I)**2)-.00496*(VSHEAR(I)**3)
1355 !cmr EDT(I) = MIN(EDT(I),.9)
1357 EDT(I) = MIN(EDT(I),val)
1358 !cmr EDT(I) = MAX(EDT(I),.0)
1360 EDT(I) = MAX(EDT(I),val)
1365 ! DETERMINE DETRAINMENT RATE BETWEEN 1 AND KBDTR
1369 if(SLIMSK(I).eq.1.) beta = betal
1372 KBDTR(I) = MAX(KBDTR(I),1)
1374 IF(KBDTR(I).GT.1) THEN
1375 DZ = .5 * ZO(I,KBDTR(I)) + .5 * ZO(I,KBDTR(I)-1) &
1377 XLAMD(I) = LOG(BETA) / DZ
1381 ! DETERMINE DOWNDRAFT MASS FLUX
1384 IF(k .le. kmax(i)) then
1394 if (k .le. kbmax(i)) then
1395 IF(CNVFLG(I).AND.K.LT.KBDTR(I)) THEN
1396 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1397 ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
1404 IF(CNVFLG(I).AND.KBDTR(I).GT.1) THEN
1405 DZ = .5 * (ZO(I,2) - ZO(I,1))
1406 ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
1410 !--- DOWNDRAFT MOISTURE PROPERTIES
1419 HCDO(I) = HEO(I,JMN)
1421 QRCDO(I,JMN) = QESO(I,JMN)
1428 if (k .le. kmax(i)-1) then
1429 IF(CNVFLG(I).AND.K.LT.JMIN(I)) THEN
1432 GAMMA = EL2ORC * DQ / DT**2
1433 DH = HCDO(I) - HESO(I,k)
1434 QRCDO(I,k) = DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
1435 DETAD = ETAD(I,k+1) - ETAD(I,k)
1436 PWDO(I,k) = ETAD(I,k+1) * QCDO(I) - &
1437 & ETAD(I,k) * QRCDO(I,k)
1438 PWDO(I,k) = PWDO(I,k) - DETAD * &
1439 & .5 * (QRCDO(I,k) + QRCDO(I,k+1))
1440 QCDO(I) = QRCDO(I,k)
1441 PWEVO(I) = PWEVO(I) + PWDO(I,k)
1446 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG(I)) THEN
1447 ! PRINT *, ' PWAVO(I), PWEVO(I) =', PWAVO(I), PWEVO(I)
1450 !--- FINAL DOWNDRAFT STRENGTH DEPENDENT ON PRECIP
1451 !--- EFFICIENCY (EDT), NORMALIZED CONDENSATE (PWAV), AND
1452 !--- EVAPORATE (PWEV)
1456 if(SLIMSK(I).eq.0.) edtmax = edtmaxs
1458 IF(PWEVO(I).LT.0.) THEN
1459 EDTO(I) = -EDTO(I) * PWAVO(I) / PWEVO(I)
1460 EDTO(I) = MIN(EDTO(I),EDTMAX)
1470 !--- DOWNDRAFT CLOUDWORK FUNCTIONS
1475 if (k .le. kmax(i)-1) then
1476 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1477 GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
1482 DZ=-1.*(ZO(I,k+1)-ZO(I,k))
1483 AA1(I)=AA1(I)+EDTO(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
1484 & *(1.+DELTA*CP*DG*DT/HVAP)
1486 AA1(I)=AA1(I)+EDTO(I)* &
1487 !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
1488 & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
1493 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
1494 !cccc PRINT *, ' AA1(I) AFTER DWNDRFT =', AA1(I)
1497 IF(AA1(I).LE.0.) CNVFLG(I) = .FALSE.
1498 IF(AA1(I).LE.0.) DWNFLG(I) = .FALSE.
1499 IF(AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
1504 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1510 !--- WHAT WOULD THE CHANGE BE, THAT A CLOUD WITH UNIT MASS
1511 !--- WILL DO TO THE ENVIRONMENT?
1515 IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1525 DP = 1000. * DEL(I,1)
1526 DELLAH(I,1) = EDTO(I) * ETAD(I,1) * (HCDO(I) &
1527 & - HEO(I,1)) * G / DP
1528 DELLAQ(I,1) = EDTO(I) * ETAD(I,1) * (QCDO(I) &
1529 & - QO(I,1)) * G / DP
1530 DELLAU(I,1) = EDTO(I) * ETAD(I,1) * (UCDO(I) &
1531 & - UO(I,1)) * G / DP
1532 DELLAV(I,1) = EDTO(I) * ETAD(I,1) * (VCDO(I) &
1533 & - VO(I,1)) * G / DP
1537 !--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT
1541 if (k .le. kmax(i)-1) then
1542 IF(CNVFLG(I).AND.K.LT.KTCON(I)) THEN
1544 IF(K.LE.KB(I)) AUP = 0.
1546 IF(K.GT.JMIN(I)) ADW = 0.
1548 DV2 = .5 * (HEO(I,k) + HEO(I,k+1))
1551 DV2Q = .5 * (QO(I,k) + QO(I,k+1))
1554 DV2U = .5 * (UO(I,k) + UO(I,k+1))
1557 DV2V = .5 * (VO(I,k) + VO(I,k+1))
1559 DP = 1000. * DEL(I,K)
1560 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1561 DETA = ETA(I,k) - ETA(I,k-1)
1562 DETAD = ETAD(I,k) - ETAD(I,k-1)
1563 DELLAH(I,k) = DELLAH(I,k) + &
1564 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1 &
1565 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3 &
1566 & - AUP * DETA * DV2 &
1567 & + ADW * EDTO(I) * DETAD * HCDO(I)) * G / DP
1568 DELLAQ(I,k) = DELLAQ(I,k) + &
1569 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1Q &
1570 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3Q &
1571 & - AUP * DETA * DV2Q &
1572 & +ADW*EDTO(I)*DETAD*.5*(QRCDO(I,k)+QRCDO(I,k-1))) * G / DP
1573 DELLAU(I,k) = DELLAU(I,k) + &
1574 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1U &
1575 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3U &
1576 & - AUP * DETA * DV2U &
1577 & + ADW * EDTO(I) * DETAD * UCDO(I) &
1579 DELLAV(I,k) = DELLAV(I,k) + &
1580 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1V &
1581 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3V &
1582 & - AUP * DETA * DV2V &
1583 & + ADW * EDTO(I) * DETAD * VCDO(I) &
1595 DP = 1000. * DEL(I,INDX)
1597 DELLAH(I,INDX) = ETA(I,INDX-1) * &
1598 & (HCKO(I,INDX-1) - DV1) * G / DP
1600 DELLAQ(I,INDX) = ETA(I,INDX-1) * &
1601 & (QCKO(I,INDX-1) - DVQ1) * G / DP
1603 DELLAU(I,INDX) = ETA(I,INDX-1) * &
1604 & (UCKO(I,INDX-1) - DV1U) * G / DP
1606 DELLAV(I,INDX) = ETA(I,INDX-1) * &
1607 & (VCKO(I,INDX-1) - DV1V) * G / DP
1611 DELLAL(I) = ETA(I,INDX-1) * QLKO_KTCON(I) * g / dp
1615 !------- FINAL CHANGED VARIABLE PER UNIT MASS FLUX
1619 if (k .le. kmax(i)) then
1620 IF(CNVFLG(I).and.k.gt.KTCON(I)) THEN
1626 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
1627 QO(I,k) = DELLAQ(I,k) * MBDT + Q1(I,k)
1628 DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
1629 TO(I,k) = DELLAT * MBDT + T1(I,k)
1630 !cmr QO(I,k) = max(QO(I,k),1.e-10)
1632 QO(I,k) = max(QO(I,k), val )
1637 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1639 !--- THE ABOVE CHANGED ENVIRONMENT IS NOW USED TO CALULATE THE
1640 !--- EFFECT THE ARBITRARY CLOUD (WITH UNIT MASS FLUX)
1641 !--- WOULD HAVE ON THE STABILITY,
1642 !--- WHICH THEN IS USED TO CALCULATE THE REAL MASS FLUX,
1643 !--- NECESSARY TO KEEP THIS CHANGE IN BALANCE WITH THE LARGE-SCALE
1644 !--- DESTABILIZATION.
1646 !--- ENVIRONMENTAL CONDITIONS AGAIN, FIRST HEIGHTS
1650 IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1651 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
1653 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
1655 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k)+EPSM1*QESO(I,k))
1656 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
1658 QESO(I,k) = MAX(QESO(I,k), val )
1659 TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
1670 ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
1673 ! IF(CNVFLG(I)) THEN
1674 ! DLNSIG = LOG(PRSL(I,1)/PS(I))
1675 ! ZO(I,1) = TERR - DLNSIG * RD / G * TVO(I,1)
1680 ! IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1681 ! DLNSIG = LOG(PRSL(I,K) / PRSL(I,K-1))
1682 ! ZO(I,k) = ZO(I,k-1) - DLNSIG * RD / G
1683 ! & * .5 * (TVO(I,k) + TVO(I,k-1))
1688 !--- MOIST STATIC ENERGY
1692 IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
1693 DZ = .5 * (ZO(I,k+1) - ZO(I,k))
1694 DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
1695 !jfe ES = 10. * FPVS(TO(I,k+1))
1697 ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
1699 PPRIME = PFLD(I,k+1) + EPSM1 * ES
1700 QS = EPS * ES / PPRIME
1701 DQSDP = - QS / PPRIME
1702 DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
1703 DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
1704 GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
1705 DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
1706 DQ = DQSDT * DT + DQSDP * DP
1707 TO(I,k) = TO(I,k+1) + DT
1708 QO(I,k) = QO(I,k+1) + DQ
1709 PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
1715 IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
1716 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
1718 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
1720 QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1 * QESO(I,k))
1721 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
1723 QESO(I,k) = MAX(QESO(I,k), val1)
1724 !cmr QO(I,k) = max(QO(I,k),1.e-10)
1726 QO(I,k) = max(QO(I,k), val2 )
1727 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
1728 HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
1729 & CP * TO(I,k) + HVAP * QO(I,k)
1730 HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
1731 & CP * TO(I,k) + HVAP * QESO(I,k)
1738 HEO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QO(I,k)
1739 HESO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QESO(I,k)
1740 ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
1746 XHKB(I) = HEO(I,INDX)
1747 XQKB(I) = QO(I,INDX)
1748 HCKO(I,INDX) = XHKB(I)
1749 QCKO(I,INDX) = XQKB(I)
1754 !**************************** STATIC CONTROL
1757 !------- MOISTURE AND CLOUD WORK FUNCTIONS
1761 if (k .le. kmax(i)-1) then
1762 ! IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
1763 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KTCON(I)) THEN
1764 FACTOR = ETA(I,k-1) / ETA(I,k)
1766 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1767 & .5 * (HEO(I,k) + HEO(I,k+1))
1769 ! IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
1770 ! HEO(I,k) = HEO(I,k-1)
1777 if (k .le. kmax(i)-1) then
1778 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
1779 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1780 GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
1781 XDBY = HCKO(I,k) - HESO(I,k)
1782 !cmr XDBY = MAX(XDBY,0.)
1784 XDBY = MAX(XDBY,val)
1786 & + GAMMA * XDBY / (HVAP * (1. + GAMMA))
1787 FACTOR = ETA(I,k-1) / ETA(I,k)
1789 QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
1790 & .5 * (QO(I,k) + QO(I,k+1))
1791 DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * XQRCH
1793 ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
1794 QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
1795 XAA0(I) = XAA0(I) - (ZO(I,k) - ZO(I,k-1)) * G * QLK
1797 XPW = ETAH * C0 * DZ * QLK
1799 XPWAV(I) = XPWAV(I) + XPW
1802 ! IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LT.KTCON(I)) THEN
1803 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1804 DZ1 = ZO(I,k) - ZO(I,k-1)
1805 GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
1806 RFACT = 1. + DELTA * CP * GAMMA &
1807 & * TO(I,k-1) / HVAP
1808 XDBY = HCKO(I,k-1) - HESO(I,k-1)
1810 & + DZ1 * (G / (CP * TO(I,k-1))) &
1811 & * XDBY / (1. + GAMMA) &
1815 & DZ1 * G * DELTA * &
1816 !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
1817 & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
1822 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1823 !cccc PRINT *, ' XAA BEFORE DWNDRFT =', XAA0(I)
1826 !------- DOWNDRAFT CALCULATIONS
1829 !--- DOWNDRAFT MOISTURE PROPERTIES
1837 XHCD(I) = HEO(I,JMN)
1839 QRCD(I,JMN) = QESO(I,JMN)
1844 if (k .le. kmax(i)-1) then
1845 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1848 GAMMA = EL2ORC * DQ / DT**2
1849 DH = XHCD(I) - HESO(I,k)
1850 QRCD(I,k)=DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
1851 DETAD = ETAD(I,k+1) - ETAD(I,k)
1852 XPWD = ETAD(I,k+1) * QRCD(I,k+1) - &
1853 & ETAD(I,k) * QRCD(I,k)
1854 XPWD = XPWD - DETAD * &
1855 & .5 * (QRCD(I,k) + QRCD(I,k+1))
1856 XPWEV(I) = XPWEV(I) + XPWD
1864 if(SLIMSK(I).eq.0.) edtmax = edtmaxs
1866 IF(XPWEV(I).GE.0.) THEN
1869 EDTX(I) = -EDTX(I) * XPWAV(I) / XPWEV(I)
1870 EDTX(I) = MIN(EDTX(I),EDTMAX)
1879 !--- DOWNDRAFT CLOUDWORK FUNCTIONS
1884 if (k .le. kmax(i)-1) then
1885 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1886 GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
1891 DZ=-1.*(ZO(I,k+1)-ZO(I,k))
1892 XAA0(I)=XAA0(I)+EDTX(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
1893 & *(1.+DELTA*CP*DG*DT/HVAP)
1895 XAA0(I)=XAA0(I)+EDTX(I)* &
1896 !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
1897 & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
1902 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
1903 !cccc PRINT *, ' XAA AFTER DWNDRFT =', XAA0(I)
1906 ! CALCULATE CRITICAL CLOUD WORK FUNCTION
1911 ! IF(CNVFLG(I).AND.SLIMSK(I).NE.1.) THEN
1912 IF(PFLD(I,KTCON(I)).LT.PCRIT(15))THEN
1913 ACRT(I)=ACRIT(15)*(975.-PFLD(I,KTCON(I))) &
1915 ELSE IF(PFLD(I,KTCON(I)).GT.PCRIT(1))THEN
1918 !cmr K = IFIX((850. - PFLD(I,KTCON(I)))/50.) + 2
1919 K = int((850. - PFLD(I,KTCON(I)))/50.) + 2
1922 ACRT(I)=ACRIT(K)+(ACRIT(K-1)-ACRIT(K))* &
1923 & (PFLD(I,KTCON(I))-PCRIT(K))/(PCRIT(K-1)-PCRIT(K))
1926 ! ACRT(I) = .5 * (PFLD(I,KBCON(I)) - PFLD(I,KTCON(I)))
1932 if(SLIMSK(I).eq.1.) THEN
1943 !C IF(CNVFLG(I).AND.SLIMSK(I).EQ.1.) THEN
1944 ! ACRTFCT(I) = PDOT(I) / W3
1946 ! modify critical cloud workfunction by cloud base vertical velocity
1948 IF(PDOT(I).LE.W4) THEN
1949 ACRTFCT(I) = (PDOT(I) - W4) / (W3 - W4)
1950 ELSEIF(PDOT(I).GE.-W4) THEN
1951 ACRTFCT(I) = - (PDOT(I) + W4) / (W4 - W3)
1955 !cmr ACRTFCT(I) = MAX(ACRTFCT(I),-1.)
1957 ACRTFCT(I) = MAX(ACRTFCT(I),val1)
1958 !cmr ACRTFCT(I) = MIN(ACRTFCT(I),1.)
1960 ACRTFCT(I) = MIN(ACRTFCT(I),val2)
1961 ACRTFCT(I) = 1. - ACRTFCT(I)
1963 ! modify ACRTFCT(I) by colume mean rh if RHBAR(I) is greater than 80 percent
1965 ! if(RHBAR(I).ge..8) THEN
1966 ! ACRTFCT(I) = ACRTFCT(I) * (.9 - min(RHBAR(I),.9)) * 10.
1969 ! modify adjustment time scale by cloud base vertical velocity
1971 DTCONV(I) = DT2 + max((1800. - DT2),RZERO) * &
1972 & (PDOT(I) - W2) / (W1 - W2)
1973 ! DTCONV(I) = MAX(DTCONV(I), DT2)
1974 ! DTCONV(I) = 1800. * (PDOT(I) - w2) / (w1 - w2)
1975 DTCONV(I) = max(DTCONV(I),dtmin)
1976 DTCONV(I) = min(DTCONV(I),dtmax)
1981 !--- LARGE SCALE FORCING
1986 ! F = AA1(I) / DTCONV(I)
1987 FLD(I) = (AA1(I) - ACRT(I) * ACRTFCT(I)) / DTCONV(I)
1988 IF(FLD(I).LE.0.) FLG(I) = .FALSE.
1992 ! XAA0(I) = MAX(XAA0(I),0.)
1993 XK(I) = (XAA0(I) - AA1(I)) / MBDT
1994 IF(XK(I).GE.0.) FLG(I) = .FALSE.
1997 !--- KERNEL, CLOUD BASE MASS FLUX
2001 XMB(I) = -FLD(I) / XK(I)
2002 XMB(I) = MIN(XMB(I),XMBMAX(I))
2005 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
2006 ! print *, ' RHBAR(I), ACRTFCT(I) =', RHBAR(I), ACRTFCT(I)
2007 ! PRINT *, ' A1, XA =', AA1(I), XAA0(I)
2008 ! PRINT *, ' XMB(I), ACRT =', XMB(I), ACRT
2012 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
2016 ! restore t0 and QO to t1 and q1 in case convection stops
2020 if (k .le. kmax(i)) then
2023 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
2025 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
2027 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
2028 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
2030 QESO(I,k) = MAX(QESO(I,k), val )
2034 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2036 !--- FEEDBACK: SIMPLY THE CHANGES FROM THE CLOUD WITH UNIT MASS FLUX
2037 !--- MULTIPLIED BY THE MASS FLUX NECESSARY TO KEEP THE
2038 !--- EQUILIBRIUM WITH THE LARGER-SCALE.
2048 if (k .le. kmax(i)) then
2049 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2051 IF(K.Le.KB(I)) AUP = 0.
2053 IF(K.GT.JMIN(I)) ADW = 0.
2054 DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
2055 T1(I,k) = T1(I,k) + DELLAT * XMB(I) * DT2
2056 Q1(I,k) = Q1(I,k) + DELLAQ(I,k) * XMB(I) * DT2
2057 U1(I,k) = U1(I,k) + DELLAU(I,k) * XMB(I) * DT2
2058 V1(I,k) = V1(I,k) + DELLAV(I,k) * XMB(I) * DT2
2059 DP = 1000. * DEL(I,K)
2060 DELHBAR(I) = DELHBAR(I) + DELLAH(I,k)*XMB(I)*DP/G
2061 DELQBAR(I) = DELQBAR(I) + DELLAQ(I,k)*XMB(I)*DP/G
2062 DELTBAR(I) = DELTBAR(I) + DELLAT*XMB(I)*DP/G
2069 if (k .le. kmax(i)) then
2070 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2071 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
2073 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
2075 QESO(I,k) = EPS * QESO(I,k)/(PFLD(I,k) + EPSM1*QESO(I,k))
2076 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
2078 QESO(I,k) = MAX(QESO(I,k), val )
2082 if(ncloud.gt.0.and.CNVFLG(I).and.k.eq.KTCON(I)) THEN
2083 tem = DELLAL(I) * XMB(I) * dt2
2084 tem1 = MAX(RZERO, MIN(RONE, (TCR-t1(I,K))*TCRF))
2085 if (QL(I,k,2) .gt. -999.0) then
2086 QL(I,k,1) = QL(I,k,1) + tem * tem1 ! Ice
2087 QL(I,k,2) = QL(I,k,2) + tem *(1.0-tem1) ! Water
2089 tem2 = QL(I,k,1) + tem
2090 QL(I,k,1) = tem2 * tem1 ! Ice
2091 QL(I,k,2) = tem2 - QL(I,k,1) ! Water
2093 ! QL(I,k) = QL(I,k) + DELLAL(I) * XMB(I) * dt2
2094 dp = 1000. * del(i,k)
2095 DELLAL(I) = DELLAL(I) * XMB(I) * dp / g
2101 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
2102 ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
2103 ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
2104 ! PRINT *, ' DELLBAR ='
2105 ! PRINT 6003, HVAP*DELLbar
2106 ! PRINT *, ' DELLAQ ='
2107 ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
2108 ! PRINT *, ' DELLAT ='
2109 ! PRINT 6003, (DELLAH(i,k)*XMB(I)-HVAP*DELLAQ(I,k)*XMB(I), &
2120 if (k .le. kmax(i)) then
2121 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2123 IF(K.Le.KB(I)) AUP = 0.
2125 IF(K.GT.JMIN(I)) ADW = 0.
2126 rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
2127 RNTOT(I) = RNTOT(I) + rain * XMB(I) * .001 * dt2
2134 if (k .le. kmax(i)) then
2138 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2140 IF(K.Le.KB(I)) AUP = 0.
2142 IF(K.GT.JMIN(I)) ADW = 0.
2143 rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
2144 RN(I) = RN(I) + rain * XMB(I) * .001 * dt2
2146 IF(FLG(I).AND.K.LE.KTCON(I)) THEN
2147 evef = EDT(I) * evfact
2148 if(SLIMSK(I).eq.1.) evef=EDT(I) * evfactl
2149 ! if(SLIMSK(I).eq.1.) evef=.07
2150 ! if(SLIMSK(I).ne.1.) evef = 0.
2151 QCOND(I) = EVEF * (Q1(I,k) - QESO(I,k)) &
2152 & / (1. + EL2ORC * QESO(I,k) / T1(I,k)**2)
2153 DP = 1000. * DEL(I,K)
2154 IF(RN(I).GT.0..AND.QCOND(I).LT.0.) THEN
2155 QEVAP(I) = -QCOND(I) * (1.-EXP(-.32*SQRT(DT2*RN(I))))
2156 QEVAP(I) = MIN(QEVAP(I), RN(I)*1000.*G/DP)
2157 DELQ2(I) = DELQEV(I) + .001 * QEVAP(I) * dp / g
2159 if(RN(I).gt.0..and.QCOND(I).LT.0..and. &
2160 & DELQ2(I).gt.RNTOT(I)) THEN
2161 QEVAP(I) = 1000.* g * (RNTOT(I) - DELQEV(I)) / dp
2164 IF(RN(I).GT.0..AND.QEVAP(I).gt.0.) THEN
2165 Q1(I,k) = Q1(I,k) + QEVAP(I)
2166 T1(I,k) = T1(I,k) - ELOCP * QEVAP(I)
2167 RN(I) = RN(I) - .001 * QEVAP(I) * DP / G
2168 DELTV(I) = - ELOCP*QEVAP(I)/DT2
2169 DELQ(I) = + QEVAP(I)/DT2
2170 DELQEV(I) = DELQEV(I) + .001*dp*QEVAP(I)/g
2172 DELLAQ(I,k) = DELLAQ(I,k) + DELQ(I) / XMB(I)
2173 DELQBAR(I) = DELQBAR(I) + DELQ(I)*DP/G
2174 DELTBAR(I) = DELTBAR(I) + DELTV(I)*DP/G
2179 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
2180 ! PRINT *, ' DELLAH ='
2181 ! PRINT 6003, (DELLAH(k)*XMB(I),K=1,KMAX)
2182 ! PRINT *, ' DELLAQ ='
2183 ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
2184 ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
2185 ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
2186 ! PRINT *, ' PRECIP =', HVAP*RN(I)*1000./DT2
2187 !CCCC PRINT *, ' DELLBAR ='
2188 !CCCC PRINT *, HVAP*DELLbar
2191 ! PRECIPITATION RATE CONVERTED TO ACTUAL PRECIP
2192 ! IN UNIT OF M INSTEAD OF KG
2197 ! IN THE EVENT OF UPPER LEVEL RAIN EVAPORATION AND LOWER LEVEL DOWNDRAF
2198 ! MOISTENING, RN CAN BECOME NEGATIVE, IN THIS CASE, WE BACK OUT OF TH
2199 ! HEATING AND THE MOISTENING
2201 if(RN(I).lt.0..and..not.FLG(I)) RN(I) = 0.
2202 IF(RN(I).LE.0.) THEN
2214 if (k .le. kmax(i)) then
2215 IF(CNVFLG(I).AND.RN(I).LE.0.) THEN
2224 END SUBROUTINE SASCNV
2226 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2228 SUBROUTINE SHALCV(IM,IX,KM,DT,DEL,PRSI,PRSL,PRSLK,KUO,Q,T,DPSHC)
2230 USE MODULE_GFS_MACHINE , ONLY : kind_phys
2231 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
2236 ! include 'constant.h'
2238 integer IM, IX, KM, KUO(IM)
2239 real(kind=kind_phys) DEL(IX,KM), PRSI(IX,KM+1), PRSL(IX,KM), &
2241 & Q(IX,KM), T(IX,KM), DT, DPSHC
2245 real(kind=kind_phys) ck, cpdt, dmse, dsdz1, dsdz2, &
2246 & dsig, dtodsl, dtodsu, eldq, g, &
2249 integer k,k1,k2,kliftl,kliftu,kt,N2,I,iku,ik1,ik,ii
2250 integer INDEX2(IM), KLCL(IM), KBOT(IM), KTOP(IM),kk &
2253 ! PHYSICAL PARAMETERS
2254 PARAMETER(G=GRAV, GOCP=G/CP)
2255 ! BOUNDS OF PARCEL ORIGIN
2256 PARAMETER(KLIFTL=2,KLIFTU=2)
2258 real(kind=kind_phys) Q2(IM*KM), T2(IM*KM), &
2259 & PRSL2(IM*KM), PRSLK2(IM*KM), &
2260 & AL(IM*(KM-1)), AD(IM*KM), AU(IM*(KM-1))
2261 !-----------------------------------------------------------------------
2262 ! COMPRESS FIELDS TO POINTS WITH NO DEEP CONVECTION
2263 ! AND MOIST STATIC INSTABILITY.
2269 IF(KUO(I).EQ.0) THEN
2270 ELDQ = HVAP*(Q(I,K)-Q(I,K+1))
2271 CPDT = CP*(T(I,K)-T(I,K+1))
2272 RTDLS = (PRSL(I,K)-PRSL(I,K+1)) / &
2273 & PRSI(I,K+1)*RD*0.5*(T(I,K)+T(I,K+1))
2274 DMSE = ELDQ+CPDT-RTDLS
2275 LSHC(I) = LSHC(I).OR.DMSE.GT.0.
2294 PRSL2(IK) = PRSL(II,K)
2295 PRSLK2(IK) = PRSLK(II,K)
2304 if (prsi(ii,1)-prsi(ii,k) .le. dpshc) ktopm(i) = k
2308 !-----------------------------------------------------------------------
2309 ! COMPUTE MOIST ADIABAT AND DETERMINE LIMITS OF SHALLOW CONVECTION.
2310 ! CHECK FOR MOIST STATIC INSTABILITY AGAIN WITHIN CLOUD.
2311 CALL MSTADBT3(N2,KM-1,KLIFTL,KLIFTU,PRSL2,PRSLK2,T2,Q2, &
2312 & KLCL,KBOT,KTOP,AL,AU)
2314 KBOT(I) = min(KLCL(I)-1, ktopm(i)-1)
2315 KTOP(I) = min(KTOP(I)+1, ktopm(i))
2321 IF(K.GE.KBOT(I).AND.K.LT.KTOP(I)) THEN
2324 ELDQ = HVAP * (Q2(IK)-Q2(IKU))
2325 CPDT = CP * (T2(IK)-T2(IKU))
2326 RTDLS = (PRSL2(IK)-PRSL2(IKU)) / &
2327 & PRSI(index2(i),K+1)*RD*0.5*(T2(IK)+T2(IKU))
2328 DMSE = ELDQ + CPDT - RTDLS
2329 LSHC(I) = LSHC(I).OR.DMSE.GT.0.
2337 IF(.NOT.LSHC(I)) THEN
2341 K1 = MIN(K1,KBOT(I))
2342 K2 = MAX(K2,KTOP(I))
2346 !-----------------------------------------------------------------------
2347 ! SET EDDY VISCOSITY COEFFICIENT CKU AT SIGMA INTERFACES.
2348 ! COMPUTE DIAGONALS AND RHS FOR TRIDIAGONAL MATRIX SOLVER.
2349 ! EXPAND FINAL FIELDS.
2359 ! DTODSU= DT/DEL(K+1)
2360 ! DSIG=SL(K)-SL(K+1)
2364 DTODSL = DT/DEL(II,K)
2365 DTODSU = DT/DEL(II,K+1)
2366 DSIG = PRSL(II,K) - PRSL(II,K+1)
2369 IF(K.EQ.KBOT(I)) THEN
2371 ELSEIF(K.EQ.KTOP(I)-1) THEN
2373 ELSEIF(K.EQ.KTOP(I)-2) THEN
2375 ELSEIF(K.GT.KBOT(I).AND.K.LT.KTOP(I)-2) THEN
2380 DSDZ1 = CK*DSIG*AU(IK)*GOCP
2381 DSDZ2 = CK*DSIG*AU(IK)*AU(IK)
2382 AU(IK) = -DTODSL*DSDZ2
2383 AL(IK) = -DTODSU*DSDZ2
2384 AD(IK) = AD(IK)-AU(IK)
2386 T2(IK) = T2(IK)+DTODSL*DSDZ1
2387 T2(IKU) = T2(IKU)-DTODSU*DSDZ1
2391 CALL TRIDI2T3(N2,KT,AL(IK1),AD(IK1),AU(IK1),Q2(IK1),T2(IK1), &
2392 & AU(IK1),Q2(IK1),T2(IK1))
2397 Q(INDEX2(I),K) = Q2(IK)
2398 T(INDEX2(I),K) = T2(IK)
2401 !-----------------------------------------------------------------------
2403 END SUBROUTINE SHALCV
2404 !-----------------------------------------------------------------------
2405 SUBROUTINE TRIDI2T3(L,N,CL,CM,CU,R1,R2,AU,A1,A2)
2406 !yt INCLUDE DBTRIDI2;
2408 USE MODULE_GFS_MACHINE , ONLY : kind_phys
2411 real(kind=kind_phys) fk
2413 real(kind=kind_phys) &
2414 & CL(L,2:N),CM(L,N),CU(L,N-1),R1(L,N),R2(L,N), &
2415 & AU(L,N-1),A1(L,N),A2(L,N)
2416 !-----------------------------------------------------------------------
2425 FK=1./(CM(I,K)-CL(I,K)*AU(I,K-1))
2427 A1(I,K)=FK*(R1(I,K)-CL(I,K)*A1(I,K-1))
2428 A2(I,K)=FK*(R2(I,K)-CL(I,K)*A2(I,K-1))
2432 FK=1./(CM(I,N)-CL(I,N)*AU(I,N-1))
2433 A1(I,N)=FK*(R1(I,N)-CL(I,N)*A1(I,N-1))
2434 A2(I,N)=FK*(R2(I,N)-CL(I,N)*A2(I,N-1))
2438 A1(I,K)=A1(I,K)-AU(I,K)*A1(I,K+1)
2439 A2(I,K)=A2(I,K)-AU(I,K)*A2(I,K+1)
2442 !-----------------------------------------------------------------------
2444 END SUBROUTINE TRIDI2T3
2445 !-----------------------------------------------------------------------
2447 SUBROUTINE MSTADBT3(IM,KM,K1,K2,PRSL,PRSLK,TENV,QENV, &
2448 & KLCL,KBOT,KTOP,TCLD,QCLD)
2449 !yt INCLUDE DBMSTADB;
2451 USE MODULE_GFS_MACHINE, ONLY : kind_phys
2452 USE MODULE_GFS_FUNCPHYS, ONLY : FTDP, FTHE, FTLCL, STMA
2453 USE MODULE_GFS_PHYSCONS, EPS => con_eps, EPSM1 => con_epsm1, FV => con_FVirt
2457 ! include 'constant.h'
2459 integer k,k1,k2,km,i,im
2460 real(kind=kind_phys) pv,qma,slklcl,tdpd,thelcl,tlcl
2461 real(kind=kind_phys) tma,tvcld,tvenv
2463 real(kind=kind_phys) PRSL(IM,KM), PRSLK(IM,KM), TENV(IM,KM), &
2464 & QENV(IM,KM), TCLD(IM,KM), QCLD(IM,KM)
2465 INTEGER KLCL(IM), KBOT(IM), KTOP(IM)
2467 real(kind=kind_phys) SLKMA(IM), THEMA(IM)
2468 !-----------------------------------------------------------------------
2469 ! DETERMINE WARMEST POTENTIAL WET-BULB TEMPERATURE BETWEEN K1 AND K2.
2470 ! COMPUTE ITS LIFTING CONDENSATION LEVEL.
2478 PV = 1000.0 * PRSL(I,K)*QENV(I,K)/(EPS-EPSM1*QENV(I,K))
2479 TDPD = TENV(I,K)-FTDP(PV)
2481 TLCL = FTLCL(TENV(I,K),TDPD)
2482 SLKLCL = PRSLK(I,K)*TLCL/TENV(I,K)
2487 THELCL=FTHE(TLCL,SLKLCL)
2488 IF(THELCL.GT.THEMA(I)) THEN
2494 !-----------------------------------------------------------------------
2495 ! SET CLOUD TEMPERATURES AND HUMIDITIES WHEREVER THE PARCEL LIFTED UP
2496 ! THE MOIST ADIABAT IS BUOYANT WITH RESPECT TO THE ENVIRONMENT.
2510 IF(PRSLK(I,K).LE.SLKMA(I)) THEN
2511 KLCL(I)=MIN(KLCL(I),K)
2512 CALL STMA(THEMA(I),PRSLK(I,K),TMA,QMA)
2513 ! TMA=FTMA(THEMA(I),PRSLK(I,K),QMA)
2514 TVCLD=TMA*(1.+FV*QMA)
2515 TVENV=TENV(I,K)*(1.+FV*QENV(I,K))
2516 IF(TVCLD.GT.TVENV) THEN
2517 KBOT(I)=MIN(KBOT(I),K)
2518 KTOP(I)=MAX(KTOP(I),K)
2519 TCLD(I,K)=TMA-TENV(I,K)
2520 QCLD(I,K)=QMA-QENV(I,K)
2525 !-----------------------------------------------------------------------
2527 END SUBROUTINE MSTADBT3
2530 ! random seeds - ZCX
2531 SUBROUTINE init_random_seed()
2532 INTEGER :: i, n, clock
2533 INTEGER, DIMENSION(:), ALLOCATABLE :: seed
2535 CALL RANDOM_SEED(size = n)
2538 CALL SYSTEM_CLOCK(COUNT=clock)
2540 seed = clock + 37 * (/ (i - 1, i = 1, n) /)
2541 CALL RANDOM_SEED(PUT = seed)
2546 END MODULE module_cu_sas