!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
***s/p emicroi -- explicit microphysics for cold cloud (warm + cold)
*
#include "phy_macros_f.h"

      subroutine emicroi ( W,T,Q,QC,QR,QI,PS,TM,QM,QCM,QRM,QIM,PSM , 1
     $                     SATUCO,S,SR,IR,ZSTE,ZSQE,ZSQCE,ZSQRE,ZSQIE,
     $                     DT,NI,N,NK,J,KOUNT )
#include "impnone.cdk"
*
      logical SATUCO
      integer NI,N,NK,J,KOUNT
      real W(NI,NK),T(NI,NK),Q(NI,NK),QC(NI,NK),QR(NI,NK),QI(NI,NK)
      real TM(NI,NK),QM(NI,NK),QCM(NI,NK),QRM(NI,NK),QIM(NI,NK)
      real ZSTE(NI,NK),ZSQE(NI,NK),ZSQCE(NI,NK),ZSQRE(NI,NK)
      real ZSQIE(NI,NK),PS(NI),PSM(NI),SR(NI),IR(NI),S(NI,NK)
      real DT
*
*Author
*          Kong,Yau (McGill University)         Feb 1995
*
*Revision
*
*Object
*
*Arguments
*
*          - Input -
* W        vertical velocity
* T        virtual temperature
* Q        specific humidity
* QC       cloud mixing ratio
* QR       rain  mixing ratio
* QI       ice & snow 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)
* QIM      ice & snow 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       liquid precipitation rate (rain)
* IR       solid  precipitation rate (snow)
* ZSTE     tendency on virtual temperature
* ZSQE     tendency on specific humidity
* ZSQCE    tendency on cloud      mixing ratio
* ZSQRE    tendency on rain       mixing ratio
* ZSQIE    tendency on ice & snow 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
*
*  NOTE
*       Two parameters (nsplit & nspliti) calculated from physlb8.ftn
*       and transferred via sedipara.cdk are the splitting small time
*       step numbers used in the sedimentation terms of rain and ice.
*       The determination of 'nspliti' 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
*       'nspliti' increase [see the documentation] -- This is already
*       done automatically in "physlb8.ftn"
*
**
      logical log1,log2,log3,log4      
      integer  i,k,niter,ll,ll0
      real fre,ckice,AC, EPSQC,EPSQR,EPS, VDmax
      real k1,k2,k3,ck1,ck2,ck3,ck4,ck5,ck6,ck7,ck8,ck9
      real X,D,DEL,ER,ES,LCP,LFP,LSP,DT2
      real cloudnc,rqr,rqr2,rqr4,esi,si,ani,di
      real source,sink,sour,ratio
      real ANUvi,AHNUci,AHNUri,AVDvi,ACLci,AFRri,AMLir,AMVDiv
      real dei,ani0,ck0,ck01,ck02,qvs0,vr,vi0,de1,lamda,lamdai,si0
*
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
     AUTOMATIC ( A1   , REAL , (nk   ))
     AUTOMATIC ( A2   , REAL , (nk   ))
     AUTOMATIC ( B1   , REAL , (nk   ))
     AUTOMATIC ( DE   , REAL , (ni,nk))
     AUTOMATIC ( VT   , REAL , (ni,nk))
     AUTOMATIC ( VI   , REAL , (ni,nk))
     AUTOMATIC ( DP   , REAL , (ni,nk))
     AUTOMATIC ( QS   , REAL , (ni,nk))
     AUTOMATIC ( QSW  , REAL , (ni,nk))
     AUTOMATIC ( QSI  , REAL , (ni,nk))
*
************************************************************************
*
      parameter(EPSQC=1e-12)
      parameter(EPSQR=1e-6 )
      parameter(EPS  =1e-32)
      parameter(k1 = 0.001 )
      parameter(k2 = 0.0005)
      parameter(k3 = 2.54  )
      parameter(cloudnc=3e8)
      parameter(dei=900.0, ani0=1e3)
*
#include "consphy.cdk"
#include "dintern.cdk"
#include "sedipara.cdk"
#include "fintern.cdk"
*
      LCP=CHLC/CPD
      LFP=CHLF/CPD
      LSP=LCP+LFP
      dt2=DT
      ck0=1./3.
      ck01=0.25*ck0
      ck02=1.0+ck01
      ck1=dt2*k1
      ck2=k2
      ck3=dt2*k3
      ck4=14.0873
      ck5=4098.170*LCP
      ck6=5806.485*LSP
      ck7=1.0/(dt2*GRAV)
      ck8=1./(PI*dei*ani0)**ck0
      ck9=3.1752e-11*dt2/GRAV
