!added 
!WRF:MODEL_LAYER:PHYSICS
!based on module_mp_gsfcgce_311_new_20101115_newdbz.F
!implemented conv/stra separation scheme 
!--->cal_sepa
!on 06/11/2011
!
!Implemented conv/stra diagnostic variable rainncv_sepa and rainnc_sepa
!--->var_sepa
!on 11/18/2011  
!Di
!
!added small fix to prevent underflow and overflow issues
!on 12/02/2011
!EMK
!
!implemented 4ice writen by Steve Lang
!added tervrh.F_v3.0
!on 08/06/2012
!
!adding saticerh.F_v3.0
!on 08/07/2012  
!
!from GCE saticerh.F_v3.08j, sgmap.F_v3.08t.clean
!consatrh.F_v3.08t, tervrh.F_v3.08t, and vqrqi.F_v3.05
!on 12/09/2014
!Di

MODULE module_mp_gsfcgce_4ice_nuwrf

#if (WRF_CHEM == 1)
   use module_gocart_coupling
#endif
   USE module_mp_radar

   INTEGER, PARAMETER, PRIVATE:: chunk = 16

   LOGICAL, EXTERNAL :: wrf_dm_on_monitor

!JJS 20140117 vvvvv
   PRIVATE  ! privatize all variables/subroutines in this module excepting public parameter below
   PUBLIC :: gsfcgce_4ice_nuwrf
!JJS 20140117 ^^^^^

!JJS 1/3/2008     vvvvv

!  common /bt/
   REAL,    PRIVATE ::          rd1,  rd2,   al,   cp

!  common /cont/
   REAL,    PRIVATE ::          c38, c358, c610, c149,             &
                               c879, c172, c409,  c76,             &
                               c218, c580, c141
!  common /b3cs/
   REAL,    PRIVATE ::           ag,   bg,   as,   bs,             &
                                 aw,   bw,  bgh,  bgq,             &
                                bsh,  bsq,  bwh,  bwq,             &
                                 ah,   bh,  bh3,  bhh,             &
                                bhh5, bhq,  bh3_2

!  common /size/
   REAL,    PRIVATE ::          tnw,  tns,  tng, tnh,              &
                               roqs, roqg, roqr, roqh

!  common /rterv/
   REAL,    PRIVATE ::           zrc,  zgc,  zsc, zhc, vrc,        &  
                                vrc0, vrc1, vrc2, vrc3,            &
                             	 vgc,  vsc, vhc
!  common /rterv_2/ 
    REAL,    PRIVATE ::         zgc2, vgc2

!  common /bsnw/
   REAL,    PRIVATE ::              rn11a

   REAL,    PRIVATE ::          rn17, rn19b,                       &
                               	bnd3, rn23a,                   &
                               rn23b, rn30b,                       &
                               rn30c 

!  common /rsnw/
    REAL,    PRIVATE ::          alv,   alf,   als,    t0,   t00,     &
                                 avc,   afc,   asc,   esi,   rn1, rn2,     &
                                bnd2,   rn3,   rn4,   rn5,  rn50,     &
                                rn51,  rn52,  rn53,   rn6,  rn60,     &
                                rn61,  rn62,  rn63,   rn7,   rn8,     &
                                 rn9,  rn10, rn101, rn102, rn10a,     &
                               rn10b, rn10c,  rn11,  rn12,  rn14,     &
                                rn15, rn15a,  rn16, rn171, rn172,     &
                               rn17a, rn17b, rn17c,  rn18, rn18a,     &
                                rn19, rn191, rn192, rn19a,  rn20,     &
                               rn20a, rn20b,  rn30, rn30a,  rn21,     &
                               bnd21,  rn22,  rn23, rn231, rn232,     &
                                rn25,  rn31,  beta,  rn32,  rn33,     &
                               rn331, rn332,  rn34,  rn35,rnn30a,     &
                               rnn191,rnn192
   REAL,    PRIVATE, DIMENSION( 31 ) ::    rn12a, rn12b, rn13, rn25a

!  common /rsnw2h/
    REAL,    PRIVATE ::         hn9,  hn10,  hn10a, hn14,  hn15a, hn16,  &
                                hn17, hn17a, hn19,  hn19a, hn20,  hn20b  
    REAL,    PRIVATE ::         gn17,gn17a,gn17a2                                     !4ice revised

!  common /rainmap/ 
    REAL,    PRIVATE ::         draimax

!  common /snomap/ 
  real, PRIVATE ::  xs,sno11,sno00,dsno11,dsno00,sexp11,sexp00,stt,   &
                stexp,sbase,tslopes,dsnomin,dsnomin4,slim
!  common /grpmap/
  real, PRIVATE ::  xg,grp11,grp00,dgrp11,dgrp00,gexp11,gexp00,gtt,   &
                gtexp,gbase,tslopeg,dgrpmin,dgrpmin4,glim
!  common /haimap/
  real, PRIVATE :: hai00,hai11,htt0,htt1,haixp 

!  common /b3cg_2/ 
    REAL,    PRIVATE ::         ag2, bg2, bgh2, bgq2, roqg2, qrog2

!  common /rsnw2/ 
    REAL,    PRIVATE ::         rn142, rn152, rn15a2, rn17a2, rn192_2

!  common /icemass/
    REAL,    PRIVATE ::          ami50, ami40, ami100

!  common /BergCon/
   REAL,    PRIVATE, DIMENSION( 31 ) ::    BergCon1,  BergCon2,       &
                                           BergCon3,  BergCon4
  REAL, PRIVATE    :: cmin
  REAL, PRIVATE    :: cpi
!
   REAL,    PRIVATE, DIMENSION( 31 )  ::      aa1,  aa2
   DATA aa1/.7939e-7, .7841e-6, .3369e-5, .4336e-5, .5285e-5,         &
           .3728e-5, .1852e-5, .2991e-6, .4248e-6, .7434e-6,          &
           .1812e-5, .4394e-5, .9145e-5, .1725e-4, .3348e-4,          &
           .1725e-4, .9175e-5, .4412e-5, .2252e-5, .9115e-6,          &
           .4876e-6, .3473e-6, .4758e-6, .6306e-6, .8573e-6,          &
           .7868e-6, .7192e-6, .6513e-6, .5956e-6, .5333e-6,          &
           .4834e-6/
   DATA aa2/.4006, .4831, .5320, .5307, .5319,                        &
           .5249, .4888, .3894, .4047, .4318,                         &
           .4771, .5183, .5463, .5651, .5813,                         &
           .5655, .5478, .5203, .4906, .4447,                         &
           .4126, .3960, .4149, .4320, .4506,                         &
           .4483, .4460, .4433, .4413, .4382,                         &
           .4361/

!+---+-----------------------------------------------------------------+
!..The following 6 variables moved here to facilitate reflectivity
!.. calculation similar to other MP schemes, because when they get
!.. declared later in the code (now commented out), it makes things
!.. more difficult to integreate with the radar code.
      REAL ::     xnor, xnos, xnoh, xnog
      REAL ::     rhohail, rhograul
!.. Values will be defined in subroutine fall_flux --- JJS 20150731
!      REAL    , PARAMETER ::     xnor = 8.0e6
!      REAL    , PARAMETER ::     xnos = 1.6e7
!      REAL    , PARAMETER ::     xnoh = 2.0e5
!      REAL    , PARAMETER ::     xnog = 4.0e6
!      REAL    , PARAMETER ::     rhohail = 917.
!      REAL    , PARAMETER ::     rhograul = 400.
!+---+-----------------------------------------------------------------+

!JJS 1/3/2008     ^^^^^

CONTAINS

!--------------------------------------------------------------------
!  NASA/GSFC GCE
!  Tao et al, 2001, Meteo. & Atmos. Phy., 97-137
!--------------------------------------------------------------------
  SUBROUTINE gsfcgce_4ice_nuwrf(   th                               &
                       ,qv, ql                                      &
                       ,qr, qi                                      &
                       ,qs, qh                                      & ! 4ice
                       ,rho, pii, p, dt_in, z                       &
                       ,ht, dz8w, grav, w                           &
                       ,rhowater, rhosnow                           &
                       ,itimestep, xland, dx                        &
                       ,ids,ide, jds,jde, kds,kde                   & ! domain dims
                       ,ims,ime, jms,jme, kms,kme                   & ! memory dims
                       ,its,ite, jts,jte, kts,kte                   & ! tile   dims
                       ,rainnc, rainncv                             &
                       ,snownc, snowncv, sr                         &
                       ,graupelnc, graupelncv                       &
                       ,refl_10cm, diagflag, do_radar_ref           &
                       ,hailnc, hailncv                             & !Hail
                       ,f_qg, qg                                    &
                       ,physc, physe, physd, physs, physm, physf    &
                       ,acphysc, acphyse, acphysd, acphyss, acphysm, acphysf &
                       ,re_cloud_gsfc, re_rain_gsfc, re_ice_gsfc    &
                       ,re_snow_gsfc, re_graupel_gsfc, re_hail_gsfc & ! cloud effective radius
                       ,preci3d, precs3d, precg3d, prech3d, precr3d &
#if ( WRF_CHEM == 1)
!JJS 20110525     vvvvv
                       ,aero, icn_diag, nc_diag, gid               &
!JJS 20110525     ^^^^^
! EMK
                       ,chem_opt                                   &
                       ,gsfcgce_gocart_coupling                    &
#endif
!NUWRF END
                                                                   )


!-------------------------------------------------------------------
  IMPLICIT NONE
!-------------------------------------------------------------------
!
! JJS 2/15/2005
!
  INTEGER,      INTENT(IN   )    ::   ids,ide, jds,jde, kds,kde , &
                                      ims,ime, jms,jme, kms,kme , &
                                      its,ite, jts,jte, kts,kte 
  INTEGER,      INTENT(IN   )    ::   itimestep
  
  REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
        INTENT(INOUT) ::                                          &
                                                              th, &
                                                              qv, &
                                                              ql, &
                                                              qr, &
                                                              qi, &
                                                              qs, &
                                                              qg, &
                                                              qh

!NUWRF BEGIN
#if ( WRF_CHEM == 1)
! JJS 20110525 vvvvv
! for inline Gocart coupling
  INTEGER, PARAMETER :: num_go = 14  ! number of the gocart aerosol species
  REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_go), intent(in) :: aero
  REAL, DIMENSION( ims:ime, kms:kme, jms:jme), intent(out) :: icn_diag, nc_diag
  INTEGER,      INTENT(IN   )    ::   gid
! JJS 20110525 ^^^^^
  integer,intent(in) :: chem_opt ! EMK
  integer,intent(in) :: gsfcgce_gocart_coupling ! EMK
#endif
!NUWRF END

!
  REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
        INTENT(IN   ) ::                                          &
                                                             rho, &
                                                             pii, &
                                                               p, &
                                                            dz8w, &
                                                               z, &
                                                               w

  REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
        INTENT(INOUT) ::                                          &
                                                           physc, &
                                                           physe, &
                                                           physd, &
                                                           physs, &
                                                           physm, &
                                                           physf, &
                                                           acphysc, &
                                                           acphyse, &
                                                           acphysd, &
                                                           acphyss, &
                                                           acphysm, &
                                                           acphysf, &
                                                         preci3d, &
                                                         precs3d, &
                                                         precg3d, &
                                                         prech3d, &
                                                         precr3d

  REAL, DIMENSION( ims:ime , jms:jme ),                           &
        INTENT(INOUT) ::                               rainnc,    &
                                                       rainncv,   &
                                                       snownc,    &   
                                                       snowncv,   &
                                                       sr,        &
                                                       graupelnc, &
                                                       graupelncv,&
                                                       hailnc, &
                                                       hailncv

!JJS 20140225   for calculation of effective radius of cloud species
  REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN)   :: XLAND
  REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
        INTENT(INOUT) ::                               re_cloud_gsfc, &
                                                       re_rain_gsfc,  &
                                                       re_ice_gsfc,   &
                                                       re_snow_gsfc,  &
                                                       re_graupel_gsfc, &
                                                       re_hail_gsfc
!JJS 20140225  ^^^^^

!+---+-----------------------------------------------------------------+
  REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT)::           &  ! GT
                                                       refl_10cm
  LOGICAL, OPTIONAL, INTENT(IN) :: diagflag
  INTEGER, OPTIONAL, INTENT(IN) :: do_radar_ref
!+---+-----------------------------------------------------------------+

  REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) ::       ht

  REAL, INTENT(IN   ) ::                                   dt_in, &
                                                            grav, &
                                                        rhowater, &
                                                         rhosnow, &
                                                              dx 

  LOGICAL, INTENT(IN), OPTIONAL :: F_QG

!  LOCAL VAR

!
  INTEGER ::  itaobraun, istatmin, new_ice_sat, id
  INTEGER ::  improve

  INTEGER :: i, j, k, ip, ii, ic
  INTEGER :: iskip, ih, icount, ibud, i24h 
  REAL    :: hour
  REAL    :: dth, dqv, dqrest, dqall, dqall1, rhotot, a1, a2 
 
  REAL, DIMENSION(CHUNK, kms:kme):: th2d, qv2d, ql2d, qr2d
  REAL, DIMENSION(CHUNK, kms:kme):: qi2d, qs2d, qg2d, qh2d
  REAL, DIMENSION(CHUNK, kms:kme):: rho2d, pii2d, p2d, w2d
  REAL, DIMENSION(CHUNK, kms:kme):: refc2d, refr2d, refi2d
  REAL, DIMENSION(CHUNK, kms:kme):: refs2d, refg2d, refh2d
  REAL, DIMENSION(CHUNK, kms:kme):: physc2d, physe2d, physd2d
  REAL, DIMENSION(CHUNK, kms:kme):: physs2d, physm2d, physf2d
  REAL, DIMENSION(CHUNK, kms:kme):: acphysc2d, acphyse2d, acphysd2d
  REAL, DIMENSION(CHUNK, kms:kme):: acphyss2d, acphysm2d, acphysf2d
  REAL, DIMENSION(CHUNK) :: xland1d
  REAL, DIMENSION(CHUNK, kms:kme):: refl_10cm2d
#if ( WRF_CHEM == 1)
  REAL, DIMENSION(CHUNK, kms:kme, num_go):: aero3d
  REAL, DIMENSION(CHUNK, kms:kme):: icn_diag2d, nc_diag2d
#endif

!-----------------------------------------------------------------------
!WRF radar reflectivity initialization only need to run once

      INTEGER:: NCALL=0

!-----------------------------------------------------------------------


! itaobraun: 0 for Tao's constantis, 1 for Braun's constants
!c        if ( itaobraun.eq.1 ) --> betah=0.5*beta=-.46*0.5=-0.23;   cn0=1.e-6
!c        if ( itaobraun.eq.0 ) --> betah=0.5*beta=-.6*0.5=-0.30;    cn0=1.e-8
   itaobraun = 0

! Use Steve's new improvement   9/18/2009

    improve = 8

!c  new_ice_sat = 0, 1, 2, or 3 
    new_ice_sat = 9

!c istatmin
    istatmin = 180

!c id = 0  without in-line staticstics
!c id = 1  with in-line staticstics
    id = 0

!c ibud = 0 no calculation of dth, dqv, dqrest and dqall
!c ibud = 1 yes
    ibud = 0

!c  set up constants used internally in GCE

   call consat_s ( itaobraun)

! calculte fallflux and precipiation in MKS system

   call fall_flux(    dt_in,ql, qr, qi, qs, qg, qh, p,        &
                      rho, th, pii, z, dz8w, ht, rainnc,      &
                      rainncv, grav,itimestep,                &
                      preci3d, precs3d, precg3d, prech3d, precr3d,     &
                      snownc, snowncv, sr,                    &
                      graupelnc, graupelncv,                  &
                      hailnc, hailncv,                        &
                      vgc, vgc2,vhc,bhq,                      &
                      improve,                                &
                      ims,ime, jms,jme, kms,kme,              & ! memory dims
                      its,ite, jts,jte, kts,kte               ) ! tile   dims
!-----------------------------------------------------------------------
      ! EMK NUWRF...Moved this WRF radar reflectivity initialization to after
      ! fall_flux, as the rhohail and rhograul variables are set in that
      ! subroutine.

      IF (NCALL .EQ. 0) THEN
!..Set these variables needed for computing radar reflectivity.  These
!.. get used within radar_init to create other variables used in the
!.. radar module.
         xam_r = 3.14159*rhowater/6.
         xbm_r = 3.
         xmu_r = 0.
         xam_s = 3.14159*rhosnow/6.
         xbm_s = 3.
         xmu_s = 0.
         xam_g = 3.14159*rhograul/6.
         xbm_g = 3.
         xmu_g = 0.

         call radar_init
         NCALL = 1
      ENDIF
!+---+-----------------------------------------------------------------+

!c Negative values correction

!   iskip = 1
! 
!   if (iskip.eq.0) then
!      call negcor(qv,rho,dz8w,ims,ime,jms,jme,kms,kme, &
!                           itimestep,1,             &
!                           its,ite,jts,jte,kts,kte)
!      call negcor(ql,rho,dz8w,ims,ime,jms,jme,kms,kme, &
!                           itimestep,2,             &
!                           its,ite,jts,jte,kts,kte)
!      call negcor(qr,rho,dz8w,ims,ime,jms,jme,kms,kme, &
!                           itimestep,3,             &
!                           its,ite,jts,jte,kts,kte)
!      call negcor(qi,rho,dz8w,ims,ime,jms,jme,kms,kme, &
!                           itimestep,4,             &
!                           its,ite,jts,jte,kts,kte)
!      call negcor(qs,rho,dz8w,ims,ime,jms,jme,kms,kme, &
!                           itimestep,5,             &
!                           its,ite,jts,jte,kts,kte)
!      call negcor(qg,rho,dz8w,ims,ime,jms,jme,kms,kme, &
!                           itimestep,6,             &
!                           its,ite,jts,jte,kts,kte)
!!   else if (mod(itimestep,i24h).eq.1) then
!!      print *,'no neg correction in mp at timestep=',itimestep
!   endif ! iskip

!c microphysics in GCE

!$OMP PARALLEL DO &
!$OMP PRIVATE ( ic, j, ii, i, k ) &
!$OMP PRIVATE ( th2d, qv2d, ql2d, qr2d ) &
!$OMP PRIVATE ( qi2d, qs2d, qg2d, qh2d ) &
!$OMP PRIVATE ( rho2d, pii2d, p2d, w2d ) &
!$OMP PRIVATE ( refc2d, refr2d, refi2d, refs2d, refg2d, refh2d ) &
!$OMP PRIVATE ( physc2d, physe2d, physd2d, physs2d, physm2d, physf2d ) &
!$OMP PRIVATE ( acphysc2d, acphyse2d, acphysd2d, acphyss2d, acphysm2d, acphysf2d ) &
!$OMP PRIVATE ( xland1d, refl_10cm2d ) &
#if ( WRF_CHEM == 1)
!$OMP PRIVATE ( aero3d, icn_diag2d, nc_diag2d) &
#endif
!$OMP SCHEDULE(dynamic,1)
      DO ip = 1,((1+(ite-its+1)/CHUNK)*CHUNK)*(jte-jts+1),CHUNK ! i-dim contains '(1+(ite-its+1)/CHUNK)' blocks of size 'CHUNK'
       j  = jts+(ip-1)/((1+(ite-its+1)/CHUNK)*CHUNK)
       IF ( j .ge. jts .and. j .le. jte ) THEN ! j: [jts, jte]
        ii = its+mod((ip-1),((1+(ite-its+1)/CHUNK)*CHUNK)) ! ii: [its, ((1+(ite-its+1)/CHUNK)*CHUNK)]

        DO ic=1,min(CHUNK,ite-ii+1)
          i = ii+ic -1
          xland1d(ic) = xland(i,j)
        ENDDO

         do k = kts, kte
          DO ic=1,min(CHUNK,ite-ii+1) 
            i = ii+ic -1
            th2d(ic,k) = th(i,k,j)
            qv2d(ic,k) = qv(i,k,j)
            ql2d(ic,k) = ql(i,k,j)
            qr2d(ic,k) = qr(i,k,j)
            qi2d(ic,k) = qi(i,k,j)
            qs2d(ic,k) = qs(i,k,j)
            qg2d(ic,k) = qg(i,k,j)
            qh2d(ic,k) = qh(i,k,j)
            rho2d(ic,k) = rho(i,k,j)
            pii2d(ic,k) = pii(i,k,j)
            p2d(ic,k) = p(i,k,j)
            w2d(ic,k) = w(i,k,j)
            refl_10cm2d(ic,k)=refl_10cm(i,k,j)
            refc2d(ic,k)=re_cloud_gsfc(i,k,j)
            refr2d(ic,k)=re_rain_gsfc(i,k,j)
            refi2d(ic,k)=re_ice_gsfc(i,k,j)
            refs2d(ic,k)=re_snow_gsfc(i,k,j)
            refg2d(ic,k)=re_graupel_gsfc(i,k,j)
            refh2d(ic,k)=re_hail_gsfc(i,k,j)
            physc2d(ic,k)=physc(i,k,j)
            physe2d(ic,k)=physe(i,k,j)
            physd2d(ic,k)=physd(i,k,j)
            physs2d(ic,k)=physs(i,k,j)
            physm2d(ic,k)=physm(i,k,j)
            physf2d(ic,k)=physf(i,k,j)
            acphysc2d(ic,k)=acphysc(i,k,j)
            acphyse2d(ic,k)=acphyse(i,k,j)
            acphysd2d(ic,k)=acphysd(i,k,j)
            acphyss2d(ic,k)=acphyss(i,k,j)
            acphysm2d(ic,k)=acphysm(i,k,j)
            acphysf2d(ic,k)=acphysf(i,k,j)
#if ( WRF_CHEM == 1)
            aero3d(ic,k,:)=aero(i,k,j,:)
#endif
          ENDDO
         enddo

   IF ( min(CHUNK,ite-ii+1) .gt. 0 ) THEN
   call saticel_s( dt_in, dx, itaobraun, istatmin,               &
                   new_ice_sat, id, improve,                     &
                   th2d, qv2d, ql2d, qr2d,                       &
                   qi2d, qs2d, qg2d, qh2d,                       &
                   rho2d, pii2d, p2d, w2d,                       & 
                   itimestep, xland1d,                           &
                   refl_10cm2d, diagflag, do_radar_ref,         & ! GT added for reflectivity calcs
                   ids,ide, jds,jde, kds,kde,                    & ! domain dims
                   ims,ime, jms,jme, kms,kme,                    & ! memory dims
                   its,ite, jts,jte, kts,kte,                    & ! tile   dims
!NUWRF BEGIN
                   refc2d, refr2d, refi2d, refs2d, refg2d, refh2d,  & ! cloud effective radius
                   physc2d, physe2d, physd2d, physs2d, physm2d, physf2d,  &
                   acphysc2d, acphyse2d, acphysd2d, acphyss2d, acphysm2d, acphysf2d  &

#if ( WRF_CHEM == 1)
!JJS 20110525     vvvvv
                   ,aero3d, icn_diag2d, nc_diag2d, gid,          &
!JJS 20110525     ^^^^^
!EMK
                   chem_opt,                                     &
                   gsfcgce_gocart_coupling                       &
#endif   
                  ,ii, j, min(CHUNK,ite-ii+1))
!NUWRF END
   ENDIF

         do k = kts, kte
          DO ic=1,min(CHUNK,ite-ii+1)
            i = ii+ic -1
            th(i,k,j) = th2d(ic,k)
            qv(i,k,j) = qv2d(ic,k)
            ql(i,k,j) = ql2d(ic,k)
            qr(i,k,j) = qr2d(ic,k)
            qi(i,k,j) = qi2d(ic,k)
            qs(i,k,j) = qs2d(ic,k)
            qg(i,k,j) = qg2d(ic,k)
            qh(i,k,j) = qh2d(ic,k)
            re_cloud_gsfc(i,k,j)=refc2d(ic,k)
            re_rain_gsfc(i,k,j)=refr2d(ic,k)
            re_ice_gsfc(i,k,j)=refi2d(ic,k)
            re_snow_gsfc(i,k,j)=refs2d(ic,k)
            re_graupel_gsfc(i,k,j)=refg2d(ic,k)
            re_hail_gsfc(i,k,j)=refh2d(ic,k)
            refl_10cm(i,k,j)=refl_10cm2d(ic,k)
            physc(i,k,j)=physc2d(ic,k)
            physe(i,k,j)=physe2d(ic,k)
            physd(i,k,j)=physd2d(ic,k)
            physs(i,k,j)=physs2d(ic,k)
            physm(i,k,j)=physm2d(ic,k)
            physf(i,k,j)=physf2d(ic,k)
            acphysc(i,k,j)=acphysc2d(ic,k)
            acphyse(i,k,j)=acphyse2d(ic,k)
            acphysd(i,k,j)=acphysd2d(ic,k)
            acphyss(i,k,j)=acphyss2d(ic,k)
            acphysm(i,k,j)=acphysm2d(ic,k)
            acphysf(i,k,j)=acphysf2d(ic,k)
#if ( WRF_CHEM == 1)
            icn_diag(i,k,j)=icn_diag2d(ic,k)
            nc_diag(i,k,j)=nc_diag2d(ic,k)
#endif
          ENDDO
         enddo

         ENDIF
      ENDDO ! ip_loop

  END SUBROUTINE gsfcgce_4ice_nuwrf

  SUBROUTINE fall_flux ( dt, ql, qr, qi, qs, qg, qh, p,       &
                      rho, th, pi_mks, z, dz8w, topo, rainnc, &
                      rainncv, grav, itimestep,               &
                      preci3d, precs3d, precg3d, prech3d, precr3d,     &
                      snownc, snowncv, sr,                    &
                      graupelnc, graupelncv,                  &
                      hailnc, hailncv,                        &
                      vgc, vgc2, vhc, bhq,                    &
                      improve,                                &
                      ims,ime, jms,jme, kms,kme,              & ! memory dims
                      its,ite, jts,jte, kts,kte               ) ! tile   dims
!-----------------------------------------------------------------------
! adopted from Jiun-Dar Chern's codes for Purdue Regional Model
! adopted by Jainn J. Shi, 6/10/2005
! modified by Goddard 7/24/2010
! modified by Tao 11/12/2010
!-----------------------------------------------------------------------

  IMPLICIT NONE
  INTEGER, INTENT(IN   )               :: improve,            &
                                          ims,ime, jms,jme, kms,kme,  &
                                          its,ite, jts,jte, kts,kte 
  INTEGER, INTENT(IN   )               :: itimestep
  REAL,    DIMENSION( ims:ime , kms:kme , jms:jme ),                  &
           INTENT(INOUT)               :: ql, qr, qi, qs, qg, qh      
  REAL,    DIMENSION( ims:ime , kms:kme , jms:jme ),                  &
           INTENT(IN)                  :: th, pi_mks      

  REAL,    DIMENSION( ims:ime , jms:jme ),                            &
           INTENT(INOUT)               :: rainnc, rainncv,            &
                                          snownc, snowncv, sr,        &
                                          graupelnc, graupelncv,      &
                                          hailnc, hailncv
  REAL,    DIMENSION( ims:ime , kms:kme , jms:jme ),                  &
           INTENT(IN   )               :: rho, z, dz8w, p     

  REAL,    INTENT(IN   )               :: dt, grav, vgc, vgc2, vhc, bhq


  REAL,    DIMENSION( ims:ime , jms:jme ),                            &
           INTENT(IN   )               :: topo   
  REAL,    DIMENSION( ims:ime , kms:kme , jms:jme ),                  &
           INTENT(OUT)               :: preci3d, precs3d, precg3d, prech3d, precr3d

