C THIS PROGRAM TO CHANGE TRANSLATION OF AN RT OPERATOR CHARACTER*40 INFILE,FILENAME LOGICAL EFLG real*8 M1(3,4),M2(3,4),M3(3,4),M(3,4),ACC(3,4) REAL*8 P1(3),P2(3),T(3),cell(3),gcell(3) character*40 string INTEGER*4 MM,NN,I,J WRITE(6,*) 'This vers handles non-orthorh cell (beta <> 90.)' WRITE(6,*) 'to enter fractional not grid, specify grid 1. 1. 1.' WRITE(6,*) 'ENTER cell extent in grid points a,b,c:' read(5,*) (gcell(i),i=1,3) WRITE(6,*) 'ENTER cell extent in angstroms a,b,c:' read(5,*) (cell(i),i=1,3) c. orthogonalize: WRITE(6,*) 'ENTER beta angle in degrees (alpha=gamma=90):' read(5,*) beta pi=4*atan(1.0) beta=pi*beta/180. cosb= cos(beta) sinb=sin(beta) c read operator into m1 5 WRITE(6,*) 'ENTER NAME OF FILE of old rotation-trans op (.o):' READ(5,1200) INFILE 1200 FORMAT(A) IF (INFILE(:5).EQ.' ') STOP INQUIRE(FILE=INFILE, NAME=FILENAME,EXIST=EFLG) IF (.NOT.EFLG) GOTO 5 OPEN (UNIT=2,FILE=INFILE,STATUS='OLD',READONLY) c READ(2,*) '.SPACE_GROUP_operators r 12 (3f12.7)' READ(2,'(A40)') string do 50 j=1,4 C50 read(2,1151)(M1(I,J),I=1,3) 50 read(2,*)(M1(I,J),I=1,3) 1151 FORMAT(3f14.7) CLOSE(UNIT=2) MM=3 NN=4 CALL MATPRN (M1,MM,NN) write(6,*)' enter x y z translations in grid points ' write(6,*)' (cell =',(gcell(i),i=1,3),')' read(5,*) (t(i),i=1,3) c do 100 i=1,3 c100 m1(i,4)=t(i)*cell(i)/gcell(i) c orthogonalize: a along x, b=b* along y; t(i)=a,b,c, m1(i,4)=x,y,z 100 m1(1,4)=t(1)*cell(1)/gcell(1)+cosb*t(3)*cell(3)/gcell(3) m1(2,4)=t(2)*cell(2)/gcell(2) m1(3,4)=sinb*t(3)*cell(3)/gcell(3) WRITE(6,*)' NCS OPERATOR:' WRITE(6,*)' ROTATE MATRIX' DO 1100 I=1,3 1100 WRITE(6,9) (M1(I,J),J=1,3) WRITE(6,*)' TRANSLATE ' WRITE(6,9) (M1(I,4),I=1,3) 9 FORMAT(' ',3F14.6) write(6,*)' this operator will be saved as an O datablock RT.O' WRITE(6,*)' Note this operator is for orthogpnal coord, A translation' WRITE(6,*)' You will have to convert for your cell. ' WRITE(6,*) 'ENTER NAME FOR output of resulting rot-trans op (.o):' READ(5,1200) filename open (unit=3,name=FILENAME,status='unknown') WRITE(3,*) '.SPACE_GROUP_operators r 12 (3f14.7)' do 1150 j=1,4 1150 write(3,1151)(M1(I,J),I=1,3) goto 5 END SUBROUTINE MATPRN(ARRAY,M,N) REAL*8 ARRAY(3,4) WRITE(6,*)'M, N=',M,N DO 10 I=1,M 10 WRITE (6,50) (ARRAY(I,J),J=1,N) 50 format(8f10.5) RETURN END