CTITLEMODND3 -- FIND GREATEST COMMON DIVISOR OF SHOT & RECVR IN IND 00000010 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA AUTHOR D.D. THOMPSON 00000020 CA DESIGNER D.D. THOMPSON 00000030 CA LANGUAGE FORTRAN H 00000040 CA SYSTEM IBM OR CRAY CA WRITTEN 3/15/76 00000060 C REVISED MO-DA-YR BY PROGRAMMER FOR REASON 00000070 C REVISED 07-07-86 JMP. DUAL IBM/CRAY VERSION. 00000080 CA 00000090 CA CALL MODND3 (IND, NT, KR, KS) 00000100 CA 00000110 CA IN/OUT ARGUMENT TYPE DESCRIPTION 00000120 CA 00000130 CA IN IND I4 ARRAY TO FIND GREATEST COMMON DIVISORS 00000140 CA IN NT I4 NUMBER OF ELEMENTS IN IND 00000150 CA OUT KR I4 RECEIVER INCREMENT 00000160 CA OUT KS I4 SHOT INCREMENT 00000170 CA 00000180 CA MODND3 FINDS THE GREATEST COMMON DIVISOR OF BOTH THE RECEIVER 00000190 CA AND SHOT ELEMENTS OF THE IND ARRAY SO THAT THE INDEX ARRAY CAN 00000200 CA BE REINDEXED SO AS TO USE AS LITTLE SPACE AS POSSIBLE FOR THE 00000210 CA CONJUGATE GRADIENT SOLUTION ARRAY. 00000220 C 00000230 SUBROUTINE MODND3 (IND, NT, KR, KS) 00000240 C 00000250 C INTEGER ARRAY IN PARAMETER LIST 00000260 C 00000270 INTEGER IND (2,1) 00000280 C 00000290 C FIND 2 DIFFERENT RECEIVER NUMBERS 00000300 C 00000310 J = 2 00000320 JR1 = IND(1,1) 00000330 10 JR2 = IND(1,J) 00000340 J = J + 1 00000350 IF (JR2 .EQ. JR1) GO TO 10 00000360 C 00000370 C FIND TWO DIFFERENT SHOT NUMBERS 00000380 C 00000390 J = 2 00000400 JS1 = IND(2,1) 00000410 20 JS2 = IND(2,J) 00000420 J = J + 1 00000430 IF (JS2 .EQ. JS1) GO TO 20 00000440 C 00000450 C MINR = DIFFERENCE BETWEEN TWO RECEIVER NUMBERS 00000460 C MINS = DIFFERENCE BETWEEN TWO SHOT NUMBERS 00000470 C 00000480 MINR = IABS(JR2 - JR1) 00000490 MINS = IABS(JS2 - JS1) 00000500 C 00000510 C FIND RECEIVER INCREMENT 00000520 C 00000530 C RECEIVER INCREMENT MUST BE LESS THAN OR EQUAL TOMINR 00000540 C AND MINR MUST BE A MULTIPLE OF RECEIVER INC. 00000550 C 00000560 LM = MINR - 1 00000570 IF (LM .LE. 0) GO TO 50 00000580 DO 40 I = 1, LM 00000590 MM = MINR / I 00000600 IF ((MINR / MM) * MM .NE. MINR) GO TO 40 00000610 MA = MOD(JR1, MM) 00000620 C 00000630 C MM IS A DIVISOR OF MINR IS IT THE GREATEST COMMON 00000640 C DIVISOR OF ALL RECEIVER NUMBERS? 00000650 C 00000660 DO 30 J = 1, NT 00000670 INDEX = IND(1,J) 00000680 IF (MA .NE. MOD(INDEX, MM)) GO TO 40 00000690 30 CONTINUE 00000700 C 00000710 GO TO 60 00000720 C 00000730 40 CONTINUE 00000740 C 00000750 50 KR = 1 00000760 C 00000770 GO TO 100 00000780 C 00000790 60 KR = MM 00000800 C 00000810 C FIND SHOT INCREMENT 00000820 C 00000830 C SHOT INCREMENTS MUST BE LESS THAN OR EQUAL TOMINS 00000840 C AND MINS MUST BE A MULTIPLE OF SHOT INCREMENT 00000850 C 00000860 100 LM = MINS - 1 00000870 IF (LM .LE. 0) GO TO 130 00000880 C 00000890 DO 120 I = 1, LM 00000900 MM = MINS / I 00000910 IF ((MINS / MM) * MM .NE. MINS) GO TO 120 00000920 MA = MOD(JS1, MM) 00000930 C 00000940 C MM IS A DIVISOR OF MINS IS IT THE GREATEST COMMON 00000950 C DIVISOR OF ALL SHOT NUMBERS? 00000960 C 00000970 DO 110 J = 1, NT 00000980 INDEX = IND(2,J) 00000990 IF (MA .NE. MOD(INDEX, MM)) GO TO 120 00001000 110 CONTINUE 00001010 C 00001020 GO TO 140 00001030 C 00001040 120 CONTINUE 00001050 C 00001060 130 KS = 1 00001070 RETURN 00001080 00001090 140 KS = MM 00001100 RETURN 00001110 END 00001120