#! /bin/sh # # Last change: Mihai Dima 2001 # if [ $# -lt 3 ] then echo " " echo " ***** BOXAVG ***** " echo " " echo " The program averages over areas of given dimensions" echo " " echo "Syntax: boxavg " echo " " echo " - lines number in input file " echo " - lines number of the averaging box" echo " - columns number of the averaging box" echo " " exit 0 else echo " " echo " ***** BOXAVG ***** " echo " " echo "file1="$1 echo "file2="$2 echo "Lines number in the input file "$3 echo "Lines number of the averaging box "$4 echo "Columns number of the averaging box "$5 echo " " cp $1 fort.1 fi cat > boxavg.f < IF(LEN.GT.IE) GOTO 14 READ(1,END=15) (X(I),I=1,IE) C PRINT SAMPLE RECORD C IF (ICNT.EQ.2.OR.ICNT.EQ.7) PRINT 107,' RECORD NR ',ICNT, C * ' 1ST DATA 5X2 BLOCKS ARE: ',( (X(I+J*NCOLS),I=1,5), C * (X(I+J*NCOLS),I=ROWLEN+1,ROWLEN+5), J=0,ROWLEN/NCOLS-1 ) C C CHECK THAT VARIOUS RATIOS ARE INTEGERS REMAIN = MOD(LEN,COLLEN) IF (REMAIN.NE.0.) THEN WRITE(6,6010) * 'NUMBER OF ROWS IS NOT EXACT FRACTION OF TOTAL DATA' * ,COLLEN,LEN GOTO 9910 ENDIF ROWLEN=LEN/COLLEN REMAIN = MOD(COLLEN,NROWS) IF (REMAIN.NE.0.) THEN WRITE(6,6010) * 'NR ROWS TO AVERAGE IS NOT EXACT FRACTN OF TOTAL ROWS' * ,NROWS,COLLEN GOTO 9910 ENDIF REMAIN = MOD(ROWLEN,NCOLS) IF (REMAIN.NE.0.) THEN WRITE (6,6010) * 'NR COLS TO AVERAGE IS NOT EXACT FRACTN OF TOTAL COLS' * ,NCOLS,ROWLEN GOTO 9910 ENDIF 99 CONTINUE NEWLEN = LEN / (NROWS*NCOLS) C C WRITE HEADER OF NEW RECORD WRITE(2) ITIME,INAME,ILEV,NEWLEN C C *************************************************** C --- LOOP TO DO AVERAGING --- C ---------------------------- C SETUP C XPOSA IS CURRENT START OF A BLOCK OF ROWS: XPOSA=1 C YPOS IS CURRENT Y INDEX POSITION: YPOS=1 C XPOS IS CURRENT X INDEX POSITION: XPOS=XPOSA C XIND IS CURRENT X-VALUE BEING USED C TOT IS CURRENT TOTAL OF VALUES BEING SUMMED C NCOUNT IS NR OF GOOD VALUES SO FAR SUMMED C C ************************* C LOOP TO DO EACH NEW VALUE 960 CONTINUE TOT=0. NCOUNT=0 DO 220 JROW=1,NROWS XIND = XPOS + (JROW-1)*ROWLEN DO 210 JCOL=1,NCOLS IF (X(XIND).LT.UNDEFE) THEN TOT=TOT+X(XIND) NCOUNT=NCOUNT+1 ENDIF XIND = XIND+1 210 CONTINUE 220 CONTINUE C IF (NCOUNT.EQ.0) THEN Y(YPOS)=TMISS ELSE Y(YPOS)=TOT/NCOUNT ENDIF C XPOS = XPOS+NCOLS YPOS=YPOS+1 C IF SAME ROW -- IF (XPOS.LT.XPOSA+ROWLEN) GOTO 960 C IF NEW ROW -- XPOSA = XPOSA+(ROWLEN*NROWS) XPOS = XPOSA C IF STILL WITHIN SET -- IF (XPOSA.LT.LEN) GOTO 960 C BREAK OUT OF LOOP HERE WHEN LEN IS REACHED --> C C END OF LOOP TO DO EACH NEW VALUE C ******************************** C C --------------------------- C END OF LOOP TO DO AVERAGING C ***************************************************** C C WRITE NEW DATA WRITE(2) (Y(J),J=1,NEWLEN) C PRINT SAMPLE RECORD C IF (ICNT.EQ.2.OR.ICNT.EQ.7) THEN C PRINT 107,' RECORD NR ',ICNT, C * ' NEW DATA 1ST 5 ITEMS ARE: ',(Y(I),I=1,5) 107 FORMAT(A,I4,A/(5F8.2/5F8.2/)) C ENDIF C ICNT=ICNT+1 GOTO 980 C ******************************************* C ***** END OF LOOP TO READ EACH RECORD ***** C ******************************************************************* C C FATAL ERRORS 10 WRITE(6,6010) ' INPUT FILE IS EMPTY ' GOTO 9910 11 WRITE(6,6010) ' INPUT GRIDS TOO LARGE ' GOTO 9910 12 WRITE(6,6010) ' PARAMETER CARD TOO SHORT OR MISSING ' GOTO 9910 14 WRITE(6,6010) ' INVALID RECORD LENGTH:', LEN GOTO 9910 15 WRITE(6,6010) ' UNEXPECTED *EOF* DURING READ ' GOTO 9910 C C* ABNORMAL TERMINATION. 9910 CONTINUE PRINT *, '*BOXAVG*: FATAL END ' STOP C C* NORMAL TERMINATION. C 9920 WRITE(6,6008) ' LAST RECORD READ:',ITIME,INAME,ILEV,LEN WRITE(6,6060) ICNT-1 PRINT 6008,' LAST RECORD WRITTEN',ITIME,INAME,ILEV,NEWLEN PRINT *, '*BOXAVG*: NORMAL END OF PROGRAM' stop 6008 FORMAT('*BOXAVG*: ', A,/,(6I10)) 6010 FORMAT('*******************************************************'/ * '*BOXAVG*: ', A,/,(8X,I10,26X,I10/ * '************************************************************')) 6011 FORMAT(' *BOXAVG*: ', A) 6060 FORMAT(' READ ',I10,' RECORDS.') END EOF f77 boxavg.f -o boxavg.x boxavg.x $1 $2 $3 $4 $5<< M $3 $4 $5 M cp fort.2 $2 rm fort.1 fort.2 rm boxavg.x boxavg.f exit