!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%% ***s/p emicrow -- explicit microphysics for warm cloud * #include "phy_macros_f.h"![]()
subroutine emicrow ( T,Q,QC,QR,PS,TM,QM,QCM,QRM,PSM , 1 $ SATUCO,S,SR,ZSTE,ZSQE,ZSQCE,ZSQRE, $ DT,NI,N,NK,J,KOUNT ) #include "impnone.cdk"
* logical SATUCO integer NI,N,NK,J,KOUNT real T(NI,NK),Q(NI,NK),QC(NI,NK),QR(NI,NK) real TM(NI,NK),QM(NI,NK),QCM(NI,NK),QRM(NI,NK) real PS(NI),PSM(NI),SR(NI),S(NI,NK) real ZSTE(NI,NK),ZSQE(NI,NK),ZSQCE(NI,NK),ZSQRE(NI,NK) real DT * *Author * Kong,Yau (McGill University) Feb 1995 * *Revision * *Object * *Arguments * * - Input - * T virtual temperature * Q specific humidity * QC cloud mixing ratio * QR rain mixing ratio * PS surface pressure * TM virtual temperature at (t-dt) * QM specific humidity at (t-dt) * QCM cloud mixing ratio at (t-dt) * QRM rain mixing ratio at (t-dt) * PSM surface pressure at (t-dt) * SATUCO .TRUE. to have water/ice phase for saturation * .FALSE. to have water phase only for saturation * S sigma values * * - Output - * SR precipitation rate (liquid only, in mm/s) * ZSTE tendency on virtual temperature * ZSQE tendency on specific humidity * ZSQCE tendency on cloud mixing ratio * ZSQRE tendency on rain mixing ratio * * - Input - * DT timestep * NI 1st horizontal dimension * N NI or NIxNJ (first dimension of T, Q etc) * NK vertical dimension * J index of the row * KOUNT number of timestep * *Notes * The determination of 'nsplit' also depends on the vertical * levelling (Gal-Chen). If higher vertical resolution would be * used, the small time step should also decrease, and in turn * 'nsplit' increase [see the documentation]-- This is already * done automatically in "physlb5.ftn" since May 1996 * ** integer i,k,ll,NTMPVEC real AC,k1,k2,k3,ck1,ck2,ck3,ck4,ck5,ck7 real X,D,DEL,ER,ES,LCP,DT2,EPSQC,EPSQR,EPS * ************************************************************************ * AUTOMATIC ARRAYS ************************************************************************ * AUTOMATIC ( A1 , REAL , (nk )) AUTOMATIC ( B1 , REAL , (nk )) AUTOMATIC ( DE , REAL , (ni,nk)) AUTOMATIC ( VT , REAL , (ni,nk)) AUTOMATIC ( DP , REAL , (ni,nk)) AUTOMATIC ( QS , REAL , (ni,nk)) AUTOMATIC ( QSM1, REAL , (ni,nk)) * ************************************************************************ * #include "consphy.cdk"
#include "dintern.cdk"
#include "sedipara.cdk"
#include "fintern.cdk"
* data EPSQC,EPSQR,EPS/1e-12,1e-6,1e-32/ data k1,k2,k3/0.001,0.0005,2.54/ * LCP=CHLC/CPD dt2=DT ck1=dt2*k1 ck2=k2 ck3=dt2*k3 ck4=14.08 ck5=4098.170*LCP ck7=1.0/(dt2*GRAV) * * *** copie des champs T, Q, QC et QR do k=1,nk do i=1,ni ZSTE(i,k) = T(i,k) ZSQE(i,k) = Q(i,k) ZSQCE(i,k)= QC(i,k) ZSQRE(i,k)= QR(i,k) end do end do * c prepare PS, T, and Q field do 105 i=1,ni PSM(i)= 0.5*(PSM(i)+PS(i)) 105 continue * do 150 k=1,nk * do 115 i=1,ni TM(i,k)= 0.5*(TM(i,k)+T(i,k)) QM(i,k)= 0.5*(QM(i,k)+Q(i,k)) QCM(i,k)=0.5*(QCM(i,k)+QC(i,k)) QRM(i,k)=0.5*(QRM(i,k)+QR(i,k)) 115 continue do 120 i=1,ni DE(i,k)=S(i,k)*PSM(i)/(RGASD*TM(i,k)) 120 continue do 130 i=1,ni VT(i,k)=ck4/DE(i,k)**0.375 130 continue * 150 continue * do 210 k=1,nk do 210 i=1,ni if(QR(i,k).lt.EPSQC) then Q(i,k)= Q(i,k)-QR(i,k) QR(i,k)= 0.0 endif if(QRM(i,k).lt.EPSQC) then QM(i,k)= QM(i,k)-QRM(i,k) QRM(i,k)= 0.0 endif 210 continue * c calculate DP for QR's sedimentation term * do 160 k=2,nk-1 do 160 i=1,ni DP(i,k)=PS(i)*(S(i,k+1)-S(i,k-1))/2.0 160 continue do 170 i=1,ni DP(i,1)=PS(i)*(S(i,2)-S(i,1)) DP(i,nk)=PS(i)*(S(i,nk)-S(i,nk-1)) 170 continue * c autoconversion & coalescence * do 200 k=2,nk do 200 i=1,ni if(QCM(i,k).le.EPSQC.and.QRM(i,k).lt.EPSQR) go to 190 if(QRM(i,k).lt.EPSQR) then AC= ck1*dim(QCM(i,k), ck2) else AC= ck1*dim(QCM(i,k), ck2)+ck3*QCM(i,k)*(DE(i,k)* $ QRM(i,k))**0.875/sqrt(DE(i,k)) endif if(AC.gt.QC(i,k)) then QR(i,k)= QR(i,k)+QC(i,k) QC(i,k)= 0.0 else QC(i,k)= QC(i,k)- AC QR(i,k)= QR(i,k)+ AC endif 190 continue 200 continue * c rain-drop sedimentation * do 260 i=1,ni SR(i)=0.0 do 220 k=1,nk A1(k)= cr6*DE(i,k)*VT(i,k) 220 continue do 250 ll=1,nsplit*nspliti do 230 k=1,nk B1(k)=A1(k)*QR(i,k)**1.125 230 continue do 240 k=2,nk QR(i,k)=dim(QR(i,k)+(B1(k-1)-B1(k))/DP(i,k), EPS) 240 continue SR(i)=SR(i)+B1(nk) 250 continue SR(i)=ck7*SR(i) 260 continue * c microphysical adjustment for condensation/evaporation * do 400 k=1,nk do 400 i=1,ni QS(i,k)= FOQSA(T(i,k), PS(i)*S(i,k)) QSM1(i,k)= FOQSA(TM(i,k), PSM(i)*S(i,k)) 400 continue * do 500 k=1,nk do 500 i=1,ni X= Q(i,k)- QS(i,k) if(X.le.0.0.and.QC(i,k).le.0.0.and.QR(i,k).le.0.0) go to 480 X= X/(1.0+ ck5*QS(i,k)/(T(i,k)-35.86)**2) if(X.lt.(-QC(i,k))) go to 420 T(i,k)= T(i,k)+ LCP*X Q(i,k)= Q(i,k)- X QC(i,k)= QC(i,k)+ X go to 480 420 if(QR(i,k).gt.EPSQC) go to 440 430 D= 0.0 go to 470 440 if(QM(i,k).ge.QSM1(i,k)) go to 430 * c ES = P*QS/(0.622*100) with unit of hPa (mb) * ES= QSM1(i,k)*PSM(i)*S(i,k)/62.2 ER= dt2*(1.0-QM(i,k)/QSM1(i,k))*(1.0+11.69*(DE(i,k)*QRM(i,k))** $ 0.1875)*(DE(i,k)*QRM(i,k))**0.5/(2.02e4+1.55e5/ES)/DE(i,k) if(QR(i,k).gt.ER) go to 450 DEL= -QR(i,k) go to 460 450 DEL= -ER 460 D= amax1(X+QC(i,k), DEL) 470 X= D - QC(i,k) QR(i,k)= QR(i,k)+ D QC(i,k)= 0.0 T(i,k)= T(i,k) + LCP*X Q(i,k)= Q(i,k) - X 480 continue 500 continue * c finish the microphysical adjustment * do 650 k=1,nk do 650 i=1,ni Q(i,k)= amax1(Q(i,k), 0.0) 650 continue * *** calcul des tendances pour les champs T, Q, QC et QR *** retour aux champs de depart do k=1,nk do i=1,ni ZSTE(i,k) = (T(i,k) - ZSTE(i,k))/DT ZSQE(i,k) = (Q(i,k) - ZSQE(i,k))/DT ZSQCE(i,k)= (QC(i,k)-ZSQCE(i,k))/DT ZSQRE(i,k)= (QR(i,k)-ZSQRE(i,k))/DT T(i,k) = T(i,k) - ZSTE(i,k)*DT Q(i,k) = Q(i,k) - ZSQE(i,k)*DT QC(i,k)= QC(i,k)- ZSQCE(i,k)*DT QR(i,k)= QR(i,k)- ZSQRE(i,k)*DT end do end do * * return end