/wrfv2_fire/phys/module_cu_kfeta.F
FORTRAN Legacy | 3174 lines | 2002 code | 116 blank | 1056 comment | 19 complexity | 83c977654d6529edf366d4c5881efc42 MD5 | raw file
Possible License(s): AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- MODULE module_cu_kfeta
- USE module_wrf_error
- !
- ! V3.3: A new trigger function is added based Ma and Tan (2009):
- ! Ma, L.-M. and Z.-M. Tan, 2009: Improving the behavior of
- ! the cumulus parameterization for tropical cyclone prediction:
- ! Convection trigger. Atmospheric Research, 92, 190 - 211.
- !
- !--------------------------------------------------------------------
- ! Lookup table variables:
- INTEGER, PARAMETER :: KFNT=250,KFNP=220
- REAL, DIMENSION(KFNT,KFNP),PRIVATE, SAVE :: TTAB,QSTAB
- REAL, DIMENSION(KFNP),PRIVATE, SAVE :: THE0K
- REAL, DIMENSION(200),PRIVATE, SAVE :: ALU
- REAL, PRIVATE, SAVE :: RDPR,RDTHK,PLUTOP
- ! Note: KF Lookup table is used by subroutines KF_eta_PARA, TPMIX2,
- ! TPMIX2DD, ENVIRTHT
- ! End of Lookup table variables:
- CONTAINS
- SUBROUTINE KF_eta_CPS( &
- ids,ide, jds,jde, kds,kde &
- ,ims,ime, jms,jme, kms,kme &
- ,its,ite, jts,jte, kts,kte &
- ,trigger &
- ,DT,KTAU,DX,CUDT,CURR_SECS,ADAPT_STEP_FLAG &
- ,CUDTACTTIME &
- ,rho,RAINCV,PRATEC,NCA &
- ,U,V,TH,T,W,dz8w,Pcps,pi &
- ,W0AVG,XLV0,XLV1,XLS0,XLS1,CP,R,G,EP1 &
- ,EP2,SVP1,SVP2,SVP3,SVPT0 &
- ,STEPCU,CU_ACT_FLAG,warm_rain,CUTOP,CUBOT &
- ,QV &
- ! optionals
- ,F_QV ,F_QC ,F_QR ,F_QI ,F_QS &
- ,RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN &
- ,RQICUTEN,RQSCUTEN, RQVFTEN &
- )
- !
- !-------------------------------------------------------------
- IMPLICIT NONE
- !-------------------------------------------------------------
- INTEGER, INTENT(IN ) :: &
- ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte
- INTEGER, INTENT(IN ) :: trigger
- INTEGER, INTENT(IN ) :: STEPCU
- LOGICAL, INTENT(IN ) :: warm_rain
- REAL, INTENT(IN ) :: XLV0,XLV1,XLS0,XLS1
- REAL, INTENT(IN ) :: CP,R,G,EP1,EP2
- REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
- INTEGER, INTENT(IN ) :: KTAU
- REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
- INTENT(IN ) :: &
- U, &
- V, &
- W, &
- TH, &
- T, &
- QV, &
- dz8w, &
- Pcps, &
- rho, &
- pi
- !
- REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
- INTENT(INOUT) :: &
- W0AVG
- REAL, INTENT(IN ) :: DT, DX
- REAL, INTENT(IN ) :: CUDT
- REAL, INTENT(IN ) :: CURR_SECS
- LOGICAL,OPTIONAL,INTENT(IN ) :: ADAPT_STEP_FLAG
- REAL, INTENT (INOUT) :: CUDTACTTIME
- !
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: RAINCV
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: PRATEC
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: NCA
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(OUT) :: CUBOT, &
- CUTOP
- LOGICAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: CU_ACT_FLAG
- !
- ! Optional arguments
- !
- REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
- OPTIONAL, &
- INTENT(INOUT) :: &
- RTHCUTEN, &
- RQVCUTEN, &
- RQCCUTEN, &
- RQRCUTEN, &
- RQICUTEN, &
- RQSCUTEN, &
- RQVFTEN
- !
- ! Flags relating to the optional tendency arrays declared above
- ! Models that carry the optional tendencies will provdide the
- ! optional arguments at compile time; these flags all the model
- ! to determine at run-time whether a particular tracer is in
- ! use or not.
- !
- LOGICAL, OPTIONAL :: &
- F_QV &
- ,F_QC &
- ,F_QR &
- ,F_QI &
- ,F_QS
- ! LOCAL VARS
- LOGICAL :: flag_qr, flag_qi, flag_qs
- REAL, DIMENSION( kts:kte ) :: &
- U1D, &
- V1D, &
- T1D, &
- DZ1D, &
- QV1D, &
- P1D, &
- RHO1D, &
- tpart_v1D, &
- tpart_h1D, &
- W0AVG1D
- REAL, DIMENSION( kts:kte ):: &
- DQDT, &
- DQIDT, &
- DQCDT, &
- DQRDT, &
- DQSDT, &
- DTDT
- REAL, DIMENSION (its-1:ite+1,kts:kte,jts-1:jte+1) :: aveh_t, aveh_q
- REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: aveh_qmax, aveh_qmin
- REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: avev_t, avev_q
- REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: avev_qmax, avev_qmin
- REAL, DIMENSION (its:ite,kts:kte,jts:jte) :: coef_v, coef_h, tpart_h, tpart_v
- INTEGER :: ii,jj,kk
- REAL :: ttop
- REAL, DIMENSION (kts:kte) :: z0
- REAL :: TST,tv,PRS,RHOE,W0,SCR1,DXSQ,tmp
- integer :: ibegh,iendh,jbegh,jendh
- integer :: istart,iend,jstart,jend
- INTEGER :: i,j,k,NTST
- REAL :: lastdt = -1.0
- REAL :: W0AVGfctr, W0fctr, W0den
- LOGICAL :: run_param , doing_adapt_dt , decided
-
- !
- DXSQ=DX*DX
- !----------------------
- NTST=STEPCU
- TST=float(NTST*2)
- flag_qr = .FALSE.
- flag_qi = .FALSE.
- flag_qs = .FALSE.
- IF ( PRESENT(F_QR) ) flag_qr = F_QR
- IF ( PRESENT(F_QI) ) flag_qi = F_QI
- IF ( PRESENT(F_QS) ) flag_qs = F_QS
- !
- if (lastdt < 0) then
- lastdt = dt
- endif
-
- if (ADAPT_STEP_FLAG) then
- W0AVGfctr = 2 * MAX(CUDT*60,dt) - dt
- W0fctr = dt
- W0den = 2 * MAX(CUDT*60,dt)
- else
- W0AVGfctr = (TST-1.)
- W0fctr = 1.
- W0den = TST
- endif
- DO J = jts,jte
- DO K=kts,kte
- DO I= its,ite
- ! SCR1=-5.0E-4*G*rho(I,K,J)*(w(I,K,J)+w(I,K+1,J))
- ! TV=T(I,K,J)*(1.+EP1*QV(I,K,J))
- ! RHOE=Pcps(I,K,J)/(R*TV)
- ! W0=-101.9368*SCR1/RHOE
- W0=0.5*(w(I,K,J)+w(I,K+1,J))
- ! Old:
- !
- ! W0AVG(I,K,J)=(W0AVG(I,K,J)*(TST-1.)+W0)/TST
- !
- ! New, to support adaptive time step:
- !
- W0AVG(I,K,J) = ( W0AVG(I,K,J) * W0AVGfctr + W0 * W0fctr ) / W0den
- ENDDO
- ENDDO
- ENDDO
- lastdt = dt
- ! Initialization for adaptive time step.
- doing_adapt_dt = .FALSE.
- IF ( PRESENT(adapt_step_flag) ) THEN
- IF ( adapt_step_flag ) THEN
- doing_adapt_dt = .TRUE.
- IF ( cudtacttime .EQ. 0. ) THEN
- cudtacttime = curr_secs + cudt*60.
- END IF
- END IF
- END IF
- ! Do we run through this scheme or not?
- ! Test 1: If this is the initial model time, then yes.
- ! KTAU=1
- ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
- ! CUDT=0 or STEPCU=1
- ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
- ! MOD(KTAU,NST)=0
- ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
- ! CURR_SECS >= CUDTACTTIME
- ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
- ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
- ! We only proceed to other tests if the previous tests all have left decided as FALSE.
- ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
- ! cumulus run.
- decided = .FALSE.
- run_param = .FALSE.
- IF ( ( .NOT. decided ) .AND. &
- ( ktau .EQ. 1 ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- END IF
- IF ( ( .NOT. decided ) .AND. &
- ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- END IF
- IF ( ( .NOT. decided ) .AND. &
- ( .NOT. doing_adapt_dt ) .AND. &
- ( MOD(ktau,ntst) .EQ. 0 ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- END IF
- IF ( ( .NOT. decided ) .AND. &
- ( doing_adapt_dt ) .AND. &
- ( curr_secs .GE. cudtacttime ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- cudtacttime = curr_secs + cudt*60
- END IF
- if (run_param) then
- ! New trigger function
- IF (trigger.eq.2) THEN
- !
- ! calculate 9-point average of moisture advection and temperature using halo (Horizontal)
- !
- aveh_t=-999 ! horizontal 9-point ave
- aveh_q=-999
- avev_t=0 ! vertical 3-level ave
- avev_q=0
- avev_qmax=0
- avev_qmin=0
- aveh_qmax=0
- aveh_qmin=0
- tpart_h=0
- tpart_v=0
- coef_h=0
- coef_v=0
- ibegh=max(its-1, ids+1) ! start from 2
- jbegh=max(jts-1, jds+1)
- iendh=min(ite+1, ide-2) ! end at ide-2
- jendh=min(jte+1, jde-2)
- DO J = jbegh,jendh
- DO K = kts,kte
- DO I = ibegh,iendh
- aveh_t(i,k,j)=(T(i-1,k,j-1)+T(i-1,k,j) +T(i-1,k,j+1)+ &
- T(i,k,j-1) +T(i,k,j) +T(i,k,j+1)+ &
- T(i+1,k,j-1) +T(i+1,k,j) +T(i+1,k,j+1))/9.
- aveh_q(i,k,j)=(rqvften(i-1,k,j-1)+rqvften(i-1,k,j) +rqvften(i-1,k,j+1)+ &
- rqvften(i,k,j-1) +rqvften(i,k,j) +rqvften(i,k,j+1)+ &
- rqvften(i+1,k,j-1) +rqvften(i+1,k,j) +rqvften(i+1,k,j+1))/9.
- ENDDO
- ENDDO
- ENDDO
- ! boundary value ( all processors will do the following? Or just those processsors handling sub-area including boundary)
- DO K = kts,kte
- DO J = jts-1,jte+1
- DO I = its-1,ite+1
- if(i.eq.ids) then
- aveh_t(i,k,j)=aveh_t(i+1,k,j)
- aveh_q(i,k,j)=aveh_q(i+1,k,j)
- elseif(i.eq.ide-1) then
- aveh_t(i,k,j)=aveh_t(i-1,k,j)
- aveh_q(i,k,j)=aveh_q(i-1,k,j)
- endif
- if(j.eq.jds) then
- aveh_t(i,k,j)=aveh_t(i,k,j+1)
- aveh_q(i,k,j)=aveh_q(i,k,j+1)
- elseif(j.eq.jde-1) then
- aveh_t(i,k,j)=aveh_t(i,k,j-1)
- aveh_q(i,k,j)=aveh_q(i,k,j-1)
- endif
- if(j.eq.jds.and.i.eq.ids) then
- aveh_q(i,k,j)=aveh_q(i+1,k,j+1)
- aveh_t(i,k,j)=aveh_t(i+1,k,j+1)
- endif
- if(j.eq.jde-1.and.i.eq.ids) then
- aveh_q(i,k,j)=aveh_q(i+1,k,j-1)
- aveh_t(i,k,j)=aveh_t(i+1,k,j-1)
- endif
- if(j.eq.jde-1.and.i.eq.ide-1) then
- aveh_q(i,k,j)=aveh_q(i-1,k,j-1)
- aveh_t(i,k,j)=aveh_t(i-1,k,j-1)
- endif
- if(j.eq.jds.and.i.eq.ide-1) then
- aveh_q(i,k,j)=aveh_q(i-1,k,j+1)
- aveh_t(i,k,j)=aveh_t(i-1,k,j+1)
- endif
- ENDDO
- ENDDO
- ENDDO
- ! search for max/min moisture advection in 9-point range, calculate horizontal T-perturbation (tpart_h)
- istart=max(its, ids+1) ! start from 2
- jstart=max(jts, jds+1)
- iend=min(ite, ide-2) ! end at ide-2
- jend=min(jte, jde-2)
- DO K = kts,kte
- DO J = jstart,jend
- DO I = istart,iend
- aveh_qmax(i,k,j)=aveh_q(i,k,j)
- aveh_qmin(i,k,j)=aveh_q(i,k,j)
- DO ii=-1, 1
- DO jj=-1,1
- if(aveh_q(i+II,k,j+JJ).gt.aveh_qmax(i,k,j)) aveh_qmax(i,k,j)=aveh_q(i+II,k,j+JJ)
- if(aveh_q(i+II,k,j+JJ).lt.aveh_qmin(i,k,j)) aveh_qmin(i,k,j)=aveh_q(i+II,k,j+JJ)
- ENDDO
- ENDDO
- if(aveh_qmax(i,k,j).gt.aveh_qmin(i,k,j))then
- coef_h(i,k,j)=(aveh_q(i,k,j)-aveh_qmin(i,k,j))/(aveh_qmax(i,k,j)-aveh_qmin(i,k,j))
- else
- coef_h(i,k,j)=0.
- endif
- coef_h(i,k,j)=amin1(coef_h(i,k,j),1.0)
- coef_h(i,k,j)=amax1(coef_h(i,k,j),0.0)
- tpart_h(i,k,j)=coef_h(i,k,j)*(T(i,k,j)-aveh_t(i,k,j))
- ENDDO
- ENDDO
- ENDDO
- 89 continue
- ! vertical 3-layer calculation
- DO J = jts, jte
- DO I = its, ite
- z0(1) = 0.5 * dz8w(i,1,j)
- DO K = 2, kte
- Z0(K) = Z0(K-1) + .5 * (DZ8W(i,K,j) + DZ8W(i,K-1,j))
- ENDDO
- DO K = kts+1,kte-1
- ttop = t(i,k,j) + ((t(i,k,j) - t(i,k+1,j)) / (z0(k) - z0(k+1))) * (z0(k)-z0(k-1))
- avev_t(i,k,j)=(T(i,k-1,j) + T(i,k,j) + ttop)/3.
- ! avev_t(i,k,j)=(T(i,k-1,j)+T(i,k,j) + T(i,k+1,j))/3.
- avev_q(i,k,j)=(rqvften(i,k-1,j)+rqvften(i,k,j) + rqvften(i,k+1,j))/3.
- ENDDO
- avev_t(i,kts,j)=avev_t(i,kts+1,j) ! lowest level value, is it the same as avev_t(i,kds,j)=avev_t(i,kds+1,j)?
- avev_q(i,kts,j)=avev_q(i,kts+1,j)
- avev_t(i,kte,j)=avev_t(i,kte-1,j) ! highest level value
- avev_q(i,kte,j)=avev_q(i,kte-1,j)
- ENDDO
- ENDDO
- ! max /min value
- DO J = jts, jte
- DO I = its, ite
- DO K = kts+1,kte-1
- avev_qmax(i,k,j)=avev_q(i,k,j)
- avev_qmin(i,k,j)=avev_q(i,k,j)
- DO kk=-1,1
- if(avev_q(i,k+kk,j).gt.avev_qmax(i,k,j)) avev_qmax(i,k,j)=avev_q(i,k+kk,j)
- if(avev_q(i,k+kk,j).lt.avev_qmin(i,k,j)) avev_qmin(i,k,j)=avev_q(i,k+kk,j)
- ENDDO
- if(avev_qmax(i,k,j).gt.avev_qmin(i,k,j)) then
- coef_v(i,k,j)=(avev_q(i,k,j)-avev_qmin(i,k,j))/(avev_qmax(i,k,j)-avev_qmin(i,k,j))
- else
- coef_v(i,k,j)=0
- endif
- tpart_v(i,k,j)=coef_v(i,k,j)*(T(i,k,j)-avev_t(i,k,j))
- ENDDO
- tpart_v(i,kts,j)= tpart_v(i,kts+1,j) ! lowest level
- tpart_v(i,kte,j)= tpart_v(i,kte-1,j) ! highest level
- ENDDO
- ENDDO
- ENDIF ! endif (trigger.eq.2)
- !
- DO J = jts,jte
- DO I= its,ite
- CU_ACT_FLAG(i,j) = .true.
- ENDDO
- ENDDO
- DO J = jts,jte
- DO I=its,ite
-
- IF ( NCA(I,J) .ge. 0.5*DT ) then
- CU_ACT_FLAG(i,j) = .false.
- ELSE
- DO k=kts,kte
- DQDT(k)=0.
- DQIDT(k)=0.
- DQCDT(k)=0.
- DQRDT(k)=0.
- DQSDT(k)=0.
- DTDT(k)=0.
- ENDDO
- RAINCV(I,J)=0.
- CUTOP(I,J)=KTS
- CUBOT(I,J)=KTE+1
- PRATEC(I,J)=0.
- !
- ! assign vars from 3D to 1D
- DO K=kts,kte
- U1D(K) =U(I,K,J)
- V1D(K) =V(I,K,J)
- T1D(K) =T(I,K,J)
- RHO1D(K) =rho(I,K,J)
- QV1D(K)=QV(I,K,J)
- P1D(K) =Pcps(I,K,J)
- W0AVG1D(K) =W0AVG(I,K,J)
- DZ1D(k)=dz8w(I,K,J)
- IF (trigger.eq.2) THEN
- tpart_h1D(K) =tpart_h(I,K,J)
- tpart_v1D(K) =tpart_v(I,K,J)
- ELSE
- tpart_h1D(K) = 0.
- tpart_v1D(K) = 0.
- ENDIF
- ENDDO
- CALL KF_eta_PARA(I, J, &
- U1D,V1D,T1D,QV1D,P1D,DZ1D,W0AVG1D, &
- tpart_h1D,tpart_v1D, &
- trigger, &
- DT,DX,DXSQ,RHO1D, &
- XLV0,XLV1,XLS0,XLS1,CP,R,G, &
- EP2,SVP1,SVP2,SVP3,SVPT0, &
- DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT, &
- RAINCV,PRATEC,NCA, &
- flag_QI,flag_QS,warm_rain, &
- CUTOP,CUBOT,CUDT, &
- ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte)
- IF(PRESENT(rthcuten).AND.PRESENT(rqvcuten)) THEN
- DO K=kts,kte
- RTHCUTEN(I,K,J)=DTDT(K)/pi(I,K,J)
- RQVCUTEN(I,K,J)=DQDT(K)
- ENDDO
- ENDIF
- IF(PRESENT(rqrcuten).AND.PRESENT(rqccuten)) THEN
- IF( F_QR )THEN
- DO K=kts,kte
- RQRCUTEN(I,K,J)=DQRDT(K)
- RQCCUTEN(I,K,J)=DQCDT(K)
- ENDDO
- ELSE
- ! This is the case for Eta microphysics without 3d rain field
- DO K=kts,kte
- RQRCUTEN(I,K,J)=0.
- RQCCUTEN(I,K,J)=DQRDT(K)+DQCDT(K)
- ENDDO
- ENDIF
- ENDIF
- !...... QSTEN STORES GRAUPEL TENDENCY IF IT EXISTS, OTHERISE SNOW (V2)
- IF(PRESENT( rqicuten )) THEN
- IF ( F_QI ) THEN
- DO K=kts,kte
- RQICUTEN(I,K,J)=DQIDT(K)
- ENDDO
- ENDIF
- ENDIF
- IF(PRESENT( rqscuten )) THEN
- IF ( F_QS ) THEN
- DO K=kts,kte
- RQSCUTEN(I,K,J)=DQSDT(K)
- ENDDO
- ENDIF
- ENDIF
- !
- ENDIF
- ENDDO ! i-loop
- ENDDO ! j-loop
- ENDIF ! run_param
- !
- END SUBROUTINE KF_eta_CPS
- ! ****************************************************************************
- !-----------------------------------------------------------
- SUBROUTINE KF_eta_PARA (I, J, &
- U0,V0,T0,QV0,P0,DZQ,W0AVG1D, &
- TPART_H0,TPART_V0, &
- trigger, &
- DT,DX,DXSQ,rhoe, &
- XLV0,XLV1,XLS0,XLS1,CP,R,G, &
- EP2,SVP1,SVP2,SVP3,SVPT0, &
- DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT, &
- RAINCV,PRATEC,NCA, &
- F_QI,F_QS,warm_rain, &
- CUTOP,CUBOT,CUDT, &
- ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte)
- !-----------------------------------------------------------
- !***** The KF scheme that is currently used in experimental runs of EMCs
- !***** Eta model....jsk 8/00
- !
- IMPLICIT NONE
- !-----------------------------------------------------------
- INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte, &
- I,J
- ! ,P_QI,P_QS,P_FIRST_SCALAR
- INTEGER, INTENT(IN ) :: trigger
- LOGICAL, INTENT(IN ) :: F_QI, F_QS
- LOGICAL, INTENT(IN ) :: warm_rain
- !
- REAL, DIMENSION( kts:kte ), &
- INTENT(IN ) :: U0, &
- V0, &
- TPART_H0, &
- TPART_V0, &
- T0, &
- QV0, &
- P0, &
- rhoe, &
- DZQ, &
- W0AVG1D
- !
- REAL, INTENT(IN ) :: DT,DX,DXSQ
- !
- REAL, INTENT(IN ) :: XLV0,XLV1,XLS0,XLS1,CP,R,G
- REAL, INTENT(IN ) :: EP2,SVP1,SVP2,SVP3,SVPT0
- !
- REAL, DIMENSION( kts:kte ), INTENT(INOUT) :: &
- DQDT, &
- DQIDT, &
- DQCDT, &
- DQRDT, &
- DQSDT, &
- DTDT
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: NCA
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: RAINCV
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: PRATEC
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(OUT) :: CUBOT, &
- CUTOP
- REAL, INTENT(IN ) :: CUDT
- !
- !...DEFINE LOCAL VARIABLES...
- !
- REAL, DIMENSION( kts:kte ) :: &
- Q0,Z0,TV0,TU,TVU,QU,TZ,TVD, &
- QD,QES,THTES,TG,TVG,QG,WU,WD,W0,EMS,EMSD, &
- UMF,UER,UDR,DMF,DER,DDR,UMF2,UER2, &
- UDR2,DMF2,DER2,DDR2,DZA,THTA0,THETEE, &
- THTAU,THETEU,THTAD,THETED,QLIQ,QICE, &
- QLQOUT,QICOUT,PPTLIQ,PPTICE,DETLQ,DETIC, &
- DETLQ2,DETIC2,RATIO,RATIO2
- REAL, DIMENSION( kts:kte ) :: &
- DOMGDP,EXN,TVQU,DP,RH,EQFRC,WSPD, &
- QDT,FXM,THTAG,THPA,THFXOUT, &
- THFXIN,QPA,QFXOUT,QFXIN,QLPA,QLFXIN, &
- QLFXOUT,QIPA,QIFXIN,QIFXOUT,QRPA, &
- QRFXIN,QRFXOUT,QSPA,QSFXIN,QSFXOUT, &
- QL0,QLG,QI0,QIG,QR0,QRG,QS0,QSG
- REAL, DIMENSION( kts:kte+1 ) :: OMG
- REAL, DIMENSION( kts:kte ) :: RAINFB,SNOWFB
- REAL, DIMENSION( kts:kte ) :: &
- CLDHGT,QSD,DILFRC,DDILFRC,TKE,TGU,QGU,THTEEG
- ! LOCAL VARS
- REAL :: P00,T00,RLF,RHIC,RHBC,PIE, &
- TTFRZ,TBFRZ,C5,RATE
- REAL :: GDRY,ROCP,ALIQ,BLIQ, &
- CLIQ,DLIQ
- REAL :: FBFRC,P300,DPTHMX,THMIX,QMIX,ZMIX,PMIX, &
- ROCPQ,TMIX,EMIX,TLOG,TDPT,TLCL,TVLCL, &
- CPORQ,PLCL,ES,DLP,TENV,QENV,TVEN,TVBAR, &
- ZLCL,WKL,WABS,TRPPT,WSIGNE,DTLCL,GDT,WLCL,&
- TVAVG,QESE,WTW,RHOLCL,AU0,VMFLCL,UPOLD, &
- UPNEW,ABE,WKLCL,TTEMP,FRC1, &
- QNEWIC,RL,R1,QNWFRZ,EFFQ,BE,BOTERM,ENTERM,&
- DZZ,UDLBE,REI,EE2,UD2,TTMP,F1,F2, &
- THTTMP,QTMP,TMPLIQ,TMPICE,TU95,TU10,EE1, &
- UD1,DPTT,QNEWLQ,DUMFDP,EE,TSAT, &
- THTA,VCONV,TIMEC,SHSIGN,VWS,PEF, &
- CBH,RCBH,PEFCBH,PEFF,PEFF2,TDER,THTMIN, &
- DTMLTD,QS,TADVEC,DPDD,FRC,DPT,RDD,A1, &
- DSSDT,DTMP,T1RH,QSRH,PPTFLX,CPR,CNDTNF, &
- UPDINC,AINCM2,DEVDMF,PPR,RCED,DPPTDF, &
- DMFLFS,DMFLFS2,RCED2,DDINC,AINCMX,AINCM1, &
- AINC,TDER2,PPTFL2,FABE,STAB,DTT,DTT1, &
- DTIME,TMA,TMB,TMM,BCOEFF,ACOEFF,QVDIFF, &
- TOPOMG,CPM,DQ,ABEG,DABE,DFDA,FRC2,DR, &
- UDFRC,TUC,QGS,RH0,RHG,QINIT,QFNL,ERR2, &
- RELERR,RLC,RLS,RNC,FABEOLD,AINCOLD,UEFRC, &
- DDFRC,TDC,DEFRC,RHBAR,DMFFRC,DPMIN,DILBE
- REAL :: ASTRT,TP,VALUE,AINTRP,TKEMAX,QFRZ,&
- QSS,PPTMLT,DTMELT,RHH,EVAC,BINC
- !
- INTEGER :: INDLU,NU,NUCHM,NNN,KLFS
- REAL :: CHMIN,PM15,CHMAX,DTRH,RAD,DPPP
- REAL :: TVDIFF,DTTOT,ABSOMG,ABSOMGTC,FRDP
- INTEGER :: KX,K,KL
- !
- INTEGER :: NCHECK
- INTEGER, DIMENSION (kts:kte) :: KCHECK
- INTEGER :: ISTOP,ML,L5,KMIX,LOW, &
- LC,MXLAYR,LLFC,NLAYRS,NK, &
- KPBL,KLCL,LCL,LET,IFLAG, &
- NK1,LTOP,NJ,LTOP1, &
- LTOPM1,LVF,KSTART,KMIN,LFS, &
- ND,NIC,LDB,LDT,ND1,NDK, &
- NM,LMAX,NCOUNT,NOITR, &
- NSTEP,NTC,NCHM,ISHALL,NSHALL
- LOGICAL :: IPRNT
- REAL :: u00,qslcl,rhlcl,dqssdt !jfb
- CHARACTER*1024 message
- !
- DATA P00,T00/1.E5,273.16/
- DATA RLF/3.339E5/
- DATA RHIC,RHBC/1.,0.90/
- DATA PIE,TTFRZ,TBFRZ,C5/3.141592654,268.16,248.16,1.0723E-3/
- DATA RATE/0.03/ ! wrf default
- ! DATA RATE/0.01/ ! value used in NRCM
- ! DATA RATE/0.001/ ! effectively turn off autoconversion
- !-----------------------------------------------------------
- IPRNT=.FALSE.
- GDRY=-G/CP
- ROCP=R/CP
- NSHALL = 0
- KL=kte
- KX=kte
- !
- ! ALIQ = 613.3
- ! BLIQ = 17.502
- ! CLIQ = 4780.8
- ! DLIQ = 32.19
- ALIQ = SVP1*1000.
- BLIQ = SVP2
- CLIQ = SVP2*SVPT0
- DLIQ = SVP3
- !
- !
- !****************************************************************************
- ! ! PPT FB MODS
- !...OPTION TO FEED CONVECTIVELY GENERATED RAINWATER ! PPT FB MODS
- !...INTO GRID-RESOLVED RAINWATER (OR SNOW/GRAUPEL) ! PPT FB MODS
- !...FIELD. "FBFRC" IS THE FRACTION OF AVAILABLE ! PPT FB MODS
- !...PRECIPITATION TO BE FED BACK (0.0 - 1.0)... ! PPT FB MODS
- FBFRC=0.0 ! PPT FB MODS
- !...mods to allow shallow convection...
- NCHM = 0
- ISHALL = 0
- DPMIN = 5.E3
- !...
- P300=P0(1)-30000.
- !
- !...PRESSURE PERTURBATION TERM IS ONLY DEFINED AT MID-POINT OF
- !...VERTICAL LAYERS...SINCE TOTAL PRESSURE IS NEEDED AT THE TOP AND
- !...BOTTOM OF LAYERS BELOW, DO AN INTERPOLATION...
- !
- !...INPUT A VERTICAL SOUNDING ... NOTE THAT MODEL LAYERS ARE NUMBERED
- !...FROM BOTTOM-UP IN THE KF SCHEME...
- !
- ML=0
- !SUE tmprpsb=1./PSB(I,J)
- !SUE CELL=PTOP*tmprpsb
- !
- DO K=1,KX
- !
- ! Saturation vapor pressure (ES) is calculated following Buck (1981)
- !...IF Q0 IS ABOVE SATURATION VALUE, REDUCE IT TO SATURATION LEVEL...
- !
- ES=ALIQ*EXP((BLIQ*T0(K)-CLIQ)/(T0(K)-DLIQ))
- QES(K)=0.622*ES/(P0(K)-ES)
- Q0(K)=AMIN1(QES(K),QV0(K))
- Q0(K)=AMAX1(0.000001,Q0(K))
- QL0(K)=0.
- QI0(K)=0.
- QR0(K)=0.
- QS0(K)=0.
- RH(K) = Q0(K)/QES(K)
- DILFRC(K) = 1.
- TV0(K)=T0(K)*(1.+0.608*Q0(K))
- ! RHOE(K)=P0(K)/(R*TV0(K))
- ! DP IS THE PRESSURE INTERVAL BETWEEN FULL SIGMA LEVELS...
- DP(K)=rhoe(k)*g*DZQ(k)
- ! IF Turbulent Kinetic Energy (TKE) is available from turbulent mixing scheme
- ! use it for shallow convection...For now, assume it is not available....
- ! TKE(K) = Q2(I,J,NK)
- TKE(K) = 0.
- CLDHGT(K) = 0.
- ! IF(P0(K).GE.500E2)L5=K
- IF(P0(K).GE.0.5*P0(1))L5=K
- IF(P0(K).GE.P300)LLFC=K
- ENDDO
- !
- !...DZQ IS DZ BETWEEN SIGMA SURFACES, DZA IS DZ BETWEEN MODEL HALF LEVEL
- Z0(1)=.5*DZQ(1)
- !cdir novector
- DO K=2,KL
- Z0(K)=Z0(K-1)+.5*(DZQ(K)+DZQ(K-1))
- DZA(K-1)=Z0(K)-Z0(K-1)
- ENDDO
- DZA(KL)=0.
- !
- !
- ! To save time, specify a pressure interval to move up in sequential
- ! check of different ~50 mb deep groups of adjacent model layers in
- ! the process of identifying updraft source layer (USL). Note that
- ! this search is terminated as soon as a buoyant parcel is found and
- ! this parcel can produce a cloud greater than specifed minimum depth
- ! (CHMIN)...For now, set interval at 15 mb...
- !
- NCHECK = 1
- KCHECK(NCHECK)=1
- PM15 = P0(1)-15.E2
- DO K=2,LLFC
- IF(P0(K).LT.PM15)THEN
- NCHECK = NCHECK+1
- KCHECK(NCHECK) = K
- PM15 = PM15-15.E2
- ENDIF
- ENDDO
- !
- NU=0
- NUCHM=0
- usl: DO
- NU = NU+1
- IF(NU.GT.NCHECK)THEN
- IF(ISHALL.EQ.1)THEN
- CHMAX = 0.
- NCHM = 0
- DO NK = 1,NCHECK
- NNN=KCHECK(NK)
- IF(CLDHGT(NNN).GT.CHMAX)THEN
- NCHM = NNN
- NUCHM = NK
- CHMAX = CLDHGT(NNN)
- ENDIF
- ENDDO
- NU = NUCHM-1
- FBFRC=1.
- CYCLE usl
- ELSE
- RETURN
- ENDIF
- ENDIF
- KMIX = KCHECK(NU)
- LOW=KMIX
- !...
- LC = LOW
- !
- !...ASSUME THAT IN ORDER TO SUPPORT A DEEP UPDRAFT YOU NEED A LAYER OF
- !...UNSTABLE AIR AT LEAST 50 mb DEEP...TO APPROXIMATE THIS, ISOLATE A
- !...GROUP OF ADJACENT INDIVIDUAL MODEL LAYERS, WITH THE BASE AT LEVEL
- !...LC, SUCH THAT THE COMBINED DEPTH OF THESE LAYERS IS AT LEAST 50 mb..
- !
- NLAYRS=0
- DPTHMX=0.
- NK=LC-1
- IF ( NK+1 .LT. KTS ) THEN
- WRITE(message,*)'WOULD GO OFF BOTTOM: KF_ETA_PARA I,J,NK',I,J,NK
- CALL wrf_message (TRIM(message))
- ELSE
- DO
- NK=NK+1
- IF ( NK .GT. KTE ) THEN
- WRITE(message,*)'WOULD GO OFF TOP: KF_ETA_PARA I,J,DPTHMX,DPMIN',I,J,DPTHMX,DPMIN
- CALL wrf_message (TRIM(message))
- EXIT
- ENDIF
- DPTHMX=DPTHMX+DP(NK)
- NLAYRS=NLAYRS+1
- IF(DPTHMX.GT.DPMIN)THEN
- EXIT
- ENDIF
- END DO
- ENDIF
- IF(DPTHMX.LT.DPMIN)THEN
- RETURN
- ENDIF
- KPBL=LC+NLAYRS-1
- !
- !...********************************************************
- !...for computational simplicity without much loss in accuracy,
- !...mix temperature instead of theta for evaluating convective
- !...initiation (triggering) potential...
- ! THMIX=0.
- TMIX=0.
- QMIX=0.
- ZMIX=0.
- PMIX=0.
- !
- !...FIND THE THERMODYNAMIC CHARACTERISTICS OF THE LAYER BY
- !...MASS-WEIGHTING THE CHARACTERISTICS OF THE INDIVIDUAL MODEL
- !...LAYERS...
- !
- !cdir novector
- DO NK=LC,KPBL
- TMIX=TMIX+DP(NK)*T0(NK)
- QMIX=QMIX+DP(NK)*Q0(NK)
- ZMIX=ZMIX+DP(NK)*Z0(NK)
- PMIX=PMIX+DP(NK)*P0(NK)
- ENDDO
- ! THMIX=THMIX/DPTHMX
- TMIX=TMIX/DPTHMX
- QMIX=QMIX/DPTHMX
- ZMIX=ZMIX/DPTHMX
- PMIX=PMIX/DPTHMX
- EMIX=QMIX*PMIX/(0.622+QMIX)
- !
- !...FIND THE TEMPERATURE OF THE MIXTURE AT ITS LCL...
- !
- ! TLOG=ALOG(EMIX/ALIQ)
- ! ...calculate dewpoint using lookup table...
- !
- astrt=1.e-3
- ainc=0.075
- a1=emix/aliq
- tp=(a1-astrt)/ainc
- indlu=int(tp)+1
- value=(indlu-1)*ainc+astrt
- aintrp=(a1-value)/ainc
- tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
- TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
- TLCL=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(TMIX-T00))*(TMIX-TDPT)
- TLCL=AMIN1(TLCL,TMIX)
- TVLCL=TLCL*(1.+0.608*QMIX)
- ZLCL = ZMIX+(TLCL-TMIX)/GDRY
- NK = LC-1
- DO
- NK = NK+1
- KLCL=NK
- IF(ZLCL.LE.Z0(NK) .or. NK.GT.KL)THEN
- EXIT
- ENDIF
- ENDDO
- IF(NK.GT.KL)THEN
- RETURN
- ENDIF
- K=KLCL-1
- ! calculate DLP using Z instead of log(P)
- DLP=(ZLCL-Z0(K))/(Z0(KLCL)-Z0(K))
- !
- !...ESTIMATE ENVIRONMENTAL TEMPERATURE AND MIXING RATIO AT THE LCL...
- !
- TENV=T0(K)+(T0(KLCL)-T0(K))*DLP
- QENV=Q0(K)+(Q0(KLCL)-Q0(K))*DLP
- TVEN=TENV*(1.+0.608*QENV)
- !
- !...CHECK TO SEE IF CLOUD IS BUOYANT USING FRITSCH-CHAPPELL TRIGGER
- !...FUNCTION DESCRIBED IN KAIN AND FRITSCH (1992)...W0 IS AN
- !...APROXIMATE VALUE FOR THE RUNNING-MEAN GRID-SCALE VERTICAL
- !...VELOCITY, WHICH GIVES SMOOTHER FIELDS OF CONVECTIVE INITIATION
- !...THAN THE INSTANTANEOUS VALUE...FORMULA RELATING TEMPERATURE
- !...PERTURBATION TO VERTICAL VELOCITY HAS BEEN USED WITH THE MOST
- !...SUCCESS AT GRID LENGTHS NEAR 25 km. FOR DIFFERENT GRID-LENGTHS,
- !...ADJUST VERTICAL VELOCITY TO EQUIVALENT VALUE FOR 25 KM GRID
- !...LENGTH, ASSUMING LINEAR DEPENDENCE OF W ON GRID LENGTH...
- !
- IF(ZLCL.LT.2.E3)THEN ! Kain (2004) Eq. 2
- WKLCL=0.02*ZLCL/2.E3
- ELSE
- WKLCL=0.02 ! units of m/s
- ENDIF
- WKL=(W0AVG1D(K)+(W0AVG1D(KLCL)-W0AVG1D(K))*DLP)*DX/25.E3-WKLCL
- IF(WKL.LT.0.0001)THEN
- DTLCL=0.
- ELSE
- DTLCL=4.64*WKL**0.33 ! Kain (2004) Eq. 1
- ENDIF
- ! New trigger function
- IF(trigger.eq.2) then
- DTLCL=amax1(TPART_H0(KLCL)+TPART_V0(KLCL),0.0)
- ENDIF
- ! end for trigger function
- !
- dtrh = 0.
- if (trigger .eq. 3) then
- !...for ETA model, give parcel an extra temperature perturbation based
- !...the threshold RH for condensation (U00)...
- ! as described in Narita and Ohmori (2007, 12th Mesoscale Conf.
- !
- !...for now, just assume U00=0.75...
- !...!!!!!! for MM5, SET DTRH = 0. !!!!!!!!
- U00 = 0.75
- IF(U00.lt.1.)THEN
- QSLCL=QES(K)+(QES(KLCL)-QES(K))*DLP
- RHLCL = QENV/QSLCL
- DQSSDT = QMIX*(CLIQ-BLIQ*DLIQ)/((TLCL-DLIQ)*(TLCL-DLIQ))
- IF(RHLCL.ge.0.75 .and. RHLCL.le.0.95)then
- DTRH = 0.25*(RHLCL-0.75)*QMIX/DQSSDT
- ELSEIF(RHLCL.GT.0.95)THEN
- DTRH = (1./RHLCL-1.)*QMIX/DQSSDT
- ELSE
- DTRH = 0.
- ENDIF
- ENDIF
- endif ! trigger 3
- ! IF(ISHALL.EQ.1)IPRNT=.TRUE.
- ! IPRNT=.TRUE.
- ! IF(TLCL+DTLCL.GT.TENV)GOTO 45
-
- trigger2: IF(TLCL+DTLCL+DTRH.LT.TENV)THEN
- !
- ! Parcel not buoyant, CYCLE back to start of trigger and evaluate next potential USL...
- !
- CYCLE usl
- !
- ELSE ! Parcel is buoyant, determine updraft
- !
- !...CONVECTIVE TRIGGERING CRITERIA HAS BEEN SATISFIED...COMPUTE
- !...EQUIVALENT POTENTIAL TEMPERATURE
- !...(THETEU) AND VERTICAL VELOCITY OF THE RISING PARCEL AT THE LCL...
- !
- CALL ENVIRTHT(PMIX,TMIX,QMIX,THETEU(K),ALIQ,BLIQ,CLIQ,DLIQ)
- !
- !...modify calculation of initial parcel vertical velocity...jsk 11/26/97
- !
- DTTOT = DTLCL+DTRH
- IF(DTTOT.GT.1.E-4)THEN
- GDT=2.*G*DTTOT*500./TVEN ! Kain (2004) Eq. 3 (sort of)
- WLCL=1.+0.5*SQRT(GDT)
- WLCL = AMIN1(WLCL,3.)
- ELSE
- WLCL=1.
- ENDIF
- PLCL=P0(K)+(P0(KLCL)-P0(K))*DLP
- WTW=WLCL*WLCL
- !
- TVLCL=TLCL*(1.+0.608*QMIX)
- RHOLCL=PLCL/(R*TVLCL)
- !
- LCL=KLCL
- LET=LCL
- ! make RAD a function of background vertical velocity... (Kain (2004) Eq. 6)
- IF(WKL.LT.0.)THEN
- RAD = 1000.
- ELSEIF(WKL.GT.0.1)THEN
- RAD = 2000.
- ELSE
- RAD = 1000.+1000*WKL/0.1
- ENDIF
- !
- !*******************************************************************
- ! *
- ! COMPUTE UPDRAFT PROPERTIES *
- ! *
- !*******************************************************************
- !
- !
- !...
- !...ESTIMATE INITIAL UPDRAFT MASS FLUX (UMF(K))...
- !
- WU(K)=WLCL
- AU0=0.01*DXSQ
- UMF(K)=RHOLCL*AU0
- VMFLCL=UMF(K)
- UPOLD=VMFLCL
- UPNEW=UPOLD
- !
- !...RATIO2 IS THE DEGREE OF GLACIATION IN THE CLOUD (0 TO 1),
- !...UER IS THE ENVIR ENTRAINMENT RATE, ABE IS AVAILABLE
- !...BUOYANT ENERGY, TRPPT IS THE TOTAL RATE OF PRECIPITATION
- !...PRODUCTION...
- !
- RATIO2(K)=0.
- UER(K)=0.
- ABE=0.
- TRPPT=0.
- TU(K)=TLCL
- TVU(K)=TVLCL
- QU(K)=QMIX
- EQFRC(K)=1.
- QLIQ(K)=0.
- QICE(K)=0.
- QLQOUT(K)=0.
- QICOUT(K)=0.
- DETLQ(K)=0.
- DETIC(K)=0.
- PPTLIQ(K)=0.
- PPTICE(K)=0.
- IFLAG=0
- !
- !...TTEMP IS USED DURING CALCULATION OF THE LINEAR GLACIATION
- !...PROCESS; IT IS INITIALLY SET TO THE TEMPERATURE AT WHICH
- !...FREEZING IS SPECIFIED TO BEGIN. WITHIN THE GLACIATION
- !...INTERVAL, IT IS SET EQUAL TO THE UPDRAFT TEMP AT THE
- !...PREVIOUS MODEL LEVEL...
- !
- TTEMP=TTFRZ
- !
- !...ENTER THE LOOP FOR UPDRAFT CALCULATIONS...CALCULATE UPDRAFT TEMP,
- !...MIXING RATIO, VERTICAL MASS FLUX, LATERAL DETRAINMENT OF MASS AND
- !...MOISTURE, PRECIPITATION RATES AT EACH MODEL LEVEL...
- !
- ! **1 variables indicate the bottom of a model layer
- ! **2 variables indicate the top of a model layer
- !
- EE1=1.
- UD1=0.
- REI = 0.
- DILBE = 0.
- updraft: DO NK=K,KL-1
- NK1=NK+1
- RATIO2(NK1)=RATIO2(NK)
- FRC1=0.
- TU(NK1)=T0(NK1)
- THETEU(NK1)=THETEU(NK)
- QU(NK1)=QU(NK)
- QLIQ(NK1)=QLIQ(NK)
- QICE(NK1)=QICE(NK)
- call tpmix2(p0(nk1),theteu(nk1),tu(nk1),qu(nk1),qliq(nk1), &
- qice(nk1),qnewlq,qnewic,XLV1,XLV0)
- !
- !
- !...CHECK TO SEE IF UPDRAFT TEMP IS ABOVE THE TEMPERATURE AT WHICH
- !...GLACIATION IS ASSUMED TO INITIATE; IF IT IS, CALCULATE THE
- !...FRACTION OF REMAINING LIQUID WATER TO FREEZE...TTFRZ IS THE
- !...TEMP AT WHICH FREEZING BEGINS, TBFRZ THE TEMP BELOW WHICH ALL
- !...LIQUID WATER IS FROZEN AT EACH LEVEL...
- !
- IF(TU(NK1).LE.TTFRZ)THEN
- IF(TU(NK1).GT.TBFRZ)THEN
- IF(TTEMP.GT.TTFRZ)TTEMP=TTFRZ
- FRC1=(TTEMP-TU(NK1))/(TTEMP-TBFRZ)
- ELSE
- FRC1=1.
- IFLAG=1
- ENDIF
- TTEMP=TU(NK1)
- !
- ! DETERMINE THE EFFECTS OF LIQUID WATER FREEZING WHEN TEMPERATURE
- !...IS BELOW TTFRZ...
- !
- QFRZ = (QLIQ(NK1)+QNEWLQ)*FRC1
- QNEWIC=QNEWIC+QNEWLQ*FRC1
- QNEWLQ=QNEWLQ-QNEWLQ*FRC1
- QICE(NK1) = QICE(NK1)+QLIQ(NK1)*FRC1
- QLIQ(NK1) = QLIQ(NK1)-QLIQ(NK1)*FRC1
- CALL DTFRZNEW(TU(NK1),P0(NK1),THETEU(NK1),QU(NK1),QFRZ, &
- QICE(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
- ENDIF
- TVU(NK1)=TU(NK1)*(1.+0.608*QU(NK1))
- !
- ! CALCULATE UPDRAFT VERTICAL VELOCITY AND PRECIPITATION FALLOUT...
- !
- IF(NK.EQ.K)THEN
- BE=(TVLCL+TVU(NK1))/(TVEN+TV0(NK1))-1.
- BOTERM=2.*(Z0(NK1)-ZLCL)*G*BE/1.5
- DZZ=Z0(NK1)-ZLCL
- ELSE
- BE=(TVU(NK)+TVU(NK1))/(TV0(NK)+TV0(NK1))-1.
- BOTERM=2.*DZA(NK)*G*BE/1.5
- DZZ=DZA(NK)
- ENDIF
- ENTERM=2.*REI*WTW/UPOLD
- CALL CONDLOAD(QLIQ(NK1),QICE(NK1),WTW,DZZ,BOTERM,ENTERM, &
- RATE,QNEWLQ,QNEWIC,QLQOUT(NK1),QICOUT(NK1),G)
- !
- !...IF VERT VELOCITY IS LESS THAN ZERO, EXIT THE UPDRAFT LOOP AND,
- !...IF CLOUD IS TALL ENOUGH, FINALIZE UPDRAFT CALCULATIONS...
- !
- IF(WTW.LT.1.E-3)THEN
- EXIT
- ELSE
- WU(NK1)=SQRT(WTW)
- ENDIF
- !...Calculate value of THETA-E in environment to entrain into updraft...
- !
- CALL ENVIRTHT(P0(NK1),T0(NK1),Q0(NK1),THETEE(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
- !
- !...REI IS THE RATE OF ENVIRONMENTAL INFLOW...
- !
- REI=VMFLCL*DP(NK1)*0.03/RAD ! KF (1990) Eq. 1; Kain (2004) Eq. 5
- TVQU(NK1)=TU(NK1)*(1.+0.608*QU(NK1)-QLIQ(NK1)-QICE(NK1))
- IF(NK.EQ.K)THEN
- DILBE=((TVLCL+TVQU(NK1))/(TVEN+TV0(NK1))-1.)*DZZ
- ELSE
- DILBE=((TVQU(NK)+TVQU(NK1))/(TV0(NK)+TV0(NK1))-1.)*DZZ
- ENDIF
- IF(DILBE.GT.0.)ABE=ABE+DILBE*G
- !
- !...IF CLOUD PARCELS ARE VIRTUALLY COLDER THAN THE ENVIRONMENT, MINIMAL
- !...ENTRAINMENT (0.5*REI) IS IMPOSED...
- !
- IF(TVQU(NK1).LE.TV0(NK1))THEN ! Entrain/Detrain IF BLOCK
- EE2=0.5 ! Kain (2004) Eq. 4
- UD2=1.
- EQFRC(NK1)=0.
- ELSE
- LET=NK1
- TTMP=TVQU(NK1)
- !
- !...DETERMINE THE CRITICAL MIXED FRACTION OF UPDRAFT AND ENVIRONMENTAL AIR...
- !
- F1=0.95
- F2=1.-F1
- THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
- QTMP=F1*Q0(NK1)+F2*QU(NK1)
- TMPLIQ=F2*QLIQ(NK1)
- TMPICE=F2*QICE(NK1)
- call tpmix2(p0(nk1),thttmp,ttmp,qtmp,tmpliq,tmpice, &
- qnewlq,qnewic,XLV1,XLV0)
- TU95=TTMP*(1.+0.608*QTMP-TMPLIQ-TMPICE)
- IF(TU95.GT.TV0(NK1))THEN
- EE2=1.
- UD2=0.
- EQFRC(NK1)=1.0
- ELSE
- F1=0.10
- F2=1.-F1
- THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
- QTMP=F1*Q0(NK1)+F2*QU(NK1)
- TMPLIQ=F2*QLIQ(NK1)
- TMPICE=F2*QICE(NK1)
- call tpmix2(p0(nk1),thttmp,ttmp,qtmp,tmpliq,tmpice, &
- qnewlq,qnewic,XLV1,XLV0)
- TU10=TTMP*(1.+0.608*QTMP-TMPLIQ-TMPICE)
- TVDIFF = ABS(TU10-TVQU(NK1))
- IF(TVDIFF.LT.1.e-3)THEN
- EE2=1.
- UD2=0.
- EQFRC(NK1)=1.0
- ELSE
- EQFRC(NK1)=(TV0(NK1)-TVQU(NK1))*F1/(TU10-TVQU(NK1))
- EQFRC(NK1)=AMAX1(0.0,EQFRC(NK1))
- EQFRC(NK1)=AMIN1(1.0,EQFRC(NK1))
- IF(EQFRC(NK1).EQ.1)THEN
- EE2=1.
- UD2=0.
- ELSEIF(EQFRC(NK1).EQ.0.)THEN
- EE2=0.
- UD2=1.
- ELSE
- !
- !...SUBROUTINE PROF5 INTEGRATES OVER THE GAUSSIAN DIST TO DETERMINE THE
- ! FRACTIONAL ENTRAINMENT AND DETRAINMENT RATES...
- !
- CALL PROF5(EQFRC(NK1),EE2,UD2)
- ENDIF
- ENDIF
- ENDIF
- ENDIF ! End of Entrain/Detrain IF BLOCK
- !
- !
- !...NET ENTRAINMENT AND DETRAINMENT RATES ARE GIVEN BY THE AVERAGE FRACTIONAL
- ! VALUES IN THE LAYER...
- !
- EE2 = AMAX1(EE2,0.5)
- UD2 = 1.5*UD2
- UER(NK1)=0.5*REI*(EE1+EE2)
- UDR(NK1)=0.5*REI*(UD1+UD2)
- !
- !...IF THE CALCULATED UPDRAFT DETRAINMENT RATE IS GREATER THAN THE TOTAL
- ! UPDRAFT MASS FLUX, ALL CLOUD MASS DETRAINS, EXIT UPDRAFT CALCULATIONS...
- !
- IF(UMF(NK)-UDR(NK1).LT.10.)THEN
- !
- !...IF THE CALCULATED DETRAINED MASS FLUX IS GREATER THAN THE TOTAL UPD MASS
- ! FLUX, IMPOSE TOTAL DETRAINMENT OF UPDRAFT MASS AT THE PREVIOUS MODEL LVL..
- ! First, correct ABE calculation if needed...
- !
- IF(DILBE.GT.0.)THEN
- ABE=ABE-DILBE*G
- ENDIF
- LET=NK
- ! WRITE(98,1015)P0(NK1)/100.
- EXIT
- ELSE
- EE1=EE2
- UD1=UD2
- UPOLD=UMF(NK)-UDR(NK1)
- UPNEW=UPOLD+UER(NK1)
- UMF(NK1)=UPNEW
- DILFRC(NK1) = UPNEW/UPOLD
- !
- !...DETLQ AND DETIC ARE THE RATES OF DETRAINMENT OF LIQUID AND
- !...ICE IN THE DETRAINING UPDRAFT MASS...
- !
- DETLQ(NK1)=QLIQ(NK1)*UDR(NK1)
- DETIC(NK1)=QICE(NK1)*UDR(NK1)
- QDT(NK1)=QU(NK1)
- QU(NK1)=(UPOLD*QU(NK1)+UER(NK1)*Q0(NK1))/UPNEW
- THETEU(NK1)=(THETEU(NK1)*UPOLD+THETEE(NK1)*UER(NK1))/UPNEW
- QLIQ(NK1)=QLIQ(NK1)*UPOLD/UPNEW
- QICE(NK1)=QICE(NK1)*UPOLD/UPNEW
- !
- !...PPTLIQ IS THE RATE OF GENERATION (FALLOUT) OF
- !...LIQUID PRECIP AT A GIVEN MODEL LVL, PPTICE THE SAME FOR ICE,
- !...TRPPT IS THE TOTAL RATE OF PRODUCTION OF PRECIP UP TO THE
- !...CURRENT MODEL LEVEL...
- !
- PPTLIQ(NK1)=QLQOUT(NK1)*UMF(NK)
- PPTICE(NK1)=QICOUT(NK1)*UMF(NK)
- !
- TRPPT=TRPPT+PPTLIQ(NK1)+PPTICE(NK1)
- IF(NK1.LE.KPBL)UER(NK1)=UER(NK1)+VMFLCL*DP(NK1)/DPTHMX
- ENDIF
- !
- END DO updraft
- !
- !...CHECK CLOUD DEPTH...IF CLOUD IS TALL ENOUGH, ESTIMATE THE EQUILIBRIUM
- ! TEMPERATURE LEVEL (LET) AND ADJUST MASS FLUX PROFILE AT CLOUD TOP SO
- ! THAT MASS FLUX DECREASES TO ZERO AS A LINEAR FUNCTION OF PRESSURE BETWEEN
- ! THE LET AND CLOUD TOP...
- !
- !...LTOP IS THE MODEL LEVEL JUST BELOW THE LEVEL AT WHICH VERTICAL VELOCITY
- ! FIRST BECOMES NEGATIVE...
- !
- LTOP=NK
- CLDHGT(LC)=Z0(LTOP)-ZLCL
- !
- !...Instead of using the same minimum cloud height (for deep convection)
- !...everywhere, try specifying minimum cloud depth as a function of TLCL...
- !
- ! Kain (2004) Eq. 7
- !
- IF(TLCL.GT.293.)THEN
- CHMIN = 4.E3
- ELSEIF(TLCL.LE.293. .and. TLCL.GE.273)THEN
- CHMIN = 2.E3 + 100.*(TLCL-273.)
- ELSEIF(TLCL.LT.273.)THEN
- CHMIN = 2.E3
- ENDIF
- !
- !...If cloud top height is less than the specified minimum for deep
- !...convection, save value to consider this level as source for
- !...shallow convection, go back up to check next level...
- !
- !...Try specifying minimum cloud depth as a function of TLCL...
- !
- !
- !...DO NOT ALLOW ANY CLOUD FROM THIS LAYER IF:
- !
- !... 1.) if there is no CAPE, or
- !... 2.) cloud top is at model level just above LCL, or
- !... 3.) cloud top is within updraft source layer, or
- !... 4.) cloud-top detrainment layer begins within
- !... updraft source layer.
- !
- IF(LTOP.LE.KLCL .or. LTOP.LE.KPBL .or. LET+1.LE.KPBL)THEN ! No Convection Allowed
- CLDHGT(LC)=0.
- DO NK=K,LTOP
- UMF(NK)=0.
- UDR(NK)=0.
- UER(NK)=0.
- DETLQ(NK)=0.
- DETIC(NK)=0.
- PPTLIQ(NK)=0.
- PPTICE(NK)=0.
- ENDDO
- !
- ELSEIF(CLDHGT(LC).GT.CHMIN .and. ABE.GT.1)THEN ! Deep Convection allowed
- ISHALL=0
- EXIT usl
- ELSE
- !
- !...TO DISALLOW SHALLOW CONVECTION, COMMENT OUT NEXT LINE !!!!!!!!
- ISHALL = 1
- IF(NU.EQ.NUCHM)THEN
- EXIT usl ! Shallow Convection from this layer
- ELSE
- ! Remember this layer (by virtue of non-zero CLDHGT) as potential shallow-cloud layer
- DO NK=K,LTOP
- UMF(NK)=0.
- UDR(NK)=0.
- UER(NK)=0.
- DETLQ(NK)=0.
- DETIC(NK)=0.
- PPTLIQ(NK)=0.
- PPTICE(NK)=0.
- ENDDO
- ENDIF
- ENDIF
- ENDIF trigger2
- END DO usl
- IF(ISHALL.EQ.1)THEN
- KSTART=MAX0(KPBL,KLCL)
- LET=KSTART
- endif
- !
- !...IF THE LET AND LTOP ARE THE SAME, DETRAIN ALL OF THE UPDRAFT MASS FL
- ! THIS LEVEL...
- !
- IF(LET.EQ.LTOP)THEN
- UDR(LTOP)=UMF(LTOP)+UDR(LTOP)-UER(LTOP)
- DETLQ(LTOP)=QLIQ(LTOP)*UDR(LTOP)*UPNEW/UPOLD
- DETIC(LTOP)=QICE(LTOP)*UDR(LTOP)*UPNEW/UPOLD
- UER(LTOP)=0.
- UMF(LTOP)=0.
- ELSE
- !
- ! BEGIN TOTAL DETRAINMENT AT THE LEVEL ABOVE THE LET...
- !
- DPTT=0.
- DO NJ=LET+1,LTOP
- DPTT=DPTT+DP(NJ)
- ENDDO
- DUMFDP=UMF(LET)/DPTT
- !
- !...ADJUST MASS FLUX PROFILES, DETRAINMENT RATES, AND PRECIPITATION FALL
- ! RATES TO REFLECT THE LINEAR DECREASE IN MASS FLX BETWEEN THE LET AND
- !
- DO NK=LET+1,LTOP
- !
- !...entrainment is allowed at every level except for LTOP, so disallow
- !...entrainment at LTOP and adjust entrainment rates between LET and LTOP
- !...so the the dilution factor due to entyrianment is not changed but
- !...the actual entrainment rate will change due due forced total
- !...detrainment in this layer...
- !
- IF(NK.EQ.LTOP)THEN
- UDR(NK) = UMF(NK-1)
- UER(NK) = 0.
- DETLQ(NK) = UDR(NK)*QLIQ(N…
Large files files are truncated, but you can click here to view the full file