cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c     
c     subroutine new_fog: compute fog LWC according to the asymptotic analysis 
c                         of radiation fog theory but adding advection term
c     
c     Author: Binbin Zhou, Aug 18 , 2010 
c     Modification: 
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
        subroutine new_fog(nv,itime,i00,t4cooling,t2m4cooling,
     +     rawdata,jf,im,jm,dx,dy,iens,interval,loutput, 
     +     derv_mn,derv_sp,derv_pr,LWCfield)

            include 'parm.inc'

C for variable table:
        Integer numvar, nderiv
        Character*4 vname(maxvar)
        Integer k5(maxvar), k6(maxvar)
        Character*1 Msignal(maxvar), Psignal(maxvar)
        Integer Mlvl(maxvar), MeanLevel(maxvar,maxmlvl)
        Integer Plvl(maxvar), ProbLevel(maxvar,maxplvl)
        Integer Tlvl(maxvar)
        Character*1 op(maxvar)
        Real    Thrs(maxvar,maxtlvl)
                                                                                                                                                                
c    for derived variables
        Character*4 dvname(maxvar)
        Integer dk5(maxvar), dk6(maxvar)
        Character*1 dMsignal(maxvar), dPsignal(maxvar)
        Integer dMlvl(maxvar), dMeanLevel(maxvar,maxmlvl)
        Integer dPlvl(maxvar), dProbLevel(maxvar,maxplvl)
        Character*1 dop(maxvar)
        Integer dTlvl(maxvar)
        Real    dThrs(maxvar,maxtlvl)
        Integer MPairLevel(maxvar,maxmlvl,2)
        Integer PPairLevel(maxvar,maxplvl,2)
                                                                                                                                                                
        common /tbl/numvar,
     +              vname,k5,k6,Mlvl,Plvl,Tlvl,
     +              MeanLevel,ProbLevel,Thrs,
     +              Msignal,Psignal,op
                                                                                                                                                                
        common /dtbl/nderiv,
     +              dvname,dk5,dk6,dMlvl,dPlvl,dTlvl,
     +              dMeanLevel,dProbLevel,dThrs,
     +              dMsignal,dPsignal,MPairLevel,PPairLevel,dop


        INTEGER, intent(IN) :: nv, jf, iens
        REAL,dimension(jf,iens,numvar,maxmlvl),intent(IN) :: rawdata
        REAL,dimension(jf,nderiv,maxmlvl),intent(INOUT) :: derv_mn
        REAL,dimension(jf,nderiv,maxmlvl),intent(INOUT) :: derv_sp
        REAL,dimension(jf,nderiv,maxplvl,maxtlvl),intent(INOUT) :: 
     +               derv_pr
 
               
        REAL,dimension(jf,iens,loutput,14),intent(IN) ::t4cooling
        REAL,dimension(jf,iens,loutput),intent(IN)    ::t2m4cooling
        REAL,dimension(jf,iens,loutput),intent(INOUT) ::LWCfield

        real apoint(iens),FOGapoint(iens)
        real u10,v10,hsfc,up(14),vp(14),hp(14),
     +       tp(14,2),t2(2),rh2,rhp(14),lwc,lwc1(jf,iens)

        real qw(jf),qw2d(im,jm),qadv(jf,iens),
     +       qadv2d(im,jm),u2d(im,jm),v2d(im,jm)
        real dx,dy,ddx,ddy,q_adv

           ID_U10=index_table(k5,k6,33,105,numvar)    !search index of direct variable u10 in the table
           ID_V10=index_table(k5,k6,34,105,numvar)    !search index of direct variable v10 in the table
           ID_U=index_table_var(vname,k5,k6,33,100,'ULWS',numvar) !search index of direct variable u in the table
           ID_V=index_table_var(vname,k5,k6,34,100,'VLWS',numvar) !search index of direct variable v in the table
           ID_RH2=index_table(k5,k6,52,105,numvar)     !search index of direct variable RH 2m in the table
           ID_RH=index_table_var(vname,k5,k6,52,100,'RHFG',numvar) !search index of direct variable profile RH in the table
           ID_CLDB=index_table(k5,k6,7,2,maxvar)      !search index of cloud base heightin the table
           ID_CLDT=index_table(k5,k6,7,3,maxvar)      !search index of cloud cloud heightin the table
 
           !Note: there are other U,V at 850,550 and 250 mb for jet stream. So can not search ULWS,VLWS. 
           !So additional info vname to further search wind at 14 pressure levels  
                                  
           ID_H=index_table_var(vname,k5,k6,7,100,'HLWS',numvar)      !searcg index of direct variable height in tha table
           ID_SF=index_table(k5,k6, 7, 1,numvar)      !searcg index of direct variable hsfc in tha table


            write(*,*) 'In new_fog=', ID_U10,ID_V10,
     +  ID_U,ID_V,ID_H,ID_SF,ID_RH2, ID_RH,
     +    ID_CLDB,ID_CLDT
           write(*,*) jf,iens,interval,loutput,i00

        if (ID_RH  .gt.0 .and.
     +        ID_U10 .gt.0 .and. ID_V10 .gt.0) then    !compute advection LWC term with sepecic humidity q to estimate

           ddx=dx/1000.   !m-->km        
           ddy=dy/1000.

           qadv=0.

           do k=1,iens  

            qadv2d=0.

            do igrid = 1,jf
             RH=rawdata(igrid,k,ID_RH2,1)/100.0
             t=t2m4cooling(igrid,k,i00)
