real*4 rm(3,3),v(3) character*40 MATNAME do 10 i=1,3 do 10 j=1,3 10 rm(i,j)=0. n=0 20 TYPE *,'ENTER FILE NAME OF next MATRIX to include(CR to stop):' read(5,40)MATNAME 40 FORMAT (A40) if (matname(1:5).eq.' ') goto 100 OPEN(UNIT=4,FILE=MATNAME,STATUS='OLD') n=n+1 DO 41 I=1,3 READ(4,*)(v(J),J=1,3) write(6,*)(v(j),j=1,3) do 41 j=1,3 if (n.ne.2*(n/2)) then c change sign of each element of odd matrices: v(j)=-v(j) write(6,*)' negating this matrix:',n endif 41 rm(i,j)=rm(i,j)+v(j) CLOSE(UNIT=4) goto 20 100 do 200 i=1,3 do 200 j=1,3 200 rm(i,j)=rm(i,j)/n C NOW ORTHONORMALIZE, PRESERVING DIRECTION OF 3'D ROW (VECTOR THAT WILL BE TAKEN TO Z) C NORMALIZE 3'D ROW: SUM=0. DO 400 J=1,3 400 SUM=SUM+RM(3,J)*RM(3,J) SUM=SQRT(SUM) DO 420 J=1,3 420 RM(3,J)=RM(3,J)/SUM C NOW REMOVE COMPONENT OF 3RD ROW FROM 2ND, FIRST: DO 450 I=1,2 SUM=0 DO 440 J=1,3 440 SUM=SUM+RM(3,J)*RM(I,J) DO 450 J=1,3 450 RM(I,J)=RM(I,J)-SUM*RM(3,J) C NOW NORMALIZE 2ND ROW: I=2 SUM=0. DO 480 J=1,3 480 SUM=SUM+RM(I,J)*RM(I,J) SUM=SQRT(SUM) DO 500 J=1,3 500 RM(I,J)=RM(I,J)/SUM C NOW REMOVE COMPONENT OF 2ND ROW FROM FIRST: I=1 SUM=0 DO 540 J=1,3 540 SUM=SUM+RM(2,J)*RM(I,J) DO 550 J=1,3 550 RM(I,J)=RM(I,J)-SUM*RM(2,J) C NOW NORMALIZE 1ST ROW: I=1 SUM=0. DO 580 J=1,3 580 SUM=SUM+RM(I,J)*RM(I,J) SUM=SQRT(SUM) DO 600 J=1,3 600 RM(I,J)=RM(I,J)/SUM C CHECK ORTHONORMALITY: DO 700 I=1,3 DO 680 J=1,3 V(J)=0. DO 680 K=1,3 680 V(J)=V(J)+RM(I,K)*RM(J,K) 700 WRITE(6,301)(V(J),J=1,3) C WRITE ORTHONORMAL MATRIX THAT TAKES ORIG THIRD ROW TO Z TO FILE: OPEN (UNIT=3,FILE='AVEROT.MAT',STATUS='NEW') DO 300 I=1,3 300 WRITE(3,301) (RM(I,J),J=1,3) CLOSE (UNIT=3) 301 format(' ',2(3f15.8,3x)) end