PROGRAM pltgrid ! ! Program to plot model grids ! ! Commands: ! ! zxncarf77 -o pltgrid pltgrid.f ! pltgrid < pltgrid.input ! ! or in ARPS root directory, enter ! ! makearps pltgrid ! bin/pltgrid < input/pltgrid.input ! ! MODIFICATION HISTORY: ! ! 11/27/2001 (K. Brewster) ! ! Added plotting of station locations to plot, correcting some ! previous test code. ! ! 03/03/2003 (K. Brewster) ! ! Modified scaling of station markers and name sizes. ! IMPLICIT NONE INTEGER :: nx,ny INTEGER :: mapproj REAL :: dx,dy,ctrlat,ctrlon,trulat1,trulat2,trulon,sclfct,xl,yl INTEGER :: nnwgrd, nnwgrdmax PARAMETER (nnwgrdmax = 10) ! maximum number of new grids INTEGER :: nx1(nnwgrdmax),ny1(nnwgrdmax) REAL :: xctr1(nnwgrdmax) , yctr1(nnwgrdmax) REAL :: dx1(nnwgrdmax),dy1(nnwgrdmax) NAMELIST /grid/ nx,ny,dx,dy,ctrlat,ctrlon NAMELIST /projection/ mapproj,trulat1,trulat2,trulon,sclfct NAMELIST /newgrid/ nnwgrd,nx1,ny1,xctr1,yctr1,dx1,dy1 INTEGER :: ovrmap,mapgrid,nmapfile,lmapfile,i, mxmapfile PARAMETER (mxmapfile= 10) CHARACTER (LEN=132) :: mapfile(mxmapfile) REAL :: latgrid,longrid, xorig, yorig COMMON /mappar2/ latgrid,longrid NAMELIST /map_plot/ ovrmap,mapgrid,latgrid,longrid,nmapfile, & mapfile INTEGER :: pltstn CHARACTER (LEN=100) :: stnfile CHARACTER (LEN=2) :: statelist(60) NAMELIST /station_plot/ pltstn, stnfile, statelist CHARACTER (LEN=20) :: stnname CHARACTER (LEN=2) :: state CHARACTER (LEN=4) :: stnsymbol REAL :: lat,long, x1,x2,y1,y2 INTEGER :: elv,TYPE,length REAL :: xstn,ystn INTEGER :: mxstalo ! maximum number of observation stations PARAMETER (mxstalo=500) INTEGER :: ovrstaopt INTEGER :: ovrstam,staset,ovrstan,ovrstav,stacol,markprio,wrtstax INTEGER :: nsta_typ,sta_typ(10),sta_marktyp(10),sta_markcol(10) REAL :: sta_marksz(10) REAL :: wrtstad INTEGER :: nsta,nstapro(mxstalo),nstatyp(mxstalo) REAL :: latsta(mxstalo), lonsta(mxstalo) CHARACTER (LEN=2) :: s_state(mxstalo) CHARACTER (LEN=5) :: s_name(mxstalo) CHARACTER (LEN=20) :: s_site(mxstalo) INTEGER :: s_elev(mxstalo) CHARACTER (LEN=132) :: stalofl INTEGER :: lstalofl NAMELIST /plot_sta/ ovrstaopt,ovrstam,ovrstan,ovrstav,wrtstax, & wrtstad, stacol, markprio, nsta_typ, sta_typ, sta_marktyp, & sta_markcol,sta_marksz,stalofl REAL :: swx,swy,ctrx,ctry LOGICAL :: fexist REAL :: truelat(2) REAL :: xl1, yl1, ctrlat1, ctrlon1,chsize,yoffset REAL :: cornerlat,cornerlon INTEGER :: itype ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Input control parameters map plotting ! !----------------------------------------------------------------------- ! WRITE(6,'(/a/)') & ' Please input control parameters for map plotting.' READ(5,grid,ERR=100) WRITE(6,'(/5x,a,i8)')'Input nx was',nx WRITE(6,'(/5x,a,i8)')'Input ny was',ny WRITE(6,'(/5x,a,f12.6,a)')'Input dx was',dx,' meters' WRITE(6,'(/5x,a,f12.6,a)')'Input dy was',dy,' meters' WRITE(6,'(/5x,a,f12.6,a)') & 'Input ctrlat was ',ctrlat,' degree North' WRITE(6,'(/5x,a,f12.6,a)') & 'Input ctrlon was ',ctrlon,' degree East' !----------------------------------------------------------------------- ! ! Input map projection parameters ! !----------------------------------------------------------------------- ! READ (5,projection,ERR=100) WRITE(6,'(/5x,a,i4)') 'Input mapproj was ',mapproj WRITE(6,'(/5x,a,f12.6,a)') & 'Input trulat1 was ',trulat1,' degree North' WRITE(6,'(/5x,a,f12.6,a)') & 'Input trulat2 was ',trulat2,' degree North' WRITE(6,'(/5x,a,f12.6)') & 'The latitude of the center of the model domain was ',ctrlat WRITE(6,'(/5x,a,f12.6)') & 'The longitude of the center of the model domain was ',ctrlon WRITE(6,'(/5x,a,f12.6,a)') & 'Input trulon was ',trulon,' degree East' IF ( mapproj == 0 ) THEN trulat1 = ctrlat trulat2 = ctrlat trulon = ctrlon END IF ! !----------------------------------------------------------------------- ! ! Set the output grid and the variable control parameters ! !----------------------------------------------------------------------- ! READ (5,newgrid) PRINT*,' Input nnwgrd=',nnwgrd IF( nnwgrd > nnwgrdmax) THEN PRINT*,'Number of new grids more than maximum allowed.' PRINT*,'Increase the size of nnwgrdmax in the program.' STOP END IF PRINT*,' Input nx1=',(nx1(i),i=1,nnwgrd) PRINT*,' Input ny1=',(ny1(i),i=1,nnwgrd) PRINT*,' Input dx1=',(dx1(i),i=1,nnwgrd) PRINT*,' Input dy1=',(dy1(i),i=1,nnwgrd) PRINT*,' Input xctr1=',(xctr1(i),i=1,nnwgrd) PRINT*,' Input yctr1=',(yctr1(i),i=1,nnwgrd) READ(5,map_plot,ERR=100) ! READ(5,station_plot,ERR=100) GO TO 10 100 WRITE(6,'(a)') 'Error reading NAMELIST file. Program stopped.' STOP 10 CONTINUE ! !----------------------------------------------------------------------- ! ! Initialize ZXPLOT plotting package ! !----------------------------------------------------------------------- ! CALL xdevic CALL xafstyl(1) CALL xsetclrs(1) CALL xcolor(1) CALL xartyp(2) CALL xdspac(0.9) CALL xaxfmt( '(i10)' ) !----------------------------------------------------------------------- ! ! Set up map projection. ! !----------------------------------------------------------------------- ! xl = (nx-3)*dx * 0.001 yl = (ny-3)*dy * 0.001 xorig = 0.0 yorig = 0.0 CALL xstpjgrd(mapproj,trulat1,trulat2,trulon, & ctrlat,ctrlon,xl,yl,xorig,yorig) CALL xxytoll(1,1,xorig*1000.0,yorig*1000.0,cornerlat,cornerlon) WRITE(6,'(/1x,a,2f12.6)') & 'Lat/lon at the SW corner of base grid=',cornerlat,cornerlon CALL xxytoll(1,1,(xorig+xl)*1000.0,(yorig+yl)*1000.0, & cornerlat,cornerlon) WRITE(6,'(1x,a,2f12.6/)') & 'Lat/lon at the NE corner of base grid=',cornerlat,cornerlon IF( xl >= yl) THEN CALL xpspac(0.1,0.9, 0.5-yl/xl*0.4,0.5+yl/xl*0.4) ELSE CALL xpspac(0.5-xl/yl*0.4,0.5+xl/yl*0.4,0.1, 0.9) END IF ! CALL xmap(0.0,xl, 0.0, yl) CALL xaxsca(0.0,xl, dx/1000.0, 0.0, yl, dy/1000.0 ) CALL xcolor(9) IF( ovrmap /= 0 ) THEN DO i=1,MIN(mxmapfile,nmapfile) lmapfile=132 CALL strlnth(mapfile(i), lmapfile) WRITE(6,'(1x,a,a)') 'Input was ',mapfile(i)(1:lmapfile) INQUIRE(FILE=mapfile(i)(1:lmapfile), EXIST = fexist ) IF( .NOT.fexist) THEN WRITE(6,'(a)') 'Map file '//mapfile(i)(1:lmapfile)// & ' not found. Corresponding map no plotted.' ELSE CALL xdrawmap(10,mapfile(i)(1:lmapfile),latgrid,longrid) END IF END DO END IF CALL xthick(3) DO i=1,nnwgrd CALL xcolor(5+i) xl1 = (nx1(i)-3)*dx1(i) * 0.001 yl1 = (ny1(i)-3)*dy1(i) * 0.001 CALL xbox(xctr1(i)/1000.0-xl1/2, xctr1(i)/1000.0+xl1/2, & yctr1(i)/1000.0-yl1/2, yctr1(i)/1000.0+yl1/2) CALL xxytoll(1,1,xctr1(i),yctr1(i),ctrlat1,ctrlon1) WRITE(6,'(/1x,a,2f15.4,2f12.6)') & 'xctr1,yctr1,ctrlat1,ctrlon1=', & xctr1(i),yctr1(i),ctrlat1,ctrlon1 CALL xxytoll(1,1,xctr1(i)-xl1*500.0,yctr1(i)-yl1*500.0, & cornerlat,cornerlon) WRITE(6,'(1x,a,i3,a,2f12.6)') & 'Lat/lon at the SW corner of new grid no.',i, & '=', cornerlat,cornerlon CALL xxytoll(1,1,xctr1(i)+xl1*500.0,yctr1(i)+yl1*500.0, & cornerlat,cornerlon) WRITE(6,'(1x,a,i3,a,2f12.6/)') & 'Lat/lon at the NE corner of new grid no.',i, & '=', cornerlat,cornerlon END DO ovrstam=0 ovrstan=0 ovrstav=0 wrtstax=0 READ(5,plot_sta, ERR=72) WRITE(6,'(a)') & 'Namelist plot_sta was successfully read.' lstalofl=LEN(stalofl) CALL strlnth(stalofl,lstalofl) WRITE(6,'(1x,a,a)') 'Station file name was ',stalofl(1:lstalofl) 72 CONTINUE nsta=0 IF(ovrstaopt /= 0) THEN INQUIRE(FILE=stalofl(1:lstalofl), EXIST = fexist ) IF( .NOT.fexist) THEN WRITE(6,'(a)') 'WARNING: Surface obs file ' & //stalofl(1:lstalofl)// & ' not found. Program continue in ARPSPLT.' ELSE CALL read_station(stalofl,mxstalo,latsta,lonsta,nstatyp, & nstapro,nsta,s_name,s_state,s_site,s_elev) IF(nsta > 0) staset=1 END IF print *, ' Done reading, nsta= ',nsta CALL xcolor(1) DO i=1,nsta CALL xlltoxy(1,1,latsta(i),lonsta(i), xstn,ystn) print *, ' Plotting ',s_name(i),latsta(i),lonsta(i),.001*xstn,.001*ystn xstn=xstn*0.001 ystn=ystn*0.001 DO itype=1,nsta_typ-1 IF(nstatyp(i) == sta_typ(itype)) EXIT END DO print *, ' nstatyp, itype = ',nstatyp(i),itype call xcolor(sta_markcol(itype)) chsize=sta_marksz(itype)*yl*7. yoffset=sta_marksz(itype)*yl*10. IF( ovrstam > 0) THEN print *, 'plotting marker' CALL xmrksz(sta_marksz(itype)) CALL xmarker(xstn,ystn,sta_marktyp(itype)) END IF IF( ovrstan > 0) THEN CALL xchsiz(chsize) length = 5 CALL strlnth(s_name(i),length) IF( ovrstam > 0) THEN CALL xcharc(xstn, (ystn-yoffset), s_name(i)(1:length)) ELSE CALL xcharc(xstn, ystn, s_name(i)(1:length)) END IF END IF END DO END IF CALL xframe CALL xgrend STOP END PROGRAM pltgrid ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE STRLNTH ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE strlnth( string, length ) 235 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Return the length of the non-blank part of a character string. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 11/20/91 ! ! MODIFICATION HISTORY: ! ! 5/05/92 (M. Xue) ! Added full documentation. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! string A character string ! length The declared length of the character string 'string'. ! ! OUTPUT: ! ! length The length of the non-blank part of the string. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE CHARACTER (LEN=* ) :: string ! A character string for the name of ! this run. INTEGER :: length ! The length of the non-blank part ! of a string. INTEGER :: i ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! DO i = length,1,-1 ! ! IF(string(i:i) /= ' ') EXIT ! ! END DO ! ! 200 CONTINUE ! ! length = MAX(1,i) length = LEN_TRIM(string) RETURN END SUBROUTINE strlnth !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READ_STATION ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE read_station(infile,mxstalo,latsta,lonsta, & 2 nstatyp,nstapro,nsta,sname,state,sitena,nelev) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! This subroutine will read external staion information. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! AUTHOR: ! Min Zou (6/1/97) ! ! Modification history: ! !----------------------------------------------------------------------- ! ! Variable Declarations ! !----------------------------------------------------------------------- ! CHARACTER (LEN=*) :: infile INTEGER :: nsta,nstapro(mxstalo),nstatyp(mxstalo) REAL :: latsta(mxstalo), lonsta(mxstalo) CHARACTER (LEN=5) :: sname(mxstalo) CHARACTER (LEN=2) :: state(mxstalo) CHARACTER (LEN=20) :: sitena(mxstalo) INTEGER :: nelev(mxstalo) CHARACTER (LEN=132) :: line OPEN(1,IOSTAT=ios,FILE=infile,STATUS='old',FORM='formatted') IF(ios /= 0) THEN ! error during read istatus = -1 WRITE(6,650) infile 650 FORMAT(' +++ ERROR opening: ',a70,' +++') WRITE(6,651) ios 651 FORMAT(' IOS code = ',i5) RETURN END IF nsta = 0 ! Read only lines that begin with A-Z, a-z, or 0-9 -- treat the rest as ! comments DO i=1,mxstalo READ(1,'(A)',END=999) line IF ( ( line(:1) >= 'A' .AND. line(:1) <= 'Z' ) .OR. & ( line(:1) >= 'a' .AND. line(:1) <= 'z' ) .OR. & ( line(:1) >= '0' .AND. line(:1) <= '9' ) ) THEN nsta = nsta + 1 READ(line,101,ERR=999)sname(nsta),state(nsta),sitena(nsta), & latsta(nsta),lonsta(nsta),nelev(nsta),nstatyp(nsta), & nstapro(nsta) END IF 101 FORMAT(a5,2X,a2,1X,a20,4X,f8.3,1X,f8.3,1X,i5,2X,i2,i1) 102 FORMAT(a5,2X,a2,1X,a20,4X,f8.3,1X,f8.3,1X,i5,2X,i2,1X,i1) END DO 999 CONTINUE CLOSE(1) RETURN END SUBROUTINE read_station