*
*
*
***   copie des champs T, Q, QC, QR et QI
      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)
            ZSQIE(i,k)  = QI(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))
            QIM(i,k)=0.5*(QIM(i,k)+QI(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
            VI(i,k)=0.0
*
c   Here, VI must be zeroed, since it will not be fully assigned later.
*
 130     continue
*
 150  continue
*
      do 160 k=1,nk
      do 160 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(QI(i,k).lt.EPSQC) then
            Q(i,k)= Q(i,k)-QI(i,k)
            QI(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
         if(QIM(i,k).lt.EPSQC) then
            QM(i,k)= QM(i,k)-QIM(i,k)
            QIM(i,k)= 0.0
         endif
 160  continue
*
c   calculate DP for sedimentation term
*
      do 170 k=2,nk-1
      do 170 i=1,ni
         DP(i,k)=PSM(i)*(S(i,k+1)-S(i,k-1))/2.0
 170  continue
      do 180 i=1,ni
         DP(i,1)=PSM(i)*(S(i,2)-S(i,1))
         DP(i,nk)=PSM(i)*(S(i,nk)-S(i,nk-1))
 180  continue
*
c   saturate mixing ratio: 	QSW   vs. liquid water
c                               QS    vs. ice surface  at (*)
c                               QSI   vs. ice surface
      do 190 k=1,nk
      do 190 i=1,ni
         QSW(i,k)= FOQSA(TM(i,k),PSM(i)*S(i,k))
         QS(i,k) = FOQST(T(i,k),  PS(i)*S(i,k))
         QSI(i,k)= FOQST(TM(i,k),PSM(i)*S(i,k))
 190  continue
*
*
c --PART I: Cold Microphysics Processes
*
c   calculating source and sink terms
      do 800 k=2,nk
      do 800 i=1,ni
         de1=sqrt(DE(i,k))
         qvs0=FOQSA(TRPL,PSM(i)*S(i,k))
         log1= QSW(i,k).gt.QM(i,k).and.(QCM(i,k)+QIM(i,k)).lt.EPSQC.and.
     $         QRM(i,k).lt.EPSQR
         log2= QIM(i,k).lt.EPSQC
         log3= TM(i,k).lt.TRPL.and.log1
         log4= TM(i,k).ge.TRPL.and.log2
         if(log3.or.log4) go to 790
         if(TM(i,k).gt.233.16) go to 410
         QCM(i,k)= 0.0
         QRM(i,k)= 0.0
 410     continue
         if(QRM(i,k).lt.EPSQR) go to 420
         rqr=DE(i,k)*QRM(i,k)
         rqr2= sqrt(rqr)
         rqr4= sqrt(rqr2)
         lamda=2.375e-3*rqr4
         vr=ck4*sqrt(rqr4)/de1
 420     continue
         if(TM(i,k).lt.TRPL) go to 450
*
         QIM(i,k) = 0.0
         AMLir=QI(i,k)
         AMVDiv=0.0
*     
         ANUvi= 0.0
         AHNUci= 0.0
         AVDvi= 0.0
         ACLci= 0.0
         AFRri= 0.0
         AHNUri= 0.0
         go to 600
 450     continue
         AMLir= 0.0
         AMVDiv=0.0
*     
c   T < To
         esi= QSI(i,k)*PSM(i)*S(i,k)/62.2
         si= QM(i,k)/QSI(i,k)
         si0=QSW(i,k)/QSI(i,k)
*MD Le rapport "si= QM(i,k)/QSI(i,k)" peut etre ici assez grand
*MD et faire saute l'evaluation de "exp(12.96*(si-1.0)-0.639)"
         ani=amax1(1e3*exp(12.96*(si-1.0)-0.639),ani0)
         if(TM(i,k).le.233.16) then
*     
c   T<=-40 (homogeneous freezing)
            AHNUci= QC(i,k)
            AHNUri= QR(i,k)
         else
            AHNUci= 0.0
            AHNUri= 0.0
         endif
         if(QM(i,k).lt.QSW(i,k).or.TM(i,k).gt.268.16) go to 460
         ANUvi= ck9*(W(i,k-1)+W(i,k+1))*(TM(i,k-1)-TM(i,k+1))*
     ]        ani*si0*(5806.485/(TM(i,k)-7.66)**2-4098.171/
     ]        (TM(i,k)-35.86)**2)/DP(i,k)/DE(i,k)
         if(ANUvi.gt.0.0) go to 470
 460     ANUvi= 0.0
 470     continue
         if(QIM(i,k).lt.EPSQC) go to 550
         lamdai=(DE(i,k)/(PI*dei*ani))**ck0
         VI(i,k)= 7.3455*lamdai**0.25/de1
         vi0=VI(i,k)*QIM(i,k)**ck01
         lamdai=lamdai*QIM(i,k)**ck0
         di= 1.8171*lamdai
         fre=1.0+217.7331*lamdai**0.625/sqrt(de1)
         ckice= ani*dt2/DE(i,k)
         if(si.le.1.0) go to 530
         if(QCM(i,k).lt.1e-5.or.di.lt.2e-4) go to 530
         ACLci=10.6508*ckice*de1*QCM(i,k)*lamdai**2.25
         go to 540
 530     ACLci= 0.0
 540     AVDvi=ckice*(si-1.)*fre*lamdai/(1.7276e6+0.9161e7/esi)-ACLci/
     ]        (9.0929+48.2164/esi)
         if(AVDvi.lt.0.0.and.si.gt.1.) AVDvi=0.0
         VDmax=(Q(i,k)-QS(i,k))/(1.0+ck6*QS(i,k)/(T(i,k)-7.66)**2)
         if(si.ge.1.0) then
            AVDvi=amin1(AVDvi,VDmax)
         else
            AVDvi=amax1(AVDvi,VDmax)
         endif
         go to 560
 550     ACLci=0.0
         AVDvi=0.0
         ani=0.0
         di=0.0
         vi0=0.0
 560     if(QIM(i,k).lt.EPSQC.or.QRM(i,k).lt.EPSQR) go to 580
         AFRri= PI*ckice*rqr*abs(vr-vi0)*(5.*lamda*lamda+
     ]        2.*lamda*lamdai+0.5*lamdai*lamdai)
         AFRri=amin1(AFRri,QR(i,k))
         go to 600
 580     AFRri= 0.0
 600     continue