! temperary vars
 
  REAL,    DIMENSION( kts:kte )           :: fv
  REAL                                    :: tmp1, term0
  REAL                                :: pptrain, pptsnow,        &
                                         pptgraul, pptice, ppthail
  REAL :: qrz, qiz
  REAL,    DIMENSION( kts:kte )       :: qcz, qsz, qgz, qhz,  &
                                         zz, dzw, prez, rhoz,      &
                                         orhoz,r00
  REAL,    DIMENSION( kts:kte )       :: csed, rsed, ised, ssed, gsed, hsed

  REAL,    DIMENSION( kts:kte )       :: thz, piz

   INTEGER                    :: k, i, j
!

  REAL, DIMENSION( kts:kte )    :: vtr, vts, vtg, vth, vti

  REAL                          :: dtb, pi, consta, constc, gambp4,    &
                                   gamdp4, gam4pt5, gam4bbar

! New local variable
  REAL                          :: y1, y2, vr, vs, vg
  REAL                          :: vgcr, vgcr2, vscf,   &
                                   vhcr, vhcr2
  REAL                          :: tair, tairc, fexp
  REAL                          :: ftns, ftnsQ, ftng, ftngQ
  REAL                          :: const_vt, const_d, const_m, bb1, bb2
  REAL,    DIMENSION(7)         :: aice, vice
  REAL                          :: ftns0, ftng0
  REAL                          :: fros, fros0
  REAL                          :: qhz2,qgz2

!  DATA tslopes/0./, tslopeg/0./
!  DATA const_vt//, const_d//, const_m//
  DATA aice/1.e-6, 1.e-5, 1.e-4, 1.e-3, 0.01, 0.1, 1./  ! g/m**3
  DATA vice/5.,15.,30.,35.,40.,45.,50./  ! cm/s
  DATA ftns/1./, ftng/1./


!  will be defined later using consat values 
   REAL     ::     rhowater 
   REAL     ::     rhosnow 
!JJS 20140116  These variables are declared in the beginning of the module.
!JJS 20140116  No need to declared again here.
!   REAL     ::     xnor
!   REAL     ::     xnos
!   REAL     ::     xnoh, rhohail 
!   REAL     ::     xnog, rhograul
!

   REAL    , PARAMETER ::                              &
!             constb = 0.8, constd = 0.25, o6 = 1./6.,           &
             constb = 0.8, constd = 0.11, o6 = 1./6.,            &
             cdrag = 0.6
  REAL    , PARAMETER ::     abar = 19.3, bbar = 0.37,           &
                                      p0 = 1.0e5
  REAL    , PARAMETER ::     rhoe_s = 1.29

! for terminal velocity flux
  INTEGER                       :: min_q, max_q
  REAL                          :: t_del_tv, del_tv, flux, fluxin, fluxout
  LOGICAL                       :: notlast

!-----------------------------------------------------------------------
!  This program calculates precipitation fluxes due to terminal velocities.
!-----------------------------------------------------------------------

   dtb=dt
   pi=acos(-1.)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      xnor = tnw*1.0e8
      rhowater = roqr*1000.
      xnos = tns*1.0e8             ! Consistent with ConSat
      rhosnow = roqs*1000.

! tng and roqg are assigned with hail numbers in consat if (ihail.eq.1)
      xnog = tng*1.0e8
      rhograul = roqg*1000.
      xnoh = tnh*1.0e8      
      rhohail = roqh*1000.

   consta=2115.0*0.01**(1-constb)
!   constc=152.93*0.01**(1-constd)
   constc=78.63*0.01**(1-constd)

!  Gamma function
   gambp4=gammagce(constb+4.)
   gamdp4=gammagce(constd+4.)
   gam4pt5=gammagce(4.5)
   gam4bbar=gammagce(4.+bbar)
!
!      cmin=1.e-10
!
!***********************************************************************
! Calculate precipitation fluxes due to terminal velocities.
!***********************************************************************
!
!- Calculate termianl velocity (vt?)  of precipitation q?z
!- Find maximum vt? to determine the small delta t

!$OMP PARALLEL DO &
!$OMP FIRSTPRIVATE(dtb, pi, rhowater, rhosnow, gambp4) &
!$OMP FIRSTPRIVATE(consta, constc, gamdp4, gam4pt5, gam4bbar) &
!$OMP PRIVATE(i,k,fv,tmp1,term0,pptrain, pptsnow,pptgraul, pptice, ppthail) &
!$OMP PRIVATE(qcz, qrz, qiz, qsz, qgz, qhz, zz, dzw, prez, rhoz, orhoz,r00) &
!$OMP PRIVATE(csed, rsed, ised, ssed, gsed, hsed) &
!$OMP PRIVATE(thz, piz) &
!$OMP PRIVATE(vtr, vts, vtg, vth, vti) &
!$OMP PRIVATE(y1, y2, vr, vs, vg) &
!$OMP PRIVATE(vgcr, vgcr2, vscf, vhcr, vhcr2) &
!$OMP PRIVATE(tair, tairc, fexp) &
!$OMP PRIVATE(ftns, ftnsQ, ftng, ftngQ) &
!$OMP PRIVATE(const_vt, const_d, const_m, bb1, bb2) &
!$OMP PRIVATE(aice, vice, ftns0, ftng0, fros, fros0, qhz2,qgz2) &
!$OMP PRIVATE(min_q, max_q) &
!$OMP PRIVATE(t_del_tv, del_tv, flux, fluxin, fluxout) &
!$OMP PRIVATE(notlast) &
!$OMP SCHEDULE(dynamic)

 j_loop:  do j = jts, jte
 i_loop:  do i = its, ite

   do k = kts, kte
      preci3d(i,k,j)=0.
      precs3d(i,k,j)=0.
      precg3d(i,k,j)=0.
      prech3d(i,k,j)=0.
      precr3d(i,k,j)=0.
      ised(k)=0.
      ssed(k)=0.
      gsed(k)=0.
      hsed(k)=0.
      rsed(k)=0.
   end do

   pptrain = 0.
   pptsnow = 0.
   pptgraul = 0.
   ppthail = 0.
   pptice  = 0.

   ! in MKS system
   do k = kts, kte
      qcz(k)=ql(i,k,j)             !Di
      qsz(k)=qs(i,k,j)
      qhz(k)=qh(i,k,j)
      rhoz(k)=rho(i,k,j)
      r00(k)=rhoz(k)*0.001         !rho in cgs
      thz(k)=th(i,k,j)
      piz(k)=pi_mks(i,k,j)
      orhoz(k)=1./rhoz(k)
      prez(k)=p(i,k,j)
      fv(k)=sqrt(rhoe_s/rhoz(k))
!      fv(k)=sqrt(rho(i,1,j)/rhoz(k))
      zz(k)=z(i,k,j)
      dzw(k)=dz8w(i,k,j)
   enddo !k

      DO k = kts, kte
         qgz(k)=qg(i,k,j)
      ENDDO

!
!-- rain
!
    t_del_tv=0.
    del_tv=dtb
    notlast=.true.
    DO while (notlast)
!
      min_q=kte
      max_q=kts-1
!


      do k=kts,kte-1

         vtr(k)=0.
         qrz=qr(i,k,j)
         if (qrz .gt. cmin) then
            min_q=min0(min_q,k)
            max_q=max0(max_q,k)

! old codes from Chern's in MKS
!            min_q=min0(min_q,k)
!            max_q=max0(max_q,k)
            tmp1=sqrt(pi*rhowater*xnor/rhoz(k)/qrz)
            tmp1=sqrt(tmp1)
            vtr(k)=consta*gambp4*fv(k)/tmp1**constb
            vtr(k)=vtr(k)/6.
! new codes from Steve's in cgs
            tair=thz(k)*piz(k)
            tairc=tair-t0
            y1=qrz  ! rhoz(k) need to be in CGS
            y2=qcz(k)  ! rhoz(k) need to be in CGS
            call vqrqi(1,r00(k),fv(k),y1,y2,tair,vtr(k))     !Di
            vtr(k)=vtr(k) * 0.01 ! convert back to MKS             !Di

           if (.not. vtr(k) .gt. 0.0) cycle ! EMK NUWRF Bug fix

            if (k .eq. 1) then
               del_tv=amin1(del_tv,0.9*(zz(k)-topo(i,j))/vtr(k))
            else
               del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtr(k))
            endif
          endif
      enddo !do K

      if (max_q .ge. min_q) then
!
!- Check if the summation of the small delta t >=  big delta t
!             (t_del_tv)          (del_tv)             (dtb)

         t_del_tv=t_del_tv+del_tv
!
         if ( t_del_tv .ge. dtb ) then
              notlast=.false.
              del_tv=dtb+del_tv-t_del_tv
         endif

! use small delta t to calculate the qrz flux
! termi is the qrz flux pass in the grid box through the upper boundary
! termo is the qrz flux pass out the grid box through the lower boundary
!
         fluxin=0.
         do k=max_q,min_q,-1
            qrz=qr(i,k,j)
            fluxout=rhoz(k)*vtr(k)*qrz
            flux=(fluxin-fluxout)/rhoz(k)/dzw(k)
            qrz=qrz+del_tv*flux
            qrz=amax1(0.,qrz)
            qr(i,k,j)=qrz
            fluxin=fluxout
            rsed(k)=rsed(k)+fluxin
         enddo
         if (min_q .eq. 1) then
            pptrain=pptrain+fluxin*del_tv
         else
            qrz=qr(i,min_q-1,j)
            qrz=qrz+del_tv*  &
                          fluxin/rhoz(min_q-1)/dzw(min_q-1)
            qrz=amax1(0.,qrz)         !Di 10/23/2012
            qr(i,min_q-1,j)=qrz
         endif
!
      else
         notlast=.false.
      endif
    ENDDO ! DO WHILE

!
!-- snow
!
    t_del_tv=0.
    del_tv=dtb
    notlast=.true.

    DO while (notlast)
!
      min_q=kte
      max_q=kts-1

!
      do k=kts,kte-1
         vts(k)=0.

         if (qsz(k) .gt. cmin) then
            min_q=min0(min_q,k)
            max_q=max0(max_q,k)

! old codes from Chern's in MKS
            tmp1=sqrt(pi*rhosnow*xnos/rhoz(k)/qsz(k))
            tmp1=sqrt(tmp1)
            vts(k)=constc*gamdp4*fv(k)/tmp1**constd
            vts(k)=vts(k)/6.

! new codes from Steve's in cgs
            y1 = qsz(k)             
            vscf=vsc*fv(k)

            ftns=1.
            ftns0=1.
            tair=thz(k)*piz(k)
            tairc=tair-t0

            qhz2=qhz(k)
            qgz2=qgz(k)
            if (k .lt. kte-2 .and. tairc .ge. -5) then
              qhz2=qhz(k+1) 
              qgz2=qgz(k+1)
            endif
            call sgmap(1,qsz(k),qgz(k),qgz2,qhz(k),qhz2,r00(k),tairc,ftns0)                   !snow intercept
            ftns=ftns0**bsq
            fros=1.
            call sgmap(3,qsz(k),qgz(k),qgz2,qhz(k),qhz2,r00(k),tairc,fros0)  !snow density
            fros=fros0**bsq
            vts(k)=max(vscf*(r00(k)*y1)**bsq/ftns/fros,0.e0)
!            vts(k)=max(vscf*(r00*y1)**bsq/ftns, 0.0)
!            ! bs, bsq, vscf are defined in new consat_s
            vts(k)=vts(k) * 0.01  ! convert back to MKS  

            if (k .eq. 1) then
               del_tv=amin1(del_tv,0.9*(zz(k)-topo(i,j))/vts(k))
            else
               del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vts(k))
            endif !k
         endif !cmin
      enddo  ! do k

      if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >=  big delta t
!             (t_del_tv)          (del_tv)             (dtb)

         t_del_tv=t_del_tv+del_tv

         if ( t_del_tv .ge. dtb ) then
              notlast=.false.
              del_tv=dtb+del_tv-t_del_tv
         endif

! use small delta t to calculate the qsz flux
! termi is the qsz flux pass in the grid box through the upper boundary
! termo is the qsz flux pass out the grid box through the lower boundary
!
         fluxin=0.
         do k=max_q,min_q,-1
            fluxout=rhoz(k)*vts(k)*qsz(k)
            flux=(fluxin-fluxout)/rhoz(k)/dzw(k)
            qsz(k)=qsz(k)+del_tv*flux
            qsz(k)=amax1(0.,qsz(k))
            qs(i,k,j)=qsz(k)
            fluxin=fluxout
            ssed(k)=ssed(k)+fluxin
         enddo
         if (min_q .eq. 1) then
            pptsnow=pptsnow+fluxin*del_tv
         else
            qsz(min_q-1)=qsz(min_q-1)+del_tv*  &
                         fluxin/rhoz(min_q-1)/dzw(min_q-1)
            qsz(min_q-1)=amax1(0.,qsz(min_q-1))         !Di 10/23/2012
            qs(i,min_q-1,j)=qsz(min_q-1)
         endif
!
      else
         notlast=.false.
      endif

    ENDDO

!
!--- graupel
!

    t_del_tv=0.
    del_tv=dtb
    notlast=.true.
!
    DO while (notlast)
!
      min_q=kte
      max_q=kts-1
!
      do k=kts,kte-1
          vtg(k)=0.

         if (qgz(k) .gt. cmin) then
            min_q=min0(min_q,k)
            max_q=max0(max_q,k)

! for graupel, based on RH (1984)
! new codes from Steve's in cgs
!                 y1=rhoz(k) * 0.001 * qgz(k)    ! rhoz(k) need to be in CGS
                 y1 = qgz(k)             
                 vgcr=vgc*fv(k)
                 vgcr2=vgc2*fv(k)
                 ftng=1.
                 ftng0=1.
                 tair=thz(k)*piz(k)
                 tairc=tair-t0
                 qhz2=qhz(k)
                 qgz2=qgz(k)
                 if (k .lt. kte-2 .and. tairc .ge. -5) then
                    qhz2=qhz(k+1)
                    qgz2=qgz(k+1)
                 endif
                 call sgmap(2,qsz(k),qgz(k),qgz2,qhz(k),qhz2,r00(k),tairc,ftng0) !ftng0 is graupel intercept
                 ftng=ftng0**bgq
                 vtg(k)=amax1(vgcr*(r00(k)*y1)**bgq/ftng, 0.0)
                                       ! bg, vgcr, bgq are defined in new consat_s
                 vtg(k)=vtg(k) * 0.01  ! convert back to MKS
                 if (y1.gt.qrog2)then                              !Di
                    ftng=ftng0**bgq2                                                !Di
                    vtg(k)=amax1(vgcr2*(r00(k)*y1)**bgq2/ftng, 0.0)                    !Di
                                       ! bg, vgcr, bgq are defined in new consat_s  !Di
                    vtg(k)=vtg(k) * 0.01  ! convert back to MKS
                 endif 

            if (k .eq. 1) then
               del_tv=amin1(del_tv,0.9*(zz(k)-topo(i,j))/vtg(k))
            else
               del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtg(k))
            endif 
!
         endif !qgz
      enddo !k

      if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >=  big delta t
!             (t_del_tv)          (del_tv)             (dtb)

         t_del_tv=t_del_tv+del_tv

         if ( t_del_tv .ge. dtb ) then
              notlast=.false.
              del_tv=dtb+del_tv-t_del_tv
         endif

! use small delta t to calculate the qgz flux
! termi is the qgz flux pass in the grid box through the upper boundary
! termo is the qgz flux pass out the grid box through the lower boundary
!
         fluxin=0.
         do k=max_q,min_q,-1
            fluxout=rhoz(k)*vtg(k)*qgz(k)
            flux=(fluxin-fluxout)/rhoz(k)/dzw(k)
            qgz(k)=qgz(k)+del_tv*flux
            qgz(k)=amax1(0.,qgz(k))
            qg(i,k,j)=qgz(k)
            fluxin=fluxout
            gsed(k)=gsed(k)+fluxin
         enddo
         if (min_q .eq. 1) then
            pptgraul=pptgraul+fluxin*del_tv
         else
            qgz(min_q-1)=qgz(min_q-1)+del_tv*  &
                         fluxin/rhoz(min_q-1)/dzw(min_q-1)
            qgz(min_q-1)=amax1(0.,qgz(min_q-1))         !Di 10/23/2012
            qg(i,min_q-1,j)=qgz(min_q-1)
         endif
!
      else
         notlast=.false.
      endif
!
    ENDDO
!
!--- hail
!

    t_del_tv=0.
    del_tv=dtb
    notlast=.true.
!
    DO while (notlast)
!
      min_q=kte
      max_q=kts-1

      do k=kts,kte-1
          vth(k)=0.

         if (qhz(k) .gt. cmin) then
            min_q=min0(min_q,k)
            max_q=max0(max_q,k)

! new codes from Steve's in cgs
                 y1 = qhz(k)
                 vhcr=vhc/sqrt(r00(k))                                 !Di              
                 vth(k)=amax1(vhcr*(y1*r00(k))**bhq, 0.e0)             !Di
                 vth(k)=vth(k) * 0.01  ! convert back to MKS

            if (k .eq. 1) then
               del_tv=amin1(del_tv,0.9*(zz(k)-topo(i,j))/vth(k))
            else
               del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vth(k))
            endif
!
         endif !qhz
      enddo !k

      if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >=  big delta t
!             (t_del_tv)          (del_tv)             (dtb)

         t_del_tv=t_del_tv+del_tv

         if ( t_del_tv .ge. dtb ) then
              notlast=.false.
              del_tv=dtb+del_tv-t_del_tv
         endif

! use small delta t to calculate the qhz flux
! termi is the qhz flux pass in the grid box through the upper boundary
! termo is the qhz flux pass out the grid box through the lower boundary
!
         fluxin=0.
         do k=max_q,min_q,-1
            fluxout=rhoz(k)*vth(k)*qhz(k)
            flux=(fluxin-fluxout)/rhoz(k)/dzw(k)
            qhz(k)=qhz(k)+del_tv*flux
            qhz(k)=amax1(0.,qhz(k))
            qh(i,k,j)=qhz(k)
            fluxin=fluxout
            hsed(k)=hsed(k)+fluxin
         enddo
         if (min_q .eq. 1) then
            ppthail=ppthail+fluxin*del_tv
         else
            qhz(min_q-1)=qhz(min_q-1)+del_tv*  &
                         fluxin/rhoz(min_q-1)/dzw(min_q-1)
            qhz(min_q-1)=amax1(0.,qhz(min_q-1))         !Di 10/23/2012
            qh(i,min_q-1,j)=qhz(min_q-1)
         endif
!
      else
         notlast=.false.
      endif
!
    ENDDO

!
!-- cloud ice  (03/21/02) follow Vaughan T.J. Phillips at GFDL
!

    t_del_tv=0.
    del_tv=dtb
    notlast=.true.
!
    DO while (notlast)
!
      min_q=kte
      max_q=kts-1
!
      do k=kts,kte-1
         qiz=qi(i,k,j)
         vti(k)=0.
         if (qiz .gt. cmin) then
            min_q=min0(min_q,k)
            max_q=max0(max_q,k)

! new codes from Steve's in cgs.
         vti(k)=0.
         y1=rhoz(k) * 1000. * qiz    ! y1 in g/m**3
         if (y1 .ge. 1.e-6) then
            y1=qiz
            y2=qcz(k)
             tair=thz(k)*piz(k)
             tairc=tair-t0
             call vqrqi(2,r00(k),fv(k),y1,y2,tair,vti(k))      ! Di
          endif  !y1
             vti(k)=vti(k) * 0.01                       ! convert back to MKS

! EMK: prevent divsion by zero and underflow value
          if (vti(k) .gt. 1.e-20) then
            if (k .eq. 1) then
               del_tv=amin1(del_tv,0.9*(zz(k)-topo(i,j))/vti(k))
            else
               del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vti(k))
            endif
          endif
!         else
!            vti(k)=0.
         endif
      enddo

      if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >=  big delta t
!             (t_del_tv)          (del_tv)             (dtb)

         t_del_tv=t_del_tv+del_tv

         if ( t_del_tv .ge. dtb ) then
              notlast=.false.
              del_tv=dtb+del_tv-t_del_tv
         endif

! use small delta t to calculate the qiz flux
! termi is the qiz flux pass in the grid box through the upper boundary
! termo is the qiz flux pass out the grid box through the lower boundary
!

         fluxin=0.
         do k=max_q,min_q,-1
            qiz=qi(i,k,j)
            fluxout=rhoz(k)*vti(k)*qiz
            flux=(fluxin-fluxout)/rhoz(k)/dzw(k)
            qiz=qiz+del_tv*flux
            qiz=amax1(0.,qiz)
            qi(i,k,j)=qiz
            fluxin=fluxout
            ised(k)=ised(k)+fluxin
         enddo
         if (min_q .eq. 1) then
            pptice=pptice+fluxin*del_tv
         else
            qiz=qi(i,min_q-1,j)
            qiz=qiz+del_tv*  &
                         fluxin/rhoz(min_q-1)/dzw(min_q-1)
            qiz=amax1(0.,qiz)         !Di 10/23/2012
            qi(i,min_q-1,j)=qiz
         endif
!
      else
         notlast=.false.
      endif
!
   ENDDO !notlast

   do k = kts, kte
            preci3d(i,k,j)=ised(k)
            precs3d(i,k,j)=ssed(k)
            precg3d(i,k,j)=gsed(k)
            prech3d(i,k,j)=hsed(k)
            precr3d(i,k,j)=rsed(k)
   end do

!   prnc(i,j)=prnc(i,j)+pptrain
!   psnowc(i,j)=psnowc(i,j)+pptsnow
!   pgrauc(i,j)=pgrauc(i,j)+pptgraul
!   picec(i,j)=picec(i,j)+pptice
!                     

!   write(6,*) 'i=',i,' j=',j,'   ', pptrain, pptsnow, pptgraul, pptice
!   call flush(6)

   snowncv(i,j) = pptsnow
   snownc(i,j) = snownc(i,j) + pptsnow
   graupelncv(i,j) = pptgraul
   graupelnc(i,j) = graupelnc(i,j) + pptgraul 
   hailncv(i,j) = ppthail
   hailnc(i,j) = hailnc(i,j) + ppthail
   RAINNCV(i,j) = pptrain + pptsnow + pptgraul + pptice + ppthail
   RAINNC(i,j)  = RAINNC(i,j) + pptrain + pptsnow + pptgraul + pptice + ppthail
   sr(i,j) = 0.
   if (RAINNCV(i,j) .gt. 0.) sr(i,j) = (pptsnow + pptgraul + pptice + ppthail) / RAINNCV(i,j) 

  ENDDO i_loop
  ENDDO j_loop

 
  END SUBROUTINE fall_flux

!-----------------------------------------------------------------------
!c Correction of negative values  
   SUBROUTINE negcor ( X, rho, dz8w,                         &
                      ims,ime, jms,jme, kms,kme,              & ! memory dims
                      itimestep, ics,                         &
                      its,ite, jts,jte, kts,kte               ) ! tile   dims
!-----------------------------------------------------------------------
  REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
        INTENT(INOUT) ::                                     X   
  REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
        INTENT(IN   ) ::                              rho, dz8w  
  integer, INTENT(IN   ) ::                           itimestep, ics 

!c Local variables
!  REAL, DIMENSION( kts:kte ) ::  Y1, Y2
  REAL   ::   A0, A1, A2

  A1=0.
  A2=0.
  do k=kts,kte
     do j=jts,jte
        do i=its,ite
        A1=A1+max(X(i,k,j), 0.)*rho(i,k,j)*dz8w(i,k,j)
        A2=A2+max(-X(i,k,j), 0.)*rho(i,k,j)*dz8w(i,k,j)
        enddo
     enddo
  enddo

!  A1=0.0
!  A2=0.0
!  do k=kts,kte
!     A1=A1+Y1(k)
!     A2=A2+Y2(k)
!  enddo

  A0=0.0

  if (A1.NE.0.0.and.A1.GT.A2) then 
     A0=(A1-A2)/A1

  if (mod(itimestep,540).eq.0) then
     if (ics.eq.1) then
        write(61,*) 'kms=',kms,'  kme=',kme,'  kts=',kts,'  kte=',kte
        write(61,*) 'jms=',jms,'  jme=',jme,'  jts=',jts,'  jte=',jte 
        write(61,*) 'ims=',ims,'  ime=',ime,'  its=',its,'  ite=',ite 
     endif 
     if (ics.eq.1) then
         write(61,*) 'qv timestep=',itimestep
         write(61,*) '  A1=',A1,'   A2=',A2,'   A0=',A0
     else if (ics.eq.2) then
             write(61,*) 'ql timestep=',itimestep
             write(61,*) '  A1=',A1,'   A2=',A2,'   A0=',A0
     else if (ics.eq.3) then
             write(61,*) 'qr timestep=',itimestep
             write(61,*) '  A1=',A1,'   A2=',A2,'   A0=',A0
     else if (ics.eq.4) then
             write(61,*) 'qi timestep=',itimestep
             write(61,*) '  A1=',A1,'   A2=',A2,'   A0=',A0
     else if (ics.eq.5) then
             write(61,*) 'qs timestep=',itimestep
             write(61,*) '  A1=',A1,'   A2=',A2,'   A0=',A0
     else if (ics.eq.6) then
             write(61,*) 'qg timestep=',itimestep
             write(61,*) '  A1=',A1,'   A2=',A2,'   A0=',A0
     else
             write(61,*) 'wrong cloud specieis number'
     endif 
  endif 

     do k=kts,kte
        do j=jts,jte
           do i=its,ite
           X(i,k,j)=A0*AMAX1(X(i,k,j), 0.0)
           enddo
        enddo
     enddo
  endif

  END SUBROUTINE negcor

  SUBROUTINE consat_s ( itaobraun)  

!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!                                                                      c
!   Tao, W.-K., and J. Simpson, 1989: Modeling study of a tropical     c
!   squall-type convective line. J. Atmos. Sci., 46, 177-202.          c
!                                                                      c
!   Tao, W.-K., J. Simpson and M. McCumber, 1989: An ice-water         c
!   saturation adjustment. Mon. Wea. Rev., 117, 231-235.               c

!                                                                      c
!   Tao, W.-K., and J. Simpson, 1993: The Goddard Cumulus Ensemble     c
!   Model. Part I: Model description. Terrestrial, Atmospheric and     c
!   Oceanic Sciences, 4, 35-72.                                        c
!                                                                      c
!   Tao, W.-K., J. Simpson, D. Baker, S. Braun, M.-D. Chou, B.         c
!   Ferrier,D. Johnson, A. Khain, S. Lang,  B. Lynn, C.-L. Shie,       c
!   D. Starr, C.-H. Sui, Y. Wang and P. Wetzel, 2003: Microphysics,    c
!   radiation and surface processes in the Goddard Cumulus Ensemble    c
!   (GCE) model, A Special Issue on Non-hydrostatic Mesoscale          c
!   Modeling, Meteorology and Atmospheric Physics, 82, 97-137.         c
!                                                                      c
!   Lang, S., W.-K. Tao, R. Cifelli, W. Olson, J. Halverson, S.        c
!   Rutledge, and J. Simpson, 2007: Improving simulations of           c
!   convective system from TRMM LBA: Easterly and Westerly regimes.    c
!   J. Atmos. Sci., 64, 1141-1164.                                     c
!                                                                      c
!   Coded by Tao (1989-2003), modified by S. Lang (2006/07)            c
!                                                                      c
!   Implemented into WRF  by Roger Shi 2006/2007                       c
!   Additional modifications by Tao, Roger and Steve 2009              c
!   July 25 2010                                                       c
!   Tao November 12 2010                                               c
!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  IMPLICIT NONE

