cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c     
c     subroutine LLWS: compute low level wind shear 
c     
c     Author: Binbin Zhou, Aug, 7, 2005
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
   	subroutine llws (nv,rawdata, jf, iens,  
     +             derv_mn, derv_sp, derv_pr)

            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 apoint(iens),LLWSapoint(iens),llws1(jf,iens)
        real ws,u10,v10,hsfc,up(14),vp(14),hp(14)

           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
           !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 for LLWS                                             
           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 LLWS=', ID_U10,ID_V10,
     +  ID_U,ID_V,ID_H,ID_SF


          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 ) then

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

            write(*,*) 'In LLWS=', ID_U10,ID_V10,
     +  ID_U,ID_V,ID_H,ID_SF

              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)
                 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)
                 end do
  
                 call get_llws(up,vp,hp,u10,v10,hsfc,jf,14,ws)

                  LLWSapoint(i)=ws
                  llws1(igrid,i)=ws

                end do 

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

                  if(igrid.eq.4300) then
                   write(*,*) 'LLWS=',amean,aspread
                  end if
                end do

              end do

              do lv=1,dPlvl(nv)

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

                    LLWSapoint(:)=llws1(igrid,:)

                    if(trim(dop(nv)).ne.'-') then
                     thr1 = dThrs(nv,lt)
                     thr2 = 0.
               call getprob(LLWSapoint,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(LLWSapoint,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


      subroutine get_llws (up,vp,hp,u10,v10,hsfc,jf,lv,llws)
c         up,vp : u,v on pressure levels
c            hp : height of pressure levels
c       u10,v10 : 10m u and v
c          hsfc : sfc height

        INTEGER jf,lv
        REAL up(lv),vp(lv),hp(lv)
        REAL u10,v10,hsfc,llws


         z1 = 10. + hsfc
          if (z1 .lt. hp(1) ) then
            kp = 0
          else
            do k = 1,lv-1
             if(z1.ge.hp(k).and.z1.lt.hp(k+1)) then
               kp=k
             end if
            end do
          end if

          hz1 = hp(kp+1) - z1

          dh=0.0

          if((hz1+10.0).gt.609.6) then                    !609.6m=2000ft, hz1+10 means from sfc instead form 10m
            u2=u10 + (up(kp+1)-u10)*599.6/hz1
            v2=v10 + (vp(kp+1)-v10)*599.6/hz1
            z2=hsfc+609.6
          else
            do k=kp+1,lv-1
              dh=dh+hp(k+1)-hp(k)
              if((dh+hz1+10).gt.609.6) then  !ie, reach to 2000 feet
               z2=hsfc+609.6
               rt=(z2-hp(k))/(hp(k+1)-hp(k))
               u2=up(k)+(up(k+1)-up(k))*rt
               v2=vp(k)+(vp(k+1)-vp(k))*rt
               k2=k
               goto 609
              end if
            end do
          end if

609       llws=abs(sqrt((u2-u10)**2+(v2-v10)**2))
     &              /609.9
          llws=llws*1.943*609.9                             !unit--> knot/2000ft

     
       return
       end