*     
c     iterating the sink terms for each mixing ratio quantity
*     
         do 750 niter=1,2
*
c  (1) for Qi
            source=QI(i,k)+ANUvi+AHNUci+dim(AVDvi,0.0)+
     $             ACLci+AHNUri+AFRri
            sink=AMLir+AMVDiv+dim(-AVDvi,0.0)
            sour=amax1(source,0.0)
            if(sink.le.sour) go to 650
            ratio=sour/sink
            AMLir=ratio*AMLir
            AMVDiv=ratio*AMVDiv
            if(AVDvi.ge.0.0) go to 650
            AVDvi=ratio*AVDvi
 650        continue
*     
c     (2) for Qr
            source=QR(i,k)+AMLir
            sink=AHNUri+AFRri
            sour=amax1(source,0.0)
            if(sink.le.sour) go to 690
            ratio=sour/sink
            AHNUri=ratio*AHNUri
            AFRri=ratio*AFRri
 690        continue
*
c  (3) for Qc
            source=QC(i,k)
            sink=AHNUci+ACLci
            sour=amax1(source,0.0)
            if(sink.le.sour) go to 710
            ratio=sour/sink
            AHNUci=ratio*AHNUci
            ACLci=ratio*ACLci
 710        continue
*
c  (4) for Qv
            source=Q(i,k)+dim(-AVDvi,0.0)+AMVDiv
            sink=ANUvi+dim(AVDvi,0.0)
            sour=amax1(source,0.0)
            if(sink.le.sour) go to 730
            ratio=sour/sink
            ANUvi=ratio*ANUvi
            if(AVDvi.le.0.0) go to 730
            AVDvi=ratio*AVDvi
 730        continue
*     
 750     continue
*     
cc   adjusting all related quantities
         Q(i,k)= Q(i,k)-ANUvi-AVDvi+AMVDiv
         QC(i,k)= QC(i,k)-AHNUci-ACLci
         QR(i,k)= QR(i,k)+AMLir-AHNUri-AFRri
         QI(i,k)= QI(i,k)+ANUvi+AHNUci+AVDvi+ACLci+AHNUri+AFRri
     $                 -AMLir-AMVDiv
*
         T(i,k)= T(i,k)+LFP*(AHNUci+AHNUri+AFRri+ACLci-AMLir)+
     $           LSP*(ANUvi+AVDvi)-LCP*AMVDiv