c             tt=7.45*t/(235.0 + t)
c             es = 6.10 *10 ** tt                        !es:saturated vapor pressure, qw: specific humiduty
C        Use WMO recommended formulation (2008)
C   Guide to Metteorological Instruments and Methods of
C   Observation (CIMO Guide):

          if( t.ge.0.0) then
            tt=17.62*t/(243.12 + t)     !over liquid water
          else
            tt=22.46*t/(272.62 + t)     !over ice, assume no supercooled water
          end if

          es = 6.112 *2.71828 ** tt                     !es:saturated vapor pressure

             qw(igrid)=622.0*es*RH/1000.0               !qw=622*es*RH/P    (g/kg)
            end do
 
            do j=1,jm
             do i=1,im
              ij=(j-1)*im + i 
              qw2d(i,j)=qw(ij)+LWCfield(ij,k,i00-1)
              u2d(i,j)=rawdata(ij,k,ID_U10,1)
              v2d(i,j)=rawdata(ij,k,ID_V10,1)
             end do
            end do
 
            do j=2,jm-1                                            !general upwind scheme
             do i=2,im-1  
              if(u2d(i,j).ge.0.0.and.v2d(i,j).ge.0.0) then      
                 qadv2d(i,j) = 
     +            -u2d(i,j)*(qw2d(i,j)-qw2d(i-1,j))/ddx  
     +            -v2d(i,j)*(qw2d(i,j)-qw2d(i,j-1))/ddy
         else if(u2d(i,j).gt.0.0.and.v2d(i,j).lt.0.0) then
                 qadv2d(i,j) =
     +            -u2d(i,j)*(qw2d(i,j)-qw2d(i-1,j))/ddx
     +            -v2d(i,j)*(qw2d(i,j+1)-qw2d(i,j))/ddy
         else if(u2d(i,j).lt.0.0.and.v2d(i,j).lt.0.0) then
                  qadv2d(i,j) =
     +            -u2d(i,j)*(qw2d(i+1,j)-qw2d(i,j))/ddx
     +            -v2d(i,j)*(qw2d(i,j+1)-qw2d(i,j))/ddy
         else if(u2d(i,j).lt.0.0.and.v2d(i,j).gt.0.0) then
                  qadv2d(i,j) =
     +             -u2d(i,j)*(qw2d(i+1,j)-qw2d(i,j))/ddx
     +             -v2d(i,j)*(qw2d(i,j)-qw2d(i,j-1))/ddy
              end if
             end do
            end do

            do j=1,jm
             do i=1,im
              ij=(j-1)*im + i
              qadv(ij,k)=qadv2d(i,j)
             end do
            end do
 
          end do                                                      

        end if

        if (ID_U10 .gt.0 .and. ID_V10 .gt.0 .and.
     +          ID_U .gt.0 .and.   ID_V .gt.0 .and. 
     +          ID_H .gt.0 .and.  ID_SF .gt.0 .and.
     +          ID_RH2.gt.0. and. ID_RH .gt.0 .and.
     +          ID_CLDB.gt.0. and. ID_CLDT.gt.0 ) then

             write(*,*) 'dMlvl(nv)=',dMlvl(nv)

             do lv=1,dMlvl(nv)                       !for all  levels

              do igrid = 1,jf
                          
               do i=1,iens
 
               
                 u10= rawdata(igrid,i,ID_U10,1)
                 v10= rawdata(igrid,i,ID_V10,1)
                 hsfc=rawdata(igrid,i,ID_SF, 1)
                 rh2= rawdata(igrid,i,ID_RH2,1)
                 t2(1) = t2m4cooling (igrid,i,i00-1)    !previous time step
                 t2(2) = t2m4cooling (igrid,i,i00)      !this time step
                 cldb = rawdata(igrid,i,ID_CLDB,1)-hsfc !cloudbase above ground
                 cldt = rawdata(igrid,i,ID_CLDT,1)-hsfc !cloud top above ground
                 q_adv=qadv(igrid,i)

                 do k=1,14
                  up(k)=rawdata(igrid,i,ID_U,k)
                  vp(k)=rawdata(igrid,i,ID_V,k)
                  hp(k)=rawdata(igrid,i,ID_H,k)
                  rhp(k)=rawdata(igrid,i,ID_RH,k)  
                  tp(k,1)=t4cooling(igrid,i,i00-1,k)   !previous time step
                  tp(k,2)=t4cooling(igrid,i,i00,k)     !this time step
                 end do
                
                 lwc=0.0
                 call get_new_fog(up,vp,hp,u10,v10,hsfc,
     +            rhp,rh2,t2,tp,interval,14,cldt,cldb,q_adv,
     +            lwc)
                 FOGapoint(i)=lwc             
                 lwc1(igrid,i)=lwc
c                 LWCfield(igrid,i,i00)=lwc   !this array has error

               end do 


                call getmean(FOGapoint,iens,amean,aspread)
                  derv_mn(igrid,nv,lv)=amean
                  derv_sp(igrid,nv,lv)=aspread

c          write(*,'(i8,22f6.2)') igrid,FOGapoint,amean

                end do  

              end do


              do lv=1,dPlvl(nv)

                do lt = 1, dTlvl(nv)
                              
                 do igrid = 1,jf

                    FOGapoint(:)=lwc1(igrid,:)

                    if(trim(dop(nv)).ne.'-') then
                     thr1 = dThrs(nv,lt)
                     thr2 = 0.
               call getprob(FOGapoint,iens,thr1,thr2,dop(nv),aprob)
                     derv_pr(igrid,nv,lv,lt)=aprob
                    else
                     if(lt.lt.dTlvl(nv)) then
                       thr1 = dThrs(nv,lt)
                       thr2 = dThrs(nv,lt+1)
               call getprob(FOGapoint,iens,thr1,thr2,dop(nv),aprob)
                       derv_pr(igrid,nv,lv,lt)=aprob
                     end if
                    end if

                 end do

                end do
              end do

           end if

           return
           end