subroutine spruv(wdata,uges,vges,fact,wtype,nwdta,nwrecs, * nlat,nlon,nsig,uvfile,ermax,ermin,gross) c$$$ subprogram documentation block c . . . . c subprogram: spruv save wind infor. c prgmmr: parrish org: w/nmc22 date: 90-10-13 c c abstract: save wind information for later use. c c program history log: c 90-10-13 parrish c 08-04-04 ebisuzaki use f90 dynamic arrays, loops c c input argument list: c wdata - obs info at obs locations c uges,vges - guess u,v values c fact - reduction to 10,20 m factor c wtype - wind type c nwdta - number of obs c nlat - number of latitudes on gaussian grid c nlon - number of longitudes on gaussian grid c nsig - number of layers on gaussian grid c nblk - blocking factor for output file c iunit - output scratch unit c ermax,ermin,gross - parameters for gross error test c c output argument list: c nwrecs - number of records of wind data c c attributes: c language: f90 c machine: AIX c c$$$ c dimension wdata(nwdta,7) dimension uges(nwdta),vges(nwdta),wtype(nwdta) dimension numw(nsig) dimension fact(nwdta) dimension uplty(nsig),vplty(nsig) dimension icount(nlat,nlon,nsig),ncount(nwdta) dimension jl(128,6) dimension uvfile(*) c-------- obermax=-1.e50 obermin=1.e50 resmax=-1.e50 ratmax=-1.e50 numgross=0 numw=0 ntot=0 ier=1 ilon=2 ilat=3 isig=4 iures=5 ivres=6 nlth=nlat/2 factor=2.0 ssmpen=0. numssm=0 umplty=0. vmplty=0. npp=17 anlon=float(nlon) irec=0 inc=nwdta/128 inc=max(inc,1) nwttot=0 ncount=0 is=1 do 200 kk=1,nwdta ngrp=0 icount=0 issave=is is=is+1 i128=1 numdat=0 do 100 iii=1,5*inc ibeg=mod(iii-1,inc)+1 do 100 i=ibeg,nwdta,inc if(ncount(i) .gt. 0)go to 100 jlat=wdata(i,ilat) if(wdata(i,ilon).ge. anlon+1.)wdata(i,ilon)= * wdata(i,ilon)-anlon if(wdata(i,ilon).lt. 1.)wdata(i,ilon)=wdata(i,ilon)+anlon jlon=wdata(i,ilon) jsig=wdata(i,isig) dx=wdata(i,ilon)-jlon dy=wdata(i,ilat)-jlat ds=wdata(i,isig)-jsig jlat=max(1,min(jlat,nlat)) jsig=max(1,min(jsig,nsig)) if(icount(jlat,jlon,jsig) .eq. 1)go to 100 jlatp=jlat+1 jlatp=min(jlatp,nlat) if(icount(jlatp,jlon,jsig) .eq. 1)go to 100 jsigp=jsig+1 jsigp=min(jsigp,nsig) if(icount(jlat,jlon,jsigp) .eq. 1)go to 100 if(icount(jlatp,jlon,jsig) .eq. 1)go to 100 jlonp=jlon+1 if(jlonp .gt. nlon)jlonp=jlonp-nlon if(icount(jlat,jlonp,jsigp) .eq. 1)go to 100 if(icount(jlat,jlonp,jsig) .eq. 1)go to 100 if(icount(jlatp,jlonp,jsigp) .eq. 1)go to 100 if(icount(jlatp,jlonp,jsig) .eq. 1)go to 100 if(jlat .le. nlth)wdata(i,ier)=wdata(i,ier)*factor c-----------------------------------gross error test added here obserror=1./max(sqrt(wdata(i,ier)),1.e-10) obserrlm=max(ermin,min(ermax,obserror)) residual=sqrt(wdata(i,iures)**2+wdata(i,ivres)**2) ratio=residual/obserrlm if(obserror.lt.1.e5) obermax=max(obermax,obserror) obermin=min(obermin,obserror) resmax=max(resmax,residual) ratmax=max(ratmax,ratio) if(ratio.gt.gross) then numgross=numgross+1 wdata(i,ier)=0. end if if(nint(wtype(i)) .ne. 283)then uplty(jsig)=uplty(jsig)+wdata(i,ier)*wdata(i,iures)**2 vplty(jsig)=vplty(jsig)+wdata(i,ier)*wdata(i,ivres)**2 numw(jsig)=numw(jsig)+1 else ssmpen=ssmpen+wdata(i,ier)*(wdata(i,iures)-wdata(i,ivres)) * **2 numssm=numssm+1 end if icount(jlat,jlon,jsig)=1 icount(jlatp,jlon,jsig)=1 icount(jlat,jlonp,jsig)=1 icount(jlatp,jlonp,jsig)=1 icount(jlat,jlon,jsigp)=1 icount(jlatp,jlon,jsigp)=1 icount(jlat,jlonp,jsigp)=1 icount(jlatp,jlonp,jsigp)=1 jl(i128,1)=jlat jl(i128,2)=jlon jl(i128,3)=jsig jl(i128,4)=jlatp jl(i128,5)=jlonp jl(i128,6)=jsigp wdata(i,ier)=sqrt(wdata(i,ier)) wgt000=fact(i)*wdata(i,ier)*(1.0-dx)*(1.0-dy)*(1.0-ds) wgt010=fact(i)*wdata(i,ier)*dx*(1.0-dy)*(1.0-ds) wgt100=fact(i)*wdata(i,ier)*(1.-dx)*dy*(1.0-ds) wgt110=fact(i)*wdata(i,ier)*dx*dy*(1.0-ds) wgt001=fact(i)*wdata(i,ier)*(1.-dx)*(1.-dy)*ds wgt011=fact(i)*wdata(i,ier)*dx*(1.-dy)*ds wgt101=fact(i)*wdata(i,ier)*(1.-dx)*dy*ds wgt111=fact(i)*wdata(i,ier)*dx*dy*ds uvfile(is)=jlat+.001 uvfile(is+1)=jlon+.001 uvfile(is+2)=jsig+.001 uvfile(is+3)=jlatp+.001 uvfile(is+4)=jlonp+.001 uvfile(is+5)=jsigp+.001 uvfile(is+6)=wgt000 uvfile(is+7)=wgt100 uvfile(is+8)=wgt010 uvfile(is+9)=wgt110 uvfile(is+10)=wgt001 uvfile(is+11)=wgt101 uvfile(is+12)=wgt011 uvfile(is+13)=wgt111 uvfile(is+14)=wdata(i,iures) uvfile(is+15)=wdata(i,ivres) uvfile(is+16)=wdata(i,ier) c uvfile(is+17)=uges(i) c uvfile(is+18)=vges(i) c uvfile(is+19)=wtype(i)+.001 nwttot=nwttot+1 is=is+npp ngrp=ngrp+1 i128=i128+1 ncount(i)=1 if(i128 .eq. 129)i128=1 if(ngrp .gt. 128)then icount(jl(i128,1),jl(i128,2),jl(i128,3))=0 icount(jl(i128,4),jl(i128,2),jl(i128,3))=0 icount(jl(i128,1),jl(i128,5),jl(i128,3))=0 icount(jl(i128,4),jl(i128,5),jl(i128,3))=0 icount(jl(i128,1),jl(i128,2),jl(i128,6))=0 icount(jl(i128,4),jl(i128,2),jl(i128,6))=0 icount(jl(i128,1),jl(i128,5),jl(i128,6))=0 icount(jl(i128,4),jl(i128,5),jl(i128,6))=0 end if 100 continue 121 continue uvfile(issave)=ngrp+.001 irec=irec+1 if(nwttot .eq. nwdta)go to 201 200 continue 201 nwrecs=irec do 251 k=1,nsig umplty=umplty+uplty(k) vmplty=vmplty+vplty(k) ntot=ntot+numw(k) write(6,240)numw(k),k,uplty(k),vplty(k) 240 format(' number of wind obs=',i9,' at level ',i4,' pen = ', * 2e12.4) 251 continue print *,' total number of ssm/i obs=',numssm print *,' total number of wind obs=',ntot print *,' ssm/i penalty = ', ssmpen tu=umplty/float(ntot) write(6,930)umplty,tu 930 format(' total u obs penalty=',e12.4,e12.4) tv=vmplty/float(ntot) write(6,940)vmplty,tv 940 format(' total v obs penalty=',e12.4,e12.4) write(6,*)' gross error check for winds:' write(6,*)' obs error max,min=',obermax,obermin write(6,*)' for check, obs error bounded by ',ermin,ermax write(6,*)' for check, max ratio residual/ob error =',gross write(6,*)' max residual=',resmax write(6,*)' max ratio=',ratmax write(6,*)' number obs that failed gross test = ',numgross return end