CTITLEDMVAV -- COMPUTES MOVING AVERAGES FROM AN ARRAY 00000030 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA 00000040 CA AUTHOR DAVE THOMPSON 00000050 CA DESIGNER DAVE THOMPSON 00000060 CA LANGUAGE FORTRAN IV 00000070 CA SYSTEM IBM OR CRAY C WRITTEN 00000080 C REVISED 11-13-89 RDK. REMOVE EXTERNAL S1ATP. 00000090 C C REVISED FOR VS FORTRAN TRA 10-03-8400004400 C C RELEASED FOR PRODUCTION SPARC TRA 01-21-8500004400 C C DUAL IBM/CRAY VERSION. JMP 07-07-86 C CA 00000100 CA CALL DMVAV (A,N,NW,B) 00000110 CA 00000120 CA IN A R8 INPUT ARRAY 00000130 CA IN N I4 LENGTH OF INPUT AND OUTPUT ARRAYS 00000140 CA IN MW I4 WINDOW LENGTH (IF EVEN THEN IABS(MW)-1 IS USED) 00000150 CA A. IF MW >= 0, B RETURNS SMOOTHED VERSION OF A 00000160 CA B. IF MW < 0, B RETURNS A MINUS ITS SMOOTHED 00000170 CA VERSION (FLATTENING) 00000180 CA OUT B R8 OUTPUT ARRAY 00000190 CA 00000200 CA 00000210 CA PURPOSE: COMPUTES MOVING AVERAGES FROM N POINTS OF ARRAY 00000220 CA A AND RETURNS THE NN MEAN VALUES I ARRAY B. 00000222 CA 00000224 CA 00000226 CA CAUTIONS: 00000240 CA A. SLIDING WINDOW SMOOTHING OR FLATTENING OF INPUT 00000250 CA ARRAY 00000260 CA B. WINDOW SHRINKS SYMETRICALLY ON EACH END SO THAT 00000270 CA B(1)=A(1) AND B(N)=A(N) FOR SMOOTHING OR B(1)= 00000280 CA B(N)=0 FOR FLATTENING 00000290 C 00000300 C 00000303 C 00000306 SUBROUTINE DMVAV(A,N,MW,B) 00000310 DOUBLE PRECISION S 00000321 DOUBLE PRECISION A(1),B(1) 00000322 C EXTERNAL S1ATP NW=IABS(MW) 00000330 K=(NW-1)/2 00000340 IF(K.NE.0) GO TO 20 00000350 CALL ARMVE(A, B, N) 00000360 IF(MW.LT.0) CALL ARSET(B, N, 0) RETURN 00000380 20 NV=2*K+1 00000390 S=A(1) 00000400 KP=K+1 00000410 B(1)=A(1) 00000420 IF(N.EQ.1) RETURN 00000430 J=2 00000440 DO 10 I=2,N 00000450 IF(I.GT.KP) GO TO 30 00000460 S= S+A(J)+A(J+1) 00000470 J=J+2 00000480 B(I)=S/(2*I-1) 00000490 GO TO 10 00000500 30 IF(I.GT.N-K) GO TO 40 00000510 J=I-K-1 00000520 S=S+A(I+K)-A(J) 00000530 B(I)=S/NV 00000540 GO TO 10 00000550 40 S=S-A(J+1)-A(J+2) 00000560 J=J+2 00000570 B(I)=S/((N-I)*2+1) 00000580 10 CONTINUE 00000590 IF(MW.GT.0) RETURN 00000600 DO 50 I=1,N 00000610 50 B(I)=A(I)-B(I) 00000620 RETURN 00000630 END 00000640