!        itaobraun=0   ! see Tao and Simpson (1993)
!        itaobraun=1   ! see Tao et al. (2003)

 integer ::  itaobraun
 real    :: cn0

 integer k
 real :: ga3, ga4, ga5, ga7, ga8, ga9, ga3g2, ga4g2, ga5g2, ga6d      
 real :: ga3h, ga4h, ga5hh, bc1, dc1, esc, egs, erc, amc, ehs, ehg
 real :: ehw, ehi, ehr, sc13, ga6, ga5gh2, egc, cpi2, grvt, tca, dwv
 real :: dva, amw, ars, rw, cw, ci, cd1, cd2, ga3b, ga4b, ga6b, ga5bh
 real :: ga3g, ga4g, ga5gh, ga3d, ga4d, ga5dh, ac1, ac2, ac3, cc1, eri
 real :: ami, ESR, eiw, ui50, ri50, cmn, y1, egi, egr, apri, bpri

!JJS 1/3/2008  vvvvv
!JJS   the following common blocks have been moved to the top of
!JJS   module_mp_gsfcgce.F
!
! real,   dimension (1:31) ::  a1, a2
! data a1/.7939e-7,.7841e-6,.3369e-5,.4336e-5,.5285e-5,.3728e-5,       &
!      .1852e-5,.2991e-6,.4248e-6,.7434e-6,.1812e-5,.4394e-5,.9145e-5, &
!      .1725e-4,.3348e-4,.1725e-4,.9175e-5,.4412e-5,.2252e-5,.9115e-6, &
!      .4876e-6,.3473e-6,.4758e-6,.6306e-6,.8573e-6,.7868e-6,.7192e-6, &
!         .6513e-6,.5956e-6,.5333e-6,.4834e-6/
! data a2/.4006,.4831,.5320,.5307,.5319,.5249,.4888,.3894,.4047, &
!         .4318,.4771,.5183,.5463,.5651,.5813,.5655,.5478,.5203,.4906, &
!         .4447,.4126,.3960,.4149,.4320,.4506,.4483,.4460,.4433,.4413, &
!         .4382,.4361/
!JJS 1/3/2008  ^^^^^

!23456789012345678901234567890123456789012345678901234567890123456789012
!     ******************************************************************
!JJS
      cmin=1.e-20
      al = 2.5e10
      cp = 1.004e7
      rd1 = 1.e-3
      rd2 = 2.2
!JJS
      cpi=4.*atan(1.)
      cpi2=cpi*cpi
      grvt=980.               !hail                 
!
      c38=3.799052e3
      c358=35.86
      c610=6.1078e3
      c149=1.496286e-5
      c879=8.794142
      c172=17.26939
      c409=4098.026
      c76=7.66
      c218=21.87456
      c580=5807.695
      c141=1.414435e7

!
      tca=2.43e3
      dwv=.226
      dva=1.718e-4
      amw=18.016
      ars=8.314e7
!      scv=2.2904487
!
      t0=273.16
      t00=238.16
      alv=2.5e10    !latent heat vaporization
      alf=3.336e9
      als=2.8336e10
      avc=alv/cp
      afc=alf/cp
      asc=als/cp
      rw=4.615e6
      cw=4.187e7
      ci=2.093e7
!***   DEFINE THE COEFFICIENTS USED IN TERMINAL VELOCITY
!***   DEFINE THE DENSITY AND SIZE DISTRIBUTION OF PRECIPITATION
!**********   HAIL OR GRAUPEL PARAMETERS   **********

! tnw                  !  rain intercept (1/cm**4)
! roqr                 !  rain density (g/cm**3)
! tns                  !  snow intercept (1/cm**4)
! roqs                 !  snow density (g/cm**3)
! tng                  !  graupel intercept (1/cm**4)
! roqg                 !  graupel density (g/cm**3)

!**********         HAIL PARAMETERS        **********
!      tnh = 0.002                 !hail  medium size
       tnh = 0.01
!      tnh = 0.0002                !hail large size
!      tnh = 0.02                  !hail small size
      roqh = 0.9                  !hail
      cd1=6.e-1                   !hail
      cd2=4.*grvt/(3.*cd1)        !hail
      ah=sqrt(cd2*roqh)           !hail
      bh=0.5                      !hail


!!!!!!!!check /08/08/12!!!!!!!!!!!!
         roqg=.3      !bulk density
!         ag=341.84    !for bulk density of 0.4
         ag=330.22    !for bulk density of 0.3
!         ag=314.54    !for bulk density of 0.2         
         bg=.36
         ag2=544.83   !for bulk density of 0.5
         bg2=.54
         tng=.04

       roqg2=0.5
       qrog2=2.0            !g/m**3
!      qrog2=9.0            !g/m**3    !fixed size test
       qrog2=qrog2*1.e-6
       ag=330.22
       ag2=544.83
       bg=0.36
       bg2=0.54

!**********         SNOW PARAMETERS        **********
!                             6/15/02
!      TNS=1.
!      TNS=.08             ! if ice913=1, tao's
      tns=.16              ! if ice913=0, tao's snow intercept
      roqs=.1              ! snow density g/cm
      as=78.63154          ! coefficient a in snow terminal velocity
      bs=.11               ! coefficient b in snow terminal velocity
        roqs=.05        !  snow density (g/cm**3)
        tns=0.1         !  snow intercept (1/cm**4)
        as=151.01
        bs=0.24

!**********         RAIN PARAMETERS        **********
      aw=2115.
      bw=.8
      roqr=1.  !not defined in Steve's
      tnw=.08  !not defined in Steve's
!*****************************************************************
      bgh=.5*bg
      bgh2=.5*bg2
      bsh=.5*bs
      bwh=.5*bw
      bhh=.5*bh
      bgq=.25*bg
      bgq2=.25*bg2
      bsq=.25*bs
      bwq=.25*bw
      bhq=.25*bh          !hail

!***   define the snow and graupel size mapping parameters for improve=3
       tslopes=0.11177209   ! increase tns by  50 from 0 to -35C !sgmap000
       tslopeg=0.05756866   ! increase tng by 7.5 from 0 to -35C

       draimax=0.0500 !maximum rain diameter (cm)
       draimax=draimax**4.*roqr*cpi
       dsnomin=0.0100 !minimum snow diameter (cm) !fin16
       dsnomin4=dsnomin**4.*0.900*cpi  !density at 100 microns

       dgrpmin=0.0135 !minimum graupel diameter (cm)
       dgrpmin4=dgrpmin**4.*roqg*cpi

       xs=0.97
       sno11=0.70   !fin15
       sno00=-0.24   !fin17
       dsno11=3.25   !fin8
       dsno00=0.40   !fin12
       sexp11=1.5    !sgmapfin17
       sexp00=0.9    !fin15
       stt=-35.      !iterate
       stexp=0.42    !fin18
       slim=1.00     !fin5
       sbase=0.04000 !sgmap00s

       xg=0.98
       grp11=0.30    !sgmap00x
       grp00=0.30    !sgmap00x
       dgrp11=2.70   !sgmap001
       dgrp00=2.60
       gexp11=0.20   !sgmap004
       gexp00=0.20   !sgmap004
       gtt=-35.      !sgmap006 made consistent
       gtexp=0.40
       glim=0.90
       gbase=0.0130  !sgmap00u

       hai00=3.25     !g/m**3        fin20
       hai11=0.50     !g/m**3        fin20
       htt0=-5.00     !deg C         fin20
       htt1=-50.00    !deg C         fin20
       haixp=2.7      !exponent      fin20

!**********GAMMA FUNCTION CALCULATIONS*************
      ga3=2.
      ga4=6.
      ga5=24.
      ga6=120.
      ga7=720.
      ga8=5040.
      ga9=40320.
!
      ga3b  = gammagce(3.+bw)
      ga4b  = gammagce(4.+bw)
      ga6b  = gammagce(6.+bw)
      ga5bh = gammagce((5.+bw)/2.)
      ga3g  = gammagce(3.+bg)
      ga4g  = gammagce(4.+bg)
      ga5gh = gammagce((5.+bg)/2.)
      ga3d  = gammagce(3.+bs)
      ga4d  = gammagce(4.+bs)
      ga5dh = gammagce((5.+bs)/2.)

        ga4g=11.63177
        ga3g=3.3233625          
        ga5gh=1.608355         
        if(bg.eq.0.37) ga4g=9.730877 
        if(bg.eq.0.37) ga3g=2.887512
        if(bg.eq.0.37) ga5gh=1.526425
        if(bg.eq.0.36) ga4g=9.599978
        if(bg.eq.0.36) ga3g=2.857136
        if(bg.eq.0.36) ga5gh=1.520402 
        if(bg2.eq.0.54) ga4g2=12.298653
        if(bg2.eq.0.54) ga3g2=3.474196
        if(bg2.eq.0.54) ga5gh2=1.635061 
          ga3d=2.54925           
          ga4d=8.285063         
          ga5dh=1.456943
          if(bs.eq.0.57) ga3d=3.59304
          if(bs.eq.0.57) ga4d=12.82715
          if(bs.eq.0.57) ga5dh=1.655588
          if(bs.eq.0.24) ga3d=2.523508
          if(bs.eq.0.24) ga4d=8.176166
          if(bs.eq.0.24) ga5dh=1.451396
          if(bs.eq.0.11) ga3d=2.218906
          if(bs.eq.0.11) ga4d=6.900796
          if(bs.eq.0.11) ga5dh=1.382792 

      ga6d=144.93124
        if(bs.eq.0.24) ga6d=181.654791
      ga3h=gammagce(3.+bh)                     !hail
      ga4h=gammagce(4.+bh)                     !hail
      ga5hh=gammagce((5.+bh)/2.)               !hail
!
!CCCCC        LIN ET AL., 1983 OR LORD ET AL., 1984   CCCCCCCCCCCCCCCCC
      ac1=aw
      ac2=ag            ! Steve only defines ac1 and ac2
      ac3=as            ! need to talk about these 3 parameters.

      bc1=bw
      cc1=as
      dc1=bs

      zrc=(cpi*roqr*tnw)**0.25
      zsc=(cpi*roqs*tns)**0.25
      zgc=(cpi*roqg*tng)**0.25
      zgc2=(cpi*roqg2*tng)**0.25
      zhc=(cpi*roqh*tnh)**0.25               !hail

      vrc=aw*ga4b/(6.*zrc**bw)

       vrc0=-26.7
       vrc1=20600./zrc
       vrc2=-204500./(zrc*zrc)
       vrc3=906000./(zrc*zrc*zrc)

      vsc=as*ga4d/(6.*zsc**bs)
      vgc=ag*ga4g/(6.*zgc**bg)
      vgc2=ag2*ga4g2/(6.*zgc2**bg2)
      vhc=ah*ga4h/(6.*zhc**bh)          !hail
!     ****************************
      rn1=9.4e-15
      rn2=1.e-3
      bnd2=2.0e-3                    ! if ice913=0 6/15/02 tao's

      esi=0.70
      rn3=.25*cpi*tns*as*esi*ga3d

      esc=0.45
      rn4=.25*cpi*esc*tns*as*ga3d

      eri=.1                        ! 6/17/02 tao's ice913=0 (not 1)
      rn5=.25*cpi*eri*tnw
      rn50=-.267e2*ga3
      rn51=5.15e3*ga4
      rn52=-1.0225e4*ga5
      rn53=7.55e3*ga6

      ami=1./(24.*6.e-9)            ! 6/15/02 tao's
      rn6=cpi2*eri*tnw*roqr*ami
      rn60=-.267e2*ga6
      rn61=5.15e3*ga7
      rn62=-1.0225e4*ga8
      rn63=7.55e3*ga9

      ESR=1.                       ! also if ice913=1 for tao's
      rn7=cpi2*esr*tnw*tns*roqs
      rn8=cpi2*esr*tnw*tns*roqr

      egs=.1
      rn9=cpi2*egs*tns*tng*roqs

      rn10=4.*tns
      rn101=.65
      rn102=.44*sqrt(as/dva)*ga5dh
      rn10a=alv*als*amw/(tca*ars)
      rn10b=alv/tca
      rn10c=ars/(dwv*amw)

      rn11=2.*cpi*tns*tca/alf
      rn11a=cw/alf

      ami50=4.8e-7*(dsnomin*1.e4/2./50.)**3
      ami100=1.51e-7    ! improve < 3
      ami40=2.46e-7*.875**3     !fin24    35 microns

       eiw=1.
       ui50=100. ! 6/15/02 tao's
       ri50=dsnomin/2.

      cmn=1.05e-15
      rn12=cpi*eiw*ui50*ri50*ri50
      do k=1,31
         y1=1.-aa2(k)
         rn13(k)=aa1(k)*y1/(ami50**y1-ami40**y1)
         rn12a(k)=rn13(k)/ami50
         rn12b(k)=aa1(k)*ami50**aa2(k)
         rn25a(k)=aa1(k)*cmn**aa2(k)

         BergCon1(k)=6.*aa1(k)*ami50**(aa2(k)-1.)
         BergCon2(k)=-2.*aa1(k)*ami50**aa2(k)*1.2

         BergCon3(k)=6.*aa2(k)/((aa2(k)+1.)*(aa2(k)+2.))        &
                   *aa1(k)*ami50**(aa2(k)-1.)
         BergCon4(k)=2.*(1.-aa2(k))/((aa2(k)+1.)*(aa2(k)+2.))   &
                   *aa1(k)*ami50**aa2(k)*1.2
      enddo
!
      egc=0.65
      rn14=.25*cpi*egc*ag*tng*ga3g
      rn142=.25*cpi*egc*ag2*tng*ga3g2     !high dens graupel

      egi=.1
      rn15=.25*cpi*egi*tng*ag*ga3g
      rn15a=.25*cpi*egi*tng*ag*ga3g
      rn15a2=.25*cpi*egi*tng*ag2*ga3g2    !high dens graupel
      rn152=.25*cpi*egi*tng*ag2*ga3g2     !high dens graupel

      egr=1.
      rn16=cpi2*egr*tng*tnw*roqr
      rn17=2.*cpi*tng
      rn17a2=.31*ga5gh2*sqrt(ag2/dva)     !high dens graupel
      rn17b=cw-ci
      rn17c=cw
      rn171=2.*cpi*tng*alv*dwv
      rn172=2.*cpi*tng*tca
      rn17a=.31*ga5gh*sqrt(ag/dva)
!
      apri=.66
      bpri=1.e-4
      bpri=0.5*bpri                        ! 6/17/02 tao's
      rn18=20.*cpi2*bpri*tnw*roqr
      rn18a=apri
      rn191=.78                     !Are this same as rnn191 (listed below)?
      rn192=.31*ga5gh*sqrt(ag/dva)  !Are this same as rnn192 (listed below)?
      rn192_2=.31*ga5gh2*sqrt(ag2/dva)    !high dens graupel
      rn19b=cw/alf 
      rn19=2.*cpi*tng*tca/alf
      rn19a=cw/alf
!
      rn20=2.*cpi*tng
      rn20a=als*als*amw/(tca*ars)
      rn20b=als/tca
      rn30a=alv*alv*amw/(tca*ars)
      rn30=2.*cpi*tng

      bnd3=2.e-3
      rn21=1.e-3
      bnd21=1.5e-3
!
      erc=1.
      rn22=.25*cpi*erc*tnw
!
      rn23=2.*cpi*tnw
      rn23a=.31*ga5bh*sqrt(ac1)
      rn23b=alv*alv/rw
      rn231=.78
      rn232=.31*ga3*sqrt(3.e3/dva)
!
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!cc
!cc        "c0" in routine      "consat" (2d), "consatrh" (3d)
!cc        if ( itaobraun.eq.1 ) --> betah=0.5*beta=-.46*0.5=-0.23;   cn0=1.e-6
!cc        if ( itaobraun.eq.0 ) --> betah=0.5*beta=-.6*0.5=-0.30;    cn0=1.e-8

       itaobraun=0

         cn0=1.e-8
         beta=-.6
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!
      rn25=cn0
      rn30b=alv/tca
      rn30c=ars/(dwv*amw)
      rn31=1.e-17

      rn32=4.*51.545e-4
!!
      rn33=4.*tns
      rn331=.65
      rn332=.44*sqrt(as/dva)*ga5dh 
!
      amc=1./(24.*4.e-9)
      rn34=cpi2*esc*amc*as*roqs*tns*ga6d  
      rn35=alv*alv/(cp*rw)

      gn17=2.*cpi*tng                                                      !4ice revised
      gn17a=.31*ga5gh*sqrt(ag)                                             !4ice revised
      gn17a2=.31*ga5gh2*sqrt(ag2)                                          !4ice revised

      ehs=1.
      hn9=cpi2*ehs*tns*tnh*roqs
      ehg=0.3
      hn10=cpi2*ehg*tng*tnh*roqg
      ehw=1.
      hn14=.25*cpi*ehw*tnh*ga3h*ah
      ehi=1.
      hn15a=.25*cpi*ehi*tnh*ga3h*ah
      ehr=1.
      hn16=cpi2*ehr*tnh*tnw*roqr
      hn17=2.*cpi*tnh
      hn17a=.31*ga5hh*sqrt(ah)
      hn19=2.*cpi*tnh/alf
      hn19a=.31*ga5hh*sqrt(ah)
      hn10a=als*als/rw
      hn20=2.*cpi*tnh
      hn20b=.31*ga5hh*sqrt(ah)

! JDC add schmidt number term
      sc13    = 0.8420526
      rn102   = rn102 * sc13
      rn17a   = rn17a * sc13
      rn17a2  = rn17a2 * sc13
      rn192   = rn192 * sc13
      rn192_2 = rn192_2 * sc13
      rn232   = rn232 * sc13
      rn332   = rn332 * sc13

  END SUBROUTINE consat_s 

!JJS
!JJS      REAL FUNCTION GAMMA(X)
!JJS        Y=GAMMLN(X)
!JJS        GAMMA=EXP(Y)
!JJS      RETURN
!JJS      END
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!JJS      real function GAMMLN (xx)
  real function gammagce (xx)
!**********************************************************************
  implicit none
 
  real*8 cof(6),stp,half,one,fpf,x,tmp,ser
  data cof,stp /  76.18009173,-86.50532033,24.01409822, &
     -1.231739516,.120858003e-2,-.536382e-5, 2.50662827465 /
  data half,one,fpf / .5, 1., 5.5 /
!
  real xx
  real gammln
  integer j

      x=xx-one
      tmp=x+fpf
      tmp=(x+half)*log(tmp)-tmp
      ser=one
      do  j=1,6
         x=x+one
        ser=ser+cof(j)/x
      enddo !j
      gammln=tmp+log(stp*ser)
!JJS
      gammagce=exp(gammln)
!JJS

 END FUNCTION gammagce

!DIR$ ATTRIBUTES FORCEINLINE :: sgmap
  SUBROUTINE sgmap(isg,qcs,qcg,qcg2,qch,qch2,r00,tairc,ftnsg)
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
! compute base snow/graupel intercept scaling factor - ftnsg
! isg -- flag 
!        1 ftnsg=snow intercept scaling factor
!        2 ftnsg=graupel intercept scaling factor
!        3 ftnsg=snow density scaling factor
! tns is the actual intercept
!
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  IMPLICIT NONE

!      common/size/ tnw,tns,tng,roqs,roqg,roqr  !defined in the beginning of the module
  integer, intent(in)  :: isg
!  integer, intent(in)  :: i, j, k
!  INTEGER, INTENT(IN)  :: ims,ime, jms,jme, kms,kme,  &
!                          its,ite, jts,jte, kts,kte
  real,    intent(in)  :: r00, tairc
!  real,    DIMENSION( ims:ime, jms:jme, kms:kme ), intent(in)  :: qcs,qcg, qch
!  real,    DIMENSION( its:ite, jts:jte, kts:kte ), intent(in)  :: qcs,qcg, qch
  real,    intent(in)  :: qcs,qcg,qcg2,qch,qch2
  real,    intent(out) :: ftnsg

  
! LOCAL variables

!!  for snomap 
!  real ::  xs,sno11,sno00,dsno11,dsno00,sexp11,sexp00,stt,   &
!                stexp,sbase,tslopes,dsnomin,slim
!!  for grpmap
!  real ::  xg,grp11,grp00,dgrp11,dgrp00,gexp11,gexp00,gtt,   &
!                gtexp,gbase,tslopeg,dgrpmin, glim

  real :: taird, qsg, qsg1, xx, fexp  !, cpi, cmin Di
  real :: ftnsT, sno1, dsno1, sexp1, ftnsQ, tnsmax, densno
  real :: ftngT, grp1, dgrp1, gexp1, ftngQ, tngmax
  real :: hx, gx, hgx
  real :: kk
  real :: hai2, dhai1
!  CPI=4.*ATAN(1.)
!  cmin=1.e-20  !4ice

  ftnsg=1.

!  if (isg.eq.1.or.isg.eq.3) qsg=qcs(i,k,j)
!  if (isg.eq.2.) qsg = qcg(i,k,j)  
  if (isg.eq.1.or.isg.eq.3) qsg=qcs
!NUWRF EMK...Fix options 2 and 4.
  if (isg.eq.2) qsg = qcg
  if (isg.eq.4) qsg = qch

  if (qsg .gt. cmin) then
      
     qsg1=qsg*r00*1.e6

!     if (isg.eq.1) then                          !snow
     if(isg.eq.1.or.isg.eq.3)then  !snow 4ice
        taird=min(0.,max(stt,tairc)+0.0)
        ftnsT=exp(-1.*tslopes*taird)
        sno1=sno11
        dsno1=dsno11
        sexp1=sexp11

        if (taird.gt.stt) then
           sno1=sno00-(sno00-sno11)*(taird/stt)**stexp
           dsno1=dsno00-(dsno00-dsno11)*(taird/stt)**stexp
           sexp1=sexp00-(sexp00-sexp11)*(taird/stt)**stexp
        endif !taird

          hx=0.
          gx=0.
          hgx=1.

           if(qch2*1.e6*r00.gt.0.008)    &
              hx=max(1.,qch2*1.e6*r00*125.)
           if(qcg2*1.e6*r00.gt.0.040)    &
              gx=max(1.,qcg2*1.e6*r00*25.)
           hgx=hx+gx
           hgx=max(1.,hgx)
 
        xx=xs-xs*min(slim,max(0.,(qsg1-sno1)/dsno1)**sexp1)
        ftnsT=ftnsT**xx
        fexp=xx
        ftnsQ=1.0
        ftnsQ=(qsg1/sbase)**fexp
        ftnsg=ftnsT*ftnsQ*hgx
        tnsmax=r00*qsg/dsnomin4

        if (ftnsg*tns.gt.tnsmax) ftnsg=tnsmax/tns               !4ice
!        densno=0.004168*(ftnsg*tns/qsg/r00)**0.3115   !4ice Heymsfield et al. 2004
        densno=0.001996*(ftnsg*tns/qsg/r00)**0.2995   !Brandes et al. 2007
        if(isg.eq.3) ftnsg=min(densno,0.9)/roqs            !4ice

     else if (isg.eq.2) then                      !graupel
            taird=min(0.,max(gtt,tairc)+0.0)
             ftngT=exp(-1.*tslopeg*taird)
             grp1=grp11
             dgrp1=dgrp11
             gexp1=gexp11

             if (taird.gt.gtt) then
                grp1=grp00-(grp00-grp11)*(taird/gtt)**gtexp
                dgrp1=dgrp00-(dgrp00-dgrp11)*(taird/gtt)**gtexp
                gexp1=gexp00-(gexp00-gexp11)*(taird/gtt)**gtexp
             endif !taird

             xx=xg-xg*min(glim,max(0.0,(qsg1-grp1)/dgrp1)**gexp1)
             ftngT=ftngT**xx
             fexp=xx
             ftngQ=1.0
             ftngQ=(qsg1/gbase)**fexp
             ftnsg=ftngT*ftngQ
             tngmax=r00*qsg/dgrpmin4
             if (ftnsg*tng.gt.tngmax) ftnsg=tngmax/tng

	elseif(isg.eq.4)then  !hail
             hai2=hai00
             if(tairc.le.htt0.and.tairc.ge.htt1) &  !fin18
                hai2=hai11+(hai00-hai11)*((tairc-htt1)/(htt0-htt1))**haixp   !fin18
             if(tairc.le.htt1)  hai2=hai11     !fin18
                dhai1=hai2          !x2
             if(qsg1.ge.hai2)    &
                ftnsg=1.0-0.80*min(max((qsg1-hai2)/dhai1,0.),1.) !  fin16

     endif !isg

  endif !qsg

  end subroutine sgmap

!     compute fall speed of cloud rain and ice
  SUBROUTINE vqrqi(isg,r00,fv,qri,ql,tair,ww1)
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
! compute fall speed of cloud rain and ice
! isg=1, for rain
! isg=2, for ice
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  implicit none

  integer, intent(in) :: isg
  real, intent(in) :: r00, fv,qri,ql,tair
  real, intent(inout) :: ww1 

! LOCAL variables
  integer :: ic 
  real  :: y1,vr,vs,vg
  real  :: const_vt, const_d, const_m !cpi, cmin Di
  real  :: bb1, bb2,ice_fall
  real  :: bin_factor, ftnw, ftnwmin
  real, dimension(7) ::  aice, vice
  data aice/1.e-6, 1.e-5, 1.e-4, 1.e-3, 0.01, 0.1, 1./
  data vice/5,15,30,35,40,45,50/

!  cmin=1.e-40
!  CPI=4.*ATAN(1.)
     ice_fall=0.
     const_vt=1.49e4
     const_d=11.9
     const_m=1./5.38e7

  y1=r00*qri
  ww1=0.

  if (y1 .gt. cmin) then

    if (isg.eq.1) then                             !  rain

       ftnw=1.                                                       
           if(ql.lt.cmin .and. tair .gt. t0)then                      
             bin_factor=0.11*(1000.*qri)**(-1.27) + 0.98      
             bin_factor=min(bin_factor, 1.30)       
             ftnw=1./bin_factor**3.35                             
             ftnwmin=r00*qri/draimax                        
             if(qri.le.0.001) ftnw=max(ftnw,ftnwmin/tnw)   
           endif                                               

               vs=sqrt( y1 )
               vg=sqrt( vs)
