6 !-----------------------------------------------------------------
7 SUBROUTINE CU_OSAS(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, &
20 ids,ide, jds,jde, kds,kde, &
21 ims,ime, jms,jme, kms,kme, &
22 its,ite, jts,jte, kts,kte )
24 !-------------------------------------------------------------------
25 USE MODULE_GFS_MACHINE , ONLY : kind_phys
26 USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys
27 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
28 &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
29 &, CVAP => con_CVAP, CLIQ => con_CLIQ &
30 &, EPS => con_eps, EPSM1 => con_epsm1 &
31 &, ROVCP => con_rocp, RD => con_rd
32 !-------------------------------------------------------------------
34 !-------------------------------------------------------------------
35 !-- U3D 3D u-velocity interpolated to theta points (m/s)
36 !-- V3D 3D v-velocity interpolated to theta points (m/s)
37 !-- TH3D 3D potential temperature (K)
38 !-- T3D temperature (K)
39 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
40 !-- QC3D 3D cloud mixing ratio (Kg/Kg)
41 !-- QI3D 3D ice mixing ratio (Kg/Kg)
42 !-- P8w 3D pressure at full levels (Pa)
43 !-- Pcps 3D pressure (Pa)
44 !-- PI3D 3D exner function (dimensionless)
45 !-- rr3D 3D dry air density (kg/m^3)
46 !-- RUBLTEN U tendency due to
47 ! PBL parameterization (m/s^2)
48 !-- RVBLTEN V tendency due to
49 ! PBL parameterization (m/s^2)
50 !-- RTHBLTEN Theta tendency due to
51 ! PBL parameterization (K/s)
52 !-- RQVBLTEN Qv tendency due to
53 ! PBL parameterization (kg/kg/s)
54 !-- RQCBLTEN Qc tendency due to
55 ! PBL parameterization (kg/kg/s)
56 !-- RQIBLTEN Qi tendency due to
57 ! PBL parameterization (kg/kg/s)
59 !-- MOMMIX MOMENTUM MIXING COEFFICIENT (can be set in the namelist)
60 !-- RUCUTEN U tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
61 !-- RVCUTEN V tendency due to Cumulus Momentum Mixing (gopal's doing for SAS)
63 !-- CP heat capacity at constant pressure for dry air (J/kg/K)
64 !-- GRAV acceleration due to gravity (m/s^2)
66 !-- RD gas constant for dry air (J/kg/K)
68 !-- P_QI species index for cloud ice
69 !-- dz8w dz between full levels (m)
70 !-- z height above sea level (m)
71 !-- PSFC pressure at the surface (Pa)
72 !-- UST u* in similarity theory (m/s)
73 !-- PBL PBL height (m)
74 !-- PSIM similarity stability function for momentum
75 !-- PSIH similarity stability function for heat
76 !-- HFX upward heat flux at the surface (W/m^2)
77 !-- QFX upward moisture flux at the surface (kg/m^2/s)
78 !-- TSK surface temperature (K)
79 !-- GZ1OZ0 log(z/z0) where z0 is roughness length
80 !-- WSPD wind speed at lowest model level (m/s)
81 !-- BR bulk Richardson number in surface layer
83 !-- rvovrd R_v divided by R_d (dimensionless)
84 !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
85 !-- KARMAN Von Karman constant
86 !-- ids start index for i in domain
87 !-- ide end index for i in domain
88 !-- jds start index for j in domain
89 !-- jde end index for j in domain
90 !-- kds start index for k in domain
91 !-- kde end index for k in domain
92 !-- ims start index for i in memory
93 !-- ime end index for i in memory
94 !-- jms start index for j in memory
95 !-- jme end index for j in memory
96 !-- kms start index for k in memory
97 !-- kme end index for k in memory
98 !-- its start index for i in tile
99 !-- ite end index for i in tile
100 !-- jts start index for j in tile
101 !-- jte end index for j in tile
102 !-- kts start index for k in tile
103 !-- kte end index for k in tile
104 !-------------------------------------------------------------------
108 INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
109 ims,ime, jms,jme, kms,kme, &
110 its,ite, jts,jte, kts,kte, &
117 REAL, INTENT(IN) :: &
121 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: &
126 REAL, DIMENSION(ims:ime, jms:jme, kms:kme), INTENT(INOUT) :: &
127 RUCUTEN, & ! gopal's doing for SAS
128 RVCUTEN ! gopal's doing for SAS
130 REAL, INTENT(IN) :: MOMMIX
131 REAL, DIMENSION( ims:ime , jms:jme ), &
132 INTENT(IN) :: STORE_RAND
136 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
139 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
142 REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
146 LOGICAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: &
150 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
164 ! Adaptive time-step variables
165 REAL, INTENT(IN ) :: CUDT
166 REAL, INTENT(IN ) :: CURR_SECS
167 LOGICAL,INTENT(IN ) , OPTIONAL :: ADAPT_STEP_FLAG
168 REAL, INTENT (INOUT) :: CUDTACTTIME
170 !--------------------------- LOCAL VARS ------------------------------
172 REAL, DIMENSION(ims:ime, jms:jme) :: &
176 REAL (kind=kind_phys) :: &
182 REAL (kind=kind_phys), DIMENSION(its:ite) :: &
190 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte+1) :: &
193 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte) :: &
206 REAL (kind=kind_phys), DIMENSION(its:ite, kts:kte, 2) :: &
209 INTEGER, DIMENSION(its:ite) :: &
226 LOGICAL :: run_param , doing_adapt_dt , decided
230 !-----------------------------------------------------------------------
232 !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
235 ! Initialization for adaptive time step.
237 doing_adapt_dt = .FALSE.
238 IF ( PRESENT(adapt_step_flag) ) THEN
239 IF ( adapt_step_flag ) THEN
240 doing_adapt_dt = .TRUE.
241 IF ( cudtacttime .EQ. 0. ) THEN
242 cudtacttime = curr_secs + cudt*60.
247 ! Do we run through this scheme or not?
249 ! Test 1: If this is the initial model time, then yes.
251 ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
253 ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
254 ! MOD(ITIMESTEP,STEPCU)=0
255 ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
256 ! CURR_SECS >= CUDTACTTIME
258 ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
259 ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
260 ! We only proceed to other tests if the previous tests all have left decided as FALSE.
262 ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
267 IF ( ( .NOT. decided ) .AND. &
268 ( itimestep .EQ. 1 ) ) THEN
273 IF ( ( .NOT. decided ) .AND. &
274 ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
279 IF ( ( .NOT. decided ) .AND. &
280 ( .NOT. doing_adapt_dt ) .AND. &
281 ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
286 IF ( ( .NOT. decided ) .AND. &
287 ( doing_adapt_dt ) .AND. &
288 ( curr_secs .GE. cudtacttime ) ) THEN
291 cudtacttime = curr_secs + cudt*60
294 !-----------------------------------------------------------------------
301 CU_ACT_FLAG(I,J)=.TRUE.
316 PSFC(i,j)=P8w(i,kms,j)
320 if(igpvs.eq.0) CALL GFUNCPHYS
323 !------------- J LOOP (OUTER) --------------------------------------------------
327 ! --------------- compute zi and zl -----------------------------------------
335 ZI(I,K)=ZI(I,KM)+dz8w(i,km,j)
342 ZL(I,KM)=(ZI(I,K)+ZI(I,KM))*0.5
347 ZL(I,KTE)=2.*ZI(I,KTE)-ZL(I,KTE-1)
350 ! --------------- end compute zi and zl -------------------------------------
352 ! Based on some important findings from Morris Bender, XKT2 was defined in
353 ! terms of random number instead of random number based cloud tops
354 ! Also, these random numbers are stored and are changed only once in
355 ! approximately 5 minutes interval now. This is gopal's doing for HWRF.
357 ! call random_number(XKT2)
360 ! XKT2 was defined in terms of random number instead of random number based cloud tops
362 call init_random_seed()
363 call random_number(XKT2)
372 XKT2(i) = STORE_RAND(i,j)
379 SLIMSK(i)=ABS(XLAND(i,j)-2.)
389 PRSL(I,K)=Pcps(i,k,j)*.001
390 PHIL(I,K)=ZL(I,K)*GRAV
391 DOT(i,k)=-5.0E-4*GRAV*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
397 DEL(i,k)=PRSL(i,k)*GRAV/RD*dz8w(i,k,j)/T3D(i,k,j)
400 Q1(i,k)=QV3D(i,k,j)/(1.+QV3D(i,k,j))
402 QL(i,k,1)=QI3D(i,k,j)/(1.+QI3D(i,k,j))
403 QL(i,k,2)=QC3D(i,k,j)/(1.+QC3D(i,k,j))
404 PRSLK(I,K)=(PRSL(i,k)*.01)**ROVCP
411 PRSI(i,k)=PRSI(i,km)-del(i,km)
416 CALL OSASCNV(IM,IM,KX,JCAP,DELT,DEL,PRSL,PS,PHIL, &
417 QL,Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT, &
418 KTOP,KUO,SLIMSK,DOT,XKT2,NCLOUD)
420 !!! make more like GFDL ... eliminate shallow convection.....
421 !!! CALL SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KUO,Q1,T1,DPSHC)
423 CALL SHALCV(IM,IM,KX,DELT,DEL,PRSI,PRSL,PRSLK,KUO,Q1,T1,DPSHC)
427 RAINCV(I,J)=RN(I)*1000./STEPCU
428 PRATEC(I,J)=RN(I)*1000./(STEPCU * DT)
435 RTHCUTEN(I,K,J)=(T1(I,K)-T3D(I,K,J))/PI3D(I,K,J)*RDELT
436 RQVCUTEN(I,K,J)=(Q1(I,K)/(1.-q1(i,k))-QV3D(I,K,J))*RDELT
440 !===============================================================================
441 ! ADD MOMENTUM MIXING TERM AS TENDENCIES. This is gopal's doing for SAS
442 ! MOMMIX is the reduction factor set to 0.7 by default. Because NMM has
443 ! divergence damping term, a reducion factor for cumulum mixing may be
444 ! required otherwise storms were too weak.
445 !===============================================================================
450 RUCUTEN(I,J,K)=MOMMIX*(U1(I,K)-U3D(I,K,J))*RDELT
451 RVCUTEN(I,J,K)=MOMMIX*(V1(I,K)-V3D(I,K,J))*RDELT
457 IF(P_QC .ge. P_FIRST_SCALAR)THEN
460 RQCCUTEN(I,K,J)=(QL(I,K,2)/(1.-ql(i,k,2))-QC3D(I,K,J))*RDELT
465 IF(P_QI .ge. P_FIRST_SCALAR)THEN
468 RQICUTEN(I,K,J)=(QL(I,K,1)/(1.-ql(i,k,1))-QI3D(I,K,J))*RDELT
473 ENDDO ! Outer most J loop
477 END SUBROUTINE CU_OSAS
479 !====================================================================
480 SUBROUTINE osasinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, &
481 RUCUTEN,RVCUTEN, & ! gopal's doing for SAS
482 RESTART,P_QC,P_QI,P_FIRST_SCALAR, &
484 ids, ide, jds, jde, kds, kde, &
485 ims, ime, jms, jme, kms, kme, &
486 its, ite, jts, jte, kts, kte )
487 !--------------------------------------------------------------------
489 !--------------------------------------------------------------------
490 LOGICAL , INTENT(IN) :: allowed_to_read,restart
491 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
492 ims, ime, jms, jme, kms, kme, &
493 its, ite, jts, jte, kts, kte
494 INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
496 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
501 REAL, DIMENSION( ims:ime , jms:jme , kms:kme ) , INTENT(OUT) :: &
502 RUCUTEN, & ! gopal's doing for SAS
505 INTEGER :: i, j, k, itf, jtf, ktf
513 IF(.not.restart .or. .not.allowed_to_read)THEN
514 !end of zhang's doing
523 RUCUTEN(i,j,k)=0. ! gopal's doing for SAS
524 RVCUTEN(i,j,k)=0. ! gopal's doing for SAS
529 IF (P_QC .ge. P_FIRST_SCALAR) THEN
539 IF (P_QI .ge. P_FIRST_SCALAR) THEN
550 END SUBROUTINE osasinit
552 ! ------------------------------------------------------------------------
554 SUBROUTINE OSASCNV(IM,IX,KM,JCAP,DELT,DEL,PRSL,PS,PHIL,QL, &
555 & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK, &
557 ! for cloud water version
558 ! parameter(ncloud=0)
559 ! SUBROUTINE OSASCNV(KM,JCAP,DELT,DEL,SL,SLK,PS,QL,
560 ! & Q1,T1,U1,V1,RCS,CLDWRK,RN,KBOT,KTOP,KUO,SLIMSK,
563 USE MODULE_GFS_MACHINE , ONLY : kind_phys
564 USE MODULE_GFS_FUNCPHYS ,ONLY : fpvs
565 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
566 &, RV => con_RV, FV => con_fvirt, T0C => con_T0C &
567 &, CVAP => con_CVAP, CLIQ => con_CLIQ &
568 &, EPS => con_eps, EPSM1 => con_epsm1
572 ! include 'constant.h'
574 integer IM, IX, KM, JCAP, ncloud, &
575 & KBOT(IM), KTOP(IM), KUO(IM), J
576 real(kind=kind_phys) DELT
577 real(kind=kind_phys) PS(IM), DEL(IX,KM), PRSL(IX,KM), &
578 ! real(kind=kind_phys) DEL(IX,KM), PRSL(IX,KM),
579 & QL(IX,KM,2), Q1(IX,KM), T1(IX,KM), &
580 & U1(IX,KM), V1(IX,KM), RCS(IM), &
581 & CLDWRK(IM), RN(IM), SLIMSK(IM), &
582 & DOT(IX,KM), XKT2(IM), PHIL(IX,KM)
584 integer I, INDX, jmn, k, knumb, latd, lond, km1
586 real(kind=kind_phys) adw, alpha, alphal, alphas, &
587 & aup, beta, betal, betas, &
588 & c0, cpoel, dellat, delta, &
589 & desdt, deta, detad, dg, &
590 & dh, dhh, dlnsig, dp, &
591 & dq, dqsdp, dqsdt, dt, &
592 & dt2, dtmax, dtmin, dv1, &
593 & dv1q, dv2, dv2q, dv1u, &
594 & dv1v, dv2u, dv2v, dv3u, &
595 & dv3v, dv3, dv3q, dvq1, &
596 & dz, dz1, e1, edtmax, &
597 & edtmaxl, edtmaxs, el2orc, elocp, &
599 & evef, evfact, evfactl, fact1, &
600 & fact2, factor, fjcap, fkm, &
601 & fuv, g, gamma, onemf, &
602 & onemfu, pdetrn, pdpdwn, pprime, &
603 & qc, qlk, qrch, qs, &
604 & rain, rfact, shear, tem1, &
605 & tem2, terr, val, val1, &
606 & val2, w1, w1l, w1s, &
607 & w2, w2l, w2s, w3, &
608 & w3l, w3s, w4, w4l, &
609 & w4s, xdby, xpw, xpwd, &
610 & xqc, xqrch, xlambu, mbdt, &
614 integer JMIN(IM), KB(IM), KBCON(IM), KBDTR(IM), &
615 & KT2(IM), KTCON(IM), LMIN(IM), &
616 & kbm(IM), kbmax(IM), kmax(IM)
618 real(kind=kind_phys) AA1(IM), ACRT(IM), ACRTFCT(IM), &
619 & DELHBAR(IM), DELQ(IM), DELQ2(IM), &
620 & DELQBAR(IM), DELQEV(IM), DELTBAR(IM), &
621 & DELTV(IM), DTCONV(IM), EDT(IM), &
622 & EDTO(IM), EDTX(IM), FLD(IM), &
623 & HCDO(IM), HKBO(IM), HMAX(IM), &
624 & HMIN(IM), HSBAR(IM), UCDO(IM), &
625 & UKBO(IM), VCDO(IM), VKBO(IM), &
626 & PBCDIF(IM), PDOT(IM), PO(IM,KM), &
627 & PWAVO(IM), PWEVO(IM), &
628 ! & PSFC(IM), PWAVO(IM), PWEVO(IM), &
629 & QCDO(IM), QCOND(IM), QEVAP(IM), &
630 & QKBO(IM), RNTOT(IM), VSHEAR(IM), &
631 & XAA0(IM), XHCD(IM), XHKB(IM), &
632 & XK(IM), XLAMB(IM), XLAMD(IM), &
633 & XMB(IM), XMBMAX(IM), XPWAV(IM), &
634 & XPWEV(IM), XQCD(IM), XQKB(IM)
636 ! PHYSICAL PARAMETERS
638 PARAMETER(CPOEL=CP/HVAP,ELOCP=HVAP/CP, &
639 & EL2ORC=HVAP*HVAP/(RV*CP))
640 PARAMETER(TERR=0.,C0=.002,DELTA=fv)
641 PARAMETER(FACT1=(CVAP-CLIQ)/RV,FACT2=HVAP/RV-FACT1*T0C)
642 ! LOCAL VARIABLES AND ARRAYS
643 real(kind=kind_phys) PFLD(IM,KM), TO(IM,KM), QO(IM,KM), &
644 & UO(IM,KM), VO(IM,KM), QESO(IM,KM)
646 real(kind=kind_phys) QLKO_KTCON(IM), DELLAL(IM), TVO(IM,KM), &
647 & DBYO(IM,KM), ZO(IM,KM), SUMZ(IM,KM), &
648 & SUMH(IM,KM), HEO(IM,KM), HESO(IM,KM), &
649 & QRCD(IM,KM), DELLAH(IM,KM), DELLAQ(IM,KM),&
650 & DELLAU(IM,KM), DELLAV(IM,KM), HCKO(IM,KM), &
651 & UCKO(IM,KM), VCKO(IM,KM), QCKO(IM,KM), &
652 & ETA(IM,KM), ETAU(IM,KM), ETAD(IM,KM), &
653 & QRCDO(IM,KM), PWO(IM,KM), PWDO(IM,KM), &
656 LOGICAL TOTFLG, CNVFLG(IM), DWNFLG(IM), DWNFLG2(IM), FLG(IM)
658 real(kind=kind_phys) PCRIT(15), ACRITT(15), ACRIT(15)
660 DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
661 & 350.,300.,250.,200.,150./
662 DATA ACRITT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
663 & .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
665 ! DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
666 ! & .743,.813,.886,.947,1.138,1.377,1.896/
668 real(kind=kind_phys) TF, TCR, TCRF, RZERO, RONE
669 parameter (TF=233.16, TCR=263.16, TCRF=1.0/(TCR-TF))
670 parameter (RZERO=0.0,RONE=1.0)
671 !-----------------------------------------------------------------------
691 ACRIT(K) = ACRITT(K) * (975. - PCRIT(K))
694 !cmr dtmin = max(dt2,1200.)
696 dtmin = max(dt2, val )
697 !cmr dtmax = max(dt2,3600.)
699 dtmax = max(dt2, val )
700 ! MODEL TUNABLE PARAMETERS ARE ALL HERE
710 ! change for hurricane model
716 ! change for hurricane model
731 fjcap = (float(jcap) / 126.) ** 2
732 !cmr fjcap = max(fjcap,1.)
734 fjcap = max(fjcap,val)
735 fkm = (float(km) / 28.) ** 2
736 !cmr fkm = max(fkm,1.)
746 !CCCC IF(IM.EQ.384) THEN
749 !CCCC ELSEIF(IM.EQ.768) THEN
755 ! DEFINE TOP LAYER FOR SEARCH OF THE DOWNDRAFT ORIGINATING LAYER
756 ! AND THE MAXIMUM THETAE FOR UPDRAFT
767 IF (prSL(I,K)*tx1(I) .GT. 0.45) KBMAX(I) = K + 1
768 IF (prSL(I,K)*tx1(I) .GT. 0.70) KBM(I) = K + 1
769 IF (prSL(I,K)*tx1(I) .GT. 0.04) KMAX(I) = MIN(KM,K + 1)
773 KBMAX(I) = MIN(KBMAX(I),KMAX(I))
774 KBM(I) = MIN(KBM(I),KMAX(I))
777 ! CONVERT SURFACE PRESSURE TO MB FROM CB
782 if (K .le. kmax(i)) then
783 PFLD(I,k) = PRSL(I,K) * 10.0
799 ! P IS PRESSURE OF THE LAYER (MB)
800 ! T IS TEMPERATURE AT T-DT (K)..TN
801 ! Q IS MIXING RATIO AT T-DT (KG/KG)..QN
802 ! TO IS TEMPERATURE AT T+DT (K)... THIS IS AFTER ADVECTION AND TURBULAN
803 ! QO IS MIXING RATIO AT T+DT (KG/KG)..Q1
807 if (k .le. kmax(i)) then
808 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
810 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
812 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
813 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
815 QESO(I,k) = MAX(QESO(I,k), val1)
816 !cmr QO(I,k) = max(QO(I,k),1.e-10)
818 QO(I,k) = max(QO(I,k), val2 )
819 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
820 TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
826 ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
830 ZO(I,k) = PHIL(I,k) / G
833 ! COMPUTE MOIST STATIC ENERGY
836 if (K .le. kmax(i)) then
837 ! tem = G * ZO(I,k) + CP * TO(I,k)
838 tem = PHIL(I,k) + CP * TO(I,k)
839 HEO(I,k) = tem + HVAP * QO(I,k)
840 HESO(I,k) = tem + HVAP * QESO(I,k)
841 ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
846 ! DETERMINE LEVEL WITH LARGEST MOIST STATIC ENERGY
847 ! THIS IS THE LEVEL WHERE UPDRAFT STARTS
856 if (k .le. kbm(i)) then
857 IF(HEO(I,k).GT.HMAX(I).AND.CNVFLG(I)) THEN
865 ! TOL(k) = .5 * (TO(I,k) + TO(I,k+1))
866 ! QOL(k) = .5 * (QO(I,k) + QO(I,k+1))
867 ! QESOL(I,k) = .5 * (QESO(I,k) + QESO(I,k+1))
868 ! HEOL(I,k) = .5 * (HEO(I,k) + HEO(I,k+1))
869 ! HESOL(I,k) = .5 * (HESO(I,k) + HESO(I,k+1))
873 if (k .le. kmax(i)-1) then
874 DZ = .5 * (ZO(I,k+1) - ZO(I,k))
875 DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
876 !jfe ES = 10. * FPVS(TO(I,k+1))
878 ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
880 PPRIME = PFLD(I,k+1) + EPSM1 * ES
881 QS = EPS * ES / PPRIME
882 DQSDP = - QS / PPRIME
883 DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
884 DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
885 GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
886 DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
887 DQ = DQSDT * DT + DQSDP * DP
888 TO(I,k) = TO(I,k+1) + DT
889 QO(I,k) = QO(I,k+1) + DQ
890 PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
897 if (k .le. kmax(I)-1) then
898 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
900 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
902 QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1*QESO(I,k))
903 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
905 QESO(I,k) = MAX(QESO(I,k), val1)
906 !cmr QO(I,k) = max(QO(I,k),1.e-10)
908 QO(I,k) = max(QO(I,k), val2 )
909 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
910 HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
911 & CP * TO(I,k) + HVAP * QO(I,k)
912 HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
913 & CP * TO(I,k) + HVAP * QESO(I,k)
914 UO(I,k) = .5 * (UO(I,k) + UO(I,k+1))
915 VO(I,k) = .5 * (VO(I,k) + VO(I,k+1))
920 ! HEO(I,k) = HEO(I,k)
921 ! hesol(k) = HESO(I,k)
922 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
924 ! PRINT 6001, (HEO(I,K),K=1,KMAX)
926 ! PRINT 6001, (HESO(I,K),K=1,KMAX)
928 ! PRINT 6002, (TO(I,K)-273.16,K=1,KMAX)
930 ! PRINT 6003, (QO(I,K),K=1,KMAX)
932 ! PRINT 6003, (QESO(I,K),K=1,KMAX)
935 ! LOOK FOR CONVECTIVE CLOUD BASE AS THE LEVEL OF FREE CONVECTION
940 HKBO(I) = HEO(I,INDX)
951 if (k .le. kbmax(i)) then
952 IF(FLG(I).AND.K.GT.KB(I)) THEN
954 IF(HKBO(I).GT.HSBAR(I)) THEN
964 PBCDIF(I) = -PFLD(I,KBCON(I)) + PFLD(I,KB(I))
965 PDOT(I) = 10.* DOT(I,KBCON(I))
966 IF(PBCDIF(I).GT.150.) CNVFLG(I) = .FALSE.
967 IF(KBCON(I).EQ.KMAX(I)) CNVFLG(I) = .FALSE.
973 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
976 ! FOUND LFC, CAN DEFINE REST OF VARIABLES
977 6001 FORMAT(2X,-2P10F12.2)
978 6002 FORMAT(2X,10F12.2)
979 6003 FORMAT(2X,3P10F12.2)
982 ! DETERMINE ENTRAINMENT RATE BETWEEN KB AND KBCON
986 if(SLIMSK(I).eq.1.) alpha = alphal
989 DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) - ZO(I,1)
991 DZ = .5 * (ZO(I,KBCON(I)) + ZO(I,KBCON(I)-1)) &
992 & - .5 * (ZO(I,KB(I)) + ZO(I,KB(I)-1))
994 IF(KBCON(I).NE.KB(I)) THEN
995 !cmr XLAMB(I) = -ALOG(ALPHA) / DZ
996 XLAMB(I) = - LOG(ALPHA) / DZ
1002 ! DETERMINE UPDRAFT MASS FLUX
1005 if (k .le. kmax(i) .and. CNVFLG(I)) then
1013 if (k .le. kbmax(i)) then
1014 IF(CNVFLG(I).AND.K.LT.KBCON(I).AND.K.GE.KB(I)) THEN
1015 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1016 ETA(I,k) = ETA(I,k+1) * EXP(-XLAMB(I) * DZ)
1017 ETAU(I,k) = ETA(I,k)
1023 IF(CNVFLG(I).AND.KB(I).EQ.1.AND.KBCON(I).GT.1) THEN
1024 DZ = .5 * (ZO(I,2) - ZO(I,1))
1025 ETA(I,1) = ETA(I,2) * EXP(-XLAMB(I) * DZ)
1026 ETAU(I,1) = ETA(I,1)
1030 ! WORK UP UPDRAFT CLOUD PROPERTIES
1035 HCKO(I,INDX) = HKBO(I)
1036 QCKO(I,INDX) = QKBO(I)
1037 UCKO(I,INDX) = UKBO(I)
1038 VCKO(I,INDX) = VKBO(I)
1043 ! CLOUD PROPERTY BELOW CLOUD BASE IS MODIFIED BY THE ENTRAINMENT PROCES
1047 if (k .le. kmax(i)-1) then
1048 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
1049 FACTOR = ETA(I,k-1) / ETA(I,k)
1051 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1052 & .5 * (HEO(I,k) + HEO(I,k+1))
1053 UCKO(I,k) = FACTOR * UCKO(I,k-1) + ONEMF * &
1054 & .5 * (UO(I,k) + UO(I,k+1))
1055 VCKO(I,k) = FACTOR * VCKO(I,k-1) + ONEMF * &
1056 & .5 * (VO(I,k) + VO(I,k+1))
1057 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1059 IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
1060 HCKO(I,k) = HCKO(I,k-1)
1061 UCKO(I,k) = UCKO(I,k-1)
1062 VCKO(I,k) = VCKO(I,k-1)
1063 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1068 ! DETERMINE CLOUD TOP
1075 ! IF(DBYO(I,kK).GE.0..AND.FLG(I).AND.KK.GT.KBCON(I)) THEN
1082 if (k .le. kmax(i)) then
1083 IF(DBYO(I,k).LT.0..AND.FLG(I).AND.K.GT.KBCON(I)) THEN
1091 IF(CNVFLG(I).AND.(PFLD(I,KBCON(I)) - PFLD(I,KTCON(I))).LT.150.) &
1092 & CNVFLG(I) = .FALSE.
1096 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1100 ! SEARCH FOR DOWNDRAFT ORIGINATING LEVEL ABOVE THETA-E MINIMUM
1103 HMIN(I) = HEO(I,KBCON(I))
1108 DO K = KBCON(I), KBMAX(I)
1109 IF(HEO(I,k).LT.HMIN(I).AND.CNVFLG(I)) THEN
1116 ! Make sure that JMIN(I) is within the cloud
1120 JMIN(I) = MIN(LMIN(I),KTCON(I)-1)
1122 JMIN(I) = MAX(JMIN(I),KBCON(I)+1)
1130 if (k .le. kmax(i)-1) then
1131 if(CNVFLG(I).and.k.gt.JMIN(I).and.k.le.KTCON(I)) THEN
1132 SUMZ(I,k) = SUMZ(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1))
1133 SUMH(I,k) = SUMH(I,k-1) + .5 * (ZO(I,k+1) - ZO(I,k-1)) &
1142 ! call random_number(XKT2)
1145 KT2(I) = nint(XKT2(I)*float(KTCON(I)-JMIN(I))-.5)+JMIN(I)+1
1146 ! KT2(I) = nint(sqrt(XKT2(I))*float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
1147 ! KT2(I) = nint(ranf() *float(KTCON(I)-JMIN(I))-.5) + JMIN(I) + 1
1148 tem1 = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
1149 tem2 = (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
1150 if (abs(tem2) .gt. 0.000001) THEN
1151 XLAMB(I) = tem1 / tem2
1155 ! XLAMB(I) = (HCKO(I,JMIN(I)) - HESO(I,KT2(I)))
1156 ! & / (SUMZ(I,KT2(I)) * HESO(I,KT2(I)) - SUMH(I,KT2(I)))
1157 XLAMB(I) = max(XLAMB(I),RZERO)
1158 XLAMB(I) = min(XLAMB(I),2.3/SUMZ(I,KT2(I)))
1163 DWNFLG(I) = CNVFLG(I)
1164 DWNFLG2(I) = CNVFLG(I)
1166 if(KT2(I).ge.KTCON(I)) DWNFLG(I) = .false.
1167 if(XLAMB(I).le.1.e-30.or.HCKO(I,JMIN(I))-HESO(I,KT2(I)).le.1.e-30)&
1168 & DWNFLG(I) = .false.
1169 do k = JMIN(I), KT2(I)
1170 if(DWNFLG(I).and.HEO(I,k).gt.HESO(I,KT2(I))) DWNFLG(I)=.false.
1172 ! IF(CNVFLG(I).AND.(PFLD(KBCON(I))-PFLD(KTCON(I))).GT.PDETRN)
1173 ! & DWNFLG(I)=.FALSE.
1174 IF(CNVFLG(I).AND.(PFLD(I,KBCON(I))-PFLD(I,KTCON(I))).LT.PDPDWN) &
1175 & DWNFLG2(I)=.FALSE.
1181 if (k .le. kmax(i)-1) then
1182 IF(DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
1183 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1184 ! ETA(I,k) = ETA(I,k-1) * EXP( XLAMB(I) * DZ)
1185 ! to simplify matter, we will take the linear approach here
1187 ETA(I,k) = ETA(I,k-1) * (1. + XLAMB(I) * dz)
1188 ETAU(I,k) = ETAU(I,k-1) * (1. + (XLAMB(I)+xlambu) * dz)
1196 if (k .le. kmax(i)-1) then
1197 ! IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KT2(I)) THEN
1198 IF(.NOT.DWNFLG(I).AND.K.GT.JMIN(I).AND.K.LE.KTCON(I)) THEN
1199 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1200 ETAU(I,k) = ETAU(I,k-1) * (1. + xlambu * dz)
1205 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1206 ! PRINT *, ' LMIN(I), KT2(I)=', LMIN(I), KT2(I)
1207 ! PRINT *, ' KBOT, KTOP, JMIN(I) =', KBCON(I), KTCON(I), JMIN(I)
1209 ! IF(LAT.EQ.LATD.AND.lon.eq.lond) THEN
1210 ! print *, ' xlamb =', xlamb
1211 ! print *, ' eta =', (eta(k),k=1,KT2(I))
1212 ! print *, ' ETAU =', (ETAU(I,k),k=1,KT2(I))
1213 ! print *, ' HCKO =', (HCKO(I,k),k=1,KT2(I))
1214 ! print *, ' SUMZ =', (SUMZ(I,k),k=1,KT2(I))
1215 ! print *, ' SUMH =', (SUMH(I,k),k=1,KT2(I))
1223 ! CLOUD PROPERTY ABOVE CLOUD Base IS MODIFIED BY THE DETRAINMENT PROCESS
1227 if (k .le. kmax(i)-1) then
1229 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1230 !jfe IF(K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1231 FACTOR = ETA(I,k-1) / ETA(I,k)
1233 fuv = ETAU(I,k-1) / ETAU(I,k)
1235 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1236 & .5 * (HEO(I,k) + HEO(I,k+1))
1237 UCKO(I,k) = fuv * UCKO(I,k-1) + ONEMFu * &
1238 & .5 * (UO(I,k) + UO(I,k+1))
1239 VCKO(I,k) = fuv * VCKO(I,k-1) + ONEMFu * &
1240 & .5 * (VO(I,k) + VO(I,k+1))
1241 DBYO(I,k) = HCKO(I,k) - HESO(I,k)
1246 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1247 ! PRINT *, ' UCKO=', (UCKO(I,k),k=KBCON(I)+1,KTCON(I))
1248 ! PRINT *, ' uenv=', (.5*(UO(I,k)+UO(I,k-1)),k=KBCON(I)+1,KTCON(I))
1251 if(CNVFLG(I).and.DWNFLG2(I).and.JMIN(I).le.KBCON(I)) &
1255 DWNFLG2(I) = .false.
1261 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1266 ! COMPUTE CLOUD MOISTURE PROPERTY AND PRECIPITATION
1274 if (k .le. kmax(i)) then
1275 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
1276 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1277 DZ1 = (ZO(I,k) - ZO(I,k-1))
1278 GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
1280 & + GAMMA * DBYO(I,k) / (HVAP * (1. + GAMMA))
1281 FACTOR = ETA(I,k-1) / ETA(I,k)
1283 QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
1284 & .5 * (QO(I,k) + QO(I,k+1))
1285 DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * QRCH
1286 RHBAR(I) = RHBAR(I) + QO(I,k) / QESO(I,k)
1288 ! BELOW LFC CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
1291 ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
1292 QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
1293 AA1(I) = AA1(I) - DZ1 * G * QLK
1295 PWO(I,k) = ETAH * C0 * DZ * QLK
1297 PWAVO(I) = PWAVO(I) + PWO(I,k)
1304 RHBAR(I) = RHBAR(I) / float(KTCON(I) - KB(I) - 1)
1307 ! this section is ready for cloud water
1309 if(ncloud.gt.0) THEN
1311 ! compute liquid and vapor separation at cloud top
1316 GAMMA = EL2ORC * QESO(I,K) / (TO(I,K)**2)
1318 & + GAMMA * DBYO(I,K) / (HVAP * (1. + GAMMA))
1319 DQ = QCKO(I,K-1) - QRCH
1321 ! CHECK IF THERE IS EXCESS MOISTURE TO RELEASE LATENT HEAT
1331 ! CALCULATE CLOUD WORK FUNCTION AT T+DT
1335 if (k .le. kmax(i)) then
1336 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1337 DZ1 = ZO(I,k) - ZO(I,k-1)
1338 GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
1339 RFACT = 1. + DELTA * CP * GAMMA &
1340 & * TO(I,k-1) / HVAP
1342 & DZ1 * (G / (CP * TO(I,k-1))) &
1343 & * DBYO(I,k-1) / (1. + GAMMA) &
1347 & DZ1 * G * DELTA * &
1348 !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
1349 & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
1355 IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG(I) = .FALSE.
1356 IF(CNVFLG(I).AND.AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
1357 IF(CNVFLG(I).AND.AA1(I).LE.0.) CNVFLG(I) = .FALSE.
1362 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1366 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1367 !cccc PRINT *, ' AA1(I) BEFORE DWNDRFT =', AA1(I)
1370 !------- DOWNDRAFT CALCULATIONS
1373 !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
1382 if (k .le. kmax(i)) then
1383 IF(K.GE.KB(I).AND.K.LE.KTCON(I).AND.CNVFLG(I)) THEN
1384 shear=rcs(I) * sqrt((UO(I,k+1)-UO(I,k)) ** 2 &
1385 & + (VO(I,k+1)-VO(I,k)) ** 2)
1386 VSHEAR(I) = VSHEAR(I) + SHEAR
1394 KNUMB = KTCON(I) - KB(I) + 1
1395 KNUMB = MAX(KNUMB,1)
1396 VSHEAR(I) = 1.E3 * VSHEAR(I) / (ZO(I,KTCON(I))-ZO(I,KB(I)))
1397 E1=1.591-.639*VSHEAR(I) &
1398 & +.0953*(VSHEAR(I)**2)-.00496*(VSHEAR(I)**3)
1400 !cmr EDT(I) = MIN(EDT(I),.9)
1402 EDT(I) = MIN(EDT(I),val)
1403 !cmr EDT(I) = MAX(EDT(I),.0)
1405 EDT(I) = MAX(EDT(I),val)
1410 ! DETERMINE DETRAINMENT RATE BETWEEN 1 AND KBDTR
1414 if(SLIMSK(I).eq.1.) beta = betal
1417 KBDTR(I) = MAX(KBDTR(I),1)
1419 IF(KBDTR(I).GT.1) THEN
1420 DZ = .5 * ZO(I,KBDTR(I)) + .5 * ZO(I,KBDTR(I)-1) &
1422 XLAMD(I) = LOG(BETA) / DZ
1426 ! DETERMINE DOWNDRAFT MASS FLUX
1429 IF(k .le. kmax(i)) then
1439 if (k .le. kbmax(i)) then
1440 IF(CNVFLG(I).AND.K.LT.KBDTR(I)) THEN
1441 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1442 ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
1449 IF(CNVFLG(I).AND.KBDTR(I).GT.1) THEN
1450 DZ = .5 * (ZO(I,2) - ZO(I,1))
1451 ETAD(I,k) = ETAD(I,k+1) * EXP(XLAMD(I) * DZ)
1455 !--- DOWNDRAFT MOISTURE PROPERTIES
1464 HCDO(I) = HEO(I,JMN)
1466 QRCDO(I,JMN) = QESO(I,JMN)
1473 if (k .le. kmax(i)-1) then
1474 IF(CNVFLG(I).AND.K.LT.JMIN(I)) THEN
1477 GAMMA = EL2ORC * DQ / DT**2
1478 DH = HCDO(I) - HESO(I,k)
1479 QRCDO(I,k) = DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
1480 DETAD = ETAD(I,k+1) - ETAD(I,k)
1481 PWDO(I,k) = ETAD(I,k+1) * QCDO(I) - &
1482 & ETAD(I,k) * QRCDO(I,k)
1483 PWDO(I,k) = PWDO(I,k) - DETAD * &
1484 & .5 * (QRCDO(I,k) + QRCDO(I,k+1))
1485 QCDO(I) = QRCDO(I,k)
1486 PWEVO(I) = PWEVO(I) + PWDO(I,k)
1491 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG(I)) THEN
1492 ! PRINT *, ' PWAVO(I), PWEVO(I) =', PWAVO(I), PWEVO(I)
1495 !--- FINAL DOWNDRAFT STRENGTH DEPENDENT ON PRECIP
1496 !--- EFFICIENCY (EDT), NORMALIZED CONDENSATE (PWAV), AND
1497 !--- EVAPORATE (PWEV)
1501 if(SLIMSK(I).eq.0.) edtmax = edtmaxs
1503 IF(PWEVO(I).LT.0.) THEN
1504 EDTO(I) = -EDTO(I) * PWAVO(I) / PWEVO(I)
1505 EDTO(I) = MIN(EDTO(I),EDTMAX)
1515 !--- DOWNDRAFT CLOUDWORK FUNCTIONS
1520 if (k .le. kmax(i)-1) then
1521 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1522 GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
1527 DZ=-1.*(ZO(I,k+1)-ZO(I,k))
1528 AA1(I)=AA1(I)+EDTO(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
1529 & *(1.+DELTA*CP*DG*DT/HVAP)
1531 AA1(I)=AA1(I)+EDTO(I)* &
1532 !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
1533 & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
1538 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
1539 !cccc PRINT *, ' AA1(I) AFTER DWNDRFT =', AA1(I)
1542 IF(AA1(I).LE.0.) CNVFLG(I) = .FALSE.
1543 IF(AA1(I).LE.0.) DWNFLG(I) = .FALSE.
1544 IF(AA1(I).LE.0.) DWNFLG2(I) = .FALSE.
1549 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
1555 !--- WHAT WOULD THE CHANGE BE, THAT A CLOUD WITH UNIT MASS
1556 !--- WILL DO TO THE ENVIRONMENT?
1560 IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1570 DP = 1000. * DEL(I,1)
1571 DELLAH(I,1) = EDTO(I) * ETAD(I,1) * (HCDO(I) &
1572 & - HEO(I,1)) * G / DP
1573 DELLAQ(I,1) = EDTO(I) * ETAD(I,1) * (QCDO(I) &
1574 & - QO(I,1)) * G / DP
1575 DELLAU(I,1) = EDTO(I) * ETAD(I,1) * (UCDO(I) &
1576 & - UO(I,1)) * G / DP
1577 DELLAV(I,1) = EDTO(I) * ETAD(I,1) * (VCDO(I) &
1578 & - VO(I,1)) * G / DP
1582 !--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT
1586 if (k .le. kmax(i)-1) then
1587 IF(CNVFLG(I).AND.K.LT.KTCON(I)) THEN
1589 IF(K.LE.KB(I)) AUP = 0.
1591 IF(K.GT.JMIN(I)) ADW = 0.
1593 DV2 = .5 * (HEO(I,k) + HEO(I,k+1))
1596 DV2Q = .5 * (QO(I,k) + QO(I,k+1))
1599 DV2U = .5 * (UO(I,k) + UO(I,k+1))
1602 DV2V = .5 * (VO(I,k) + VO(I,k+1))
1604 DP = 1000. * DEL(I,K)
1605 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1606 DETA = ETA(I,k) - ETA(I,k-1)
1607 DETAD = ETAD(I,k) - ETAD(I,k-1)
1608 DELLAH(I,k) = DELLAH(I,k) + &
1609 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1 &
1610 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3 &
1611 & - AUP * DETA * DV2 &
1612 & + ADW * EDTO(I) * DETAD * HCDO(I)) * G / DP
1613 DELLAQ(I,k) = DELLAQ(I,k) + &
1614 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1Q &
1615 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3Q &
1616 & - AUP * DETA * DV2Q &
1617 & +ADW*EDTO(I)*DETAD*.5*(QRCDO(I,k)+QRCDO(I,k-1))) * G / DP
1618 DELLAU(I,k) = DELLAU(I,k) + &
1619 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1U &
1620 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3U &
1621 & - AUP * DETA * DV2U &
1622 & + ADW * EDTO(I) * DETAD * UCDO(I) &
1624 DELLAV(I,k) = DELLAV(I,k) + &
1625 & ((AUP * ETA(I,k) - ADW * EDTO(I) * ETAD(I,k)) * DV1V &
1626 & - (AUP * ETA(I,k-1) - ADW * EDTO(I) * ETAD(I,k-1))* DV3V &
1627 & - AUP * DETA * DV2V &
1628 & + ADW * EDTO(I) * DETAD * VCDO(I) &
1640 DP = 1000. * DEL(I,INDX)
1642 DELLAH(I,INDX) = ETA(I,INDX-1) * &
1643 & (HCKO(I,INDX-1) - DV1) * G / DP
1645 DELLAQ(I,INDX) = ETA(I,INDX-1) * &
1646 & (QCKO(I,INDX-1) - DVQ1) * G / DP
1648 DELLAU(I,INDX) = ETA(I,INDX-1) * &
1649 & (UCKO(I,INDX-1) - DV1U) * G / DP
1651 DELLAV(I,INDX) = ETA(I,INDX-1) * &
1652 & (VCKO(I,INDX-1) - DV1V) * G / DP
1656 DELLAL(I) = ETA(I,INDX-1) * QLKO_KTCON(I) * g / dp
1660 !------- FINAL CHANGED VARIABLE PER UNIT MASS FLUX
1664 if (k .le. kmax(i)) then
1665 IF(CNVFLG(I).and.k.gt.KTCON(I)) THEN
1671 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
1672 QO(I,k) = DELLAQ(I,k) * MBDT + Q1(I,k)
1673 DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
1674 TO(I,k) = DELLAT * MBDT + T1(I,k)
1675 !cmr QO(I,k) = max(QO(I,k),1.e-10)
1677 QO(I,k) = max(QO(I,k), val )
1682 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1684 !--- THE ABOVE CHANGED ENVIRONMENT IS NOW USED TO CALULATE THE
1685 !--- EFFECT THE ARBITRARY CLOUD (WITH UNIT MASS FLUX)
1686 !--- WOULD HAVE ON THE STABILITY,
1687 !--- WHICH THEN IS USED TO CALCULATE THE REAL MASS FLUX,
1688 !--- NECESSARY TO KEEP THIS CHANGE IN BALANCE WITH THE LARGE-SCALE
1689 !--- DESTABILIZATION.
1691 !--- ENVIRONMENTAL CONDITIONS AGAIN, FIRST HEIGHTS
1695 IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1696 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
1698 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
1700 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k)+EPSM1*QESO(I,k))
1701 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
1703 QESO(I,k) = MAX(QESO(I,k), val )
1704 TVO(I,k) = TO(I,k) + DELTA * TO(I,k) * QO(I,k)
1715 ! HYDROSTATIC HEIGHT ASSUME ZERO TERR
1718 ! IF(CNVFLG(I)) THEN
1719 ! DLNSIG = LOG(PRSL(I,1)/PS(I))
1720 ! ZO(I,1) = TERR - DLNSIG * RD / G * TVO(I,1)
1725 ! IF(k .le. kmax(i) .and. CNVFLG(I)) THEN
1726 ! DLNSIG = LOG(PRSL(I,K) / PRSL(I,K-1))
1727 ! ZO(I,k) = ZO(I,k-1) - DLNSIG * RD / G
1728 ! & * .5 * (TVO(I,k) + TVO(I,k-1))
1733 !--- MOIST STATIC ENERGY
1737 IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
1738 DZ = .5 * (ZO(I,k+1) - ZO(I,k))
1739 DP = .5 * (PFLD(I,k+1) - PFLD(I,k))
1740 !jfe ES = 10. * FPVS(TO(I,k+1))
1742 ES = 0.01 * fpvs(TO(I,K+1)) ! fpvs is in Pa
1744 PPRIME = PFLD(I,k+1) + EPSM1 * ES
1745 QS = EPS * ES / PPRIME
1746 DQSDP = - QS / PPRIME
1747 DESDT = ES * (FACT1 / TO(I,k+1) + FACT2 / (TO(I,k+1)**2))
1748 DQSDT = QS * PFLD(I,k+1) * DESDT / (ES * PPRIME)
1749 GAMMA = EL2ORC * QESO(I,k+1) / (TO(I,k+1)**2)
1750 DT = (G * DZ + HVAP * DQSDP * DP) / (CP * (1. + GAMMA))
1751 DQ = DQSDT * DT + DQSDP * DP
1752 TO(I,k) = TO(I,k+1) + DT
1753 QO(I,k) = QO(I,k+1) + DQ
1754 PO(I,k) = .5 * (PFLD(I,k) + PFLD(I,k+1))
1760 IF(k .le. kmax(i)-1 .and. CNVFLG(I)) THEN
1761 !jfe QESO(I,k) = 10. * FPVS(TO(I,k))
1763 QESO(I,k) = 0.01 * fpvs(TO(I,K)) ! fpvs is in Pa
1765 QESO(I,k) = EPS * QESO(I,k) / (PO(I,k) + EPSM1 * QESO(I,k))
1766 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
1768 QESO(I,k) = MAX(QESO(I,k), val1)
1769 !cmr QO(I,k) = max(QO(I,k),1.e-10)
1771 QO(I,k) = max(QO(I,k), val2 )
1772 ! QO(I,k) = MIN(QO(I,k),QESO(I,k))
1773 HEO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
1774 & CP * TO(I,k) + HVAP * QO(I,k)
1775 HESO(I,k) = .5 * G * (ZO(I,k) + ZO(I,k+1)) + &
1776 & CP * TO(I,k) + HVAP * QESO(I,k)
1783 HEO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QO(I,k)
1784 HESO(I,k) = G * ZO(I,k) + CP * TO(I,k) + HVAP * QESO(I,k)
1785 ! HEO(I,k) = MIN(HEO(I,k),HESO(I,k))
1791 XHKB(I) = HEO(I,INDX)
1792 XQKB(I) = QO(I,INDX)
1793 HCKO(I,INDX) = XHKB(I)
1794 QCKO(I,INDX) = XQKB(I)
1799 !**************************** STATIC CONTROL
1802 !------- MOISTURE AND CLOUD WORK FUNCTIONS
1806 if (k .le. kmax(i)-1) then
1807 ! IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KBCON(I)) THEN
1808 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LE.KTCON(I)) THEN
1809 FACTOR = ETA(I,k-1) / ETA(I,k)
1811 HCKO(I,k) = FACTOR * HCKO(I,k-1) + ONEMF * &
1812 & .5 * (HEO(I,k) + HEO(I,k+1))
1814 ! IF(CNVFLG(I).AND.K.GT.KBCON(I)) THEN
1815 ! HEO(I,k) = HEO(I,k-1)
1822 if (k .le. kmax(i)-1) then
1823 IF(CNVFLG(I).AND.K.GT.KB(I).AND.K.LT.KTCON(I)) THEN
1824 DZ = .5 * (ZO(I,k+1) - ZO(I,k-1))
1825 GAMMA = EL2ORC * QESO(I,k) / (TO(I,k)**2)
1826 XDBY = HCKO(I,k) - HESO(I,k)
1827 !cmr XDBY = MAX(XDBY,0.)
1829 XDBY = MAX(XDBY,val)
1831 & + GAMMA * XDBY / (HVAP * (1. + GAMMA))
1832 FACTOR = ETA(I,k-1) / ETA(I,k)
1834 QCKO(I,k) = FACTOR * QCKO(I,k-1) + ONEMF * &
1835 & .5 * (QO(I,k) + QO(I,k+1))
1836 DQ = ETA(I,k) * QCKO(I,k) - ETA(I,k) * XQRCH
1838 ETAH = .5 * (ETA(I,k) + ETA(I,k-1))
1839 QLK = DQ / (ETA(I,k) + ETAH * C0 * DZ)
1840 XAA0(I) = XAA0(I) - (ZO(I,k) - ZO(I,k-1)) * G * QLK
1842 XPW = ETAH * C0 * DZ * QLK
1844 XPWAV(I) = XPWAV(I) + XPW
1847 ! IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LT.KTCON(I)) THEN
1848 IF(CNVFLG(I).AND.K.GT.KBCON(I).AND.K.LE.KTCON(I)) THEN
1849 DZ1 = ZO(I,k) - ZO(I,k-1)
1850 GAMMA = EL2ORC * QESO(I,k-1) / (TO(I,k-1)**2)
1851 RFACT = 1. + DELTA * CP * GAMMA &
1852 & * TO(I,k-1) / HVAP
1853 XDBY = HCKO(I,k-1) - HESO(I,k-1)
1855 & + DZ1 * (G / (CP * TO(I,k-1))) &
1856 & * XDBY / (1. + GAMMA) &
1860 & DZ1 * G * DELTA * &
1861 !cmr & MAX( 0.,(QESO(I,k-1) - QO(I,k-1))) &
1862 & MAX(val,(QESO(I,k-1) - QO(I,k-1)))
1867 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
1868 !cccc PRINT *, ' XAA BEFORE DWNDRFT =', XAA0(I)
1871 !------- DOWNDRAFT CALCULATIONS
1874 !--- DOWNDRAFT MOISTURE PROPERTIES
1882 XHCD(I) = HEO(I,JMN)
1884 QRCD(I,JMN) = QESO(I,JMN)
1889 if (k .le. kmax(i)-1) then
1890 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1893 GAMMA = EL2ORC * DQ / DT**2
1894 DH = XHCD(I) - HESO(I,k)
1895 QRCD(I,k)=DQ+(1./HVAP)*(GAMMA/(1.+GAMMA))*DH
1896 DETAD = ETAD(I,k+1) - ETAD(I,k)
1897 XPWD = ETAD(I,k+1) * QRCD(I,k+1) - &
1898 & ETAD(I,k) * QRCD(I,k)
1899 XPWD = XPWD - DETAD * &
1900 & .5 * (QRCD(I,k) + QRCD(I,k+1))
1901 XPWEV(I) = XPWEV(I) + XPWD
1909 if(SLIMSK(I).eq.0.) edtmax = edtmaxs
1911 IF(XPWEV(I).GE.0.) THEN
1914 EDTX(I) = -EDTX(I) * XPWAV(I) / XPWEV(I)
1915 EDTX(I) = MIN(EDTX(I),EDTMAX)
1924 !--- DOWNDRAFT CLOUDWORK FUNCTIONS
1929 if (k .le. kmax(i)-1) then
1930 IF(DWNFLG2(I).AND.K.LT.JMIN(I)) THEN
1931 GAMMA = EL2ORC * QESO(I,k+1) / TO(I,k+1)**2
1936 DZ=-1.*(ZO(I,k+1)-ZO(I,k))
1937 XAA0(I)=XAA0(I)+EDTX(I)*DZ*(G/(CP*DT))*((DHH-DH)/(1.+DG)) &
1938 & *(1.+DELTA*CP*DG*DT/HVAP)
1940 XAA0(I)=XAA0(I)+EDTX(I)* &
1941 !cmr & DZ*G*DELTA*MAX( 0.,(QESO(I,k+1)-QO(I,k+1))) &
1942 & DZ*G*DELTA*MAX(val,(QESO(I,k+1)-QO(I,k+1)))
1947 !cccc IF(LAT.EQ.LATD.AND.lon.eq.lond.and.DWNFLG2(I)) THEN
1948 !cccc PRINT *, ' XAA AFTER DWNDRFT =', XAA0(I)
1951 ! CALCULATE CRITICAL CLOUD WORK FUNCTION
1956 ! IF(CNVFLG(I).AND.SLIMSK(I).NE.1.) THEN
1957 IF(PFLD(I,KTCON(I)).LT.PCRIT(15))THEN
1958 ACRT(I)=ACRIT(15)*(975.-PFLD(I,KTCON(I))) &
1960 ELSE IF(PFLD(I,KTCON(I)).GT.PCRIT(1))THEN
1963 !cmr K = IFIX((850. - PFLD(I,KTCON(I)))/50.) + 2
1964 K = int((850. - PFLD(I,KTCON(I)))/50.) + 2
1967 ACRT(I)=ACRIT(K)+(ACRIT(K-1)-ACRIT(K))* &
1968 & (PFLD(I,KTCON(I))-PCRIT(K))/(PCRIT(K-1)-PCRIT(K))
1971 ! ACRT(I) = .5 * (PFLD(I,KBCON(I)) - PFLD(I,KTCON(I)))
1977 if(SLIMSK(I).eq.1.) THEN
1988 !C IF(CNVFLG(I).AND.SLIMSK(I).EQ.1.) THEN
1989 ! ACRTFCT(I) = PDOT(I) / W3
1991 ! modify critical cloud workfunction by cloud base vertical velocity
1993 IF(PDOT(I).LE.W4) THEN
1994 ACRTFCT(I) = (PDOT(I) - W4) / (W3 - W4)
1995 ELSEIF(PDOT(I).GE.-W4) THEN
1996 ACRTFCT(I) = - (PDOT(I) + W4) / (W4 - W3)
2000 !cmr ACRTFCT(I) = MAX(ACRTFCT(I),-1.)
2002 ACRTFCT(I) = MAX(ACRTFCT(I),val1)
2003 !cmr ACRTFCT(I) = MIN(ACRTFCT(I),1.)
2005 ACRTFCT(I) = MIN(ACRTFCT(I),val2)
2006 ACRTFCT(I) = 1. - ACRTFCT(I)
2008 ! modify ACRTFCT(I) by colume mean rh if RHBAR(I) is greater than 80 percent
2010 ! if(RHBAR(I).ge..8) THEN
2011 ! ACRTFCT(I) = ACRTFCT(I) * (.9 - min(RHBAR(I),.9)) * 10.
2014 ! modify adjustment time scale by cloud base vertical velocity
2016 DTCONV(I) = DT2 + max((1800. - DT2),RZERO) * &
2017 & (PDOT(I) - W2) / (W1 - W2)
2018 ! DTCONV(I) = MAX(DTCONV(I), DT2)
2019 ! DTCONV(I) = 1800. * (PDOT(I) - w2) / (w1 - w2)
2020 DTCONV(I) = max(DTCONV(I),dtmin)
2021 DTCONV(I) = min(DTCONV(I),dtmax)
2026 !--- LARGE SCALE FORCING
2031 ! F = AA1(I) / DTCONV(I)
2032 FLD(I) = (AA1(I) - ACRT(I) * ACRTFCT(I)) / DTCONV(I)
2033 IF(FLD(I).LE.0.) FLG(I) = .FALSE.
2037 ! XAA0(I) = MAX(XAA0(I),0.)
2038 XK(I) = (XAA0(I) - AA1(I)) / MBDT
2039 IF(XK(I).GE.0.) FLG(I) = .FALSE.
2042 !--- KERNEL, CLOUD BASE MASS FLUX
2046 XMB(I) = -FLD(I) / XK(I)
2047 XMB(I) = MIN(XMB(I),XMBMAX(I))
2050 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I)) THEN
2051 ! print *, ' RHBAR(I), ACRTFCT(I) =', RHBAR(I), ACRTFCT(I)
2052 ! PRINT *, ' A1, XA =', AA1(I), XAA0(I)
2053 ! PRINT *, ' XMB(I), ACRT =', XMB(I), ACRT
2057 TOTFLG = TOTFLG .AND. (.NOT. CNVFLG(I))
2061 ! restore t0 and QO to t1 and q1 in case convection stops
2065 if (k .le. kmax(i)) then
2068 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
2070 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
2072 QESO(I,k) = EPS * QESO(I,k) / (PFLD(I,k) + EPSM1*QESO(I,k))
2073 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
2075 QESO(I,k) = MAX(QESO(I,k), val )
2079 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2081 !--- FEEDBACK: SIMPLY THE CHANGES FROM THE CLOUD WITH UNIT MASS FLUX
2082 !--- MULTIPLIED BY THE MASS FLUX NECESSARY TO KEEP THE
2083 !--- EQUILIBRIUM WITH THE LARGER-SCALE.
2093 if (k .le. kmax(i)) then
2094 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2096 IF(K.Le.KB(I)) AUP = 0.
2098 IF(K.GT.JMIN(I)) ADW = 0.
2099 DELLAT = (DELLAH(I,k) - HVAP * DELLAQ(I,k)) / CP
2100 T1(I,k) = T1(I,k) + DELLAT * XMB(I) * DT2
2101 Q1(I,k) = Q1(I,k) + DELLAQ(I,k) * XMB(I) * DT2
2102 U1(I,k) = U1(I,k) + DELLAU(I,k) * XMB(I) * DT2
2103 V1(I,k) = V1(I,k) + DELLAV(I,k) * XMB(I) * DT2
2104 DP = 1000. * DEL(I,K)
2105 DELHBAR(I) = DELHBAR(I) + DELLAH(I,k)*XMB(I)*DP/G
2106 DELQBAR(I) = DELQBAR(I) + DELLAQ(I,k)*XMB(I)*DP/G
2107 DELTBAR(I) = DELTBAR(I) + DELLAT*XMB(I)*DP/G
2114 if (k .le. kmax(i)) then
2115 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2116 !jfe QESO(I,k) = 10. * FPVS(T1(I,k))
2118 QESO(I,k) = 0.01 * fpvs(T1(I,K)) ! fpvs is in Pa
2120 QESO(I,k) = EPS * QESO(I,k)/(PFLD(I,k) + EPSM1*QESO(I,k))
2121 !cmr QESO(I,k) = MAX(QESO(I,k),1.E-8)
2123 QESO(I,k) = MAX(QESO(I,k), val )
2127 if(ncloud.gt.0.and.CNVFLG(I).and.k.eq.KTCON(I)) THEN
2128 tem = DELLAL(I) * XMB(I) * dt2
2129 tem1 = MAX(RZERO, MIN(RONE, (TCR-t1(I,K))*TCRF))
2130 if (QL(I,k,2) .gt. -999.0) then
2131 QL(I,k,1) = QL(I,k,1) + tem * tem1 ! Ice
2132 QL(I,k,2) = QL(I,k,2) + tem *(1.0-tem1) ! Water
2134 tem2 = QL(I,k,1) + tem
2135 QL(I,k,1) = tem2 * tem1 ! Ice
2136 QL(I,k,2) = tem2 - QL(I,k,1) ! Water
2138 ! QL(I,k) = QL(I,k) + DELLAL(I) * XMB(I) * dt2
2139 dp = 1000. * del(i,k)
2140 DELLAL(I) = DELLAL(I) * XMB(I) * dp / g
2146 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
2147 ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
2148 ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
2149 ! PRINT *, ' DELLBAR ='
2150 ! PRINT 6003, HVAP*DELLbar
2151 ! PRINT *, ' DELLAQ ='
2152 ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
2153 ! PRINT *, ' DELLAT ='
2154 ! PRINT 6003, (DELLAH(i,k)*XMB(I)-HVAP*DELLAQ(I,k)*XMB(I), &
2165 if (k .le. kmax(i)) then
2166 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2168 IF(K.Le.KB(I)) AUP = 0.
2170 IF(K.GT.JMIN(I)) ADW = 0.
2171 rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
2172 RNTOT(I) = RNTOT(I) + rain * XMB(I) * .001 * dt2
2179 if (k .le. kmax(i)) then
2183 IF(CNVFLG(I).AND.K.LE.KTCON(I)) THEN
2185 IF(K.Le.KB(I)) AUP = 0.
2187 IF(K.GT.JMIN(I)) ADW = 0.
2188 rain = AUP * PWO(I,k) + ADW * EDTO(I) * PWDO(I,k)
2189 RN(I) = RN(I) + rain * XMB(I) * .001 * dt2
2191 IF(FLG(I).AND.K.LE.KTCON(I)) THEN
2192 evef = EDT(I) * evfact
2193 if(SLIMSK(I).eq.1.) evef=EDT(I) * evfactl
2194 ! if(SLIMSK(I).eq.1.) evef=.07
2195 ! if(SLIMSK(I).ne.1.) evef = 0.
2196 QCOND(I) = EVEF * (Q1(I,k) - QESO(I,k)) &
2197 & / (1. + EL2ORC * QESO(I,k) / T1(I,k)**2)
2198 DP = 1000. * DEL(I,K)
2199 IF(RN(I).GT.0..AND.QCOND(I).LT.0.) THEN
2200 QEVAP(I) = -QCOND(I) * (1.-EXP(-.32*SQRT(DT2*RN(I))))
2201 QEVAP(I) = MIN(QEVAP(I), RN(I)*1000.*G/DP)
2202 DELQ2(I) = DELQEV(I) + .001 * QEVAP(I) * dp / g
2204 if(RN(I).gt.0..and.QCOND(I).LT.0..and. &
2205 & DELQ2(I).gt.RNTOT(I)) THEN
2206 QEVAP(I) = 1000.* g * (RNTOT(I) - DELQEV(I)) / dp
2209 IF(RN(I).GT.0..AND.QEVAP(I).gt.0.) THEN
2210 Q1(I,k) = Q1(I,k) + QEVAP(I)
2211 T1(I,k) = T1(I,k) - ELOCP * QEVAP(I)
2212 RN(I) = RN(I) - .001 * QEVAP(I) * DP / G
2213 DELTV(I) = - ELOCP*QEVAP(I)/DT2
2214 DELQ(I) = + QEVAP(I)/DT2
2215 DELQEV(I) = DELQEV(I) + .001*dp*QEVAP(I)/g
2217 DELLAQ(I,k) = DELLAQ(I,k) + DELQ(I) / XMB(I)
2218 DELQBAR(I) = DELQBAR(I) + DELQ(I)*DP/G
2219 DELTBAR(I) = DELTBAR(I) + DELTV(I)*DP/G
2224 ! IF(LAT.EQ.LATD.AND.lon.eq.lond.and.CNVFLG(I) ) THEN
2225 ! PRINT *, ' DELLAH ='
2226 ! PRINT 6003, (DELLAH(k)*XMB(I),K=1,KMAX)
2227 ! PRINT *, ' DELLAQ ='
2228 ! PRINT 6003, (HVAP*DELLAQ(I,k)*XMB(I),K=1,KMAX)
2229 ! PRINT *, ' DELHBAR, DELQBAR, DELTBAR ='
2230 ! PRINT *, DELHBAR, HVAP*DELQBAR, CP*DELTBAR
2231 ! PRINT *, ' PRECIP =', HVAP*RN(I)*1000./DT2
2232 !CCCC PRINT *, ' DELLBAR ='
2233 !CCCC PRINT *, HVAP*DELLbar
2236 ! PRECIPITATION RATE CONVERTED TO ACTUAL PRECIP
2237 ! IN UNIT OF M INSTEAD OF KG
2242 ! IN THE EVENT OF UPPER LEVEL RAIN EVAPORATION AND LOWER LEVEL DOWNDRAF
2243 ! MOISTENING, RN CAN BECOME NEGATIVE, IN THIS CASE, WE BACK OUT OF TH
2244 ! HEATING AND THE MOISTENING
2246 if(RN(I).lt.0..and..not.FLG(I)) RN(I) = 0.
2247 IF(RN(I).LE.0.) THEN
2259 if (k .le. kmax(i)) then
2260 IF(CNVFLG(I).AND.RN(I).LE.0.) THEN
2269 END SUBROUTINE OSASCNV
2271 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2273 SUBROUTINE SHALCV(IM,IX,KM,DT,DEL,PRSI,PRSL,PRSLK,KUO,Q,T,DPSHC)
2275 USE MODULE_GFS_MACHINE , ONLY : kind_phys
2276 USE MODULE_GFS_PHYSCONS, grav => con_g, CP => con_CP, HVAP => con_HVAP &
2281 ! include 'constant.h'
2283 integer IM, IX, KM, KUO(IM)
2284 real(kind=kind_phys) DEL(IX,KM), PRSI(IX,KM+1), PRSL(IX,KM), &
2286 & Q(IX,KM), T(IX,KM), DT, DPSHC
2290 real(kind=kind_phys) ck, cpdt, dmse, dsdz1, dsdz2, &
2291 & dsig, dtodsl, dtodsu, eldq, g, &
2294 integer k,k1,k2,kliftl,kliftu,kt,N2,I,iku,ik1,ik,ii
2295 integer INDEX2(IM), KLCL(IM), KBOT(IM), KTOP(IM),kk &
2298 ! PHYSICAL PARAMETERS
2299 PARAMETER(G=GRAV, GOCP=G/CP)
2300 ! BOUNDS OF PARCEL ORIGIN
2301 PARAMETER(KLIFTL=2,KLIFTU=2)
2303 real(kind=kind_phys) Q2(IM*KM), T2(IM*KM), &
2304 & PRSL2(IM*KM), PRSLK2(IM*KM), &
2305 & AL(IM*(KM-1)), AD(IM*KM), AU(IM*(KM-1))
2306 !-----------------------------------------------------------------------
2307 ! COMPRESS FIELDS TO POINTS WITH NO DEEP CONVECTION
2308 ! AND MOIST STATIC INSTABILITY.
2314 IF(KUO(I).EQ.0) THEN
2315 ELDQ = HVAP*(Q(I,K)-Q(I,K+1))
2316 CPDT = CP*(T(I,K)-T(I,K+1))
2317 RTDLS = (PRSL(I,K)-PRSL(I,K+1)) / &
2318 & PRSI(I,K+1)*RD*0.5*(T(I,K)+T(I,K+1))
2319 DMSE = ELDQ+CPDT-RTDLS
2320 LSHC(I) = LSHC(I).OR.DMSE.GT.0.
2339 PRSL2(IK) = PRSL(II,K)
2340 PRSLK2(IK) = PRSLK(II,K)
2349 if (prsi(ii,1)-prsi(ii,k) .le. dpshc) ktopm(i) = k
2353 !-----------------------------------------------------------------------
2354 ! COMPUTE MOIST ADIABAT AND DETERMINE LIMITS OF SHALLOW CONVECTION.
2355 ! CHECK FOR MOIST STATIC INSTABILITY AGAIN WITHIN CLOUD.
2356 CALL MSTADBT3(N2,KM-1,KLIFTL,KLIFTU,PRSL2,PRSLK2,T2,Q2, &
2357 & KLCL,KBOT,KTOP,AL,AU)
2359 KBOT(I) = min(KLCL(I)-1, ktopm(i)-1)
2360 KTOP(I) = min(KTOP(I)+1, ktopm(i))
2366 IF(K.GE.KBOT(I).AND.K.LT.KTOP(I)) THEN
2369 ELDQ = HVAP * (Q2(IK)-Q2(IKU))
2370 CPDT = CP * (T2(IK)-T2(IKU))
2371 RTDLS = (PRSL2(IK)-PRSL2(IKU)) / &
2372 & PRSI(index2(i),K+1)*RD*0.5*(T2(IK)+T2(IKU))
2373 DMSE = ELDQ + CPDT - RTDLS
2374 LSHC(I) = LSHC(I).OR.DMSE.GT.0.
2382 IF(.NOT.LSHC(I)) THEN
2386 K1 = MIN(K1,KBOT(I))
2387 K2 = MAX(K2,KTOP(I))
2391 !-----------------------------------------------------------------------
2392 ! SET EDDY VISCOSITY COEFFICIENT CKU AT SIGMA INTERFACES.
2393 ! COMPUTE DIAGONALS AND RHS FOR TRIDIAGONAL MATRIX SOLVER.
2394 ! EXPAND FINAL FIELDS.
2404 ! DTODSU= DT/DEL(K+1)
2405 ! DSIG=SL(K)-SL(K+1)
2409 DTODSL = DT/DEL(II,K)
2410 DTODSU = DT/DEL(II,K+1)
2411 DSIG = PRSL(II,K) - PRSL(II,K+1)
2414 IF(K.EQ.KBOT(I)) THEN
2416 ELSEIF(K.EQ.KTOP(I)-1) THEN
2418 ELSEIF(K.EQ.KTOP(I)-2) THEN
2420 ELSEIF(K.GT.KBOT(I).AND.K.LT.KTOP(I)-2) THEN
2425 DSDZ1 = CK*DSIG*AU(IK)*GOCP
2426 DSDZ2 = CK*DSIG*AU(IK)*AU(IK)
2427 AU(IK) = -DTODSL*DSDZ2
2428 AL(IK) = -DTODSU*DSDZ2
2429 AD(IK) = AD(IK)-AU(IK)
2431 T2(IK) = T2(IK)+DTODSL*DSDZ1
2432 T2(IKU) = T2(IKU)-DTODSU*DSDZ1
2436 CALL TRIDI2T3(N2,KT,AL(IK1),AD(IK1),AU(IK1),Q2(IK1),T2(IK1), &
2437 & AU(IK1),Q2(IK1),T2(IK1))
2442 Q(INDEX2(I),K) = Q2(IK)
2443 T(INDEX2(I),K) = T2(IK)
2446 !-----------------------------------------------------------------------
2448 END SUBROUTINE SHALCV
2449 !-----------------------------------------------------------------------
2450 SUBROUTINE TRIDI2T3(L,N,CL,CM,CU,R1,R2,AU,A1,A2)
2451 !yt INCLUDE DBTRIDI2;
2453 USE MODULE_GFS_MACHINE , ONLY : kind_phys
2456 real(kind=kind_phys) fk
2458 real(kind=kind_phys) &
2459 & CL(L,2:N),CM(L,N),CU(L,N-1),R1(L,N),R2(L,N), &
2460 & AU(L,N-1),A1(L,N),A2(L,N)
2461 !-----------------------------------------------------------------------
2470 FK=1./(CM(I,K)-CL(I,K)*AU(I,K-1))
2472 A1(I,K)=FK*(R1(I,K)-CL(I,K)*A1(I,K-1))
2473 A2(I,K)=FK*(R2(I,K)-CL(I,K)*A2(I,K-1))
2477 FK=1./(CM(I,N)-CL(I,N)*AU(I,N-1))
2478 A1(I,N)=FK*(R1(I,N)-CL(I,N)*A1(I,N-1))
2479 A2(I,N)=FK*(R2(I,N)-CL(I,N)*A2(I,N-1))
2483 A1(I,K)=A1(I,K)-AU(I,K)*A1(I,K+1)
2484 A2(I,K)=A2(I,K)-AU(I,K)*A2(I,K+1)
2487 !-----------------------------------------------------------------------
2489 END SUBROUTINE TRIDI2T3
2490 !-----------------------------------------------------------------------
2492 SUBROUTINE MSTADBT3(IM,KM,K1,K2,PRSL,PRSLK,TENV,QENV, &
2493 & KLCL,KBOT,KTOP,TCLD,QCLD)
2494 !yt INCLUDE DBMSTADB;
2496 USE MODULE_GFS_MACHINE, ONLY : kind_phys
2497 USE MODULE_GFS_FUNCPHYS, ONLY : FTDP, FTHE, FTLCL, STMA
2498 USE MODULE_GFS_PHYSCONS, EPS => con_eps, EPSM1 => con_epsm1, FV => con_FVirt
2502 ! include 'constant.h'
2504 integer k,k1,k2,km,i,im
2505 real(kind=kind_phys) pv,qma,slklcl,tdpd,thelcl,tlcl
2506 real(kind=kind_phys) tma,tvcld,tvenv
2508 real(kind=kind_phys) PRSL(IM,KM), PRSLK(IM,KM), TENV(IM,KM), &
2509 & QENV(IM,KM), TCLD(IM,KM), QCLD(IM,KM)
2510 INTEGER KLCL(IM), KBOT(IM), KTOP(IM)
2512 real(kind=kind_phys) SLKMA(IM), THEMA(IM)
2513 !-----------------------------------------------------------------------
2514 ! DETERMINE WARMEST POTENTIAL WET-BULB TEMPERATURE BETWEEN K1 AND K2.
2515 ! COMPUTE ITS LIFTING CONDENSATION LEVEL.
2523 PV = 1000.0 * PRSL(I,K)*QENV(I,K)/(EPS-EPSM1*QENV(I,K))
2524 TDPD = TENV(I,K)-FTDP(PV)
2526 TLCL = FTLCL(TENV(I,K),TDPD)
2527 SLKLCL = PRSLK(I,K)*TLCL/TENV(I,K)
2532 THELCL=FTHE(TLCL,SLKLCL)
2533 IF(THELCL.GT.THEMA(I)) THEN
2539 !-----------------------------------------------------------------------
2540 ! SET CLOUD TEMPERATURES AND HUMIDITIES WHEREVER THE PARCEL LIFTED UP
2541 ! THE MOIST ADIABAT IS BUOYANT WITH RESPECT TO THE ENVIRONMENT.
2555 IF(PRSLK(I,K).LE.SLKMA(I)) THEN
2556 KLCL(I)=MIN(KLCL(I),K)
2557 CALL STMA(THEMA(I),PRSLK(I,K),TMA,QMA)
2558 ! TMA=FTMA(THEMA(I),PRSLK(I,K),QMA)
2559 TVCLD=TMA*(1.+FV*QMA)
2560 TVENV=TENV(I,K)*(1.+FV*QENV(I,K))
2561 IF(TVCLD.GT.TVENV) THEN
2562 KBOT(I)=MIN(KBOT(I),K)
2563 KTOP(I)=MAX(KTOP(I),K)
2564 TCLD(I,K)=TMA-TENV(I,K)
2565 QCLD(I,K)=QMA-QENV(I,K)
2570 !-----------------------------------------------------------------------
2572 END SUBROUTINE MSTADBT3
2575 ! random seeds - ZCX
2576 SUBROUTINE init_random_seed()
2577 INTEGER :: i, n, clock
2578 INTEGER, DIMENSION(:), ALLOCATABLE :: seed
2580 CALL RANDOM_SEED(size = n)
2583 CALL SYSTEM_CLOCK(COUNT=clock)
2585 seed = clock + 37 * (/ (i - 1, i = 1, n) /)
2586 CALL RANDOM_SEED(PUT = seed)
2591 END MODULE module_cu_osas