SUBROUTINE ROTREF(NUM,NAXIS,ANGLE,ROT) 0270 C*********************************************************************** 0280 C* * 0290 C* COMPUTE PRODUCT MATRIX OF SEQUENCE OF ROTATIONS AND REFLECTIONS * 0300 C* * 0310 C* INPUTS * 0320 C* NUM = NUMBER OF ROTATIONS AND REFLECTIONS IN SEQUENCE * 0330 C* NAXIS = SEQUENCE OF ROTATION AND REFLECTION AXES * 0340 C* FOR ROTATIONS USE 1, 2, OR 3 * 0350 C* FOR REFLECTIONS USE -1, -2, OR -3 * 0360 C* ANGLE = SEQUENCE OF ROTATION ANGLES IN RADIANS * 0370 C* FOR REFLECTIONS THIS ANGLE IS IGNORED (ASSUMED ZERO) * 0380 C* * 0390 C* OUTPUT * 0400 C* ROT = 3X3 PRODUCT MATRIX * 0410 C* * 0420 C*********************************************************************** 0430 IMPLICIT REAL*8(A-H,O-Z) 0440 DIMENSION ROT(3,3),R1(3,3),R2(3),ANGLE(NUM),NAXIS(NUM) 0450 EPS = 1D-15 0460 C 0470 C ...INITIALIZE (SET 'ROT' = IDENTITY MATRIX) 0480 C 0490 DO 10 I=1,3 0500 DO 10 J=1,3 0510 ROT(I,J)=0. 0520 IF(I.EQ.J) ROT(I,J)=1. 0530 10 CONTINUE 0540 C 0550 C ...PROCESS SEQUENCE OF ROTATIONS AND REFLECTIONS ONE AT A TIME 0560 C 0570 DO 100 N=1,NUM 0580 C 0590 C ...DEFINE 3 AXES FOR CURRENT ROTATION OR REFLECTION 0600 C 0610 N1=IABS(NAXIS(N)) 0620 N2=N1+1 0630 IF(N2.GT.3) N2=N2-3 0640 N3=N2+1 0650 IF(N3.GT.3) N3=N3-3 0660 C 0670 C ...DEFINE DIAGONAL ELEMENTS 0680 C 0690 R1(N1,N1) = 1. 0700 IF(NAXIS(N).LT.0.) R1(N1,N1) = -1. 0710 R1(N2,N2) = DCOS(ANGLE(N)) 0720 IF(NAXIS(N).LT.0.) R1(N2,N2) = 1. 0730 R1(N3,N3) = R1(N2,N2) 0740 C 0750 C ...DEFINE NONZERO OFF-DIAGONAL ELEMENTS 0760 C 0770 R1(N2,N3) = DSIN(ANGLE(N)) 0780 IF(NAXIS(N).LT.0.) R1(N2,N3) = 0. 0790 R1(N3,N2) = -R1(N2,N3) 0800 C 0810 C ...DEFINE ZERO OFF-DIAGONAL ELEMENTS 0820 C 0830 R1(N1,N2) = 0. 0840 R1(N1,N3) = 0. 0850 R1(N2,N1) = 0. 0860 R1(N3,N1) = 0. 0870 C 0880 C ...FORM PRODUCT (SET 'ROT' = 'R1' * 'ROT') 0890 C 0900 DO 100 J=1,3 0910 DO 30 I=1,3 0920 R2(I) = 0. 0930 DO 30 K=1,3 0940 30 R2(I) = R2(I) + R1(I,K)*ROT(K,J) 0950 DO 100 I=1,3 0960 ROT(I,J) = R2(I) 0970 IF(DABS(ROT(I,J)).LT.EPS) ROT(I,J) = 0. 0980 100 CONTINUE 0990 RETURN 1000 END 1010