!               vr=vrc0+vrc1*vg+vrc2*vs+vrc3*vg*vs
               vr=vrc0+vrc1*vg/ftnw**0.25+vrc2*vs/ftnw**0.50+vrc3*vg*vs/ftnw**0.75
               ww1=max(fv*vr, 0.e0)


    else if (isg.eq.2) then                         ! cloud ice

            y1=1.e6*r00*qri                            ! to g/m**3

            if (y1 .gt. 1.e-6) then
                  y1=y1*1.e-3
                  bb1=const_m*y1**0.25
                  bb2=const_d*bb1**0.5
                  ww1=max(const_vt*bb2**1.31, 0.0)
                  ww1=ww1*100. !cm/s
                  if (ww1 .gt. 50.) ww1=50.               ! SLang
            endif  !y1
    endif  !isg
  endif !y1

  end subroutine vqrqi

  SUBROUTINE saticel_s (dt, dx, itaobraun, istatmin,                   &
                       new_ice_sat, id, improve,                       &
                       ptwrf, qvwrf, qlwrf, qrwrf,                     &
                       qiwrf, qswrf, qgwrf, qhwrf,                     &
                       rho_mks, pi_mks, p0_mks, w_mks,                 &
                       itimestep, xland,                               &
                       refl_10cm, diagflag, do_radar_ref,              & ! GT added for reflectivity calcs
                       ids,ide, jds,jde, kds,kde,                      &
                       ims,ime, jms,jme, kms,kme,                      &
                       its,ite, jts,jte, kts,kte,                      &
!NUWRF BEGIN
                       re_cloud_gsfc, re_rain_gsfc, re_ice_gsfc,       &
                       re_snow_gsfc, re_graupel_gsfc, re_hail_gsfc,    & ! cloud effective radius
                       physc, physe, physd, physs, physm, physf,       &
                       acphysc, acphyse, acphysd, acphyss, acphysm, acphysf &
#if ( WRF_CHEM == 1)
!JJS 20110525 vvvvv
                       ,aero, icn_diag, nc_diag, gid,                   &
!JJS 20110525 ^^^^^
! EMK
                       chem_opt,                                       &
                       gsfcgce_gocart_coupling                        &
#endif
                       ,ii,j,irestrict)
!NUWRF END

!-----------------------------------------------------------------------
!  USE module_dm
  IMPLICIT NONE
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!                                                                         c
!   History:                                                              c
!                                                                         c
!   Coded by Tao (1989-2003), modified by S. Lang (2006/07)               c
!                                                                         c
!   Implemented into WRF  by Jainn Shi 2006/2007                          c
!   Improved by S. Lang (2008-2009)                                       c
!   Implemented by Tao, Jainn Shi and tested by Jainn Shi                 c
!   Modified by Tao, Jul. 2010                                            c
!   Modified by Tao, Aug. 2010                                            c
!   Added 4ICE code (from S. Lang) into NU-WRF by Di Wu in 2014           c
!   Added aerosol coupling by Jainn Shi, Mar. 2014                        c
!   Added cloud droplet eff. radius code by Jainn Shi, Dec. 2014          c
!   Code optimization by J. Mielikainen (2016)                            c
!                                                                         c
!   References:                                                           c
!                                                                         c
!   Tao, W.-K., and J. Simpson, 1989: Modeling study of a tropical        c
!   squall-type convective line. J. Atmos. Sci., 46, 177-202.             c
!                                                                         c
!   Tao, W.-K., J. Simpson and M. McCumber, 1989: An ice-water            c
!   saturation adjustment. Mon. Wea. Rev., 117, 231-235.                  c
!                                                                         c
!                                                                         c
!   Tao, W.-K., and J. Simpson, 1993: The Goddard Cumulus Ensemble        c
!   Model. Part I: Model description. Terrestrial, Atmospheric and        c
!   Oceanic Sciences, 4, 35-72.                                           c
!                                                                         c
!   Tao, W.-K., J. Simpson, D. Baker, S. Braun, M.-D. Chou, B.            c
!   Ferrier,D. Johnson, A. Khain, S. Lang,  B. Lynn, C.-L. Shie,          c
!   D. Starr, C.-H. Sui, Y. Wang and P. Wetzel, 2003: Microphysics,       c
!   radiation and surface processes in the Goddard Cumulus Ensemble       c
!   (GCE) model, A Special Issue on Non-hydrostatic Mesoscale             c
!   Modeling, Meteorology and Atmospheric Physics, 82, 97-137.            c
!                                                                         c
!   Lang, S., W.-K. Tao, R. Cifelli, W. Olson, J. Halverson, S.           c
!   Rutledge, and J. Simpson, 2007: Improving simulations of              c
!   convective system from TRMM LBA: Easterly and Westerly regimes.       c
!   J. Atmos. Sci., 64, 1141-1164.                                        c
!                                                                         c
!   Tao, W.-K., J. J. Shi,  S. Lang, C. Peters-Lidard, A. Hou, S.         c
!   Braun, and J. Simpson, 2007: New, improved bulk-microphysical         c
!   schemes for studying precipitation processes in WRF. Part I:          c
!   Comparisons with other schemes.                                       c
!                                                                         c
!   Lang, S., W.-K. Tao, X. Zeng, and Y. Li, 2011: Reducing the Biases in c
!   Simulated Radar Reflectivities from a Bulk Microphysics Scheme:       c
!   Tropical Convective Systems. J. Atmos. Sci., 68, 2306-2320.           c
!                                                                         c
!   Shi, J. J., T. Matsui, W.-K. Tao, C. Peters-Lidard, M. Chin, Q. Tan,  c
!   K. Pickering, N. Guy, S. Lang, and E. Kemp., 2014: Implementation of  c
!   an Aerosol-Cloud Microphysics-Radiation Coupling into the NASA        c
!   Unified WRF:  Simulation Results for the 6-7 August 2006 AMMA Special c
!   Observing Period. Quart. J. Roy. Meteor. Soc., 140, 2158-2175,        c 
!   doi:10.1002/qj.2286.                                                  c
!                                                                         c
!   Stephen E. Lang, Wei-Kuo Tao, Jiun-Dar Chern, Di Wu,                  c
!   and Xiaowen Li, 2014: Benefits of a Fourth Ice Class                  c
!   in the Simulated Radar Reflectivities of Convective Systems           c
!   Using a Bulk Microphysics Scheme. J. Atmos. Sci., 71, 3583-3612.      c
!   doi: http://dx.doi.org/10.1175/JAS-D-13-0330.1                        c
!                                                                         c
!   Lang, S., W.-K. Tao, J.-D. Chern, D. Wu, and X. Li, 2014:             c
!   Benefits of a 4th ice class in the simulated radar reflectivities     c
!   of convective systems using a bulk microphysics scheme.  J. Atmos.    c
!   Sci., 71, 3583-3612. doi: http://dx.doi.org/10.1175/JAS-D-13-0330.1   c
!                                                                         c
!   Tao, W.-K., D. Wu, S. Lang, J.-D. Chern, C. Peters-Lidard,            c
!   A. Fridlind, and T. Matsui (2016), High-resolution NU-WRF             c
!   simulations of a deep convective-precipitation system during          c
!   MC3E: Further improvements and comparisons between Goddard            c
!   microphysics schemes and observations, J. Geophys. Res. Atmos.,       c
!   121, 1278-1305, doi:10.1002/2015JD023986.                             c
!                                                                         c
!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!
!      COMPUTE ICE PHASE MICROPHYSICS AND SATURATION PROCESSES
!

!cc   using scott braun's way for pint, pidep computations
  INTEGER, INTENT(IN   ) :: itaobraun, improve, new_ice_sat
  integer, intent(in)  ::   id
  integer, intent(in)  ::   itimestep,istatmin  
  real, intent(in)     ::   dt  ! timestep (second)
  real, intent(in)     ::   dx  ! grid resolution (meters)
  real     ::   thresh_evap
!cc

!JJS 20090623 vvvvv
  integer, intent(in) :: ids,ide,jds,jde,kds,kde
  integer, intent(in) :: ims,ime,jms,jme,kms,kme
  integer, intent(in) :: its,ite,jts,jte,kts,kte
  integer, intent(in) :: ii,j,irestrict ! global i-index inside local i-loops: ii+i-1
  integer i, k, kp     

  real, dimension(CHUNK) :: afcp, alvr, ascp, avcp, rp0, pi0, pir,  &
                            pr0, r00, rrs, rrq, fv0, fvs, cp409, &
                            rr0, zrr, zsr, zgr, zhr, &
                            cp580, cs580, cv409, vscf, vgcf, vgcf2, &
                            vhcr, dwvp, r3f, r4f, r5f, r6f, &
                            r12r, r14f ,r14f2, r15af, r15af2, r15f, r18r, &
                            r22f, r25rt, r32rt, r331r, r332rf, &
                            r34f

  real :: bg3, bg3_2, bgh5, bgh5_2, bs3 ,bs6, bsh5, bw3 ,bw6 ,bwh5, &
          cmin, cmin1, cmin2, d2t, del, f2 ,f3, ft, qb0, r25a, r_nci, &
          sccc, sddd, seee, sfff, smmm, ssss, tb0, temp, ucog ,ucog2, &
          ucor ,ucos, ucoh, uwet, rdt, bnd1, c_nci, &
          r10t, r20t, r23t

  real :: a_1, a_2, a_3, a_4
  real :: a_11, a_22, a_33, a_44
  real :: zdry, zwet, zwet0
  real :: vap_frac
!JJS 20090623 ^^^^^

  real, dimension (CHUNK, kts:kte) ::  fv
  real, dimension (CHUNK, kts:kte) ::  dpt, dqv
  real, dimension (CHUNK, kts:kte) ::  qcl, qrn,             &
                                       qci, qcs, qcg, qch
  real, dimension (CHUNK, kts:kte) ::  qsz, qgz,qhz
!JJS
  real, dimension (CHUNK, kms:kme), INTENT(INOUT)                       &
                                               ::  ptwrf, qvwrf,       &
                                                   qlwrf, qrwrf,       &
                                                   qiwrf, qswrf,       &
                                                   qgwrf, qhwrf

!JJS in MKS
  real, dimension (CHUNK, kms:kme), INTENT(IN   )                      &
                                              ::  rho_mks,            &
                                                  pi_mks,             &
                                                  p0_mks,             &
                                                  w_mks
!JJS      COMMON /BADV/
  real, dimension (CHUNK) ::                                  &              
           vg,      zg,       &
           ps,      pg,       &
          prn,     psn,       &
        pwacs,   wgacr,       &
        pidep,    pint,       &
          qsi,     ssi,       &
          esi,     esw,       &
          qsw,      pr,       &
          ssw,   pihom,       &
         pidw,   pimlt,       &
        psaut,   qracs,       &
        psaci,   psacw,       &
        qsacw,   praci,       &
        pmlts,   pmltg,       &
        asss

!JJS      COMMON/BSAT/
  real, dimension (CHUNK) ::        &
        praut,   pracw,       &
         psfw,    psfi,       &
        dgacs,   dgacw,       &
        dgaci,   dgacr,       &
        pgacs,   wgacs,       &
        qgacw,   wgaci,       &
        qgacr,   pgwet,       &
        pgaut,   pracs,       &
        psacr,   qsacr,       &
         pgfr,   psmlt,       &
        pgmlt,   psdep,       &
        pgdep,   piacr,       &
          egs

!JJS      COMMON/BSAT1/
  real, dimension (CHUNK) ::        &
           pt,      qv,       &
           qc,      qr,       &
           qi,      qs,       &
           qg,      qh,       &
                  tair,       &
        tairc,   rtair,       &
          dep,      dd,       &
          dd1,     qvs,       &
           dm,      rq,       &
        rsub1,     col,       &
          cnd,     ern,       &
         dlt1,    dlt2,       &
         dlt3,    dlt4,       &
           zr,      vr,       &
           zs,      vs
       

!JJS      COMMON/BSAT2H/
  real, dimension (CHUNK) ::        &
         phfr,phmlt,                          & !4ice
         dhacw,qhacw,dhacr,qhacr,whacr,       & !4ice
         dhaci,whaci,dhacs,phacs,whacs,       & !4ice
         dhacg,whacg,phwet,phdep,phsub,       & !4ice
         pvaph,primh,scv,dwv,tca                !4ice

!JJS      COMMON/B5/ 
  real, dimension (CHUNK,kts:kte) ::  rho !only in satice in cgs

!JJS      COMMON/B6/
  real, dimension (CHUNK, kts:kte) ::  p0, pi, f0, ww1
  real, dimension (CHUNK, kts:kte) ::    & 
           fd,      fe,           &
           st,      sv,           &
           sq,      sc,           &
           se,     sqa

!JJS      COMMON/BI/ IT(its:ite,jts:jte), ICS(its:ite,jts:jte,4)
  integer, dimension (CHUNK) ::        it  
  integer, dimension (CHUNK, 4) ::    ics 

  integer :: i24h
  real :: r2is, r2ig, r2ih
  

!JJS      COMMON/MICRO/
  real, dimension (CHUNK, kms:kme), INTENT(INOUT)  ::  &
          physc,   physe,   physd,                  &
          physs,   physm,   physf,                  &
          acphysc,   acphyse,   acphysd,            &
          acphyss,   acphysm,   acphysf

! EMK NUWRF
  real, dimension(CHUNK, kts:kte) :: dbz

!JJS  9/30/2009 for Steve's new improvement

  integer  ::  ihalmos
  real     ::  xnsplnt, xmsplnt
  real     ::  hmtemp1, hmtemp2, hmtemp3, hmtemp4
  real     ::  ftnw, ftnwmin
  real     ::  xssi, fssi, rssi, xsubi, wssi
  real     ::  dmicrons, dmicrong, dvair, alpha
  real,   dimension (CHUNK) :: tairN, tairI,    &
                                          ftns,  ftng,    &
                                         ftns0, ftng0,    &
                                         ftnh,  ftnh0,    &
                                         pihms, pihmg,    &
                                          pimm,  pcfr,    &
                                         pssub, pgsub,    &
                                          fros, fros0,    &
                                            vi,    zh,    &
                                            vh, pihmh,    &
                                          dda0, pvapg,    &
                                          pracg,qracg,    &
                                          qrimh,pg2h      !4ice revised

  real,   dimension (CHUNK) :: y1, y2, y3, y4,  &
                               y5, y6, y7, y8 
! for Xiping's new dbz code
  real     ::  hfact, sfact, yy1
  real     ::  xncld, esat, rv, rlapse_m
  real     ::  delT, bhi  !Di deleted cpi
  real     ::  rc, ra, cna
  real     ::  xccld, xknud, cunnf, diffar
  real     ::  qgz2, qhz2

  real :: r11t, r19t, r19at, r30t, r33t
  real, dimension(CHUNK) :: r7rf, r8rf, r9rf, r16rf
  real, dimension(CHUNK) :: r101r, r102rf, r191r, r192rf, r192rf2
  real, dimension(CHUNK) :: r231r, r232rf
  real, dimension(CHUNK) :: h9r, h10r, h14r, h15ar, h16r, h17r, h17aq,   &
              h19aq, h19rt, h10ar, h20t, h20bq
  real, dimension(CHUNK) :: bin_factor, rim_frac
  real     :: term1, term2, fdwv, dwv0  !JDC water vapor diffusivity correction term
  integer  :: iter

!NUWRF BEGIN