*
c   total deposition and sublimation
c      tdep=tdep+DE(i,k)*(ANUvi+dim(AVDvi,0.0))
c      tsub=tsub+DE(i,k)*dim(-AVDvi,0.0)
*
c   positive adjustment for all new hydrometeor fields
         if(QC(i,k).lt.EPSQC) then
            Q(i,k)= Q(i,k)-QC(i,k)
            QC(i,k)= 0.0
         endif
         if(QR(i,k).lt.EPSQC) then
            Q(i,k)= Q(i,k)-QR(i,k)
            QR(i,k)= 0.0
         endif
         if(QI(i,k).lt.EPSQC) then
            Q(i,k)= Q(i,k)-QI(i,k)
            QI(i,k)= 0.0
         endif
         Q(i,k)=amax1(Q(i,k),0.0)
*     
         go to 800
 790     continue
 800  continue
*
c   end of ice phase microphysics
*
c --PART II: Warm Microphysics Processes
*
c   re-calculate QS with new T  (vs. liquid water here!)
      do 920 k=1,nk
      do 920 i=1,ni
         QS(i,k) = FOQSA(T(i,k),  PS(i)*S(i,k))
 920  continue
*     
c   autoconversion & coalescence
*
      do 940 k=2,nk
      do 940 i=1,ni
         if(QCM(i,k).le.EPSQC.and.QRM(i,k).lt.EPSQR) go to 930
         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
 930     continue
 940  continue
*
c   microphysical adjustment for condensation/evaporation
*
      do 1060 k=1,nk
      do 1060 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 1050
         X= X/(1.0+ ck5*QS(i,k)/(T(i,k)-35.86)**2)
         if(X.lt.(-QC(i,k))) go to 990
         T(i,k)= T(i,k)+ LCP*X
         Q(i,k)= Q(i,k)- X
         QC(i,k)= QC(i,k)+ X
         go to 1050
 990     if(QR(i,k).gt.EPSQC) go to 1010
 1000    D= 0.0
         go to 1040
 1010    if(QM(i,k).ge.QSW(i,k)) go to 1000
*     
c   ES = P*QS/(0.622*100)  with unit of hPa (mb)
*
         ES= QSW(i,k)*PSM(i)*S(i,k)/62.2
         ER= dt2*(1.0-QM(i,k)/QSW(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 1020
         DEL= -QR(i,k)
         go to 1030
 1020    DEL= -ER
 1030    D= amax1(X+QC(i,k), DEL)
 1040    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
 1050    continue
 1060 continue
*
c      finish the warm microphysics processes
*
c   sedimentation term for RI & RL
      do 1200 i=1,ni
         IR(i)=0.0
         SR(i)=0.0
         do 1120 k=1,nk
            A1(k)=ci6*DE(i,k)*VI(i,k)
            A2(k)=cr6*DE(i,k)*VT(i,k)
 1120    continue
         do 1190 ll=1,nspliti
*
c   solid (snow) precipitation terms
            do 1130 k=1,nk
               B1(k)=A1(k)*QI(i,k)**ck02
 1130       continue
            do 1140 k=2,nk
               QI(i,k)=dim(QI(i,k)+(B1(k-1)-B1(k))/DP(i,k), EPS)
 1140       continue
            IR(i)=B1(nk)+IR(i)
*
c   melting sub-adjusting caused by sedimentation
            do 1150 k=2,nk
               if(T(i,k).gt.TRPL) then
                  T(i,k)=T(i,k)-LFP*QI(i,k)
                  QR(i,k)=QR(i,k)+QI(i,k)
                  QI(i,k)=0.0
               endif
 1150       continue
*
c   rain-drop sedimentation
            do 1180 ll0=1,nsplit
               do 1160 k=1,nk
 1160             B1(k)=A2(k)*QR(i,k)**1.125
                  do 1170 k=2,nk
                     QR(i,k)=dim(QR(i,k)+(B1(k-1)-B1(k))/DP(i,k), EPS)
 1170             continue
                  SR(i)=B1(nk)+SR(i)
 1180          continue
*     
 1190       continue
            IR(i)=ck7*IR(i)
            SR(i)=ck7*SR(i)
 1200    continue
*
c   finish the microphysics adjustment
*
*
c   positive adjustment for Q
      do 1350 k=1,nk
      do 1350 i=1,ni
         Q(i,k)= amax1(Q(i,k), 0.0)
1350  continue
*
***   calcul des tendances pour les champs T, Q, QC, QR et QI
***   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
            ZSQIE(i,k)= (QI(i,k)-ZSQIE(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
            QI(i,k)= QI(i,k)- ZSQIE (i,k)*DT
         end do
      end do
*
***
*
      return
      end