module module_bl_temf contains subroutine temfpbl(u3d,v3d,th3d,t3d,qv3d,qc3d,qi3d,p3d,p3di,pi3d,rho, & rublten,rvblten,rthblten, & rqvblten,rqcblten,rqiblten,flag_qi, & g,cp,rcp,r_d,r_v,cpv, & z,xlv,psfc, & p_top, & znt,ht,ust,zol,hol,hpbl,psim,psih, & xland,hfx,qfx,tsk,qsfc,gz1oz0,wspd,br, & dt,dtmin,kpbl2d, & svp1,svp2,svp3,svpt0,ep1,ep2,karman,eomeg,stbolt, & kh_temf,km_temf, & u10,v10,t2, & te_temf,shf_temf,qf_temf,uw_temf,vw_temf, & wupd_temf,mf_temf,thup_temf,qtup_temf,qlup_temf, & cf3d_temf,cfm_temf, & hd_temf,lcl_temf,hct_temf, & flhc,flqc,exch_temf, & fCor, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte & ) implicit none integer, intent(in ) :: ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte real, intent(in ) :: dt,dtmin,g,cp,rcp,r_d,r_v,xlv,cpv real, intent(in ) :: svp1,svp2,svp3,svpt0 real, intent(in ) :: ep1,ep2,karman,eomeg,stbolt real, dimension( ims:ime, kms:kme, jms:jme ) , & intent(in ) :: qv3d, qc3d, qi3d, & p3d, pi3d, th3d, t3d, & z, rho real, dimension( ims:ime, kms:kme, jms:jme ) , & intent(inout) :: te_temf real, dimension( ims:ime, kms:kme, jms:jme ) , & intent( out) :: shf_temf, qf_temf, uw_temf, vw_temf , & wupd_temf, mf_temf, thup_temf, qtup_temf, & qlup_temf,cf3d_temf real, dimension( ims:ime, jms:jme ) , & intent(inout) :: flhc, flqc, exch_temf real, dimension( ims:ime, jms:jme ) , & intent(in ) :: fCor real, dimension( ims:ime, jms:jme ) , & intent( out) :: hd_temf, lcl_temf, hct_temf, cfm_temf real, dimension( ims:ime, kms:kme, jms:jme ) , & intent(in ) :: p3di real, dimension( ims:ime, kms:kme, jms:jme ) , & intent(inout) :: rublten, rvblten, & rthblten, & rqvblten, rqcblten, rqiblten real, dimension( ims:ime, kms:kme, jms:jme ) , & intent(inout) :: kh_temf, km_temf real, dimension( ims:ime, jms:jme ) , & intent(inout) :: u10, v10, t2 real, dimension( ims:ime, jms:jme ) , & intent(in ) :: xland, & psim, psih, gz1oz0, br, & psfc, tsk, qsfc real, dimension( ims:ime, jms:jme ) , & intent(inout) :: hfx, qfx real, dimension( ims:ime, jms:jme ) , & intent(inout) :: hol, ust, hpbl, znt, wspd, zol real, dimension( ims:ime, jms:jme ) , & intent(in ) :: ht real, dimension( ims:ime, kms:kme, jms:jme ) , & intent(in ) :: u3d, v3d integer, dimension( ims:ime, jms:jme ) , & intent(out ) :: kpbl2d logical, intent(in) :: flag_qi real, optional, intent(in ) :: p_top integer :: j do j = jts,jte call temf2d(J=j,ux=u3d(ims,kms,j),vx=v3d(ims,kms,j) & ,tx=t3d(ims,kms,j),thx=th3d(ims,kms,j) & ,qvx=qv3d(ims,kms,j),qcx=qc3d(ims,kms,j) & ,qix=qi3d(ims,kms,j) & ,p2d=p3d(ims,kms,j),p2di=p3di(ims,kms,j) & ,pi2d=pi3d(ims,kms,j),rho=rho(ims,kms,j) & ,rubltenx=rublten(ims,kms,j),rvbltenx=rvblten(ims,kms,j) & ,rthbltenx=rthblten(ims,kms,j),rqvbltenx=rqvblten(ims,kms,j) & ,rqcbltenx=rqcblten(ims,kms,j),rqibltenx=rqiblten(ims,kms,j) & ,g=g,cp=cp,rcp=rcp,r_d=r_d,r_v=r_v,cpv=cpv & ,z2d=z(ims,kms,j) & ,xlv=xlv & ,psfcpa=psfc(ims,j),znt=znt(ims,j),zsrf=ht(ims,j),ust=ust(ims,j) & ,zol=zol(ims,j),hol=hol(ims,j),hpbl=hpbl(ims,j) & ,psim=psim(ims,j) & ,psih=psih(ims,j),xland=xland(ims,j) & ,hfx=hfx(ims,j),qfx=qfx(ims,j) & ,tsk=tsk(ims,j),qsfc=qsfc(ims,j),gz1oz0=gz1oz0(ims,j) & ,wspd=wspd(ims,j),br=br(ims,j) & ,dt=dt,dtmin=dtmin,kpbl1d=kpbl2d(ims,j) & ,svp1=svp1,svp2=svp2,svp3=svp3,svpt0=svpt0 & ,ep1=ep1,ep2=ep2,karman=karman,eomeg=eomeg & ,stbolt=stbolt & ,kh_temfx=kh_temf(ims,kms,j),km_temfx=km_temf(ims,kms,j) & ,u10=u10(ims,j),v10=v10(ims,j),t2=t2(ims,j) & ,te_temfx=te_temf(ims,kms,j) & ,shf_temfx=shf_temf(ims,kms,j),qf_temfx=qf_temf(ims,kms,j) & ,uw_temfx=uw_temf(ims,kms,j),vw_temfx=vw_temf(ims,kms,j) & ,wupd_temfx=wupd_temf(ims,kms,j),mf_temfx=mf_temf(ims,kms,j) & ,thup_temfx=thup_temf(ims,kms,j),qtup_temfx=qtup_temf(ims,kms,j) & ,qlup_temfx=qlup_temf(ims,kms,j) & ,cf3d_temfx=cf3d_temf(ims,kms,j),cfm_temfx=cfm_temf(ims,j) & ,hd_temfx=hd_temf(ims,j),lcl_temfx=lcl_temf(ims,j) & ,hct_temfx=hct_temf(ims,j),exch_temfx=exch_temf(ims,j) & ,flhc=flhc(ims,j),flqc=flqc(ims,j) & ,fCor=fCor(ims,j) & ,ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde & ,ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme & ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte ) enddo end subroutine temfpbl subroutine temf2d(j,ux,vx,tx,thx,qvx,qcx,qix,p2d,p2di,pi2d,rho, & rubltenx,rvbltenx,rthbltenx, & rqvbltenx,rqcbltenx,rqibltenx, & g,cp,rcp,r_d,r_v,cpv, & z2d, & xlv,psfcpa, & znt,zsrf,ust,zol,hol,hpbl,psim,psih, & xland,hfx,qfx,tsk,qsfc,gz1oz0,wspd,br, & dt,dtmin,kpbl1d, & svp1,svp2,svp3,svpt0,ep1,ep2,karman,eomeg,stbolt, & kh_temfx,km_temfx, & u10,v10,t2, & te_temfx,shf_temfx,qf_temfx,uw_temfx,vw_temfx, & wupd_temfx,mf_temfx,thup_temfx,qtup_temfx,qlup_temfx, & cf3d_temfx,cfm_temfx, & hd_temfx,lcl_temfx,hct_temfx,exch_temfx, & flhc,flqc, & fCor, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte & ) implicit none integer, intent(in ) :: ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, j real, intent(in ) :: dt,dtmin,g,cp,rcp,r_d,r_v,cpv,xlv real, intent(in ) :: svp1,svp2,svp3,svpt0 real, intent(in ) :: ep1,ep2,karman,eomeg,stbolt real, dimension( ims:ime, kms:kme ), & intent(in) :: z2d real, dimension( ims:ime, kms:kme ) , & intent(in ) :: ux, vx real, dimension( ims:ime, kms:kme ) , & intent(inout) :: te_temfx real, dimension( ims:ime, kms:kme ) , & intent( out) :: shf_temfx, qf_temfx, uw_temfx, vw_temfx , & wupd_temfx, mf_temfx,thup_temfx, & qtup_temfx, qlup_temfx, cf3d_temfx real, dimension( ims:ime ) , & intent( out) :: hd_temfx, lcl_temfx, hct_temfx, cfm_temfx real, dimension( ims:ime ) , & intent(in ) :: fCor real, dimension( ims:ime ) , & intent(inout) :: flhc, flqc, exch_temfx real, dimension( ims:ime, kms:kme ) , & intent(in ) :: tx, thx, qvx, qcx, qix, pi2d, rho real, dimension( ims:ime, kms:kme ) , & intent(in ) :: p2di, p2d real, dimension( ims:ime, kms:kme ) , & intent(inout) :: rubltenx, rvbltenx, rthbltenx, & rqvbltenx, rqcbltenx, rqibltenx real, dimension( ims:ime ) , & intent(inout) :: hol, ust, hpbl, znt real, dimension( ims:ime ) , & intent(in ) :: xland, zsrf real, dimension( ims:ime ) , & intent(inout) :: hfx, qfx real, dimension( ims:ime ), intent(inout) :: wspd real, dimension( ims:ime ), intent(in ) :: br real, dimension( ims:ime ), intent(in ) :: psim, psih real, dimension( ims:ime ), intent(in ) :: gz1oz0 real, dimension( ims:ime ), intent(in ) :: psfcpa real, dimension( ims:ime ), intent(in ) :: tsk, qsfc real, dimension( ims:ime ), intent(inout) :: zol integer, dimension( ims:ime ), intent(out ) :: kpbl1d real, dimension( ims:ime, kms:kme ) , & intent(inout) :: kh_temfx, km_temfx real, dimension( ims:ime ) , & intent(inout) :: u10, v10, t2 logical, parameter :: MFopt = .true. real, parameter :: visc_temf = 1.57e-4 real, parameter :: conduc_temf = 1.57e-4 / 0.733 real, parameter :: Pr_temf = 0.733 real, parameter :: TEmin = 1e-3 real, parameter :: ftau0 = 0.17 real, parameter :: fth0 = 0.145 real, parameter :: critRi = 0.25 real, parameter :: Cf = 0.185 real, parameter :: CN = 2.0 real, parameter :: Ceps = 0.070 real, parameter :: Cgamma = Ceps real, parameter :: Cphi = Ceps real, parameter :: PrT0 = Cphi/Ceps * ftau0**2 / 2. / fth0**2 real, parameter :: CM = 0.03 real, parameter :: Cdelt = 0.006 real, parameter :: Cw = 0.5 real, parameter :: Cc = 3.0 real, parameter :: lasymp = 200.0 real, parameter :: hmax = 4000.0 integer :: i, k, kt integer, dimension( its:ite) :: h0idx real, dimension( its:ite) :: h0 real, dimension( its:ite) :: wstr, ang, wm real, dimension( its:ite) :: hd,lcl,hct,ht real, dimension( its:ite) :: convection_TKE_surface_src, sfcFTE real, dimension( its:ite) :: sfcTHVF real, dimension( its:ite) :: z0t integer, dimension( its:ite) :: hdidx,lclidx,hctidx,htidx integer, dimension( its:ite) :: hmax_idx integer, dimension( its:ite) :: tval real, dimension( its:ite, kts:kte) :: thetal, qt real, dimension( its:ite, kts:kte) :: u_temf, v_temf real, dimension( its:ite, kts:kte) :: rv, rl, rt real, dimension( its:ite, kts:kte) :: chi_poisson, gam real, dimension( its:ite, kts:kte) :: dthdz, dqtdz, dudz, dvdz real, dimension( its:ite, kts:kte) :: lepsmin real, dimension( its:ite, kts:kte) :: thetav real, dimension( its:ite, kts:kte) :: MFCth, MFCq, MFCu, MFCv real, dimension( its:ite, kts:kte) :: MFCql, MFCthv, MFCTE real, dimension( its:ite, kts:kte) :: epsmf, deltmf, dMdz real, dimension( its:ite, kts:kte) :: UUPD, VUPD real, dimension( its:ite, kts:kte) :: thetavUPD, qlUPD, TEUPD real, dimension( its:ite, kts:kte) :: thetavUPDmoist, wupd_dry real, dimension( its:ite, kts:kte) :: B, Bmoist real, dimension( its:ite, kts:kte) :: zm, zt, dzm, dzt real, dimension( its:ite, kts:kte) :: dthUPDdz, dqtup_temfxdz, dwUPDdz real, dimension( its:ite, kts:kte) :: dwUPDmoistdz real, dimension( its:ite, kts:kte) :: dUUPDdz, dVUPDdz, dTEUPDdz real, dimension( its:ite, kts:kte) :: TUPD, rstUPD, rUPD, rlUPD, qstUPD real, dimension( its:ite, kts:kte) :: N2, S, Ri, beta, ftau, fth, ratio real, dimension( its:ite, kts:kte) :: TKE, TE2 real, dimension( its:ite, kts:kte) :: ustrtilde, linv, leps real, dimension( its:ite, kts:kte) :: km, kh real, dimension( its:ite, kts:kte) :: Fz, QFK, uwk, vwk real, dimension( its:ite, kts:kte) :: km_conv, kh_conv, lconv real, dimension( its:ite, kts:kte) :: alpha2, beta2 real, dimension( its:ite, kts:kte) :: THVF, buoy_src, srcs real, dimension( its:ite, kts:kte) :: u_new, v_new real, dimension( its:ite, kts:kte) :: thx_new, qvx_new, qcx_new real, dimension( its:ite, kts:kte) :: thup_new, qvup_new real, dimension( its:ite, kts:kte) :: beta1 real Cepsmf real red_fact logical is_convective real, dimension( its:ite, kts:kte) :: au, sigq, qst, satdef real sigq2, rst do i = its,ite thetal(i,1) = tsk(i) / pi2d(i,1) qt(i,1) = qvx(i,1) rv(i,1) = qt(i,1) / (1.-qt(i,1)) rl(i,1) = 0. rt(i,1) = rv(i,1) + rl(i,1) chi_poisson(i,1) = rcp * (1.+rv(i,1)/ep2) / (1.+rv(i,1)*cpv/cp) gam(i,1) = rv(i,1) * r_v / (cp + rv(i,1)*cpv) thetav(i,1) = thetal(i,1) * (1. + 0.608*qt(i,1) - qcx(i,1)) z0t(i) = znt(i) do k = kts+1,kte rv(i,k) = qvx(i,k-1) / (1.-qvx(i,k-1)) rl(i,k) = qcx(i,k-1) / (1.-qcx(i,k-1)) rt(i,k) = rv(i,k) + rl(i,k) chi_poisson(i,k) = rcp * (1.+rv(i,k)/ep2) / (1.+rv(i,k)*cpv/cp) gam(i,k) = rt(i,k) * r_v / (cp + rt(i,k)*cpv) thetal(i,k) = thx(i,k-1) * & ((ep2+rv(i,k))/(ep2+rt(i,k)))**chi_poisson(i,k) * & (rv(i,k)/rt(i,k))**(-gam(i,k)) * exp( -xlv*rl(i,k) / & ((cp + rt(i,k)*cpv) * tx(i,k))) qt(i,k) = qvx(i,k-1) + qcx(i,k-1) thetav(i,k) = thetal(i,k) * (1. + 0.608*qt(i,k) - qcx(i,k-1)) end do u_temf(i,1) = 0. v_temf(i,1) = 0. do k = kts+1,kte u_temf(i,k) = ux(i,k-1) v_temf(i,k) = vx(i,k-1) end do zm(i,1) = znt(i) dzt(i,1) = z2d(i,1) - zsrf(i) - zm(i,1) zt(i,1) = (z2d(i,1) - zsrf(i) - znt(i)) / 2. do kt = kts+1,kte zm(i,kt) = z2d(i,kt-1) - zsrf(i) zt(i,kt) = (zm(i,kt) + z2d(i,kt) - zsrf(i)) / 2. dzm(i,kt) = zt(i,kt) - zt(i,kt-1) dzt(i,kt) = z2d(i,kt+1) - z2d(i,kt) end do dzm(i,1) = dzm(i,2) dzt(i,kte) = dzt(i,kte-1) dthdz(i,1) = (thetal(i,2)-thetal(i,1)) / (zt(i,1) * log10(zm(i,2)/z0t(i))) dqtdz(i,1) = (qt(i,2)-qt(i,1)) / (zt(i,1) * log10(zm(i,2)/z0t(i))) dudz(i,1) = (u_temf(i,2)-u_temf(i,1)) / (zt(i,1) * log10(zm(i,2)/znt(i))) dvdz(i,1) = (v_temf(i,2)-v_temf(i,1)) / (zt(i,1) * log10(zm(i,2)/znt(i))) sfcTHVF(i) = hfx(i)/(rho(i,1)*cp) * (1.+0.608*(qvx(i,1)+qcx(i,1))) + 0.608*thetav(i,1)*qf_temfx(i,1) h0idx(i) = 1 h0(i) = zm(i,1) lepsmin(i,kts) = 0. hmax_idx(i) = kte-1 do k = kts+1,kte-1 lepsmin(i,k) = 0. dthdz(i,k) = (thetal(i,k+1) - thetal(i,k)) / dzt(i,k) dqtdz(i,k) = (qt(i,k+1) - qt(i,k)) / dzt(i,k) dudz(i,k) = (u_temf(i,k+1) - u_temf(i,k)) / dzt(i,k) dvdz(i,k) = (v_temf(i,k+1) - v_temf(i,k)) / dzt(i,k) if (thetav(i,k) > thetav(i,1) .AND. h0idx(i) .EQ. 1) then if (zm(i,k) < hmax) then h0idx(i) = k h0(i) = zm(i,k) else h0idx(i) = k h0(i) = hmax end if end if if (zm(i,k) > hmax) then hmax_idx(i) = min(hmax_idx(i),k) end if end do dthdz(i,kte) = dthdz(i,kte-1) dqtdz(i,kte) = dqtdz(i,kte-1) dudz(i,kte) = dudz(i,kte-1) dvdz(i,kte) = dvdz(i,kte-1) if ( hfx(i) > 0.) then wstr(i) = (g * h0(i) / thetav(i,2) * hfx(i)/(rho(i,1)*cp) ) ** (1./3.) else wstr(i) = 0. end if is_convective = wstr(i) > 0. .AND. MFopt .AND. dthdz(i,1)<0. .AND. dthdz(i,2)<0. do kt = 1,kte-1 N2(i,kt) = 2. * g / (thetav(i,kt) + thetav(i,kt+1))*dthdz(i,kt) S(i,kt) = sqrt(dudz(i,kt)**2. + dvdz(i,kt)**2.) Ri(i,kt) = N2(i,kt) / S(i,kt)**2. if (S(i,kt) < 1e-15) then if (N2(i,kt) >= 0) then Ri(i,kt) = 10. else Ri(i,kt) = -1. end if end if beta(i,kt) = 2. * g / (thetav(i,kt)+thetav(i,kt+1)) if (Ri(i,kt) > 0) then ratio(i,kt) = Ri(i,kt)/(Cphi**2.*ftau0**2./(2.*Ceps**2.*fth0**2.)+3.*Ri(i,kt)) ftau(i,kt) = ftau0 * ((3./4.) / (1.+4.*Ri(i,kt)) + 1./4.) fth(i,kt) = fth0 / (1.+4.*Ri(i,kt)) TE2(i,kt) = 2. * te_temfx(i,kt) * ratio(i,kt) * N2(i,kt) / beta(i,kt)**2. else ratio(i,kt) = Ri(i,kt)/(Cphi**2.*ftau0**2./(-2.*Ceps**2.*fth0**2.)+2.*Ri(i,kt)) ftau(i,kt) = ftau0 fth(i,kt) = fth0 TE2(i,kt) = 0. end if TKE(i,kt) = te_temfx(i,kt) * (1. - ratio(i,kt)) ustrtilde(i,kt) = sqrt(ftau(i,kt) * TKE(i,kt)) if (N2(i,kt) > 0.) then linv(i,kt) = 1./karman / zt(i,kt) + abs(fCor(i)) / & (Cf*ustrtilde(i,kt)) + & sqrt(N2(i,kt))/(CN*ustrtilde(i,kt)) + 1./lasymp else linv(i,kt) = 1./karman / zt(i,kt) + abs(fCor(i)) / & (Cf*ustrtilde(i,kt)) + 1./lasymp end if leps(i,kt) = 1./linv(i,kt) leps(i,kt) = max(leps(i,kt),lepsmin(i,kt)) end do S(i,kte) = 0.0 N2(i,kte) = 0.0 TKE(i,kte) = 0.0 linv(i,kte) = linv(i,kte-1) leps(i,kte) = leps(i,kte-1) do kt = 1,kte-1 km(i,kt) = TKE(i,kt)**1.5 * ftau(i,kt)**2. / (Ceps * sqrt(TKE(i,kt)*te_temfx(i,kt)) / leps(i,kt)) kh(i,kt) = 2. * leps(i,kt) * fth(i,kt)**2. * TKE(i,kt) / sqrt(te_temfx(i,kt)) / Cphi if ( is_convective) then if (kt <= h0idx(i) .AND. h0(i)-zt(i,kt) > 1e-15) then lconv(i,kt) = 1. / (1. / (karman*zt(i,kt)) + Cc / (karman * (h0(i) - zt(i,kt)))) else lconv(i,kt) = 0. end if kh_conv(i,kt) = ftau0**2. / Ceps / PrT0 * sqrt(TKE(i,kt)) * lconv(i,kt) if (kh_conv(i,kt) < 0.) then kh_conv(i,kt) = 0. end if km_conv(i,kt) = PrT0 * kh_conv(i,kt) if (zt(i,kt) <= h0(i)/2.) then km(i,kt) = km_conv(i,kt) kh(i,kt) = kh_conv(i,kt) end if if (zt(i,kt) > h0(i)/2. .AND. kt <= h0idx(i)) then km(i,kt) = max(km(i,kt),km_conv(i,kt),visc_temf) kh(i,kt) = max(kh(i,kt),kh_conv(i,kt),conduc_temf) end if end if km(i,kt) = max(km(i,kt),visc_temf) kh(i,kt) = max(kh(i,kt),conduc_temf) Fz(i,kt) = -kh(i,kt) * dthdz(i,kt) end do km(i,kte) = km(i,kte-1) kh(i,kte) = kh(i,kte-1) Fz(i,kte) = 0.0 if ( is_convective) then Cepsmf = 2. / max(200.,h0(i)) Cepsmf = max(Cepsmf,0.002) do k = kts,kte epsmf(i,k) = Cepsmf end do thup_temfx(i,1) = thetal(i,1) qtup_temfx(i,1) = qt(i,1) rUPD(i,1) = qtup_temfx(i,1) / (1. - qtup_temfx(i,1)) wupd_temfx(i,1) = Cw * wstr(i) wupd_dry(i,1) = Cw * wstr(i) UUPD(i,1) = u_temf(i,1) VUPD(i,1) = v_temf(i,1) thetavUPD(i,1) = thup_temfx(i,1) * (1. + 0.608*qtup_temfx(i,1)) thetavUPDmoist(i,1) = thup_temfx(i,1) * (1. + 0.608*qtup_temfx(i,1)) TEUPD(i,1) = te_temfx(i,1) + g / thetav(i,1) * sfcTHVF(i) qlUPD(i,1) = qcx(i,1) TUPD(i,1) = thup_temfx(i,1) * pi2d(i,1) rstUPD(i,1) = rsat(p2d(i,1),TUPD(i,1),ep2) rlUPD(i,1) = 0. do k = 2,kte if ( k < hmax_idx(i)) then dthUPDdz(i,k-1) = -epsmf(i,k) * (thup_temfx(i,k-1) - thetal(i,k-1)) thup_temfx(i,k) = thup_temfx(i,k-1) + dthUPDdz(i,k-1) * dzm(i,k-1) dqtup_temfxdz(i,k-1) = -epsmf(i,k) * (qtup_temfx(i,k-1) - qt(i,k-1)) qtup_temfx(i,k) = qtup_temfx(i,k-1) + dqtup_temfxdz(i,k-1) * dzm(i,k-1) thetavUPD(i,k) = thup_temfx(i,k) * (1. + 0.608*qtup_temfx(i,k)) B(i,k-1) = g * (thetavUPD(i,k) - thetav(i,k)) / thetav(i,k) if ( wupd_dry(i,k-1) < 1e-15 ) then wupd_dry(i,k) = 0. else dwUPDdz(i,k-1) = -2. *epsmf(i,k)*wupd_dry(i,k-1) + 0.33*B(i,k-1)/wupd_dry(i,k-1) wupd_dry(i,k) = wupd_dry(i,k-1) + dwUPDdz(i,k-1) * dzm(i,k-1) end if dUUPDdz(i,k-1) = -epsmf(i,k) * (UUPD(i,k-1) - u_temf(i,k-1)) UUPD(i,k) = UUPD(i,k-1) + dUUPDdz(i,k-1) * dzm(i,k-1) dVUPDdz(i,k-1) = -epsmf(i,k) * (VUPD(i,k-1) - v_temf(i,k-1)) VUPD(i,k) = VUPD(i,k-1) + dVUPDdz(i,k-1) * dzm(i,k-1) dTEUPDdz(i,k-1) = -epsmf(i,k) * (TEUPD(i,k-1) - te_temfx(i,k-1)) TEUPD(i,k) = TEUPD(i,k-1) + dTEUPDdz(i,k-1) * dzm(i,k-1) rUPD(i,k) = qtup_temfx(i,k) / (1. - qtup_temfx(i,k)) TUPD(i,k) = thup_temfx(i,k) * pi2d(i,k) rstUPD(i,k) = rsat(p2d(i,k-1),TUPD(i,k),ep2) beta1(i,k) = 0.622 * (xlv/(r_d*TUPD(i,k))) * (xlv/(cp*TUPD(i,k))) rstUPD(i,k) = rstUPD(i,k) * (1.0+beta1(i,k)*rUPD(i,k)) / (1.0+beta1(i,k)*rstUPD(i,k)) qstUPD(i,k) = rstUPD(i,k) / (1. + rstUPD(i,k)) if (rUPD(i,k) > rstUPD(i,k)) then rlUPD(i,k) = rUPD(i,k) - rstUPD(i,k) qlUPD(i,k) = rlUPD(i,k) / (1. + rlUPD(i,k)) thetavUPDmoist(i,k) = (thup_temfx(i,k) + ((xlv/cp)*qlUPD(i,k)/pi2d(i,k))) * & (1. + 0.608*qstUPD(i,k) - qlUPD(i,k)) else rlUPD(i,k) = 0. qlUPD(i,k) = qcx(i,k-1) thetavUPDmoist(i,k) = thup_temfx(i,k) * (1. + 0.608*qtup_temfx(i,k)) end if Bmoist(i,k-1) = g * (thetavUPDmoist(i,k) - thetav(i,k)) / thetav(i,k) if ( wupd_temfx(i,k-1) < 1e-15 ) then wupd_temfx(i,k) = 0. else dwUPDmoistdz(i,k-1) = -2. *epsmf(i,k)*wupd_temfx(i,k-1) + 0.33*Bmoist(i,k-1)/wupd_temfx(i,k-1) wupd_temfx(i,k) = wupd_temfx(i,k-1) + dwUPDmoistdz(i,k-1) * dzm(i,k-1) end if else thup_temfx(i,k) = thetal(i,k) qtup_temfx(i,k) = qt(i,k) wupd_dry(i,k) = 0. UUPD(i,k) = u_temf(i,k) VUPD(i,k) = v_temf(i,k) TEUPD(i,k) = te_temfx(i,k) qlUPD(i,k) = qcx(i,k-1) wupd_temfx(i,k) = 0. end if end do if (wupd_dry(i,1) == 0.) then hdidx(i) = 1 else hdidx(i) = kte do k = 2,kte if (wupd_dry(i,k) <= 0. .OR. zm(i,k) > hmax) then hdidx(i) = k goto 100 end if end do end if 100 hd(i) = zm(i,hdidx(i)) kpbl1d(i) = hdidx(i) hpbl(i) = hd(i) lclidx(i) = kte do k = kts,kte if ( k < hmax_idx(i) .AND. rUPD(i,k) > rstUPD(i,k)) then lclidx(i) = k goto 200 end if end do 200 lcl(i) = zm(i,lclidx(i)) if (hd(i) > lcl(i)) then if (wupd_temfx(i,1) == 0.) then hctidx(i) = 1 else hctidx(i) = kte do k = 2,kte if (wupd_temfx(i,k) <= 0. .OR. zm(i,k) > hmax) then hctidx(i) = k goto 300 end if end do end if 300 hct(i) = zm(i,hctidx(i)) if (hctidx(i) <= hdidx(i)+1) then hct(i) = hd(i) hctidx(i) = hdidx(i) else end if else hct(i) = hd(i) hctidx(i) = hdidx(i) end if ht(i) = max(hd(i),hct(i)) htidx(i) = max(hdidx(i),hctidx(i)) do k = 1,kte if (zm(i,k) < 0.9*ht(i)) then tval(i) = 1 else if (zm(i,k) >= 0.9*ht(i) .AND. zm(i,k) <= 1.0*ht(i)) then tval(i) = 1. - ((zm(i,k) - 0.9*ht(i)) / (1.0*ht(i) - 0.9*ht(i))) else tval(i) = 0. end if thup_temfx(i,k) = tval(i) * thup_temfx(i,k) + (1-tval(i))*thetal(i,k) thetavUPD(i,k) = tval(i) * thetavUPD(i,k) + (1-tval(i))*thetav(i,k) qtup_temfx(i,k) = tval(i) * qtup_temfx(i,k) + (1-tval(i)) * qt(i,k) if (k > 1) then qlUPD(i,k) = tval(i) * qlUPD(i,k) + (1-tval(i)) * qcx(i,k-1) end if UUPD(i,k) = tval(i) * UUPD(i,k) + (1-tval(i)) * u_temf(i,k) VUPD(i,k) = tval(i) * VUPD(i,k) + (1-tval(i)) * v_temf(i,k) TEUPD(i,k) = tval(i) * TEUPD(i,k) + (1-tval(i)) * te_temfx(i,k) if (zm(i,k) > ht(i)) then wupd_temfx(i,k) = 0. dwUPDmoistdz(i,k) = 0. wupd_dry(i,k) = 0. dwUPDdz(i,k) = 0. end if end do deltmf(i,1) = Cepsmf do k = 2,kte-1 if (hctidx(i) > hdidx(i)+1) then deltmf(i,k) = 0.9 * Cepsmf + Cdelt * (atan((zm(i,k)-(lcl(i)+(hct(i)-lcl(i))/1.5))/ & ((hct(i)-lcl(i))/8))+(3.1415926/2))/3.1415926 else if (k < hdidx(i)) then deltmf(i,k) = Cepsmf + 0.05 * 1. / (hd(i) - zm(i,k)) else if (k >= hdidx(i)) then deltmf(i,k) = deltmf(i,k-1) end if end do mf_temfx(i,1) = CM * wstr(i) do kt = 2,kte-1 dMdz(i,kt) = (epsmf(i,kt) - deltmf(i,kt)) * mf_temfx(i,kt-1) * dzt(i,kt) mf_temfx(i,kt) = mf_temfx(i,kt-1) + dMdz(i,kt) end do MFCth(i,2) = mf_temfx(i,2) * (thup_temfx(i,2)-thetal(i,2) + thup_temfx(i,3)-thetal(i,3)) / 2. if (MFCth(i,2) > Fz(i,2)) then red_fact = Fz(i,2) / MFCth(i,2) do kt = 1,kte mf_temfx(i,kt) = mf_temfx(i,kt) * red_fact end do end if MFCth(i,1) = mf_temfx(i,1) * (thup_temfx(i,1)-thetal(i,1) & + (thup_temfx(i,2)-thetal(i,2) - & (thup_temfx(i,1)-thetal(i,1))) * log(zt(i,1)/znt(i))/log(zm(i,2)/znt(i))) MFCq(i,1) = mf_temfx(i,1) * (qtup_temfx(i,1)-qt(i,1) & + (qtup_temfx(i,2)-qt(i,2) - & (qtup_temfx(i,1)-qt(i,1))) * log(zt(i,1)/znt(i))/log(zm(i,2)/znt(i))) MFCu(i,1) = mf_temfx(i,1) * (UUPD(i,1)-u_temf(i,1) & + (UUPD(i,2)-u_temf(i,2) - & (UUPD(i,1)-u_temf(i,1))) * log(zt(i,1)/znt(i))/log(zm(i,2)/znt(i))) MFCv(i,1) = mf_temfx(i,1) * (VUPD(i,1)-v_temf(i,1) & + (VUPD(i,2)-v_temf(i,2) - & (VUPD(i,1)-v_temf(i,1))) * log(zt(i,1)/znt(i))/log(zm(i,2)/znt(i))) MFCql(i,1) = mf_temfx(i,1) * (qlUPD(i,1)-qcx(i,1) & + (qlUPD(i,2)-qcx(i,2) - & (qlUPD(i,1)-qcx(i,1))) * log(zt(i,1)/znt(i))/log(zm(i,2)/znt(i))) MFCTE(i,1) = mf_temfx(i,1) * (TEUPD(i,1)-te_temfx(i,1) & + (TEUPD(i,2)-te_temfx(i,2) - & (TEUPD(i,1)-te_temfx(i,1))) * log(zt(i,1)/znt(i))/log(zm(i,2)/znt(i))) do kt = 2,kte-1 MFCth(i,kt) = mf_temfx(i,kt) * (thup_temfx(i,kt)-thetal(i,kt) + thup_temfx(i,kt+1)-thetal(i,kt+1)) / 2. MFCq(i,kt) = mf_temfx(i,kt) * (qtup_temfx(i,kt)-qt(i,kt) + qtup_temfx(i,kt+1)-qt(i,kt+1)) / 2. MFCu(i,kt) = mf_temfx(i,kt) * (UUPD(i,kt)-u_temf(i,kt) + UUPD(i,kt+1)-u_temf(i,kt+1)) / 2. MFCv(i,kt) = mf_temfx(i,kt) * (VUPD(i,kt)-v_temf(i,kt) + VUPD(i,kt+1)-v_temf(i,kt+1)) / 2. MFCql(i,kt) = mf_temfx(i,kt) * (qlUPD(i,kt)-qcx(i,kt-1) + qlUPD(i,kt+1)-qcx(i,kt)) / 2. MFCTE(i,kt) = mf_temfx(i,kt) * (TEUPD(i,kt)-te_temfx(i,kt)) end do MFCth(i,kte) = 0 MFCq(i,kte) = 0 MFCu(i,kte) = 0 MFCv(i,kte) = 0 MFCql(i,kte) = 0 MFCTE(i,kte) = 0 cf3d_temfx(i,1) = 0.0 cfm_temfx(i) = 0.0 do k = 2,kte if (wupd_temfx(i,k-1) >= 1.0e-15 .AND. wupd_temfx(i,k) >= 1.0e-15) then au(i,k) = ((mf_temfx(i,k-1)+mf_temfx(i,k))/2.0) / ((wupd_temfx(i,k-1)+wupd_temfx(i,k))/2.0) else au(i,k) = 0.0 end if sigq2 = au(i,k) * (qtup_temfx(i,k)-qt(i,k)) if (sigq2 > 0.0) then sigq(i,k) = sqrt(sigq2) else sigq(i,k) = 0.0 end if rst = rsat(p2d(i,k-1),thx(i,k-1)*pi2d(i,k-1),ep2) qst(i,k) = rst / (1. + rst) satdef(i,k) = qt(i,k) - qst(i,k) if (satdef(i,k) <= 0.0) then if (sigq(i,k) > 1.0e-15) then cf3d_temfx(i,k) = max(0.5 + 0.36 * atan(1.55*(satdef(i,k)/sigq(i,k))),0.0) else cf3d_temfx(i,k) = 0.0 end if else cf3d_temfx(i,k) = 1.0 end if if (zm(i,k) < lcl(i)) then cf3d_temfx(i,k) = 0.0 end if if (zt(i,k) <= hmax) then cfm_temfx(i) = max(cf3d_temfx(i,k),cfm_temfx(i)) end if end do else do kt = 1,kte MFCth(i,kt) = 0 MFCq(i,kt) = 0 MFCu(i,kt) = 0 MFCv(i,kt) = 0 MFCql(i,kt) = 0 MFCTE(i,kt) = 0 end do lcl(i) = zm(i,kte-1) hct(i) = zm(i,1) hctidx(i) = 1 hd(i) = zm(i,1) hdidx(i) = 1 ht(i) = hd(i) cf3d_temfx(i,1) = 0.0 cfm_temfx(i) = 0.0 do k = 2,kte if (qcx(i,k-1) > 1.0e-15) then cf3d_temfx(i,k) = 1.0 else cf3d_temfx(i,k) = 0.0 end if if (zt(i,k) <= hmax) then cfm_temfx(i) = max(cf3d_temfx(i,k),cfm_temfx(i)) end if end do end if cf3d_temfx(i,kte) = 0.0 do kt = 2,kte shf_temfx(i,kt) = Fz(i,kt) + MFCth(i,kt) QFK(i,kt) = -kh(i,kt) * dqtdz(i,kt) qf_temfx(i,kt) = QFK(i,kt) + MFCq(i,kt) uwk(i,kt) = -km(i,kt) * dudz(i,kt) uw_temfx(i,kt) = uwk(i,kt) + MFCu(i,kt) vwk(i,kt) = -km(i,kt) * dvdz(i,kt) vw_temfx(i,kt) = vwk(i,kt) + MFCv(i,kt) end do ust(i) = sqrt(ftau(i,1)/ftau0) * sqrt(u_temf(i,2)**2. + v_temf(i,2)**2. + (0.5*wstr(i))**2.) * leps(i,1) / log(zm(i,2)/znt(i)) / zt(i,1) ang(i) = atan2(v_temf(i,2),u_temf(i,2)) uw_temfx(i,1) = -cos(ang(i)) * ust(i)**2. vw_temfx(i,1) = -sin(ang(i)) * ust(i)**2. wm(i) = ust(i) shf_temfx(i,1) = hfx(i)/(rho(i,1)*cp) qf_temfx(i,1) = qfx(i)/rho(i,1) Fz(i,1) = shf_temfx(i,1) - MFCth(i,1) QFK(i,1) = qf_temfx(i,1) - MFCq(i,1) do kt = 2,kte-1 alpha2(i,kt) = 0.61 * (thetal(i,kt) + thetal(i,kt+1)) / 2. beta2(i,kt) = (100000. / p2di(i,kt))**0.286 * 2.45e-6 / 1004.67 - 1.61 * (thetal(i,kt) + thetal(i,kt+1)) / 2. end do alpha2(i,1) = 0.61 * (thetal(i,1) + (thetal(i,2)-thetal(i,1)) * (zt(i,2) - znt(i)) / (zm(i,2) - znt(i))) alpha2(i,kte) = 0.61 * thetal(i,kte) beta2(i,1) = (100000. / p2di(i,1))**0.286 * 2.45e-6 / & 1004.67 - 1.61 * (thetal(i,1) + (thetal(i,2) - thetal(i,1)) & * (zt(i,2) - znt(i)) / (zm(i,2) - znt(i))) beta2(i,kte) = (100000. / p2di(i,kte))**0.286 * 2.45e-6 / 1004.67 - 1.61 * thetal(i,kte) if ( is_convective ) then do kt = 1,kte-1 MFCthv(i,kt) = (1. + 0.61 * (qtup_temfx(i,kt)+qtup_temfx(i,kt+1))) / 2. * MFCth(i,kt) + & alpha2(i,kt) * MFCq(i,kt) + beta2(i,kt) * MFCql(i,kt) end do MFCthv(i,kte) = 0. else do kt = 1,kte MFCthv(i,kt) = 0. end do end if do kt = 1,kte THVF(i,kt) = (1. + 0.61 * qt(i,kt)) * Fz(i,kt) + alpha2(i,kt) * QFK(i,kt) + MFCthv(i,kt) end do u_new(i,:) = u_temf(i,:) call solve_implicit_temf(km(i,kts:kte-1),u_new(i,kts+1:kte), & uw_temfx(i,1),dzm(i,kts:kte-1),dzt(i,kts:kte-1),kts,kte-1,dt,.FALSE.) do k = 2,kte-1 u_new(i,k) = u_new(i,k) + dt * (-(MFCu(i,k)-MFCu(i,k-1))) / dzm(i,k) end do v_new(i,:) = v_temf(i,:) call solve_implicit_temf(km(i,kts:kte-1),v_new(i,kts+1:kte), & vw_temfx(i,1),dzm(i,kts:kte-1),dzt(i,kts:kte-1),kts,kte-1,dt,.FALSE.) do k = 2,kte-1 v_new(i,k) = v_new(i,k) + dt * (-(MFCv(i,k)-MFCv(i,k-1))) / dzm(i,k) end do call solve_implicit_temf(kh(i,kts:kte-1),thetal(i,kts+1:kte),Fz(i,1),dzm(i,kts:kte-1),& dzt(i,kts:kte-1),kts,kte-1,dt,.FALSE.) do k = 2,kte-1 thetal(i,k) = thetal(i,k) + dt * (-(MFCth(i,k)-MFCth(i,k-1))) / dzm(i,k) end do call solve_implicit_temf(kh(i,kts:kte-1),qt(i,kts+1:kte),QFK(i,1),dzm(i,kts:kte-1),& dzt(i,kts:kte-1),kts,kte-1,dt,.FALSE.) do k = 2,kte-1 qt(i,k) = qt(i,k) + dt * (-(MFCq(i,k)-MFCq(i,k-1))) / dzm(i,k) end do te_temfx(i,1) = ust(i)**2. / ftau(i,1) * (1. + ratio(i,1)) if ( is_convective ) then convection_TKE_surface_src(i) = 2. * beta(i,1) * shf_temfx(i,1) else convection_TKE_surface_src(i) = 0. end if te_temfx(i,1) = max(te_temfx(i,1), & (leps(i,1) / Cgamma * (ust(i)**2. * S(i,1) + convection_TKE_surface_src(i)))**(2./3.)) if (te_temfx(i,1) > 20.0) then te_temfx(i,1) = 20.0 end if sfcFTE(i) = -(km(i,1)+km(i,2)) / 2. * (te_temfx(i,2)-te_temfx(i,1)) / dzm(i,2) do kt = 1,kte if (THVF(i,kt) >= 0) then buoy_src(i,kt) = 2. * g / thetav(i,kt) * THVF(i,kt) else buoy_src(i,kt) = 0. end if srcs(i,kt) = -uw_temfx(i,kt) * dudz(i,kt) - vw_temfx(i,kt) * dvdz(i,kt) - & Cgamma * te_temfx(i,kt)**1.5 * linv(i,kt) + buoy_src(i,kt) end do call solve_implicit_temf((km(i,kts:kte-1)+km(i,kts+1:kte))/2.0, & te_temfx(i,kts+1:kte),sfcFTE(i),dzt(i,kts+1:kte),dzt(i,kts:kte-1),kts,kte-1,dt,.false.) do kt = 2,kte-1 te_temfx(i,kt) = te_temfx(i,kt) + dt * srcs(i,kt) te_temfx(i,kt) = te_temfx(i,kt) + dt * (-(MFCTE(i,kt)-MFCTE(i,kt-1))) / dzt(i,kt) if (te_temfx(i,kt) < TEmin) te_temfx(i,kt) = TEmin end do te_temfx(i,kte) = 0.0 do kt = 2,kte-1 if (te_temfx(i,kt) > 20.0) then te_temfx(i,kt) = 20.0 end if end do do k = kts,kte kh_temfx(i,k) = kh(i,k) km_temfx(i,k) = km(i,k) end do call thlqt2thqvqc(thetal(i,kts+1:kte),qt(i,kts+1:kte), & thx_new(i,kts:kte-1),qvx_new(i,kts:kte-1),qcx_new(i,kts:kte-1), & p2d(i,kts:kte-1),pi2d(i,kts:kte-1),kts,kte-1,ep2,xlv,cp) do k = kts,kte-1 rubltenx(i,k) = (u_new(i,k+1) - u_temf(i,k+1)) / dt rvbltenx(i,k) = (v_new(i,k+1) - v_temf(i,k+1)) / dt rthbltenx(i,k) = (thx_new(i,k) - thx(i,k)) / dt rqvbltenx(i,k) = (qvx_new(i,k) - qvx(i,k)) / dt rqcbltenx(i,k) = (qcx_new(i,k) - qcx(i,k)) / dt end do rubltenx(i,kte) = 0. rvbltenx(i,kte) = 0. rthbltenx(i,kte) = 0. rqvbltenx(i,kte) = 0. rqcbltenx(i,kte) = 0. u10(i) = u_new(i,2) * log(10.0/znt(i)) / log(zm(i,2)/znt(i)) v10(i) = v_new(i,2) * log(10.0/znt(i)) / log(zm(i,2)/znt(i)) t2(i) = (tsk(i)/pi2d(i,1) + (thx_new(i,1) - tsk(i)/pi2d(i,1)) * log(2.0/z0t(i)) / log(zm(i,2)/z0t(i))) * pi2d(i,1) hd_temfx(i) = hd(i) lcl_temfx(i) = lcl(i) hct_temfx(i) = hct(i) if ( is_convective) then do k = kts,kte-1 qlup_temfx(i,k) = qlUPD(i,k) end do else qlup_temfx(i,1) = qcx(i,1) do k = kts+1,kte-1 qlup_temfx(i,k) = qcx(i,k-1) end do end if qlup_temfx(i,kte) = qcx(i,kte) end do end subroutine temf2d subroutine thlqt2thqvqc(thetal,qt,theta,qv,qc,p,piex,kbot,ktop,ep2,Lv,Cp) implicit none integer, intent(in ) :: kbot, ktop real, dimension( kbot:ktop ), intent(in ) :: thetal, qt real, dimension( kbot:ktop ), intent( out) :: theta, qv, qc real, dimension( kbot:ktop ), intent(in ) :: p, piex real, intent(in ) :: ep2, Lv, Cp integer :: k, iterate real :: T1, Tt real, dimension( kbot:ktop) :: rst real, dimension( kbot:ktop) :: Tair, rc, rt, rv do k = kbot,ktop T1 = thetal(k) * piex(k) Tair(k) = T1 rt(k) = qt(k) / (1. - qt(k)) do iterate = 1,20 rst(k) = rsat(p(k),Tair(k),ep2) rc(k) = max(rt(k) - rst(k), 0.) Tt = 0.7*Tair(k) + 0.3*T1 * (1.+Lv*rc(k) / (Cp*max(Tair(k),253.))) if ( abs(Tt - Tair(k)) < 0.001) GOTO 100 Tair(k) = Tt end do 100 continue rv(k) = rt(k) - rc(k) qv(k) = rv(k) / (1. + rv(k)) qc(k) = rc(k) / (1. + rc(k)) theta(k) = Tair(k) / piex(k) end do return end subroutine thlqt2thqvqc subroutine findhct_te( thetavenv,thetaparin,qpar, & rpar,hdidx,paridx,zm,hct,hctidx,p,piex,ep2,kbot,ktop) implicit none integer, intent(in) :: kbot, ktop integer, intent(in) :: paridx, hdidx real, intent(in) :: ep2 real, dimension( kbot:ktop), intent(in) :: thetavenv real, dimension( kbot:ktop), intent(in) :: thetaparin real, dimension( kbot:ktop), intent(in) :: qpar, rpar, zm, p, piex real, intent(out) :: hct integer, intent(out) :: hctidx integer k real, dimension( kbot:ktop) :: thetapar, thetavpar, qlpar, Tpar, rsatpar real, dimension( kbot:ktop) :: qsatpar real :: gammas, TparC thetapar(paridx) = thetaparin(paridx) Tpar(paridx) = thetapar(paridx) * piex(paridx) hctidx = ktop do k = paridx+1,ktop rsatpar(k) = rsat(p(k-1),Tpar(k-1),ep2) qsatpar(k) = rsatpar(k) / (1. + rsatpar(k)) if (rpar(k) <= rsatpar(k)) then thetapar(k) = thetapar(k-1) Tpar(k) = thetapar(k) * piex(k) thetavpar(k) = thetapar(k) * (1.+0.608*qpar(k)) else TparC = Tpar(k-1) - 273.15 gammas = 6.4 - 0.12 * TparC + 2.5e-5 * TparC**3. + (-2.4 + 1.e-3 * (TparC-5.)**2.) * (1. - p(k-1)/100000.) Tpar(k) = Tpar(k-1) - gammas/1000. * (zm(k)-zm(k-1)) thetapar(k) = Tpar(k) / piex(k) qlpar(k) = qpar(k) - qsatpar(k) thetavpar(k) = thetapar(k) * (1. + 0.608 * qsatpar(k) - qlpar(k)) end if if (thetavenv(k) >= thetavpar(k)) then hctidx = k goto 1000 end if end do 1000 hct = zm(hctidx) return end subroutine findhct_te real function rsat(p,T,ep2) implicit none real p, T, ep2 real temp, x real, parameter :: c0 = 0.6105851e+3 real, parameter :: c1 = 0.4440316e+2 real, parameter :: c2 = 0.1430341e+1 real, parameter :: c3 = 0.2641412e-1 real, parameter :: c4 = 0.2995057e-3 real, parameter :: c5 = 0.2031998e-5 real, parameter :: c6 = 0.6936113e-8 real, parameter :: c7 = 0.2564861e-11 real, parameter :: c8 = -0.3704404e-13 temp = T - 273.15 x =c0+temp*(c1+temp*(c2+temp*(c3+temp*(c4+temp*(c5+temp*(c6+temp*(c7+temp*c8))))))) rsat = ep2*x/(p-x) return end function rsat subroutine solve_implicit_temf(Khlf,psi_n,srf_flux,dzm,dzt,kbot,ktop,dt,print_flag) implicit none integer :: kbot, ktop logical :: print_flag real :: srf_flux, dt real, dimension( kbot:ktop ), intent(in ) :: Khlf real, dimension( kbot:ktop ), intent(in ) :: dzm, dzt real, dimension( kbot:ktop ), intent(inout) :: psi_n integer :: k real, dimension( kbot:ktop ) :: AU, BU, CU, YU AU(kbot) = Khlf(kbot) / (dzm(kbot)*dzt(kbot)) BU(kbot) = -1.0/dt - Khlf(kbot+1)/(dzm(kbot+1)*dzt(kbot+1)) CU(kbot) = Khlf(kbot+1)/(dzm(kbot)*dzt(kbot+1)) YU(kbot) = -psi_n(kbot)/dt - srf_flux/dzm(kbot) do k = kbot+1,ktop-1 AU(k) = Khlf(k) / (dzm(k) * dzt(k)) BU(k) = -1.0/dt - (Khlf(k)/dzt(k) + Khlf(k+1)/dzt(k+1)) / dzm(k) CU(k) = Khlf(k+1) / (dzm(k)*dzt(k+1)) YU(k) = -psi_n(k)/dt end do AU(ktop) = 0. BU(ktop) = -1.0 / dt YU(ktop) = -psi_n(ktop) / dt psi_n = trid(AU,BU,CU,YU,kbot,ktop) return end subroutine solve_implicit_temf function trid(a,b,c,r,kbot,ktop) implicit none real, dimension( kbot:ktop ) :: trid integer :: kbot, ktop real, dimension( kbot:ktop ), intent(in ) :: a, b, c, r integer :: k real :: bet real, dimension( kbot:ktop ) :: gam, u bet = b(kbot) u(kbot) = r(kbot) / bet do k = kbot+1,ktop gam(k) = c(k-1) / bet bet = b(k) - a(k)*gam(k) u(k) = (r(k) - a(k)*u(k-1)) / bet end do do k = ktop-1,kbot,-1 u(k) = u(k) - gam(k+1)*u(k+1) end do trid = u return end function trid subroutine temfinit(rublten,rvblten,rthblten,rqvblten, & rqcblten,rqiblten,p_qi,p_first_scalar, & restart, allowed_to_read, & te_temf, cf3d_temf, & ids, ide, jds, jde, kds, kde, & ims, ime, jms, jme, kms, kme, & its, ite, jts, jte, kts, kte ) implicit none logical , intent(in) :: restart, allowed_to_read integer , intent(in) :: ids, ide, jds, jde, kds, kde, & ims, ime, jms, jme, kms, kme, & its, ite, jts, jte, kts, kte integer , intent(in) :: p_qi,p_first_scalar real , dimension( ims:ime , kms:kme , jms:jme ), intent(out) :: & rublten, & rvblten, & rthblten, & rqvblten, & rqcblten, & rqiblten, & te_temf, & cf3d_temf integer :: i, j, k, itf, jtf, ktf real, parameter :: TEmin = 1e-3 jtf = min0(jte,jde-1) ktf = min0(kte,kde-1) itf = min0(ite,ide-1) if(.not.restart)then do j = jts,jtf do k = kts,ktf do i = its,itf rublten(i,k,j) = 0. rvblten(i,k,j) = 0. rthblten(i,k,j) = 0. rqvblten(i,k,j) = 0. rqcblten(i,k,j) = 0. te_temf(i,k,j) = TEmin cf3d_temf(i,k,j) = 0. enddo enddo enddo endif if (p_qi .ge. p_first_scalar .and. .not.restart) then do j = jts,jtf do k = kts,ktf do i = its,itf rqiblten(i,k,j) = 0. enddo enddo enddo endif end subroutine temfinit end module module_bl_temf