#if ( WRF_CHEM == 1)
! JJS 20110525 vvvvv
! for inline Gocart coupling
  INTEGER,      INTENT(IN   )    ::   gid
  INTEGER, PARAMETER :: num_go = 14  ! number of the gocart aerosol species
  REAL, DIMENSION( CHUNK, kms:kme, num_go), intent(in) :: aero
  REAL, DIMENSION( CHUNK, kms:kme ), intent(out) :: icn_diag !IN concentration [#/Litre]
  REAL, DIMENSION( CHUNK, kms:kme ), intent(out) :: nc_diag !cloud concentration [#/cm3]
  integer,intent(in) :: chem_opt ! EMK
  integer,intent(in) :: gsfcgce_gocart_coupling ! EMK

! Local Variables

  real :: e_sat, e_dry  !saturated and dry air water vapor [hPa, mb]
  real :: rh_rad     ! relative humidity [%]
  real :: super_sat  !super saturation [%]
  real :: ccn_out(CHUNK)  ! CCN conc [#/cm3] ! EMK TEST
  real :: icn_out(CHUNK)  ! IN conc [#/Litter] ! EMK TEST
  real :: P_liu_daum  ! autoconversion rate [g/cm3 s-1]    !
  real :: re_liu_daum ! effective radius of cloud [micron]   !
  real,parameter :: min_icn = 0.01 !minimum # conc of IN [#/Litre]

! JJS 20110525 ^^^^^
#endif

!JJS 20140226  variables for the calculation of effective radius of cloud species
  real, dimension (CHUNK, kms:kme) , INTENT(INOUT   )                 &
                                              ::  re_cloud_gsfc, re_rain_gsfc,  &
                                                  re_ice_gsfc, re_snow_gsfc,    &
                                                  re_graupel_gsfc, re_hail_gsfc
  REAL , DIMENSION( CHUNK ) , INTENT(IN)   :: XLAND
  real, parameter :: roqi = 0.9179    ! ice density
  real, parameter :: ccn_over_land = 1500  ! [#/cm3] climatological value
  real, parameter :: ccn_over_water = 150  ! [#/cm3] climatological value
  real :: L_cloud    ! cloud water [g/cm3] !
  real :: I_cloud    ! cloud water [g/cm3] !
  real :: mu, ccn_ref, lambda
  real :: gamfac1, gamfac3
!JJS 20140226  ^^^^^
!NUWRF END

!+---+-----------------------------------------------------------------+
  REAL, DIMENSION(CHUNK, kms:kme), INTENT(INOUT):: refl_10cm  ! GT

  LOGICAL, OPTIONAL, INTENT(IN) :: diagflag
  INTEGER, OPTIONAL, INTENT(IN) :: do_radar_ref
!+---+-----------------------------------------------------------------+

! JDC dwv0 is water vapor diffusivity at STP
      dwv0 =  0.226

!JJS20090623      save  

    if (itimestep.eq.1) then
       do k = kts, kte
!dir$ vector aligned
         DO i=1,irestrict
             physc(i,k)=0.
             physe(i,k)=0.
             physd(i,k)=0.
             physs(i,k)=0.
             physf(i,k)=0.
             physm(i,k)=0.
             acphysc(i,k)=0.
             acphyse(i,k)=0.
             acphysd(i,k)=0.
             acphyss(i,k)=0.
             acphysf(i,k)=0.
             acphysm(i,k)=0.
       ENDDO
       enddo !k
      if ( wrf_dm_on_monitor() .and. i.eq.its .and. j.eq.jts ) then
       write(6, *) '    latent heating variables have been initialized to 0. at timestep = ', itimestep
      endif
   endif

!JJS  convert from mks to cgs, and move from WRF grid to GCE grid
      do k=kts,kte
!dir$ vector aligned
        DO i=1,irestrict
         rho(i,k)=rho_mks(i,k)*0.001
         p0(i,k)=p0_mks(i,k)*10.0
         pi(i,k)=pi_mks(i,k)
         ww1(i,k)=w_mks(i,k)*100.
         dpt(i,k)=ptwrf(i,k)
         dqv(i,k)=qvwrf(i,k)
         qcl(i,k)=qlwrf(i,k)
         qrn(i,k)=qrwrf(i,k)
         qci(i,k)=qiwrf(i,k)
         qcs(i,k)=qswrf(i,k)
         qcg(i,k)=qgwrf(i,k)
         qch(i,k)=qhwrf(i,k)
        ENDDO
      enddo !k

      do k=kts,kte
!dir$ vector aligned
        DO i=1,irestrict
            fv(i,k)=sqrt(rho(i,1)/rho(i,k))
        ENDDO
      enddo !k
!JJS

!
!     ******   THREE CLASSES OF ICE-PHASE   (LIN ET AL, 1983)  *********

      d2t=dt

      r2ig=1.
      r2is=1.
      r2ih=1.

!C  TAO 2007 END

      cmin=1.e-20
!JJS  10/7/2008
      cmin1=1.e-20
      cmin2=1.e-35

      xssi=0.16  ! maximum allowable ice supersaturation from SEL
      rssi=0.05  ! maximum allowable residual ice supersaturation SEL
      xsubi=0.70  ! ice RH below which qi must sublimate

!  HALLET-MOSSOP RIME SPLINTERING parameters
      ihalmos=1
      xnsplnt=370.     ! peak # splinters per milligram of rime
      xmsplnt=4.4e-8   ! mass of a splinter (from Ferrier 1994)
      hmtemp1=-2.
      hmtemp2=-4.
      hmtemp3=-6.
      hmtemp4=-8.

      it(:)=1
!!!!!!!!08/07/12
      f2=rd1*d2t     
      f3=rd2*d2t

      ft=dt/d2t

      bw3=bw+3.
      bs3=bs+3.
      bg3=bg+3.
      bh3=bh+3
      bsh5=2.5+bsh
      bgh5=2.5+bgh
      bhh5=2.5+bhh
      bwh5=2.5+bwh
      bw6=bw+6.
      bs6=bs+6.
!      betah=.5*beta

      r10t=rn10*d2t
      r25a=rn25

      rdt=1./d2t
      r11t=rn11*d2t
      r19t=rn19*d2t
      r19at=rn19a*d2t
      r20t=rn20*d2t
      r23t=rn23*d2t
      r30t=rn30*d2t
      r33t=rn33*d2t
      bg3_2=bg2+3
      bgh5_2=2.5+bgh2

!JJS 20150831         
! Calculate the threshold for reducing spurious evaporation
! a function of dx (grid resolution in km) 

      thresh_evap = -39.974 * exp(-1.194 * dx/1000.)

      if ( wrf_dm_on_monitor() .and. itimestep.eq.1 .and. &
           i.eq.its .and. j.eq.jts ) then
         print *,'GSFCGCE 4ice scheme inside satice improve=',improve
         print *,'dx, thresh_evap = ', dx, thresh_evap  
         print *,'no reduce suprious evaporation adjustment'
      endif

      Rc=1.e-3               ! cloud droplet radius 10 microns
      Ra=1.e-5               ! aerosol radius 0.1 microns
      Cna=500.               ! contact nuclei conc per cc
      Bhi=1.01e-2            ! pollen (Deihl et al. 2006)

!C    ******************************************************************

  do 1000 k=kts,kte
       kp=k+1
       tb0=0.
       qb0=0.

!dir$ vector aligned
       DO i=1,irestrict

! EMK BUG FIX...Initialize variable
#if ( WRF_CHEM == 1)
        ccn_out(i) = 0.e0
        icn_out(i) = 0.e0
        if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
              chem_opt == 302 .or. chem_opt == 303) .and. &
              (gsfcgce_gocart_coupling == 1) ) then
           icn_diag(i,k) = icn_out(i)  ! #/Litre
           nc_diag(i,k) = ccn_out(i)  ! #/cm3
        else
           icn_diag(i,k) = 0.
           nc_diag(i,k) = 0.
        end if
#endif
! EMK END

         rp0(i)=3.799052e3/p0(i,k)
         pi0(i)=pi(i,k)
         pir(i)=1./(pi(i,k))
         pr0(i)=1./p0(i,k)
         r00(i)=rho(i,k)
         rr0(i)=1./rho(i,k)
         rrs(i)=sqrt(rr0(i))
         rrq(i)=sqrt(rrs(i))
         f0(i,k)=al/cp/pi(i,k)
         fv0(i)=fv(i,k)
         fvs(i)=sqrt(fv(i,k))
         zrr(i)=1.e5*zrc*rrq(i)
         zsr(i)=1.e5*zsc*rrq(i)
         zgr(i)=1.e5*zgc*rrq(i)
         zhr(i)=1.e5*zhc*rrq(i)
         cp409(i)=c409*pi0(i)
         cv409(i)=c409*avc !
         cp580(i)=c580*pi0(i)
         cs580(i)=c580*asc !
         alvr(i)=r00(i)*alv
         afcp(i)=afc*pir(i)
         avcp(i)=avc*pir(i)
         ascp(i)=asc*pir(i)
         vscf(i)=vsc*fv0(i)
         vgcf(i)=vgc*fv0(i)
         vgcf2(i)=vgc2*fv0(i)
         vhcr(i)=vhc*rrs(i)
         dwvp(i)=c879*pr0(i)

         r3f(i)=rn3*fv0(i)
         r4f(i)=rn4*fv0(i)
         r5f(i)=rn5*fv0(i)
         r6f(i)=rn6*fv0(i)

         r12r(i)=rn12*r00(i)
         r14f(i)=rn14*fv0(i)
         r14f2(i)=rn142*fv0(i)
         r15f(i)=rn15*fv0(i)
         r15af(i)=rn15a*fv0(i) !4ice revised
         r15af2(i)=rn15a2*fv0(i) !4ice revised
         r18r(i)=rn18*rr0(i)
         r22f(i)=rn22*fv0(i)
         r25rt(i)=rn25*rr0(i)*d2t
         r32rt(i)=rn32*d2t*rrs(i)


!JJS added 10/1/2009          
         r7rf(i)=rn7*rr0(i)*fv0(i)
         r8rf(i)=rn8*rr0(i)*fv0(i)
         r9rf(i)=rn9*rr0(i)*fv0(i)
         r16rf(i)=rn16*rr0(i)*fv0(i)
         r101r(i)=rn101*rr0(i)
         r102rf(i)=rn102*rrs(i)*fvs(i)
         r191r(i)=rn191*rr0(i)
         r192rf(i)=rn192*rrs(i)*fvs(i)
         r192rf2(i)=rn192_2*rrs(i)*fvs(i)
         r331r(i)=rn331*rr0(i)
         r332rf(i)=rn332*rrs(i)*fvs(i)
         r34f(i)=rn34*fv0(i)

         r231r(i)=rn231*rr0(i)
         r232rf(i)=rn232*rrs(i)*fvs(i)

         h9r(i)=hn9*rr0(i)
         h10r(i)=hn10*rr0(i)
         h14r(i)=hn14*rrs(i)
         h15ar(i)=hn15a*rrs(i)
         h16r(i)=hn16*rr0(i)
         h17r(i)=hn17*rr0(i)
         h17aq(i)=hn17a*rrq(i)
         h19aq(i)=hn19a*rrq(i)
         h19rt(i)=hn19*rr0(i)*d2t
         h10ar(i)=hn10a*r00(i)
         h20t(i)=hn20*d2t !
         h20bq(i)=hn20b*rrq(i)

         pt(i)=dpt(i,k)
         qv(i)=dqv(i,k)
         qc(i)=qcl(i,k)
         qr(i)=qrn(i,k)
         qi(i)=qci(i,k)
         qs(i)=qcs(i,k)
         qg(i)=qcg(i,k)
         qh(i)=qch(i,k)
         if (qc(i) .le.  cmin) qc(i)=0.0
         if (qr(i) .le.  cmin) qr(i)=0.0
         if (qi(i) .le.  cmin) qi(i)=0.0
         if (qs(i) .le.  cmin) qs(i)=0.0
         if (qg(i) .le.  cmin) qg(i)=0.0
         if (qh(i) .le.  cmin) qh(i)=0.0
         tair(i)=(pt(i)+tb0)*pi0(i)
         tairc(i)=tair(i)-t0
         zr(i)=zrr(i)
         zs(i)=zsr(i)
         zg(i)=zgr(i)
         zh(i)=zhr(i)
         vr(i)=0.0 
         vs(i)=0.0
         vg(i)=0.0
         vi(i)=0.0
         vh(i)=0.0

         ftns(i)=1.
         ftng(i)=1.
         ftns0(i)=1.
         ftng0(i)=1.
         fros(i)=1.
         ftnh(i)=1.
         ftnh0(i)=1.

         cnd(i)=0.0
         dep(i)=0.
         ern(i)=0.0
         pint(i)=0.0
         pidep(i)=0.0

         psdep(i)=0.
         pgdep(i)=0.
         dd1(i)=0.
         dd(i)=0.
         pgsub(i)=0.
         psmlt(i)=0.
         pgmlt(i)=0.
         pimlt(i)=0.
         psacw(i)=0.
         piacr(i)=0.

         pssub(i)=0.0
         pgsub(i)=0.0

         psfw(i)=0.0
         psfi(i)=0.0
         pidep(i)=0.0

         pgfr(i)=0.
         psacr(i)=0.
         wgacr(i)=0.
         pihom(i)=0.
         pidw(i)=0.0
          
         psaut(i)=0.0
         psaci(i)=0.0
         praci(i)=0.0
         pwacs(i)=0.0
         qsacw(i)=0.0
          
         pracs(i)=0.0
         qracs(i)=0.0
         qsacr(i)=0.0
         pgaut(i)=0.0
 
         praut(i)=0.0
         pracw(i)=0.0
         pgfr(i)=0.0

         qracs(i)=0.0

         pgacs(i)=0.0
         qgacw(i)=0.0
         dgaci(i)=0.0
         dgacs(i)=0.0
         wgacs(i)=0.0
         wgaci(i)=0.0
         dgacw(i)=0.0
         dgacr(i)=0.
         pgwet(i)=0.0

         qgacr(i)=0.0

         pihom(i)=0.0
         pimlt(i)=0.0
         pidw(i)=0.0
         pimm(i)=0.0
         pcfr(i)=0.0

         pihms(i)=0.0 
         pihmg(i)=0.0
         ftns(i)=1.
         ftng(i)=1.
         pmlts(i)=0.0
         pmltg(i)=0.0

         phfr(i)=0.0
         phmlt(i)=0.0
         dhacw(i)=0.0
         qhacw(i)=0.0
         dhacr(i)=0.0
         qhacr(i)=0.0
         whacr(i)=0.0
         dhaci(i)=0.0
         whaci(i)=0.0
         dhacs(i)=0.0
         phacs(i)=0.0
         whacs(i)=0.0
         dhacg(i)=0.0
         whacg(i)=0.0
         phwet(i)=0.0
         phdep(i)=0.0
         phsub(i)=0.0
         pvapg(i)=0.0
         pvaph(i)=0.0
         primh(i)=0.0

         dlt4(i)=0.0
         dlt3(i)=0.0
         dlt2(i)=0.0

!     ******************************************************************
!     ***   Y1 : DYNAMIC VISCOSITY OF AIR (U)
!     ***   DWV : DIFFUSIVITY OF WATER VAPOR IN AIR (PI)
!     ***   TCA : THERMAL CONDUCTIVITY OF AIR (KA)
!     ***   Y2 : KINETIC VISCOSITY (V)

         y1(i)=c149*tair(i)**1.5/(tair(i)+120.)
         dwv(i)=dwvp(i)*tair(i)**1.81
         tca(i)=c141*y1(i)
         scv(i)=1./((rr0(i)*y1(i))**.1666667*dwv(i)**.3333333)

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict

!JJS   for calculating processes related to both ice and warm rain

!     ***   COMPUTE ZR,ZS,ZG,VR,VS,VG      *****************************

            if (qr(i) .gt. cmin) then
	       dd(i)=r00(i)*qr(i)
	       y1(i)=sqrt(dd(i))
	       y2(i)=sqrt(y1(i))
	       zr(i)=zrc/y2(i)
            endif

            call vqrqi(1,r00(i),fv0(i),qr(i),qc(i),tair(i),vr(i))
            call vqrqi(2,r00(i),fv0(i),qi(i),qc(i),tair(i),vi(i))

            ftns(i)=1.
            ftns0(i)=1.

            qhz2=qhwrf(i,k)
            qgz2=qgwrf(i,k)
            if (k .lt. kte-2 .and. tairc(i) .ge. -5) then
               qhz2=qhwrf(i,k+1)
               qgz2=qgwrf(i,k+1)
            endif
            call sgmap(1,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftns0(i))
            call sgmap(3,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),fros0(i))

	    if (qs(i) .gt. cmin) then
	       dd(i)=r00(i)*qs(i)
	       y1(i)=dd(i)**.25
               ftns(i)=1.
               ftns(i)=ftns0(i)**0.25
               fros(i)=1                                        !improve4
               fros(i)=fros0(i)**0.25        !improve4
               ZS(i)=ZSC/Y1(i)*ftns(i)*fros(i)            !improve4
               ftns(i)=ftns0(i)**bsq
               fros(i)=fros0(i)**bsq         !improve4
               VS(i)=MAX(vscf(i)*DD(i)**BSQ/ftns(i)/fros(i), 0.)
            endif

            ftng(i)=1.
            ftng0(i)=1.
            call sgmap(2,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftng0(i))

	    if (qg(i) .gt. cmin) then
	       dd(i)=r00(i)*qg(i)
	       y1(i)=dd(i)**.25
               ftng(i)=1.
               ftng(i)=ftng0(i)**0.25

               zg(i)=zgc/y1(i)*ftng(i)
               if(dd(i).gt.qrog2) zg(i)=zgc2/y1(i)*ftng(i)

               ftng(i)=ftng0(i)**bgq
	       vg(i)=max(vgcf(i)*dd(i)**bgq/ftng(i), 0.0)
               if(dd(i).gt.qrog2)then
               ftng(i)=ftng0(i)**bgq2
               vg(i)=max(vgcf2(i)*dd(i)**bgq2/ftng(i), 0.e0)
              endif !improve4
           endif !qg
           
           call sgmap(4,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftnh0(i))

           if (qh(i) .gt. cmin) then
              dd(i)=r00(i)*qh(i)
              y1(i)=dd(i)**.25
              ftnh(i)=ftnh0(i)**0.25
              zh(i)=zhc/y1(i)*ftnh(i)
              ftnh(i)=ftnh0(i)**bhq
              vh(i)=max(vhcr(i)*dd(i)**bhq/ftnh(i), 0.0)
            endif

            if (qr(i) .le. cmin1) vr(i)=0.0
            if (qs(i) .le. cmin1) vs(i)=0.0
            if (qg(i) .le. cmin1) vg(i)=0.0
            if (qi(i) .le. cmin1) vi(i)=0.0
            if (qh(i) .le. cmin1) vh(i)=0.0

!!     ******************************************************************
!!     ***   Y1 : DYNAMIC VISCOSITY OF AIR (U)
!!     ***   DWV : DIFFUSIVITY OF WATER VAPOR IN AIR (PI)
!!     ***   TCA : THERMAL CONDUCTIVITY OF AIR (KA)
!!     ***   Y2 : KINETIC VISCOSITY (V)
!

!*  1 * PSAUT : AUTOCONVERSION OF QI TO QS                        ***1**
!*  3 * PSACI : ACCRETION OF QI TO QS                             ***3**
!*  4 * PSACW : ACCRETION OF QC BY QS (RIMING) (QSACW FOR PSMLT)  ***4**
!*  5 * PRACI : ACCRETION OF QI BY QR                             ***5**
!*  6 * PIACR : ACCRETION OF QR OR QG BY QI                       ***6**
!* 34 * pwacs : collection of qs by qc                            **34**

          pihms(i)=0.0 
          pihmg(i)=0.0 
          psaut(i)=0.0
          psaci(i)=0.0
          praci(i)=0.0
          piacr(i)=0.0
          psacw(i)=0.0
          pwacs(i)=0.0
          qsacw(i)=0.0
          ftns(i)=1.
          ftng(i)=1.
          ftnh(i)=1.
	  ftns(i)=ftns0(i)
	  ftng(i)=ftng0(i)

          if (tair(i).lt.t0) then

             rn1=1./300.
             bnd1=6.e-5
             esi(i)=0.25
             psaut(i)=r2is*max(rn1*esi(i)*(qi(i)-bnd1*fv0(i)*fv0(i)) ,0.0) 
             ftns(i)=ftns0(i)
             ftng(i)=ftng0(i)
             fros(i)=fros0(i)
             ftnh(i)=ftnh0(i)
             esi(i)=1.0 !esi constant in consatrh via r3f/rn3; use esi( ) to make f(T)/f(q)
             dmicrons=(r00(i)*qs(i)/(roqs*fros(i))/cpi/(tns*ftns(i)))**.25*1.e4
             esi(i)=min(1.,(dmicrons/375.)**3.) ! f(dmicrons)
 
             y1(i)=1.0
             if (vs(i).gt.0.) y1(i)=abs((vs(i)-vi(i))  &
                                                 /vs(i))
             psaci(i)=r2is*y1(i)*r3f(i)*qi(i)/zs(i)**bs3*ftns(i)*esi(i)
             if(qs(i).le.cmin) psaci(i)=0.
             psacw(i)=r2is*r4f(i)*qc(i)/zs(i)**bs3*ftns(i)
             if(qs(i).le.cmin) psacw(i)=0.
             if (ihalmos.eq.1)then
                y2(i)=0.
                if((tairc(i).le.hmtemp1).and.(tairc(i).ge.hmtemp4))  &
                                                         y2(i)=0.5
                if((tairc(i).le.hmtemp2).and.(tairc(i).ge.hmtemp3))  &
                                                         y2(i)=1.
                pihms(i)=r2ih*psacw(i)*y2(i)*xnsplnt*1000.*xmsplnt
                psacw(i)=psacw(i)-pihms(i)
             endif
             pwacs(i)=r2is*r34f(i)*qc(i)/zs(i)**bs6*ftns(i)*fros(i)      !improve4
             if(qs(i).le.cmin) pwacs(i)=0.
             y1(i)=1./zr(i)
             y2(i)=y1(i)*y1(i)
             y3(i)=y1(i)*y2(i)
             y5(i)=1.0
             if (vr(i).gt.0.) y5(i)=abs((vr(i)-vi(i))   &
                                                         /vr(i))
             dd(i)=y5(i)*r5f(i)*qi(i)*y3(i)*(rn50+rn51*y1(i)             &
                                        +rn52*y2(i)+rn53*y3(i))
             praci(i)=max(dd(i),0.0)
             if (qr(i) .le. cmin) praci(i)=0.
             y4(i)=y3(i)*y3(i)
             dd1(i)=y5(i)*r6f(i)*qi(i)*y4(i)*(rn60+rn61*y1(i)       &
                                     +rn62*y2(i)+rn63*y3(i))

             piacr(i)=max(dd1(i),0.0)
             if (qr(i) .le. cmin) piacr(i)=0.
          else
             qsacw(i)=r2is*r4f(i)*qc(i)/zs(i)**bs3*ftns(i)
             if (qs(i) .le. cmin) psacw(i)=0.
          endif   !tairc 


!23456789012345678901234567890123456789012345678901234567890123456789012
!* 21 * PRAUT   AUTOCONVERSION OF QC TO QR                        **21**
!* 22 * PRACW : ACCRETION OF QC BY QR                             **22**

#if (WRF_CHEM == 1)
!JJS 20110602 vvvvv
             ! EMK...Only execute when GOCART and coupling are selected
             if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
                   chem_opt == 302 .or. chem_opt == 303) .and. &
                   (gsfcgce_gocart_coupling == 1) ) then
                !      sat vapor pressure [hPa,mb]
                e_sat = 6.11 * exp( 5423. *( 1.0/273.15 - 1./tair(i) ) )
                !      dry air vapor pressure [hPa, mb]
                e_dry = qv(i) / ( qv(i) + 0.622 ) * p0(i,k) * 1.e-3  ! p0 in [g*cm/s2/cm2]
                rh_rad = max(1.e-6, e_dry/e_sat*100.)  ! relative humidity [%]
                super_sat = max(0.001, rh_rad - 100.e0) !super saturation [%]
                !
                ! convert gocart aerosol mass conc to CN
                !
                call mass2ccn(tair(i),super_sat,aero(i,k,:),ccn_out(i) )
                !             nc_cgs(i,k)  = max(100., ccn_out)  !diagnostic cloud droplet conc  [#/cm3]
                ccn_out(i) = max(100., ccn_out(i))

!                rho_dryair = p0(i,k) / ( tair(i) * 2.87 * 1.0e6) ! dry air density [g/cm3]
                L_cloud = qc(i) * rho(i,k)             ! cloud water [g/cm3]
                !  g/g        g/cm3
                !             call auto_conversion( L_cloud, nc_cgs(i,k), P_liu_daum, re_liu_daum )
                call auto_conversion( L_cloud, ccn_out(i), P_liu_daum, re_liu_daum )

                praut(i) = P_liu_daum / rho(i,k)  !autoconversion rate [g/g s-1]
             else
                praut(i)=max(rn21*(qc(i)-bnd21),0.0)
             end if ! if (gsfcgce_gocart_coupling == 1)
#else
             praut(i)=max(rn21*(qc(i)-bnd21),0.0)
!JJS 20110602 ^^^^^
#endif

             y1(i)=1./zr(i)
             y2(i)=y1(i)*y1(i)
             y3(i)=y1(i)*y2(i)
             y4(i)=r22f(i)*qc(i)*y3(i)*(rn50+rn51*y1(i)+  &
                     rn52*y2(i)+rn53*y3(i))
             pracw(i)=max(y4(i), 0.0) 
          if(qr(i) .le. cmin) pracw(i)=0.

!* 12 * PSFW : BERGERON PROCESSES FOR QS (KOENING, 1971)          **12**
!* 13 * PSFI : BERGERON PROCESSES FOR QS                          **13**

          pidep(i)=0.0
          psfw(i)=0.0
          psfi(i)=0.0

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict

            if (tair(i) .lt. t0) then
               y1(i)=max( min(tairc(i), -1.), -31.)
               it(i)=int(abs(y1(i)))
               y1(i)=rn12a(it(i))
               y2(i)=rn12b(it(i))
               y3(i)=rn13(it(i))
               psfw(i)=r2is*max(d2t*y1(i)*(y2(i)+r12r(i)*qc(i))*  &
                            qi(i), 0.0)
               psfi(i)=r2is*y3(i)*qi(i)
!
               y4(i)=1./(tair(i)-c358)
               y5(i)=1./(tair(i)-c76)
               qsw(i)=rp0(i)*exp(c172-c409*y4(i))
               qsi(i)=rp0(i)*exp(c218-c580*y5(i))
               hfact=(qv(i)+qb0-qsi(i))/(qsw(i)-qsi(i)+cmin1)
                    ! add cmin1 to prevent overflow of hfact
               if(hfact.gt.1.) hfact=1.
               sfact=1
               SSI(i)=(qv(i)+qb0)/qsi(i)-1.

               fssi=min(xssi,max(rssi,xssi*(tairc(i)+44.)/(44.0-38.0)))  !improve4 max ssi f(tair)
               fssi=rssi
               wssi=ww1(i,k)/100.-2.0
               if(wssi.gt.0.) fssi=rssi+min(xssi,wssi*0.01)
               fssi=min(ssi(i),fssi)

!  STEVE : PLEASE CHECK
               if (tairc(i).le.-5.) then                         !meyers
                  r_nci=max(1.e-3*exp(-.639+12.96*fssi),0.528e-3)  !meyers et al. 
               else
                  r_nci=min(1.e-3*exp(-.639+12.96*fssi),0.528e-3)  !meyers et al. 
               endif  !tairc

               if (r_nci.gt.15.) r_nci=15.                  !cap at 15000/liter

! Cooper curve
               if( tairc(i) .lt. -40.0 ) then
                 c_nci = 5.0e-6*exp(0.304*40.0)
               else
                 c_nci = 5.0e-6*exp(0.304*abs(tairc(i)))
               end if
               r_nci = c_nci
! JDC cap r_nci to the amount corresponding to crystal size of ami50
               r_nci = max(r_nci,r00(i)*qi(i)/ami50)

#if (WRF_CHEM == 1)
               ! EMK...Only execute when GOCART and coupling is turned on.
               if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
                     chem_opt == 302 .or. chem_opt == 303) .and. &
                     (gsfcgce_gocart_coupling == 1) ) then
                  !JJS 20110602 vvvvv
                  ! Conversion rate of cloud water to ice in the Bergeron porcess based on Meyer + DeMott formulae
                  !
                  ! convert gocart aerosol mass conc to IN
                  !      p0 need to be converted from g*cm/s2/cm2 to mb (hPa)
                  !                call mass2icn(p0(i,k)*0.001,tair(i),aero(i,k,:), icn_out)
!                  call mass2icn(p0(i,k)*0.001,tair(i),aero(i,k,:), icn_out,i,k)
                  ! EMK...mass2icn requires i,j,k indices, but only prints
                  ! the values when an error occurs.  In no case are the i,j,k
                  ! used to access a value in an array.  
                  ! We will simply pass a bogus value of j=1 in the call
                  ! below.
                  call mass2icn(p0(i,k)*0.001,tair(i),aero(i,k,:), icn_out(i),&
                       i,1,k)

                  icn_out(i) = min(1.e3, max(0.01e0 ,  icn_out(i)) )
                  r_nci = icn_out(i) * 1.e-3  !DeMotto's formuale
                  !JJS 20110602 ^^^^^
               end if ! if (gsfcgce_gocart_coupling == 1)
#endif

               dd(i)=min((r00(i)*qi(i)/r_nci), ami40)   !mean cloud ice mass
               yy1=1.-aa2(it(i))                   
               sfact=(AMI50**YY1-AMI40**YY1)/(AMI50**YY1-dd(i)**YY1)

!JDC water vapor diffusivity correction term
               esi(i)  = qsi(i)/rp0(i)*c610
               y3(i)   = 1./tair(i)
!               term1     = y3(i)*(rn10a*y3(i)-rn10b)
               term1     = y3(i)*(rn20a*y3(i)-rn20b)
               term2     = rn10c*tair(i)/esi(i)
               dd(i)   = term1+term2
               fdwv      = dd(i)/(term1+term2*dwv0/dwv(i))
               psfw(i) = max( d2t*y1(i)*fdwv*(y2(i)*fdwv   &
                               + r12r(i)*qc(i))*qi(i),0.0 )

               psfw(i)=0.0

               if (hfact.gt.0.) then
                  psfi(i)=r2is*psfi(i)*hfact*sfact*fdwv
               else
                  psfi(i)=0.
               endif !hfact

               if(qi(i).le.1.e-5*fv0(i)*fv0(i)) psfi(i)=0.0

            endif   !tair

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict

!TTT***** QG=QG+MIN(PGDRY,PGWET)
!*  9 * PGACS : ACCRETION OF QS BY QG (DGACS,WGACS: DRY AND WET)  ***9**
!* 14 * DGACW : ACCRETION OF QC BY QG (QGACW FOR PGMLT)           **14**
!* 16 * DGACR : ACCRETION OF QR TO QG (QGACR FOR PGMLT)           **16**
!*******PGDRY : DGACW+DGACI+DGACR+DGACS                           ******
!* 15 * DGACI : ACCRETION OF QI BY QG (WGACI FOR WET GROWTH)      **15**
!* 17 * PGWET : WET GROWTH OF QG                                  **17**
!*  Steve turned off PGWET, set PGWET = 0.
!*  Steve turned off wgaci, set wgaci = 0.                           

         y1(i)=abs( vg(i)-vs(i) )
         y2(i)=zs(i)*zg(i)
         y3(i)=5./y2(i)
         y4(i)=.08*y3(i)*y3(i)
         y5(i)=.05*y3(i)*y4(i)
         y2(i)=y1(i)*(y3(i)/zs(i)**5+y4(i)/zs(i)**3        &
                         +y5(i)/zs(i))

         pgacs(i)=r2ig*r2is*r9rf(i)*y2(i)*ftns(i)*ftng(i)*fros(i) !improve4
        if(qs(i).le.cmin) pgacs(i)=0.
        if(qg(i).le.cmin) pgacs(i)=0.
         dgacs(i)=pgacs(i)
         dgacs(i)=0.0             !Lang et al. 2007
!crh     wgacs(i)=10.*r9rf(i)*y2(i)
         wgacs(i)=0.0
         wgacs(i)=10.*r9rf(i)*y2(i)*ftns(i)*ftng(i)*fros(i)         !4ice revised
!        if(r00(i)*qg(i).gt.qrog2)then                                      !4ice revised
!         wgacs(i)=10.*r9rf(i)*y2(i)*ftns(i)*ftng(i)*fros(i)        !4ice revised
!        endif                                                             !4ice revised
         if(qg(i).le.cmin) wgacs(i)=0.                !4ice revised2
         if(qs(i).le.cmin) wgacs(i)=0.                !4ice revised2

        dhacs(i)=0.0
        whacs(i)=0.0
        y1(i)=abs( vh(i)-vs(i) )
        y2(i)=zs(i)*zh(i)
        y3(i)=5./y2(i)
        y4(i)=.08*y3(i)*y3(i)
        y5(i)=.05*y3(i)*y4(i)
        dd(i)=Y1(i)*(Y3(i)/ZS(i)**5+Y4(i)/ZS(i)**3        &
               +Y5(i)/ZS(i))
        whacs(i)=r2ih*r2is*min(h9r(i)*dd(i)*ftnh(i)*ftns(i)*fros(i), &
				 qs(i)/d2t)
        if(qs(i).le.cmin) whacs(i)=0.
        if(qh(i).le.cmin) whacs(i)=0.

        dhacg(i)=0.0
        whacg(i)=0.0
        y1(i)=abs( vh(i)-vg(i) )
        y2(i)=zg(i)*zh(i)
        y3(i)=5./y2(i)
        y4(i)=.08*y3(i)*y3(i)
        y5(i)=.05*y3(i)*y4(i)
        dd(i)=Y1(i)*(Y3(i)/ZG(i)**5+Y4(i)/ZG(i)**3        &
               +Y5(i)/ZG(i))
        whacg(i)=r2ih*r2ig*min(h10r(i)*dd(i)*ftnh(i)*ftng(i),  &
				 qg(i)/d2t)
        if(r00(i)*qg(i).gt.qrog2)  &
	 whacg(i)=whacg(i)/roqg*roqg2*0.5        !reduce ehg for high dens grp
        if(qg(i).le.cmin) whacg(i)=0.
        if(qh(i).le.cmin) whacg(i)=0.

        y1(i)=1./zg(i)**bg3
        esi(i)=1.0 !egc constant in consatrh via r14f/rn14; use esi( ) to make f(T)/f(q)
        dmicrong=(r00(i)*qg(i)/roqg/cpi/(tng*ftng(i)))**.25*1.e4
        if(r00(i)*qg(i).gt.qrog2)then
         y1(i)=1./zg(i)**bg3_2
         dmicrong=(r00(i)*qg(i)/roqg2/cpi/(tng*ftng(i)))**.25*1.e4
        endif
        esi(i)=min(1.,(dmicrong/500.)**1.1)       ! f(dmicrons)

        dgacw(i)= r2ig*esi(i)*r14f(i)*qc(i)*y1(i)*ftng(i)
        if(r00(i)*qg(i).gt.qrog2)  &
         dgacw(i)=r2ig*esi(i)*r14f2(i)*qc(i)*y1(i)*ftng(i)
        if(qg(i).le.cmin) dgacw(i)=0.

        dhacw(i)=0.0                                                     !4ice
        y2(i)=1./zh(i)**bh3                                           !4ice
        dhacw(i)=r2ih*max(h14r(i)*qc(i)*y2(i)*ftnh(i), 0.0)          !4ice
        if(qh(i).le.cmin) dhacw(i)=0.
        
        if(ihalmos.eq.1)then
         y2(i)=0.
         if ((tairc(i).le.hmtemp1).and.(tairc(i).ge.hmtemp4))  &
                                                    y2(i)=0.5
         if ((tairc(i).le.hmtemp2).and.(tairc(i).ge.hmtemp3))  &
                                                    y2(i)=1.
         pihmg(i)=r2ig*dgacw(i)*y2(i)*xnsplnt*1000.*xmsplnt
         dgacw(i)=r2ig*(dgacw(i)-pihmg(i))
         pihmh(i)=0.0                                                   !4ice
         pihmh(i)=r2ih*dhacw(i)*y2(i)*xnsplnt*1000.*xmsplnt            !4ice
         dhacw(i)=r2ih*(dhacw(i)-pihmh(i))                               !4ice
        endif !ihalmos

        qgacw(i)=r2ig*dgacw(i)
        qhacw(i)=r2ih*dhacw(i)                                              !4ice
        y1(i)=1./zg(i)**bg3
        y5(i)=1.0
        if (vg(i).gt.0.) y5(i)=abs((vg(i)-vi(i))/vg(i))
        dgaci(i)= r2ig*y5(i)*r15f(i)*qi(i)*y1(i)*ftng(i)
        if(qg(i).le.cmin) dgaci(i)=0.
        dgaci(i)=0.0
        wgaci(i)=0.0
        wgaci(i)=y5(i)*r15af(i)*qi(i)*y1(i)*ftng(i)                !4ice revised
        if(r00(i)*qg(i).gt.qrog2)then                                      !4ice revised
          y1(i)=1./zg(i)**bg3_2
          wgaci(i)=y5(i)*r15af2(i)*qi(i)*y1(i)*ftng(i)              !4ice revised
        endif                                                             !4ice revised
        if(qg(i).le.cmin) wgaci(i)=0.                !4ice revised2

        dhaci(i)=0.0                                                     !4ice
        whaci(i)=0.0                                                     !4ice
        y5(i)=1.0                                                      !4ice
        if(vh(i).gt.0.) y5(i)=abs((vh(i)-vi(i))/vh(i))         !4ice
        y2(i)=1./zh(i)**bh3                                          !4ice
        whaci(i)=r2ih*min(y5(i)*h15ar(i)*qi(i)*y2(i)*ftnh(i),  &
	qi(i)/d2t)   !4ice
        if(qh(i).le.cmin) whaci(i)=0.

        y1(i)=abs( vg(i)-vr(i) )
        y2(i)=zr(i)*zg(i)
        y3(i)=5./y2(i)
        y4(i)=.08*y3(i)*y3(i)
        y5(i)=.05*y3(i)*y4(i)
        dd(i)=r16rf(i)*y1(i)*(y3(i)/zr(i)**5+y4(i)/zr(i)**3 &
                 +y5(i)/zr(i))*ftng(i)
        dgacr(i)=r2ig*max(dd(i),0.0)
        if(qg(i).le.cmin) dgacr(i)=0.
        if(qr(i).le.cmin) dgacr(i)=0.
        qgacr(i)=dgacr(i)

        pracg(i)=0.
        qracg(i)=0.
        y2(i)=zr(i)*zg(i)
        y3(i)=5./y2(i)
        y4(i)=.08*y3(i)*y3(i)
        y5(i)=.05*y3(i)*y4(i)
        pracg(i)=r16rf(i)/roqr*roqg*y1(i)*(y3(i)/zg(i)**5+y4(i) &
                   /zg(i)**3+y5(i)/zg(i))*ftng(i)
        if(r00(i)*qg(i).gt.qrog2) pracg(i)=pracg(i)/roqg*roqg2
        if(qg(i).le.cmin) pracg(i)=0.
        if(qr(i).le.cmin) pracg(i)=0.
        qracg(i)=min(d2t*pracg(i), qg(i))

        y1(i)=abs( vh(i)-vr(i) )
        y2(i)=zr(i)*zh(i)
        y3(i)=5./y2(i)
        y4(i)=.08*y3(i)*y3(i)
        y5(i)=.05*y3(i)*y4(i)
        DD(i)=h16r(i)*Y1(i)*ftnh(i)*(Y3(i)/ZR(i)**5   &
		+Y4(i)/ZR(i)**3+Y5(i)/ZR(i))
        dhacr(i)=r2ih*max(dd(i), 0.0)
        if(qh(i).le.cmin) dhacr(i)=0.
        if(qr(i).le.cmin) dhacr(i)=0.
        qhacr(i)=dhacr(i)

        if (tair(i) .ge. t0) then
          dgacs(i)=0.0
          wgacs(i)=0.0   !4ice revised
          whacs(i)=0.0
          whacg(i)=0.0
          dgacw(i)=0.0
          dhacw(i)=0.0                                                   !ice4
          dgaci(i)=0.0
          wgaci(i)=0.0   !4ice revised
          whaci(i)=0.0                                                   !ice4
          dgacr(i)=0.0
          pracg(i)=0.0
          dhacr(i)=0.0
        else
          pgacs(i)=0.0
          qgacw(i)=0.0
          qhacw(i)=0.0                                                   !ice4
          qgacr(i)=0.0
          qracg(i)=0.0
          qhacr(i)=0.0
        endif
 
        PGWET(i)=0.0
        if(tair(i) .lt. t0)then                         !4ice revised

