cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c c subroutine getfog: compute fog occurrence c c Author: Binbin Zhou, Aug 1, 2009 c Modification: adapted from Beijing Olympic Project's product generator c cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc subroutine getfog (nv,rawdata,jf,iens, + derv_pr,missing,wgt) include 'parm.inc' C for variable table: Integer numvar Character*4 vname(maxvar) Integer k5(maxvar), k6(maxvar),k4(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), dk4(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,k4,k5,k6,Mlvl,Plvl,Tlvl, + MeanLevel,ProbLevel,Thrs, + Msignal,Psignal,op common /dtbl/nderiv, + dvname,dk4,dk5,dk6,dMlvl,dPlvl,dTlvl, + dMeanLevel,dProbLevel,dThrs, + dMsignal,dPsignal,MPairLevel,PPairLevel,dop INTEGER, intent(IN) :: nv, jf, iens REAL,dimension(jf,iens,maxmlvl),intent(IN) :: rawdata REAL,dimension(jf,maxplvl,maxtlvl),intent(INOUT) :: + derv_pr real FOGapnt(iens),CLDBapnt(iens),CLDTapnt(iens), + U10apnt(iens),V10apnt(iens),RH2apnt(iens),W10apnt(iens), + VISapnt(iens),SFCapnt(iens) real fog(jf,iens),aprob, lwc(jf,iens), amean real wgt(30) integer,dimension(jf,iens),intent(IN) :: missing integer miss(iens) 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 ID_U10 = index_table(k5,k6,33,105,maxvar) !search index of 10m U ID_V10 = index_table(k5,k6,34,105,maxvar) !search index of 10m V ID_RH2 = index_table(k5,k6,52,105,maxvar) !search index of 2m RH ID_VIS = index_table(k5,k6,20,1,maxvar) !search index of sfc visibility ID_SFC = index_table(k5,k6,7,1,maxvar) !search index of sfc height in the table write(*,*) 'In getfog -->' write(*,*)'ID_U10, ID_V10, ID_RH2, ID_VIS=', + ID_U10, ID_V10, ID_RH2,ID_VIS write(*,*)'ID_CLDB, ID_CLDT, ID_SFC', + ID_CLDB, ID_CLDT, ID_SFC if (ID_CLDB .gt.0 .and. ID_CLDT .gt.0 .and. + ID_U10 .gt.0 .and. ID_V10 .gt.0 .and. + ID_RH2 .gt.0 .and. ID_VIS .gt.0 .and. + ID_SFC .gt.0 ) then do igrid = 1,jf CLDBapnt=rawdata(igrid,:,ID_CLDB,1) CLDTapnt=rawdata(igrid,:,ID_CLDT,1) RH2apnt =rawdata(igrid,:,ID_RH2,1) W10apnt=sqrt(rawdata(igrid,:,ID_U10,1)**2 + + rawdata(igrid,:,ID_V10,1)**2 ) VISapnt =rawdata(igrid,:,ID_VIS,1) SFCapnt =rawdata(igrid,:,ID_SFC,1) if(igrid.eq.739400) then write(*,*) CLDBapnt write(*,*) CLDTapnt write(*,*) W10apnt write(*,*) RH2apnt write(*,*) VISapnt write(*,*) SFCapnt end if FOGapnt = 0. hasfog= 0. do i = 1, iens if(CLDBapnt(i).lt.0.0) CLDBapnt(i)=20000.0 if(CLDTapnt(i).lt.0.0) CLDTapnt(i)=20000.0 if(CLDBapnt(i).ge.0.0) Then CLDBapnt(i) = CLDBapnt(i) - SFCapnt(i) if(CLDBapnt(i).lt.0.0) CLDBapnt(i) = 0.0 end if if(CLDTapnt(i).ge.0.0) Then CLDTapnt(i) = CLDTapnt(i) - SFCapnt(i) if(CLDTapnt(i).le.0.0) CLDTapnt(i) = 0.0 end if if(CLDTapnt(i).LE.CLDBapnt(i)) CLDTapnt(i)=CLDBapnt(i) if(((CLDBapnt(i).ge.0.0 .and. CLDBapnt(i).le.50.0).and. !50: vertical resolution ~ 30m and detect "foot fog" + (CLDTapnt(i).ge.0.0 .and. CLDTapnt(i).le.400.0)) !400: detect sea fog, advection fog and deep fogs + .or. (W10apnt(i).le.0.05 .and. RH2apnt(i).ge.99.0) !RH-wind to detect ground fog + .or. VISapnt(i).le.1000. ) then !equavalent to LWC = 0.015 g/kg FOGapnt(i) = 1. hasfog=1. if(RH2apnt(i).lt.95.0) FOGapnt(i)=0. !if RH<95%, no fog anyway else FOGapnt(i) = 0. endif end do fog(igrid,:)=FOGapnt(:) end do do 30 lv=1,dPlvl(nv) derv_pr(:,nv,lv,:)=0.0 do lt = 1, dTlvl(nv) thr1 = dThrs(nv,lt) do igrid = 1,jf miss=missing(igrid,:) FOGapnt=fog(igrid,:) call getprob(FOGapnt,iens, + thr1,thr2,dop(nv),aprob,miss,wgt) derv_pr(igrid,nv,lv,lt)=aprob end do end do 30 continue end if return end