! NUWRF corrected by Steve and Roger to prevent division by 0
           y1(i)=1./(alf+rn17c*max(tairc(i),-75.0)) 
           y2(i)=r191r(i)/zg(i)**2+r192rf(i)/zg(i)**bgh5                   !4ice revised chern
           if(r00(i)*qg(i).gt.qrog2)      &                                 !4ice revised chern
            y2(i)=(r191r(i)/zg(i)**2+r192rf2(i)/zg(i)**bgh5_2)              !4ice revised chern
           Y4(i)=ALVR(i)*DWV(i)*(RP0(i)-(QV(i)+QB0))-TCA(i)*TAIRC(i)   !4ice revised
           DD(i)=Y1(i)*(rn20*ftng(i)*Y4(i)*Y2(i)+(WGACI(i) &    !4ice revised chern
                 +WGACS(i))*(ALF+RN17B*TAIRC(i)))                       !4ice revised
           PGWET(i)=max(DD(i), 0.0)                                    !4ice revised
           if(qg(i).le.cmin) pgwet(i)=0.                               !4ice revised
        endif                                                              !4ice revised



        phwet(i)=0.0
        if (tair(i) .lt. t0) then
           y1(i)=1./(alf+rn17c*tairc(i))
           y3(i)=.78/zh(i)**2+h17aq(i)*scv(i)/zh(i)**bhh5
           Y4(i)=ALVR(i)*DWV(i)*(RP0(i)-(QV(i)+QB0))-TCA(i)*TAIRC(i)
           DD(i)=Y1(i)*(h17r(i)*ftnh(i)*Y4(i)*Y3(i)+(WHACI(i)+WHACS(i)   &
                   +WHACG(i))*(ALF+RN17B*TAIRC(i)))
           phwet(i)=r2ih*max(DD(i), 0.0)
           if(qh(i).le.cmin) phwet(i)=0.
         endif !tair

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict

 !********   HANDLING THE NEGATIVE CLOUD WATER (QC)    ******************
        y1(i)=qc(i)/d2t
          psacw(i)=min(y1(i), psacw(i))
          pihms(i)=min(y1(i), pihms(i))
          praut(i)=min(y1(i), praut(i))
          pracw(i)=min(y1(i), pracw(i))
          psfw(i)= min(y1(i), psfw(i))
          dgacw(i)=min(y1(i), dgacw(i))
          pihmg(i)=min(y1(i), pihmg(i))
          dhacw(i)=min(y1(i), dhacw(i))                              !4ice
          pihmh(i)=min(y1(i), pihmh(i))                              !4ice
          qsacw(i)=min(y1(i), qsacw(i))
          qgacw(i)=min(y1(i), qgacw(i))
          qhacw(i)=min(y1(i), qhacw(i))                              !4ice

        y1(i)=d2t*(psacw(i)+praut(i)+pracw(i)+psfw(i)            &
               +dgacw(i)+qsacw(i)+qgacw(i)+pihms(i)+pihmg(i)     &
               +dhacw(i)+qhacw(i)+pihmh(i))                          !4ice

        qc(i)=qc(i)-y1(i)
!
        if (qc(i) .lt. 0.0) then
           y2(i)=1.
           if (y1(i) .ne. 0.) y2(i)=qc(i)/y1(i)+1.
           psacw(i)=psacw(i)*y2(i)
           praut(i)=praut(i)*y2(i)
           pracw(i)=pracw(i)*y2(i)
           psfw(i)=psfw(i)*y2(i)
           dgacw(i)=dgacw(i)*y2(i)
           dhacw(i)=dhacw(i)*y2(i)
           qsacw(i)=qsacw(i)*y2(i)
           qgacw(i)=qgacw(i)*y2(i)
           qhacw(i)=qhacw(i)*y2(i)
           pihms(i)=pihms(i)*y2(i)
           pihmg(i)=pihmg(i)*y2(i)
           pihmh(i)=pihmh(i)*y2(i)                                   !4ice
           qc(i)=0.0
        endif

!                                                                          !4ice revised
!        convert wet graupel to hail                                       !4ice revised
!                                                                          !4ice revised
         y1(i)=dgacw(i)+dgacr(i)                                     !4ice revised
         if(Y1(i).lt..95*pgwet(i).or.y1(i).eq.0.)THEN                !4ice revised
           wgaci(i)=0.0                                                  !4ice revised
           wgacs(i)=0.0                                                  !4ice revised
         endif                                                             !4ice revised
         pg2h(i)=0.0                                                     !4ice revised
         if(y1(i).gt.0..and.pgwet(i).gt.0..and.  &                     !4ice revised
            Y1(i).gt.1.0*pgwet(i))THEN                                 !4ice revised
!test     pg2h(i)=2.0*y1(i)                                            !4ice revised
          pg2h(i)=qg(i)/d2t                                            !4ice revised
!         pg2h(i)=qg(i)*0.647232/d2t                                   !4ice revised Deff
          pg2h(i)=min(pg2h(i), qg(i)/d2t)                            !4ice revised
         endif                                                             !4ice revised

         whacr(i)=phwet(i)-dhacw(i)-whaci(i)-whacs(i)-whacg(i)    !4ice
         y2(i)=dhacw(i)+dhacr(i)                                        !4ice
          if(y2(i).lt.0.95*phwet(i).or.y2(i).eq.0.) THEN
            whacr(i)=0.0                                                    !4ice
            whaci(i)=0.0                                                    !4ice 
            whacg(i)=0.0
            whacs(i)=0.0
          endif
          
         primh(i)=0.0
         if(y2(i).gt.0..and.phwet(i).gt.0..and. Y2(i).lt..95*phwet(i)) THEN

          rim_frac(i)=2.0*min((1.-y2(i)/phwet(i))**2,1.0)
          rim_frac(i)=rim_frac(i)*min((tairc(i)/(t00-t0))**2,1.0)
!         primh(i)=rim_frac(i)*y2(i)
          primh(i)=rim_frac(i)*dhacw(i)
          primh(i)=min(primh(i), qh(i)/d2t)
         endif

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict

!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!********   HANDLING THE NEGATIVE CLOUD ICE (QI)      ******************
        y1(i)=qi(i)/d2t
        psaut(i)=min(y1(i), psaut(i))
        psaci(i)=min(y1(i), psaci(i))
        praci(i)=min(y1(i), praci(i))
        psfi(i)= min(y1(i), psfi(i))
        dgaci(i)=min(y1(i), dgaci(i))
        wgaci(i)=min(y1(i), wgaci(i))
        whaci(i)=min(y1(i), whaci(i))                             !4ice

        qi(i)=qi(i)+d2t*(pihms(i)+pihmg(i)+pihmh(i))             !fix SEL

        y1(i)=d2t*(psaut(i)+psaci(i)+praci(i)+psfi(i)       &
                    +dgaci(i)+wgaci(i)+whaci(i))      

        qi(i)=qi(i)-y1(i)
!
        if (qi(i) .lt. 0.0) then
           y2(i)=1.
           if (y1(i) .ne. 0.0) y2(i)=qi(i)/y1(i)+1.
           psaut(i)=psaut(i)*y2(i)
           psaci(i)=psaci(i)*y2(i)
           praci(i)=praci(i)*y2(i)
           psfi(i)=psfi(i)*y2(i)
           dgaci(i)=dgaci(i)*y2(i)
           wgaci(i)=wgaci(i)*y2(i)
           whaci(i)=whaci(i)*y2(i)                                   !4ice
           qi(i)=0.0
        endif

            wgacr(i)=qgacr(i)+qgacw(i)
            dlt3(i)=0.0
              if (qr(i) .lt. 1.e-4) dlt3(i)=1.
            dlt4(i)=1.

          if (qc(i) .gt. 5.e-4) dlt4(i)=0.0

              if (qs(i) .le. 1.e-4) dlt4(i)=1.

            if (tair(i) .ge. t0) then
               dlt3(i)=0.0
               dlt4(i)=0.0
            endif
         
            pr(i)=d2t*(qsacw(i)+praut(i)+pracw(i)+wgacr(i)   &
                   +qhacw(i)-qgacr(i))
            ps(i)=d2t*(psaut(i)+psaci(i)+dlt4(i)*psacw(i)    &  
                   +psfw(i)+psfi(i))
            pg(i)=d2t*(dlt3(i)*praci(i)+dgaci(i)               &
                   +wgaci(i)+dgacw(i)+(1.-dlt4(i))*psacw(i)    &
                   +primh(i))    !4ice revised


!*  7 * PRACS : ACCRETION OF QS BY QR                             ***7**
!*  8 * PSACR : ACCRETION OF QR BY QS (QSACR FOR PSMLT)           ***8**
!*  2 * PGAUT : AUTOCONVERSION OF QS TO QG                        ***2**
!* 18 * PGFR : FREEZING OF QR TO QG                               **18**

       qracs(i)=0.0
       y1(i)=abs(vr(i)-vs(i))
       y2(i)=zr(i)*zs(i)
       y3(i)=5./y2(i)
       y4(i)=.08*y3(i)*y3(i)
       y5(i)=.05*y3(i)*y4(i)

       pracs(i)=r2ig*r2is*(r7rf(i)*y1(i)*(y3(i)/zs(i)**5 &                   !improve4
                  +y4(i)/zs(i)**3+y5(i)/zs(i))*ftns(i)*fros(i))       !improve4
        if(qs(i).le.cmin) pracs(i)=0.
        if(qr(i).le.cmin) pracs(i)=0.
       qracs(i)=r2ig*r2is*min(d2t*pracs(i), qs(i))
       psacr(i)=r2is*(r8rf(i)*y1(i)*(y3(i)/zr(i)**5 &
                  +y4(i)/zr(i)**3+y5(i)/zr(i))*ftns(i))
        if(qs(i).le.cmin) psacr(i)=0.
        if(qr(i).le.cmin) psacr(i)=0.
       qsacr(i)=psacr(i)

         if (tair(i) .ge. t0) then
          pracs(i)=0.0
          psacr(i)=0.0
         else
          qsacr(i)=0.0
          qracs(i)=0.0
         endif

!* 18 * pgfr : freezing of qr to qg                               **18**
          pgaut(i)=0.0
          pgfr(i)=0.0
          phfr(i)=0.0
       if (tair(i) .lt. t0) then
            y1(i)=exp(rn18a*(t0-tair(i)))
          if( qr(i).ge.0.)then
           temp = 1./zr(i)
           temp = temp*temp*temp*temp*temp*temp*temp
           phfr(i)=r2ih*max(r18r(i)*(y1(i)-1.)*temp, 0.0)
!           phfr(i)=r2ih*max(r18r(i)*(y1(i)-1.)/zr(i)**7., 0.0)
          else
           temp = 1./zr(i)
           temp = temp*temp*temp*temp*temp*temp*temp
           pgfr(i)=r2ig*max(r18r(i)*(y1(i)-1.)*temp, 0.0)
!           pgfr(i)=r2ig*max(r18r(i)*(y1(i)-1.)/zr(i)**7., 0.0)
           if(qr(i).le.cmin) pgfr(i)=0.
          endif
       endif

!!
!     endif  ! for Processes 2, 7, 8, & 18

!********   HANDLING THE NEGATIVE RAIN WATER (QR)    *******************
!********   HANDLING THE NEGATIVE SNOW (QS)          *******************

          y1(i)=qr(i)/d2t
          y2(i)=-qh(i)/d2t
         piacr(i)=min(y1(i), piacr(i))
         dgacr(i)=min(y1(i), dgacr(i))
         dhacr(i)=min(y1(i), dhacr(i))
!         whacr(i)=min(y1(i), whacr(i))
!         whacr(i)=max(y2(i), whacr(i))
         psacr(i)=min(y1(i), psacr(i))
         pgfr(i)= min(y1(i), pgfr(i))
         phfr(i)= min(y1(i), phfr(i))
         del=0.
         IF(whacr(i) .LT. 0.) DEL=1.
         if(del.eq.1) whacr(i)=max(whacr(i),-dhacw(i))    !fix from JDC
         dhacr(i)=min((1.-del)*whacr(i),dhacr(i))
         if(del.eq.1) dhacw(i)=dhacw(i)+del*whacr(i)      !fix from JDC
          y1(i)=(piacr(i)+dgacr(i)+dhacr(i)+psacr(i)+pgfr(i) &
                 +phfr(i))*d2t
          qr(i)=qr(i)+pr(i)+qracs(i)-del*whacr(i)*d2t+qracg(i) !fix SEL
          qr(i)=qr(i)-y1(i)                                          !fix SEL
          if (qr(i) .lt. 0.0) then
             y2(i)=1.
             if (y1(i) .ne. 0.0) y2(i)=qr(i)/y1(i)+1.
             piacr(i)=piacr(i)*y2(i)
             dgacr(i)=dgacr(i)*y2(i)
             dhacr(i)=dhacr(i)*y2(i)
!             if(whacr(i).gt.0.) whacr(i)=whacr(i)*y2(i)
             pgfr(i)=pgfr(i)*y2(i)
             phfr(i)=phfr(i)*y2(i)
             psacr(i)=psacr(i)*y2(i)
             qr(i)=0.0
          endif !qr
          dlt2(i)=1.
          if (qr(i) .gt. 1.e-4) dlt2(i)=0.
          if (tair(i) .ge. t0) dlt2(i)=0.
          y1(i)=qs(i)/d2t
          pgacs(i)=min(y1(i), pgacs(i))
          dgacs(i)=min(y1(i), dgacs(i))
          wgacs(i)=min(y1(i), wgacs(i))
          whacs(i)=min(y1(i), whacs(i))
          pracs(i)=min(y1(i), pracs(i))
          pwacs(i)=min(y1(i), pwacs(i))

          prn(i)=d2t*(dlt3(i)*piacr(i)+dlt2(i)*dgacr(i)+pgfr(i)     &
                  +dlt2(i)*psacr(i))
          pracs(i)=(1.-dlt2(i))*pracs(i)
          pwacs(i)=(1.-dlt4(i))*pwacs(i)
          pracg(i)=(1.-dlt2(i))*pracg(i)
          psn(i)=d2t*(pgacs(i)+dgacs(i)+wgacs(i)   &
                   +pracs(i)+pwacs(i)+whacs(i))
 
          qs(i)=qs(i)+ps(i)-qracs(i)-psn(i)
          if (qs(i) .lt. 0.0) then
             y2(i)=1.
             if (psn(i) .ne. 0.) y2(i)=qs(i)/psn(i)+1.
             pgacs(i)=pgacs(i)*y2(i)
             dgacs(i)=dgacs(i)*y2(i)
             wgacs(i)=wgacs(i)*y2(i)
             whacs(i)=whacs(i)*y2(i) 
             pracs(i)=pracs(i)*y2(i)
             pwacs(i)=pwacs(i)*y2(i)
             qs(i)=0.0
          endif
          psn(i)=d2t*(pgacs(i)+dgacs(i)+wgacs(i)    &
                    +pracs(i)+pwacs(i))
          qg(i)=qg(i)+pg(i)+prn(i)+psn(i)-qracg(i)
          qg(i)=qg(i)-d2t*(pracs(i)+whacg(i)  &
                                                       +pracg(i)  &   !fix from JDC
                                                       +pg2h(i))      !fix from SEL  

          if (qg(i) .lt. 0.0) then                              !fix from JDC
           y2(i)=1.                                             !fix from JDC
            if (whacg(i)+pracg(i)+pg2h(i).ne. 0.)   &                 !fix from JDC
                y2(i)=qg(i)/(d2t*(whacg(i)+pracg(i)+pg2h(i)))+1.  !fix from JDC & SEL
            whacg(i)=whacg(i)*y2(i)                         !fix from JDC
            pracg(i)=pracg(i)*y2(i)                         !fix from JDC
            pg2h(i)=pg2h(i)*y2(i)                           !fix from SEL
            qg(i)=0.0                                           !fix from JDC
          endif        

            qh(i)=qh(i)+d2t*(phfr(i)+(1.-dlt3(i))*piacr(i)        &
                   +(1.-dlt3(i))*praci(i)+(1.-dlt2(i))*psacr(i)     &
                   +pracs(i)+(1.-dlt2(i))*dgacr(i)+pracg(i)         &
                   +dhacw(i)+dhacr(i)-primh(i)+whaci(i)             &
                   +whacs(i)+whacg(i)+pg2h(i))

          y1(i)=d2t*(psacw(i)+psfw(i)+dgacw(i)+piacr(i)             &
                 +dgacr(i)+psacr(i)+pgfr(i)+phfr(i)+pihms(i)        &
                 +pihmg(i)+dhacw(i)+dhacr(i)           +pihmh(i))     &
                 -qracs(i)
          pt(i)=pt(i)+afcp(i)*y1(i)
          tair(i)=(pt(i)+tb0)*pi0(i)

!* 11 * PSMLT : MELTING OF QS                                     **11**
!* 19 * PGMLT : MELTING OF QG TO QR                               **19**

          psmlt(i)=0.0
          pgmlt(i)=0.0
          phmlt(i)=0.0

          qhz2=qhwrf(i,k)
          qgz2=qgwrf(i,k)
          if (k .lt. kte-2 .and. tairc(i) .ge. -5) then
             qhz2=qhwrf(i,k+1)
             qgz2=qgwrf(i,k+1)
          endif
          call sgmap(1,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftns0(i))
          call sgmap(2,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftng0(i))
          call sgmap(3,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),fros0(i))
          call sgmap(4,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftnh0(i))

         if (tair(i).ge.t0) then
           tairc(i)=tair(i)-t0
           ftns(i)=1.
           ftng(i)=1.
           ftnh(i)=1.
           ftns(i)=ftns0(i)
           ftng(i)=ftng0(i)
           ftnh(i)=ftnh0(i)
           dd(i)=r11t*tairc(i)*(r101r(i)/zs(i)**2+r102rf(i)  &
                               /zs(i)**bsh5)*ftns(i)
           psmlt(i)=r2is*min(qs(i),max(dd(i),0.0))
           if (r00(i)*qg(i).gt.qrog2) then
             y2(i)=(r191r(i)/zg(i)**2+r192rf2(i)/zg(i)**bgh5_2)*ftng(i)
           else
             y2(i)=(r191r(i)/zg(i)**2+r192rf(i)/zg(i)**bgh5)*ftng(i)
           endif 
           dd1(i)=tairc(i)*(r19t*y2(i)+r19at*(qgacw(i) &
                                             +qgacr(i)))
           pgmlt(i)=r2ig*min(qg(i),max(dd1(i),0.0))
       
           Y1(i)=TCA(i)*TAIRC(i)-ALVR(i)*DWV(i)*(RP0(i)-(QV(i)+QB0))
           Y3(i)=.78/ZH(i)**2+h19aq(i)*SCV(i)/ZH(i)**BHH5
           DDa0(i)=h19rt(i)*Y1(i)*Y3(i)*ftnh(i)+r19at*TAIRC(i)*  &
             (QHACW(i)+QHACR(i))
           PHMLT(i)=r2ih*max(0.0, min(DDa0(i), QH(i)))

           pt(i)=pt(i)-afcp(i)*(psmlt(i)+pgmlt(i)+phmlt(i))
           tair(i)=(pt(i)+tb0)*pi0(i)
           qr(i)=qr(i)+psmlt(i)+pgmlt(i)+phmlt(i)
           qs(i)=qs(i)-psmlt(i)
           qg(i)=qg(i)-pgmlt(i)
           qh(i)=qh(i)-phmlt(i)

         endif !tair  ! processes 11 & 19
! 
!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!* 24 * PIHOM : HOMOGENEOUS FREEZING OF QC TO QI (T < T00)        **24**
!* 25 * PIDW : DEPOSITION GROWTH OF QC TO QI ( T0 < T <= T00)     **25**
!* 26 * PIMLT : MELTING OF QI TO QC (T >= T0)                     **26**
!****** PIMM  : IMMERSION FREEZING OF QC TO QI (T < T0)           ******
!****** PCFR  : CONTACT NUCLEATION OF QC TO QI (T < T0)           ******

       if (qc(i).le.cmin1) qc(i)=0.0
       if (qi(i).le.cmin1) qi(i)=0.0

       ftns(i)=1.
       ftng(i)=1.
       ftns0(i)=1.
       ftng0(i)=1.

       qhz2=qhwrf(i,k)
       qgz2=qgwrf(i,k)
       if (k .lt. kte-2 .and. tairc(i) .ge. -5) then
         qhz2=qhwrf(i,k+1)
         qgz2=qgwrf(i,k+1)
       endif
       call sgmap(1,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftns0(i))
       call sgmap(2,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftng0(i))

       if (tair(i).le.t00) then
          pihom(i)=qc(i)
       else
          pihom(i)=0.0
       endif 
       if (tair(i).ge.t0) then
          pimlt(i)=qi(i)
       else
          pimlt(i)=0.0
       endif
       pidw(i)=0.0
           
          if (tair(i) .lt. t0 .and. tair(i) .gt. t00) then
            TAIRC(i)=TAIR(i)-T0
             y1(i) = max( min(tairc(i), -1.), -31.)
             it(i) = int(abs(y1(i)))
             y2(i)=aa1(it(i))
             y3(i) = aa2(it(i))
             if (tairc(i).le.-5.)then                       !  meyers
                rtair(i)=1./(tair(i)-c76)
                y5(i)=exp(c218-c580*rtair(i))
                qsi(i)=rp0(i)*y5(i)
                SSI(i)=(qv(i)+qb0)/qsi(i)-1.
                fssi=min(xssi,max(rssi,xssi*(tairc(i)+44.)/(44.0-38.0))) !max ssi f(tair)
                fssi=rssi
                wssi=ww1(i,k)/100.-2.0
                if(wssi.gt.0.) fssi=rssi+min(xssi,wssi*0.01)
                fssi=min(ssi(i),fssi)

                r_nci=max(1.e-3*exp(-.639+12.96*fssi), 0.528e-3)      ! meyers et al.
                                                                      ! Roger found the bug on 2012/04/27
                if (r_nci.gt.15.) r_nci=15.                          !cap at 15000/liter

! Cooper curve
              if( tairc(i) .lt. -40.0 ) then
                c_nci = 5.0e-6*exp(0.304*40.0)
              else
                c_nci = 5.0e-6*exp(0.304*abs(tairc(i)))
              end if
              r_nci = c_nci
! JDC cap r_nci to the amount corresponding to crystal size of ami50
              r_nci = max(r_nci,r00(i)*qi(i)/ami50)

#if (WRF_CHEM == 1)
                ! EMK...Only execute if GOCART and coupling is on
                if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
                      chem_opt == 302 .or. chem_opt == 303) .and. &
                      (gsfcgce_gocart_coupling == 1) ) then
                   !JJS 20110602 vvvvv
                   ! Conversion rate of cloud water to ice in the Bergeron porcess based on Meyer + DeMott formulae
                   !
                   ! convert gocart aerosol mass conc to IN
                   !      p0 need to be converted from g*cm/s2/cm2 to mb (hPa)
                   !                call mass2icn(p0(i,k)*0.001,tair(i),aero(i,k,:), icn_out)
                   !                icn_cgs(i,k) = max(min_icn, icn_out) * 1.e-3   !IN conc [#/cm3] <-- [#/Litter]
                   !                icn_cgs(i,k) = icn_out * 1.e-3 !IN conc [#/cm3]
                   !                r_nci = icn_cgs(i,k)  !DeMotto's formuale
                   r_nci = icn_out(i) * 1.e-3  !DeMotto's formuale
                   !JJS 20110602 ^^^^^
                end if
#endif

                dd(i)=(r00(i)*qi(i)/r_nci)**y3(i)                  !meyers
                PIDW(i)=min(rr0(i)*D2T*y2(i)*r_nci*dd(i), qc(i)) !meyers

! JDC water vapor diffusivity correction term
                 esi(i)  = qsi(i)/rp0(i)*c610
                 y4(i)   = 1./tair(i)
!                term1     = y4(i)*(rn10a*y4(i)-rn10b)
                 term1     = y4(i)*(rn20a*y4(i)-rn20b)
                 term2     = rn10c*tair(i)/esi(i)
                 fdwv      = (term1+term2)/(term1+term2*dwv0/dwv(i))
              PIDW(i)=min(rr0(i)*D2T*y2(i)*r_nci*dd(i)*fdwv,qc(i)) !meyers
         endif  !tairc

             pimm(i)=0.0
             pcfr(i)=0.0

             if (qc(i) .gt. 0.0) then
                y4(i) = 1./(tair(i)-c358)
                qsw(i)=rp0(i)*exp(c172-c409*y4(i))
                xncld=qc(i)/4.e-9                         !cloud number
                esat=0.6112*exp(17.67*tairc(i)/(tairc(i)+243.5))*10.
                rv=0.622*esat/(p0(i,k)/1000.-esat)
                rlapse_m=980.616*(1.+2.5e6*rv/287./tair(i))/          &     
                       (1004.67+2.5e6*2.5e6*rv*0.622/(287.*tair(i)*tair(i)))
                delT=rlapse_m*ww1(i,k)                     !Roger
                if (delT.lt.0.) delT=0.
                Bhi=1.01e-2 
                pimm(i)=xncld*Bhi*4.e-9*exp(-tairc(i))*delT*d2t*4.e-9
 
                xccld=xncld*r00(i)                           !cloud number concentration
                Xknud=7.37*tair(i)/(288.*Ra*p0(i,k))  ! Knudsen number
                alpha=1.257+0.400*exp(-1.10/Xknud)     ! Cunningham correction (P&Klett)
 
                cunnF=1.+alpha*Xknud                   ! Cunningham correction (P&Klett)

                if (tairc(i).ge.0.) then
                    dvair=(1.718+0.0049*tairc(i))*1.e-4   
                       !dynamic visc air (Prupp&Klett)
                else 
                    dvair=(1.718+0.0049*tairc(i)-1.2e-5*tairc(i)**2)*1.e-4  
                       !dynamic visc air (Prupp&Klett)
                endif !tairc
                DIFFar=1.3804e-16*tair(i)/6./cpi/dvair/Ra*cunnF     !aerosol diffusion via P&Klett
                if (qv(i)+qb0-qsw(i).lt.0.) then                       !only when cloud evaporating
                pcfr(i)=4.e-9*4.*cpi*Rc*DIFFar*xccld*Cna*rr0(i)*d2t    !Brownian part only via Cotton
                endif
             else  !qc
                tairc(i)=tair(i)-t0
                y1(i)=max( min(tairc(i), -1.), -31.)
                it(i)=int(abs(y1(i)))
                y2(i)=aa1(it(i))
                y3(i)=aa2(it(i))
                y4(i)=exp(abs(.5*tairc(i)))
                dd(i)=(r00(i)*qi(i)/(r25a*y4(i)))**y3(i)
                pidw(i)=min(r25rt(i)*y2(i)*y4(i)*dd(i),qc(i))
             endif  !qc
          endif  !tair

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict

!      STEVE: PLEASE CHECK
       y1(i)=pihom(i)+pidw(i)+pimm(i)+pcfr(i)-pimlt(i)

         if (y1(i).gt.qc(i)) then
            y1(i)=qc(i)
            y2(i)=1.
            y3(i)=pihom(i)+pidw(i)+pimm(i)+pcfr(i)
            if(y3(i).ne.0.) y2(i)=(qc(i)+pimlt(i))/y3(i)
            pihom(i)=pihom(i)*y2(i)
            pidw(i)=pidw(i)*y2(i)
            pimm(i)=pimm(i)*y2(i)
            pcfr(i)=pcfr(i)*y2(i)
         endif  !y1

         pt(i)=pt(i)+afcp(i)*y1(i)
         tair(i)=(pt(i)+tb0)*pi0(i)
         qc(i)=qc(i)-y1(i)
         qi(i)=qi(i)+y1(i)

!* 31 * pint  : initiation of qi                                  **31**
!* 32 * pidep : deposition of qi                                  **32**
!
!     CALCULATION OF PINT USES DIFFERENT VALUES OF THE INTERCEPT AND SLOPE FOR
!     THE FLETCHER EQUATION. ALSO, ONLY INITIATE MORE ICE IF THE NEW NUMBER
!     CONCENTRATION EXCEEDS THAT ALREADY PRESENT.

         tair(i)=(pt(i)+tb0)*pi0(i)
         if (tair(i) .lt. t0) then
            if (qi(i) .le. cmin) qi(i)=0.
            tairc(i)=tair(i)-t0
            rtair(i)=1./(tair(i)-c76)
            y2(i)=exp(c218-c580*rtair(i))
            qsi(i)=rp0(i)*y2(i)
            esi(i)=c610*y2(i)
            ssi(i)=(qv(i)+qb0)/qsi(i)-1.
            y1(i)=1./tair(i)
            y3(i)=SQRT(qi(i))
! JDC water vapor diffusivity correction term
            term1   = y1(i)*(rn20a*y1(i)-rn20b)
            term2   = rn10c*tair(i)/esi(i)
            dd(i) = term1+term2
            fdwv    = dd(i)/(term1+term2*dwv0/dwv(i))

            dm(i)=max(qv(i)+qb0-qsi(i),0.0)
            rsub1(i)=cs580(i)*qsi(i)*rtair(i)*rtair(i)
            dep(i)=dm(i)/(1.+rsub1(i))
            if (tairc(i).le.-5.) then     
                y4(i)=1./(tair(i)-c358)
                qsw(i)=rp0(i)*exp(c172-c409*y4(i))
                fssi=min(xssi,max(rssi,xssi*(tairc(i)+44.)/(44.-38.)))
                fssi=rssi
                wssi=ww1(i,k)/100.-2.0
                if(wssi.gt.0.) fssi=rssi+min(xssi,wssi*0.01)
                fssi=min(ssi(i),fssi)
!               r_nci=min(1.e-3*exp(-.639+12.96*fssi),1.) 
                r_nci=max(1.e-3*exp(-.639+12.96*fssi),0.528e-3)
       	        if (r_nci.gt.15.) r_nci=15.   

! Cooper curve
                if( tairc(i) .lt. -40.0 ) then
                  c_nci = 5.0e-6*exp(0.304*40.0)
                else
                  c_nci = 5.0e-6*exp(0.304*abs(tairc(i)))
                end if
                r_nci = c_nci
! JDC cap r_nci to the amount corresponding to crystal size of ami50
                r_nci = max(r_nci,r00(i)*qi(i)/ami50)

#if (WRF_CHEM == 1)
                ! EMK...Only execute if GOCART and coupling is on
                if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
                      chem_opt == 302 .or. chem_opt == 303) .and. &
                      (gsfcgce_gocart_coupling == 1) ) then
                   !JJS 20110602 vvvvv
                   ! Conversion rate of cloud water to ice in the Bergeron porcess based on Meyer + DeMott formulae
                   !
                   ! convert gocart aerosol mass conc to IN
                   !      p0 need to be converted from g*cm/s2/cm2 to mb (hPa)
                   !                call mass2icn(p0(i,k)*0.001,tair(i),aero(i,k,:), icn_out)
                   !                icn_cgs(i,k) = max(min_icn, icn_out) * 1.e-3   !IN conc [#/cm3] <-- [#/Litter]
                   !                call mass2icn(p0(i,k)*0.001,tair(i),aero(i,k,:), icn_out,i,k)
                   !                icn_out = min(1.e3, max(0.01e0 ,  icn_out) )
                   !                icn_cgs(i,k) = icn_out * 1.e-3 !IN conc [#/cm3]
                   !                r_nci = icn_cgs(i,k)  !DeMotto's formuale
                   r_nci = icn_out(i) * 1.e-3  !DeMotto's formuale
                   !JJS 20110602 ^^^^^
                end if
#endif

                pidep(i)=max(R32RT(i)*1.e4*fssi*sqrt(r_nci)*y3(i)/     & !meyers
                dd(i)*fdwv, -qi(i))                    !fix SEL
                if(qi(i).le.cmin) pidep(i)=0.
                dd(i)=max(1.e-9*r_nci/r00(i)-qci(i,k)*1.e-9/ami50, 0.) 
                pint(i)=max(min(dd(i),dm(i)),0.)
                pint(i)=min(pint(i)+pidep(i), dep(i))
                pt(i)=pt(i)+ascp(i)*pint(i)
                tair(i)=(pt(i)+tb0)*pi0(i)
                qv(i)=qv(i)-pint(i)
                qi(i)=qi(i)+pint(i)
            endif  !taric
          endif  !tair                  

! End of Process 31 & 32

! WRF satice has new_ice_sat option 0, 1 and 2
! Steve's satice has new_ice_sat option 0, 1, 2, 3 and 9
! option 0, 1 and 2 are identical in both satice
! I added option 3 below and wrapped them with "if (improve.eq.3)"

!*****   TAO ET AL (1989) SATURATION TECHNIQUE  ***********************

!!!!
!!!   new_ice_sat option 9 from  Steve's satice
!!!   sequential, non-iterative, ssi
!!!!

         dep(i)=0.0
         cnd(i)=0.0
         tair(i)=(pt(i)+tb0)*pi0(i)
         if (tair(i).ge.t00) THEN
            y1(i)=1./(tair(i)-c358)
            qsw(i)=rp0(i)*exp(c172-c409*y1(i))
            dd(i)=cp409(i)*y1(i)*y1(i)
            dm(i)=qv(i)+qb0-qsw(i)
            cnd(i)=dm(i)/(1.+avcp(i)*dd(i)*qsw(i))
!c    ******   condensation or evaporation of qc  ******
            cnd(i)=max(-qc(i),cnd(i))

! JJS 20150831
!            if(ww1(i,k).ge.-10.)  &     ! for 1-km grid
! thresh_evap is a function of dx and defined in the beginning of the subroutine

            if(ww1(i,k) .ge. thresh_evap)  cnd(i)=max(0.,cnd(i)) !reduce spurious evap

            pt(i)=pt(i)+avcp(i)*cnd(i)
            tair(i)=(pt(i)+tb0)*pi0(i)
            qv(i)=qv(i)-cnd(i)
            qc(i)=qc(i)+cnd(i)
         endif
         if (tair(i).le.273.16) THEN
!c    ******   deposition or sublimation of qi    ******
            y1(i)=1./(tair(i)-c358)
            qsw(i)=rp0(i)*exp(c172-c409*y1(i))
            y2(i)=1./(tair(i)-c76)
            qsi(i)=rp0(i)*exp(c218-c580*y2(i))
            fssi=min(xssi,max(rssi,xssi*(tair(i)-t0+44.0)/(44.0-38.0)))
            fssi=rssi
            wssi=ww1(i,k)/100.-2.0
            if(wssi.gt.0.) fssi=rssi+min(xssi,wssi*0.01)
            y3(i)=1.+min((qsw(i)-qsi(i))/qsi(i), fssi)
            y4(i)=qsi(i)*y3(i)
            if (tair(i).le.268.16.and.(qv(i)+qb0.gt.y4(i))) then
               dd1(i)=cp580(i)*y2(i)*y2(i)
               dep(i)=(qv(i)+qb0-y4(i))/(1.+ascp(i)*dd1(i)*y4(i))
            else if (qv(i)+qb0.lt.xsubi*qsi(i).and.qi(i).gt.cmin) then
               dd1(i)=cp580(i)*y2(i)*y2(i)
               dep(i)=(qv(i)+qb0-xsubi*qsi(i))/(1.+ascp(i)*dd1(i)*xsubi*qsi(i))
               dep(i)=max(-qi(i),dep(i))
            endif
            if(ww1(i,k).ge.0.)  &
              dep(i)=max(0.,dep(i))                                !reduce spurious sublimation
            pt(i)=pt(i)+ascp(i)*dep(i)
            tair(i)=(pt(i)+tb0)*pi0(i)
            qv(i)=qv(i)-dep(i)
            qi(i)=qi(i)+dep(i)
         endif

!* 10 * PSDEP : DEPOSITION OR SUBLIMATION OF QS                   **10**
!* 20 * PGSUB : SUBLIMATION OF QG                                 **20**

        psdep(i)=0.0
        pgdep(i)=0.0
        phdep(i)=0.0
        pssub(i)=0.0
        pgsub(i)=0.0
        phsub(i)=0.0
        pvapg(i)=0.0
        pvaph(i)=0.0

        if (qc(i)+qi(i).gt.1.e-5) then
           dlt1(i)=1.
        else    
           dlt1(i)=0.
        endif

           if (tair(i) .lt. t0) then 
              rtair(i)=1./(tair(i)-c76)
              y2(i)=exp(c218-c580*rtair(i))
              qsi(i)=rp0(i)*y2(i)
              esi(i)=c610*y2(i)
              ftns(i)=1.
              ftng(i)=1. 
              ftnh(i)=1.             

              SSI(i)=(QV(i)+QB0)/QSI(i)-1.
                IF(SSI(i).GT.0.) DLT1(i)=1.
                IF(SSI(i).LE.0.) DLT1(i)=0.
              DM(i)=QV(i)+QB0-QSI(i)
              RSUB1(i)=cs580(i)*QSI(i)*RTAIR(i)*RTAIR(i)
              DD1(i)=DM(i)/(1.+RSUB1(i))
              Y3(i)=1./TAIR(i)
! JDC water vapor diffusivity correction
             term1   = y3(i)*(rn20a*y3(i)-rn20b)
             term2   = rn10c*tair(i)/esi(i)
             dd(i) = term1+term2
             fdwv    = dd(i)/(term1+term2*dwv0/dwv(i))
              TAIRC(i)=TAIR(i)-T0
!
            ftns(i)=1.
            ftng(i)=1.
            ftnh(i)=1.
            ftns0(i)=1.
            ftng0(i)=1.
            qhz2=qhwrf(i,k)
            qgz2=qgwrf(i,k)
            if (k .lt. kte-2 .and. tairc(i) .ge. -5) then
               qhz2=qhwrf(i,k+1)
               qgz2=qgwrf(i,k+1)
            endif
            call sgmap(1,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftns0(i))
            call sgmap(2,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftng0(i))
            call sgmap(3,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),fros0(i))
            call sgmap(4,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftnh0(i))

            ftns(i)=ftns0(i)
            ftng(i)=ftng0(i)
            ftnh(i)=ftnh0(i)

            Y4(i)=r10t*SSI(i)*(r101r(i)/ZS(i)**2+r102rf(i)/ZS(i)**BSH5)   &
                                /DD(i)*ftns(i)*fdwv
            PSDEP(i)=r2is*max(-QS(i), Y4(i))
            if(qs(i).le.cmin) psdep(i)=0.
            DD(i)=Y3(i)*(RN20A*Y3(i)-RN20B)+RN10C*TAIR(i)/ESI(i)
            Y2(i)=r191r(i)/ZG(i)**2+r192rf(i)/ZG(i)**BGH5
            if(r00(i)*qg(i).gt.qrog2) &
              y2(i)=(r191r(i)/zg(i)**2+r192rf2(i)/zg(i)**bgh5_2)
              PGDEP(i)=r2ig*MAX(-qg(i), R20T*SSI(i)*Y2(i)/DD(i)          &
                                     *ftng(i)*fdwv)
            if(qg(i).le.cmin) pgdep(i)=0.
           Y1(i)=h10ar(i)/(TCA(i)*TAIR(i)**2)+1./(DWV(i)*QSI(i))
           Y2(i)=.78/ZH(i)**2+h20bq(i)*SCV(i)/ZH(i)**BHH5
           PHDEP(i)=r2ih*MAX(-qh(i), h20t(i)*ftnh(i)*SSI(i)*Y2(i)/Y1(i))
                if(qh(i).le.cmin) phdep(i)=0.
          PSSUB(i)=min(PSDEP(i), 0.)
          PSDEP(i)=max(PSDEP(i), 0.)
          PGSUB(i)=min(PGDEP(i), 0.)
          PGDEP(i)=max(PGDEP(i), 0.)
          PHSUB(i)=min(PHDEP(i), 0.)
          PHDEP(i)=max(PHDEP(i), 0.)

!      ******************************************************************
              Y5(i)=min(0.,DD1(i))
              DD1(i)=max(0.,DD1(i))

         IF(DLT1(i).EQ.1.)THEN                              !Di
           Y1(i)=PSDEP(i)+PGDEP(i)+PHDEP(i)
           IF(Y1(i).ge.DD1(i))THEN
            PSDEP(i)=PSDEP(i)/Y1(i)*DD1(i)            !...
            PGDEP(i)=PGDEP(i)/Y1(i)*DD1(i)
            PHDEP(i)=PHDEP(i)/Y1(i)*DD1(i)
           ENDIF
         ENDIF                                                !Di

         if(qc(i).le.1.e-5) then
          vap_frac=2.0*min((tairc(i)/(t00-t0))**2,1.0)
          pvapg(i)=vap_frac*pgdep(i)
          pvaph(i)=vap_frac*phdep(i)
         endif
         if(pgdep(i).gt.0.)          &
           pvapg(i)=min(pvapg(i),qg(i)+pgdep(i))
         if(phdep(i).gt.0.)          &
           pvaph(i)=min(pvaph(i),qh(i)+phdep(i))


         IF(DLT1(i).EQ.0.)THEN
           Y1(i)=MAX(PSsub(i)+PGsub(i)+phsub(i), Y5(i))
           IF(Y5(i).gt.(PSsub(i)+PGsub(i)+phsub(i)))THEN
            Y3(i)=(PSsub(i)+PGsub(i)+phsub(i))
            IF(Y3(i).ne.0.0)THEN
             PSsub(i)=PSsub(i)/Y3(i)*Y5(i)
             PGsub(i)=PGsub(i)/Y3(i)*Y5(i)
             Phsub(i)=Phsub(i)/Y3(i)*Y5(i)
            ENDIF
           ENDIF
         ENDIF
          PSSUB(i)=-PSSUB(i)
          PGSUB(i)=-PGSUB(i)
          PHSUB(i)=-PHSUB(i)
          Y1(i)=PSDEP(i)+PGDEP(i)+PHDEP(i)  &
                 -PSsub(i)-PGsub(i)-PHsub(i)

           pt(i)=pt(i)+ascp(i)*y1(i)
           tair(i)=(pt(i)+tb0)*pi0(i)
           qv(i)=qv(i)-y1(i)
           qs(i)=qs(i)+psdep(i)-pssub(i)+pvapg(i)+pvaph(i)
           qg(i)=qg(i)+pgdep(i)-pgsub(i)-pvapg(i)
           qh(i)=qh(i)+phdep(i)-phsub(i)-pvaph(i)
           endif   ! if (tair(i) .lt. t0)

!* 23 * ERN : EVAPORATION OF QR (SUBSATURATION)                   **23**
! Steve did not make any improvement on this process
           ern(i)=0.0
           if (qr(i) .gt. 0.0) then
             tair(i)=(pt(i)+tb0)*pi0(i)
             rtair(i)=1./(tair(i)-c358)
	     y2(i)=exp( c172-c409*rtair(i) )
	     esw(i)=c610*y2(i)
             qsw(i)=rp0(i)*y2(i)
             ssw(i)=(qv(i)+qb0)/qsw(i)-1.
             dm(i)=qv(i)+qb0-qsw(i)
             rsub1(i)=cv409(i)*qsw(i)*rtair(i)*rtair(i)
             dd1(i)=max(-dm(i)/(1.+rsub1(i)),0.0)
             y3(i)=1./tair(i)
! JDC water vapor diffusivity correction term
             term1   = y3(i)*(rn30a*y3(i)-rn10b)
             term2   = rn10c*tair(i)/esw(i)
             dd(i) = term1+term2
             fdwv    = dd(i)/(term1+term2*dwv0/dwv(i))
             ftnw=1.
             if (qr(i) .gt. cmin.and.tair(i).gt.t0) then   !no need to check qc, no qc if ssw < 0
                 bin_factor(i)=0.11*(1000.*qr(i))**(-1.27) + 0.98
                 bin_factor(i)=min(bin_factor(i),1.30)
                 ftnw=1./bin_factor(i)**3.35
                 ftnwmin=r00(i)*qr(i)/draimax
                 if(qr(i).le.0.001) ftnw=max(ftnw,ftnwmin/tnw)

                 y4(i)=r00(i)*qr(i)
                 y1(i)=sqrt(y4(i))
                 y2(i)=sqrt(y1(i))
                 zr(i)=zrc/y2(i)*ftnw**0.25
             endif !qr
             y1(i)=-r23t*ssw(i)*(r231r(i)/zr(i)**2+r232rf(i)/       &
                                      zr(i)**3)/dd(i)*ftnw*fdwv
             ern(i)=min(dd1(i),qr(i),max(y1(i),0.0))
             pt(i)=pt(i)-avcp(i)*ern(i)
             tair(i)=(pt(i)+tb0)*pi0(i)
             tairc(i)=tair(i)-t0
             qv(i)=qv(i)+ern(i)
             qr(i)=qr(i)-ern(i)
          endif !qr

!!!!
!!  add processes 30 & 33 fpr pmltg and pmlts
!!
!!!!

!* 30 * pmltg : evaporation of melting qg                         **30**
!* 33 * pmlts : evaporation of melting qs                         **33**

          pmlts(i)=0.0
          pmltg(i)=0.0

          tair(i)=(pt(i)+tb0)*pi0(i)
          tairc(i)=tair(i)-t0

          ftns0(i)=1.
          ftng0(i)=1.

          qhz2=qhwrf(i,k)
          qgz2=qgwrf(i,k)
          if (k .lt. kte-2 .and. tairc(i) .ge. -5) then
            qhz2=qhwrf(i,k+1)
            qgz2=qgwrf(i,k+1)
          endif
          call sgmap(1,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftns0(i))
          call sgmap(2,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftng0(i))
          call sgmap(3,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),fros0(i))

          if (tair(i) .ge. t0) then
             ftns(i)=1.
             ftng(i)=1.
                ftns(i)=ftns0(i)
                ftng(i)=ftng0(i)
             rtair(i)=1./(t0-c358)
             y2(i)=exp( c172-c409*rtair(i) )
             esw(i)=c610*y2(i)
             qsw(i)=rp0(i)*y2(i)
             ssw(i)=1.-(qv(i)+qb0)/qsw(i)
             dm(i)=qsw(i)-qv(i)-qb0
             rsub1(i)=cv409(i)*qsw(i)*rtair(i)*rtair(i)
             dd1(i)=max(dm(i)/(1.+rsub1(i)),0.0)
             y3(i)=1./tair(i)
! JDC water vapor diffusivity correction term
            term1   = y3(i)*(rn30a*y3(i)-rn10b)
            term2   = rn10c*tair(i)/esw(i)
            dd(i) = term1+term2
            fdwv    = dd(i)/(term1+term2*dwv0/dwv(i))
             y1(i)=ftng(i)*r30t*ssw(i)*(r191r(i)/zg(i)**2+r192rf(i)    &
                   /zg(i)**bgh5)/dd(i)*fdwv
             if(r00(i)*qg(i).gt.qrog2)                   &
               y1(i)=ftng(i)*r30t*ssw(i)*(r191r(i)/zg(i)**2+r192rf2(i) &
                      /zg(i)**bgh5_2)/dd(i)*fdwv
             pmltg(i)=r2ig*min(qg(i),max(y1(i),0.0))
             y1(i)=ftns(i)*r33t*ssw(i)*(r331r(i)/zs(i)**2+r332rf(i)    &
                                           /zs(i)**bsh5)/dd(i)*fdwv
             pmlts(i)=r2is*min(qs(i),max(y1(i),0.0))
             y1(i)=min(pmltg(i)+pmlts(i),dd1(i))
             pmltg(i)=y1(i)-pmlts(i)
             pt(i)=pt(i)-ascp(i)*y1(i)
             tair(i)=(pt(i)+tb0)*pi0(i)
             qv(i)=qv(i)+y1(i)
             qs(i)=qs(i)-pmlts(i)
             qg(i)=qg(i)-pmltg(i)
          endif  !tair t0
! end   Processes 30 and 33
  
            if (qc(i) .le. cmin) qc(i)=0.
            if (qr(i) .le. cmin) qr(i)=0.
            if (qi(i) .le. cmin) qi(i)=0.
            if (qs(i) .le. cmin) qs(i)=0.
            if (qg(i) .le. cmin) qg(i)=0.
            if (qh(i) .le. cmin) qh(i)=0.
            dpt(i,k)=pt(i)
            dqv(i,k)=qv(i)
            qcl(i,k)=qc(i)
            qrn(i,k)=qr(i)
            qci(i,k)=qi(i)
            qcs(i,k)=qs(i)
            qcg(i,k)=qg(i)
            qch(i,k)=qh(i)

!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!c     henry:  please take a look  (start)
!JJS modified by JJS on 5/1/2007  vvvvv

            dd(i)=max(-cnd(i), 0.)
            cnd(i)=max(cnd(i), 0.)
            dd1(i)=max(-dep(i), 0.)  !bug fix by Di
            dep(i)=max(dep(i), 0.)
            del=0.
            IF(whacr(i) .LT. 0.) DEL=1.


!!!!!!!!!!!DDDDDDDDDDDDDD double check
            sccc=cnd(i)
            seee=dd(i)+ern(i)
            sddd=dep(i)+amax1(pint(i),0.0)+psdep(i)+pgdep(i)+phdep(i)
            ssss=dd1(i)-amin1(pint(i),0.0)+pssub(i)+pgsub(i)+phsub(i)+pmlts(i)+pmltg(i)
            smmm=psmlt(i)+pgmlt(i)+pimlt(i)+qracs(i)+phmlt(i)+qracg(i) &
                 -del*whacr(i)
            sfff=psacw(i)*d2t+piacr(i)*d2t+psfw(i)*d2t+pgfr(i)*d2t   &
                +dgacw(i)*d2t+dgacr(i)*d2t+psacr(i)*d2t+pihom(i) &
                +pidw(i)+pimm(i)+pcfr(i)+pihms(i)*d2t    &
                +pihmg(i)*d2t+phfr(i)*d2t+dhacw(i)*d2t+dhacr(i)*d2t+pihmh(i)*d2t

! for snapsot diabatic heating rate (deg K / s)
            physc(i,k) = avc * sccc / d2t       !K/s
            physe(i,k) = avc * seee / d2t       !K/s
            physd(i,k) = asc * sddd / d2t       !K/s
            physs(i,k) = asc * ssss / d2t       !K/s
            physf(i,k) = afc * sfff / d2t       !K/s
            physm(i,k) = afc * smmm / d2t       !K/s
! for accmulated diabatic heating (unit: deg K, in potential temperature)
            acphysc(i,k) = acphysc(i,k) + avcp(i) * sccc 
            acphyse(i,k) = acphyse(i,k) + avcp(i) * seee 
            acphysd(i,k) = acphysd(i,k) + ascp(i) * sddd 
            acphyss(i,k) = acphyss(i,k) + ascp(i) * ssss 
            acphysf(i,k) = acphysf(i,k) + afcp(i) * sfff 
            acphysm(i,k) = acphysm(i,k) + afcp(i) * smmm 

!JJS modified by JJS on 5/1/2007  ^^^^^

!JJS   2010/10/19  vvvvv
!      radar reflectivity calculation

          call sgmap(1,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftns0(i))   !Di 20160114
          call sgmap(2,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftng0(i))   !Di 20160114
          call sgmap(3,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),fros0(i))   !Di 20160114
          call sgmap(4,qs(i),qg(i),qgz2,qh(i),qhz2,r00(i),tairc(i),ftnh0(i))   !Di 20160114

        a_1=1.e6*r00(i)*qr(i)
        a_2=1.e6*r00(i)*qs(i)
        a_3=1.e6*r00(i)*qg(i)
        a_4=1.e6*r00(i)*qh(i) 

        ucor=3071.29/tnw**0.75
        ucos=687.97*roqs**0.25/tns**0.75
        ucog=687.97*roqg**0.25/tng**0.75
        ucog2=687.97*roqg2**.25/tng**.75
        ucoh=687.97*roqh**0.25/tnh**0.75
        uwet=4.464**0.95

        ftnw=1.
        if(qr(i).gt.cmin .and. qc(i).lt.cmin)then
             bin_factor(i)=0.11*(1000.*qr(i))**(-1.27) + 0.98
!            bin_factor(i)=min(bin_factor(i),1.35)
             bin_factor(i)=min(bin_factor(i),1.30)
             ftnw=1./bin_factor(i)**3.50
             ftnwmin=r00(i)*qr(i)/draimax
             if(qr(i).le.0.001) ftnw=max(ftnw,ftnwmin/tnw)
        endif
        a_11=ucor*(max(0.,a_1))**1.75/ftnw**0.75

        ftns(i)=1.
        ftng(i)=1.
        ftns(i)=ftns0(i)**0.75
        ftng(i)=ftng0(i)**0.75
        ftnh(i)=ftnh0(i)**0.75  ! Di 20160114
        fros(i)=1.
        fros(i)=fros0(i)**.25
        a_22=ucos*(max(0.,a_2))**1.75/ftns(i)*fros(i)
        a_33=ucog*(max(0.,a_3))**1.75/ftng(i)
        if(a_3.ge.qrog2) a_33=ucog2*(max(0.,a_3))**1.75/ftng(i)
        a_44=ucoh*(max(0.,a_4))**1.75/ftnh(i) ! Di 20160114

         IF (TAIR(i).LT.273.16) THEN
            ZDRY = MAX(1.e-9,A_11+A_22+A_33+A_44) !rain,snow,graupel,hail,cloud ice,cloud water
            DBZ(i,k) = 10.*ALOG10(ZDRY)
         ELSE         
            ZWET0 = A_11+UWET*(A_22+A_33+A_44)**.95
            ZWET = MAX(1.e-9,ZWET0)
            DBZ(i,k) = 10.*ALOG10(ZWET)
         ENDIF

!JJS   2010/10/19  ^^^^^

        ENDDO
!dir$ vector aligned
        DO i=1,irestrict
      
#if ( WRF_CHEM == 1)
      ! EMK...Nuclei only calculated when coupling
      if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
            chem_opt == 302 .or. chem_opt == 303) .and. &
            (gsfcgce_gocart_coupling == 1) ) then
         icn_diag(i,k) = icn_out(i)  ! #/Litre
         nc_diag(i,k) = ccn_out(i)  ! #/cm3
      else
         icn_diag(i,k) = 0
         nc_diag(i,k) = 0
      end if
#endif      

!JJS 20140305 vvvvv  Calculate effective radius for all cloud species
!   eff_rad is a function of the slope parameter (Lambda)

    ! rain
      if (qrn(i,k) .lt. cmin) then
         re_rain_gsfc(i,k) = 0.e0
      else
         re_rain_gsfc(i,k) = eff_rad(zr(i))
      endif
    ! snow
      if (qcs(i,k) .lt. cmin) then
         re_snow_gsfc(i,k) = 0.e0
      else
         re_snow_gsfc(i,k) = eff_rad(zs(i))
      endif
    ! graupel
      if (qcg(i,k) .lt. cmin) then
         re_graupel_gsfc(i,k) = 0.e0
      else
         re_graupel_gsfc(i,k) = eff_rad(zg(i))
      endif
    ! hail
      if (qch(i,k) .lt. cmin) then
         re_hail_gsfc(i,k) = 0.e0
      else
         re_hail_gsfc(i,k) = eff_rad(zh(i))
      endif

! for cloud water

   if (qcl(i,k) .lt. cmin) then
      re_cloud_gsfc(i,k) = 0.e0
   else
      L_cloud = qcl(i,k) * rho(i,k)             ! cloud water [g/cm3]
#if (WRF_CHEM == 1)
   ! when running with WRF_Chem and using aerosol coupling in Goddard MP
           ! cpi: const_pi = 4.*atan(1.)         ~ 3.1415
           ! roqr: 1.0 g/cm**3, liquid water density
           ! roqi: 0.9179, ice density
            if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
                   chem_opt == 302 .or. chem_opt == 303) .and. &
                   (gsfcgce_gocart_coupling == 1) ) then
              ! for cloud water, estimate lambda (slope of gamma distribution)
                   mu = min(15.e0, (1000.E0/ccn_out(i) + 2.e0))
                   gamfac3 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+3.e0) )
                   gamfac1 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+1.e0) )
                   lambda = (4.e0/3.e0*cpi*roqr*ccn_out(i)/L_cloud*   &
                            gamfac1)**(1.e0/3.e0)  ! [1/cm]
                   re_cloud_gsfc(i,k) = 1.e0/lambda * gamfac3 * 1.e4  !effective radius [micron]
             else
   ! when running with WRF_Chem but no aerosol coupling in Goddard MP
               if (xland(i) .eq. 1.0) then
                  ccn_ref = ccn_over_land
               else if (xland(i) .eq. 2.0) then
                  ccn_ref = ccn_over_water
               else
                  print *,' xland is not 1. or 2., run stopped'
                  ! EMK NUWRF
                  call wrf_error_fatal(' xland is not 1. or 2., run stopped')
!                  stop
               endif
                 ! for cloud water, estimate lambda (slope of gamma distribution)
                      mu = min(15.e0, (1000.E0/ccn_ref + 2.e0))
                      gamfac3 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+3.e0) )
                      gamfac1 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+1.e0) )
                      lambda = (4.e0/3.e0*cpi*roqr*ccn_ref/L_cloud*   &
                               gamfac1)**(1.e0/3.e0)  ! [1/cm]
                      re_cloud_gsfc(i,k) = 1.e0/lambda * gamfac3 * 1.e4  !effective radius [micron]
            endif ! chem_opt and gsfcgce_gocart_coupling
#else
   ! Not running with WRF_Chem
            ! ccn_over_land = 1500  ! [#/cm3] climatological value
            ! ccn_over_water = 150  ! [#/cm3] climatological value
            if (xland(i) .eq. 1.0) then
               ccn_ref = ccn_over_land
            else if (xland(i) .eq. 2.0) then
               ccn_ref = ccn_over_water
            else
               print *,' xland is not 1. or 2., run stopped'
               ! EMK NUWRF
               call wrf_error_fatal(' xland is not 1. or 2., run stopped')
!               stop
            endif
           ! for cloud water, estimate lambda (slope of gamma distribution)
                   mu = min(15.e0, (1000.E0/ccn_ref + 2.e0))
                   gamfac3 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+3.e0) )
                   gamfac1 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+1.e0) )
                   lambda = (4.e0/3.e0*cpi*roqr*ccn_ref/L_cloud*   &
                            gamfac1)**(1.e0/3.e0)  ! [1/cm]
                   re_cloud_gsfc(i,k) = 1.e0/lambda * gamfac3 * 1.e4  !effective radius [micron]
#endif
   endif ! qcl(i,k) < cmin test
      
! for cloud ice

   if (qci(i,k) .lt. cmin) then
      re_ice_gsfc(i,k) = 0.e0
   else
#if (WRF_CHEM == 1)
!  ! when running with WRF_Chem and using aerosol coupling in Goddard MP
!      I_cloud = qci(i,k) * rho(i,k)             ! cloud ice [g/cm3]
!      if ( (chem_opt == 300 .or. chem_opt == 301 .or. &
!          chem_opt == 302 .or. chem_opt == 303) .and. &
!          (gsfcgce_gocart_coupling == 1) ) then
!        ! for cloud ice, estimate lambda (slope of gamma distribution)
!         mu = min(15.e0, (1000.E0/(icn_out*1.e-3)  + 2.e0))
!         gamfac3 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+3.e0) )
!         gamfac1 = ( gamma_toshi(mu+4.e0) / gamma_toshi(mu+1.e0) )
!         lambda = (4.e0/3.e0*cpi*roqi*icn_out*1.e-3/I_cloud*  &
!                  gamfac1)**(1.e0/3.e0)  ! [1/cm]
!         re_ice_gsfc(i,k) = 1.e0/lambda * gamfac3 * 1.e4  !effective radius [micron]
!      else
  ! when running with WRF_Chem but no aerosol coupling in Goddard MP
        ! for cloud ice effective radius depends on temperature profile, formula from GCE
         re_ice_gsfc(i,k) = 125.e0 +(tair(i)-243.16)*5.e0     ! [micron]
         if (tair(i) .gt. 243.16) re_ice_gsfc(i,k) = 125.e0
         if (tair(i) .lt. 223.16) re_ice_gsfc(i,k) = 25.e0
!      endif ! chem_opt and gsfcgce_gocart_coupling
#else
  ! Not running with WRF_Chem
     ! for cloud ice effective radius depends on temperature profile, formula from GCE
      re_ice_gsfc(i,k) = 125.e0 +(tair(i)-243.16)*5.e0     ! [micron]
      if (tair(i) .gt. 243.16) re_ice_gsfc(i,k) = 125.e0
      if (tair(i) .lt. 223.16) re_ice_gsfc(i,k) = 25.e0
#endif
   endif ! qci(i,k) < cmin test

!JJS 20140305 ^^^^^  Calculate effective radius for all cloud species

 ENDDO

 1000 continue

!JJS  ****************************************************************
!JJS  convert from GCE grid back to WRF grid
      do k=kts,kte
!dir$ vector aligned
       DO i=1,irestrict
         ptwrf(i,k) = dpt(i,k)
         qvwrf(i,k) = dqv(i,k)
         qlwrf(i,k) = qcl(i,k)
         qrwrf(i,k) = qrn(i,k)
         qiwrf(i,k) = qci(i,k)
         qswrf(i,k) = qcs(i,k)
         qgwrf(i,k) = qcg(i,k)
         qhwrf(i,k) = qch(i,k)
       ENDDO
      enddo !k

!     ****************************************************************

!+---+-----------------------------------------------------------------+
! EMK NUWRF...Replace Greg Thompson's dBZ values with those calculated
! above.
        IF ( PRESENT (diagflag) ) THEN
        if (diagflag .and. do_radar_ref == 1) then
          do k=kts,kte
!dir$ vector aligned
            DO i=1,irestrict
                    refl_10cm(i,k) = max(-35.,dbz(i,k))
            ENDDO
          end do

        endif
        ENDIF
!+---+-----------------------------------------------------------------+
     
  END SUBROUTINE saticel_s
  
  SUBROUTINE auto_conversion( L, N, P , re)
  implicit none
!-----------------------------------------------------------------------------------------------------
! Comments:
!  This subroutine compute auto conversion rate folloing Li and Daum [2004], which account for
!  total cloud liquid water, particle number concentrations, PSD lambda, broadening parameters.
!
! History:
!  08/2010  Toshi Matsui@NASA GSFC : Initial.
!
!
! References:
! Liu, Y. and P. H. Daum, 2004: Parameterization of the autoconversion process. Part I: Analytical
!   formulation of the Kessler-type parameterizations. J. Atmos. Sci, 61, 1539-1548.
!-----------------------------------------------------------------------------------------------------
 real,intent(in) :: L    ! cloud liquid water [g cm-3]
 real,intent(in) :: N    ! total number concentration [# cm-3]
 real,intent(out) :: P   ! auto conversion rate [g cm-3 s-1]
 real,intent(out) :: re  ! cloud effective radius [micron]

 real :: mu   ! mu of gamma PSD [-]
 real :: eta  ! eta function [cm3 g-2 s-1]
 real :: beta, beta1, beta2     ! beta function [-]
 real :: gamfac , gfac1 , gfac2 ! gamma function [-]
 real :: R6_6power  ! mean radius of the sixth moment [cm]
 real :: R6_thresh ! threshold of  mean radius of the sixth moment [cm]
 real :: R6        ! mean radius of the sixth moment [cm]
 real :: Heaviside_func  ! Heaviside step function (0 or 1)
 real :: lambda    ! slope of gamma size ditribution [1/cm]
! real :: No        ! intercept  [cm-4]

 real,parameter :: Rc = 10.e0 * 1.e-4 ! threshold of particle radus (10 micron) [cm]
 real,parameter :: const_pi    = 3.14159e0 ! pai
 real,parameter :: const_kappa = 1.9e11    ! coefficient for water droplet collection kernel [cm-3 s-1]
                                           ! from Long [1974, JAS].
! real,parameter :: const_kappa = 1.9e11*10000.e0 !10000 is to adjust the order to keseller


 real,parameter :: const_rho_liq = 1.e0    ! density of liquid water [g cm-3]
 real,parameter :: eta_func = ((3.e0/(4.e0*const_pi*const_rho_liq))**2) * const_kappa  ! eta function [cm3 g-2 s-1]
                                                                                       ! a part of (eq 27b)

 logical,parameter :: no_thresh = .true.  ! logic to choose no threshold parameterization or not.

!
! When no particel, no autoconversion.
!
! EMK BUG FIX...Prevent overflow for small but non-zero values of L
! if( N <= 0.e0 .or. L <= 0.e0 ) then
 if( N <= 0.e0 .or. L <= 1.0e-32 ) then
   P = 0.e0
   return
 endif

!
! check bad values of N and L
!
! if( N < 0.e0 ) stop 'MSG auto_conversion: N is negative, it must be positive'
! if( L < 0.e0 ) stop 'MSG auto_conversion: L is negative, it must be positive'
! if( L > 1.e0 ) stop 'MSG auto_conversion: L is greater than 1g/cm3.'

!
! Empirical fit of mu as a function of total particle number concentrations.
! From Martin et al. (1994), assign gamma shape parameter mu for cloud
! drops according to general dispersion characteristics.
! disp=~0.25 for Maritime and 0.45 for Continental.
! Since disp=SQRT((mu+2)/(mu+1) - 1), mu varies from 15 for Maritime (pristine air)
! to 2 for Continental (really dirty air).  if mu = 0 --> expnential distribution (narrow dist)
!

! orig
 mu = MIN(15.e0, (1000.E0/N + 2.e0))


!
! gamma functions
!
 gfac1 = gamma_toshi(mu+4.e0)
 gfac2 = gamma_toshi(mu+1.e0)
 gamfac = (gfac1/gfac2)

!
! estimate lambda (slope of gamma distribution)
!
 lambda = (4.e0/3.e0*const_pi*const_rho_liq*N/L*gamfac)**(1.e0/3.e0)  ! [1/cm]


 THRESH: if( no_thresh ) then !-------------------------------------------

!
! threshold of particle radius (mean radius of the sixth moment )
!
 gfac1 = gamma_toshi(mu+7.e0)
 gfac2 = gamma_toshi(mu+1.e0)
 gamfac = (gfac1/gfac2)

 R6_6power = (1.e0 / lambda)**6.e0 * gamfac   ![cm] (eq. A3)

!
! auto conversion rate (eq. 26a)
!
 P = const_kappa *   N     * R6_6power *    L      ! [g cm-3 s-1 ]
!    [cm-3 s-1]  * [#/cm3] *   [cm6]   * [g/cm3]


 else  !with threshold ---------------------------------------------------

!
! Estimate eta under gamma PSD
!
 beta1 = (6.e0+mu)*(5.e0+mu)*(4.e0+mu)
 beta2 = (3.e0+mu)*(2.e0+mu)*(1.e0+mu)
 beta  = beta1 / beta2

 eta = eta_func * beta  ! eta function (eq 27b) [cm3 g-2 s-1]

!
! threshold of particle radius (mean radius of the sixth moment )
!
 R6_thresh = beta * Rc  ![cm] (pg 1545)

!
! mean radius of the sixth moment
!
 gfac1 = gamma_toshi(6.e0+mu+1.e0)
 gfac2 = gamma_toshi(1.e0+mu)
 gamfac = (gfac1/gfac2)**(1.e0/6.e0)

 R6 = (1.e0 / lambda) * gamfac   ![cm] (eq. A3)

!
! Heaviside step function
!
 if    ( R6 - R6_thresh <= 0.e0 ) then
    Heaviside_func = 0.e0
 elseif( R6 - R6_thresh > 0.e0 ) then
    Heaviside_func = 1.e0
 else
    ! NUWRF EMK...User WRF's library to gracefully stop MPI.
    write(wrf_err_message,*)'MSG: auto_conversion: Strange value of R6= ',R6
    call wrf_error_fatal(trim(wrf_err_message))
!   print*, 'MSG: auto_conversion: Strange value of R6= ', R6 ; stop
 endif

!
! auto conversion rate [g cm-3 s-1 ] (eq. 27a)
!
 P = eta * (1.e0/N) * (L**3) *  Heaviside_func

!    [cm3 g-2 s-1] * [cm3] * [g3/cm9]

 endif THRESH !------------------------------------------------------------


! optional

!
! estimate effective radius
!
 gfac1 = gamma_toshi(mu+4.e0)
 gfac2 = gamma_toshi(mu+3.e0)
 gamfac = (gfac1/gfac2)

 re = 1.e0/lambda * gamfac * 1.e4  !effective radius [micron]

!
! estimate No
!
! call gamma_function(mu+1.e0 ,gfac1)
! No = N * (lambda**(mu+1)) / gfac1

 END subroutine auto_conversion

!DIR$ ATTRIBUTES FORCEINLINE :: gamma_toshi
 real function gamma_toshi(x)

!---------------------------------------------------------------------------------------------------
! Comments:
!   compute the gamma function T(x) for single precision floating point.
!       input :  x  --- argument of a(x)
!                       ( x is not equal to 0,-1,-2,... )
!
! History:
! 09/2009  Toshi Matsui@NASA GSFC ; Adapted to SDSU
!
! References:
!----------------------------------------------------------------------------------------------------
 implicit double precision (a-h,o-z)
 dimension g(26)
 data g/1.0d0,0.5772156649015329d0, &
       -0.6558780715202538d0, -0.420026350340952d-1, &
        0.1665386113822915d0,-.421977345555443d-1, &
        -.96219715278770d-2, .72189432466630d-2, &
        -.11651675918591d-2, -.2152416741149d-3, &
        .1280502823882d-3, -.201348547807d-4, &
        -.12504934821d-5, .11330272320d-5, &
        -.2056338417d-6, .61160950d-8, &
         .50020075d-8, -.11812746d-8, &
        .1043427d-9, .77823d-11, &
        -.36968d-11, .51d-12, &
        -.206d-13, -.54d-14, .14d-14, .1d-15/
 real :: x

 pi=3.141592653589793d0
 if (x.eq.int(x)) then
     if (x.gt.0.0d0) then
         ga=1.0d0
         m1=int(x)-1
        do k=2,m1
           ga=ga*k
        enddo
     else
        ga=1.0d+300
     endif
  else
     if (dabs(dble(x)).gt.1.0d0) then
         z=dabs(dble(x))
         m=int(z)
         r=1.0d0
        do k=1,m
           r=r*(z-k)
        enddo
        z=z-m
     else
        z=dble(x)
     endif
     gr=g(26)
     do k=25,1,-1
        gr=gr*z+g(k)
     enddo
     ga=1.0d0/(gr*z)
     if (dabs(dble(x)).gt.1.0d0) then
         ga=ga*r
         if (x.lt.0.0d0) ga=-pi/(x*ga*dsin(pi*x))
     endif
  endif

  gamma_toshi = real(ga)

  end function gamma_toshi

 SUBROUTINE Find_NaN_Inf_Double(Warning_MSG, real_input, i_in,j_in,k_in)
 implicit none

 real,intent(inout) :: real_input  !anykind of Non-dimensional input Real parameters
 integer,intent(in) :: i_in, j_in, k_in
 character*(*),intent(in) :: Warning_MSG

!
! Find Infinity
!
!if( exp(-abs(real_input)) == 0.) then ! this formulae is bit slow 

 if( 1e+10/real_input == 0. ) then
    print*,'MSG Find_NaN_Inf: '//Warning_MSG//'Infinity at',i_in,j_in,k_in
    real_input = 0.
    return
 endif

!
! Find NaN
! 
 if( real_input==0. .or. real_input>0. .or. real_input<0. .or. real_input>=0. .or. real_input<=0. ) then
 else
    print*,'MSG Find_NaN_Inf: '//Warning_MSG//'NaN at',i_in,j_in,k_in
    real_input = 0.
    return
 endif

 END SUBROUTINE Find_NaN_Inf_Double

!+---+-----------------------------------------------------------------+

      subroutine refl10cm_gsfc (qv1d, qr1d, qs1d, qg1d,                 &
                       t1d, p1d, dBZ, kts, kte, ii, jj)

      IMPLICIT NONE

!..Sub arguments
      INTEGER, INTENT(IN):: kts, kte, ii, jj
      REAL, DIMENSION(kts:kte), INTENT(IN)::                            &
                      qv1d, qr1d, qs1d, qg1d, t1d, p1d
      REAL, DIMENSION(kts:kte), INTENT(INOUT):: dBZ

!..Local variables
      REAL, DIMENSION(kts:kte):: temp, pres, qv, rho
      REAL, DIMENSION(kts:kte):: rr, rs, rg

      DOUBLE PRECISION, DIMENSION(kts:kte):: ilamr, ilams, ilamg
      DOUBLE PRECISION, DIMENSION(kts:kte):: N0_r, N0_s, N0_g
      DOUBLE PRECISION:: lamr, lams, lamg
      LOGICAL, DIMENSION(kts:kte):: L_qr, L_qs, L_qg

      REAL, DIMENSION(kts:kte):: ze_rain, ze_snow, ze_graupel
      DOUBLE PRECISION:: fmelt_s, fmelt_g

      INTEGER:: i, k, k_0, kbot, n
      LOGICAL:: melti

      DOUBLE PRECISION:: cback, x, eta, f_d
      REAL, PARAMETER:: R=287.
      REAL, PARAMETER:: PIx=3.1415926536

!+---+

      do k = kts, kte
         dBZ(k) = -35.0
      enddo

!+---+-----------------------------------------------------------------+
!..Put column of data into local arrays.
!+---+-----------------------------------------------------------------+
      do k = kts, kte
         temp(k) = t1d(k)
         qv(k) = MAX(1.E-10, qv1d(k))
         pres(k) = p1d(k)
         rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))

         if (qr1d(k) .gt. 1.E-9) then
            rr(k) = qr1d(k)*rho(k)
            N0_r(k) = xnor
            lamr = (xam_r*xcrg(3)*N0_r(k)/rr(k))**(1./xcre(1))
            ilamr(k) = 1./lamr
            L_qr(k) = .true.
         else
            rr(k) = 1.E-12
            L_qr(k) = .false.
         endif

         if (qs1d(k) .gt. 1.E-9) then
            rs(k) = qs1d(k)*rho(k)
            N0_s(k) = xnos
            lams = (xam_s*xcsg(3)*N0_s(k)/rs(k))**(1./xcse(1))
            ilams(k) = 1./lams
            L_qs(k) = .true.
         else
            rs(k) = 1.E-12
            L_qs(k) = .false.
         endif

         if (qg1d(k) .gt. 1.E-9) then
            rg(k) = qg1d(k)*rho(k)
               N0_g(k) = xnog
            lamg = (xam_g*xcgg(3)*N0_g(k)/rg(k))**(1./xcge(1))
            ilamg(k) = 1./lamg
            L_qg(k) = .true.
         else
            rg(k) = 1.E-12
            L_qg(k) = .false.
         endif
      enddo

!+---+-----------------------------------------------------------------+
!..Locate K-level of start of melting (k_0 is level above).
!+---+-----------------------------------------------------------------+
      melti = .false.
      k_0 = kts
      do k = kte-1, kts, -1
         if ( (temp(k).gt.273.15) .and. L_qr(k)                         &
                                  .and. (L_qs(k+1).or.L_qg(k+1)) ) then
            k_0 = MAX(k+1, k_0)
            melti=.true.
            goto 195
         endif
      enddo
 195  continue

!+---+-----------------------------------------------------------------+
!..Assume Rayleigh approximation at 10 cm wavelength. Rain (all temps)
!.. and non-water-coated snow and graupel when below freezing are
!.. simple. Integrations of m(D)*m(D)*N(D)*dD.
!+---+-----------------------------------------------------------------+

      do k = kts, kte
         ze_rain(k) = 1.e-22
         ze_snow(k) = 1.e-22
         ze_graupel(k) = 1.e-22
         if (L_qr(k)) ze_rain(k) = N0_r(k)*xcrg(4)*ilamr(k)**xcre(4)
         if (L_qs(k)) ze_snow(k) = (0.176/0.93) * (6.0/PIx)*(6.0/PIx)     &
                                 * (xam_s/900.0)*(xam_s/900.0)          &
                                 * N0_s(k)*xcsg(4)*ilams(k)**xcse(4)
         if (L_qg(k)) ze_graupel(k) = (0.176/0.93) * (6.0/PIx)*(6.0/PIx)  &
                                    * (xam_g/900.0)*(xam_g/900.0)       &
                                    * N0_g(k)*xcgg(4)*ilamg(k)**xcge(4)
      enddo


!+---+-----------------------------------------------------------------+
!..Special case of melting ice (snow/graupel) particles.  Assume the
!.. ice is surrounded by the liquid water.  Fraction of meltwater is
!.. extremely simple based on amount found above the melting level.
!.. Uses code from Uli Blahak (rayleigh_soak_wetgraupel and supporting
!.. routines).
!+---+-----------------------------------------------------------------+

      if (melti .and. k_0.ge.kts+1) then
       do k = k_0-1, kts, -1

!..Reflectivity contributed by melting snow
          if (L_qs(k) .and. L_qs(k_0) ) then
           fmelt_s = MAX(0.005d0, MIN(1.0d0-rs(k)/rs(k_0), 0.99d0))
           eta = 0.d0
           lams = 1./ilams(k)
           do n = 1, nrbins
              x = xam_s * xxDs(n)**xbm_s
              call rayleigh_soak_wetgraupel (x,DBLE(xocms),DBLE(xobms), &
                    fmelt_s, melt_outside_s, m_w_0, m_i_0, lamda_radar, &
                    CBACK, mixingrulestring_s, matrixstring_s,          &
                    inclusionstring_s, hoststring_s,                    &
                    hostmatrixstring_s, hostinclusionstring_s)
              f_d = N0_s(k)*xxDs(n)**xmu_s * DEXP(-lams*xxDs(n))
              eta = eta + f_d * CBACK * simpson(n) * xdts(n)
           enddo
           ze_snow(k) = SNGL(lamda4 / (pi5 * K_w) * eta)
          endif

!..Reflectivity contributed by melting graupel

          if (L_qg(k) .and. L_qg(k_0) ) then
           fmelt_g = MAX(0.005d0, MIN(1.0d0-rg(k)/rg(k_0), 0.99d0))
           eta = 0.d0
           lamg = 1./ilamg(k)
           do n = 1, nrbins
              x = xam_g * xxDg(n)**xbm_g
              call rayleigh_soak_wetgraupel (x,DBLE(xocmg),DBLE(xobmg), &
                    fmelt_g, melt_outside_g, m_w_0, m_i_0, lamda_radar, &
                    CBACK, mixingrulestring_g, matrixstring_g,          &
                    inclusionstring_g, hoststring_g,                    &
                    hostmatrixstring_g, hostinclusionstring_g)
              f_d = N0_g(k)*xxDg(n)**xmu_g * DEXP(-lamg*xxDg(n))
              eta = eta + f_d * CBACK * simpson(n) * xdtg(n)
           enddo
           ze_graupel(k) = SNGL(lamda4 / (pi5 * K_w) * eta)
          endif

       enddo
      endif

      do k = kte, kts, -1
         dBZ(k) = 10.*log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.d18)
      enddo

      end subroutine refl10cm_gsfc

!+---+-----------------------------------------------------------------+

!JJS 20140225
! Calculate cloud droplet effective radius
   real function eff_rad(lambda)

#ifndef NO_IEEE_MODULE
      use, intrinsic :: ieee_arithmetic
#endif
      implicit none

!---------------------------------------------------------------------------------------------------
! Comments:
! Compute drop effective radius from slope parameters (lambda) of expoential size distribution.
!
! History:
! 02/2014  Toshi Matsui@NASA GSFC ; Initial
!
! References:
!----------------------------------------------------------------------------------------------------
      real,intent(in)  :: lambda   ! intercept parameter [1/cm]

!
! for no particles.
!
#ifndef NO_IEEE_MODULE
       if ( lambda <= 0.e0  .or. ieee_is_nan(lambda) ) then
#else
       if ( lambda <= 0.e0                           ) then
#endif
          eff_rad = 0.e0
          return
       endif

!
! compute drop effective radius for exponential distribution N(D) = N0*exp(-lam*D)
!
       eff_rad = 1.5e0 / (lambda*100.) * 1.0e+6  ! [micron]

   end function eff_rad

END MODULE  module_mp_gsfcgce_4ice_nuwrf


