|
|
1.1 ! root 1: SUBROUTINE ASLEV(IPT) ! 2: C ! 3: C ASLEV TAKES A SUBLATTICE WITH ITS ROOT AT NODE(IABS(IPT))) ! 4: C AND READJUSTS THE LEVELS IN THE SUBLATTICE ! 5: C IN ACCORDANCE WITH NEW LEVEL AT ROOT ! 6: C NOTE, IPT LT 0 FROM CALL IN SETREF (EXT) AND FROM ACTUALS ! 7: C PASSED DOWN IN PROC ! 8: C ! 9: INTEGER PNODE, STACK, PLAT, FIND, SYMLEN ! 10: INTEGER ZERO(1) ! 11: LOGICAL SYSERR, ERR, ABORT, GR ! 12: COMMON /DETECT/ ERR, SYSERR, ABORT ! 13: COMMON /HEAD/ LNODE, PNODE, NODE(500) ! 14: COMMON /SCR1/ LINODE, INODE(500) ! 15: COMMON /SCR2/ LSTACK, STACK(500) ! 16: COMMON /GRAPH/ LLAT, PLAT, LAT(6000) ! 17: COMMON /PARAMS/ I1, I2, I3, SYMLEN, I4, I5, I6 ! 18: DATA ZERO(1) /0/ ! 19: C ! 20: C STACK (IS) IS SIGNED NODE INDEX OF SUBPGM ! 21: C IF GT 0, NODE IS ALONG A RED LINK TO PARENT ! 22: C IF LT 0, NODE IS ALONG A GREEN LINK TO PARENT ! 23: C ! 24: C STACK(IS+1) IS PTR TO TWO WORD DESC ENTRY FOR THIS ! 25: C SUBPGM, OR 0 FOR END OF DESC LIST ! 26: C ! 27: K = IABS (IPT ) ! 28: K = SYMLEN + NODE(K) + 4 ! 29: STACK(2) = IPT ! 30: STACK (1) = IABS ( LAT(K) ) ! 31: IS = 2 ! 32: C DOES TOP OF STACK ENTRY HAVE UNVISITED DESC ! 33: 10 IF (STACK(IS-1).NE.0) GO TO 20 ! 34: C TEST IF ARE DONE WITH SUBLATTICE ! 35: IF (IS.EQ.2) RETURN ! 36: C POP UP A LEVEL IN PATH ! 37: IS = IS - 2 ! 38: GO TO 10 ! 39: C UPDATE ENTRY OF NEXT DESCENDENT TO BE CHECKED ON STACK ! 40: 20 K = STACK(IS-1) ! 41: STACK(IS-1) = IABS (LAT(K+1)) ! 42: C LAT(K) CONTAINS SIGNED INDEX OF DESC BEING PROCESSED ! 43: C SIGN INDICATES COLOR OF LINK TO PARENT, (I.E. ! 44: C NODE AT TOP OF STACK) ! 45: C LT 0 IS GREEN LINK, GT 0 IS RED LINK ! 46: C L IS INDEX IN NODE(*) OF DESC BEING PROCESSED ! 47: C KK IS INDEX IN LAT(*) OF DESC BEING PROCESSED ! 48: LL = 1 ! 49: IF( LAT(K) .LT. 0) LL = -1 ! 50: KK = IABS(LAT(K)) ! 51: L = FIND(KK) ! 52: C SKIP ALL DESC WITH NEGATIVE LEVELS ! 53: IF (INODE(L).LT.0) GO TO 10 ! 54: C SEE IF STACK TOO SHORT FOR LOOPS ! 55: IF( IS.LE.2) GOTO 40 ! 56: C CHECK FOR LOOPS IN PATH STACK DESC ! 57: LOOP = 0 ! 58: GR = .FALSE. ! 59: IF(LL.EQ.(-1)) GR = .TRUE. ! 60: DO 60 I = 2,IS,2 ! 61: IF(LOOP) 70,70,90 ! 62: 90 IF(STACK(I).LT.0) GR = .TRUE. ! 63: GOTO 60 ! 64: 70 IF(L.EQ.IABS(STACK(I))) LOOP = I ! 65: 60 CONTINUE ! 66: C NO LOOPS ! 67: IF(LOOP.EQ.0) GOTO 40 ! 68: C LOOP OF MIXED COLORED LINKS ! 69: C DO NOT STACK DESC ! 70: IF(GR) GOTO 10 ! 71: C RECURSION ! 72: ABORT = .TRUE. ! 73: CALL ERROR2(19H RECURSIVE CALL OF ,19,LAT(KK), 1, 1, 0) ! 74: DO 80 K=LOOP,IS,2 ! 75: KK = IABS(STACK(K)) ! 76: KK = NODE(KK) ! 77: 80 CALL ERROR2(11H INVOLVING ,11,LAT(KK),1, 0, 0) ! 78: CALL ERROR2(1H1, 0, ZERO, -3, 0, 1) ! 79: 30 RETURN ! 80: C TEST IF DESC LEVEL IS ALREADY GT LEVEL OF PAR ! 81: C THEN NEEDNT CHECK PART OF SUBLATTICE UNDER THIS DESC ! 82: 40 K = IABS (STACK(IS)) ! 83: IF (INODE(L).GT.INODE(K)) GO TO 10 ! 84: C PUSH DESC ONTO STACK AFTER FIXING HIS LEVEL ! 85: INODE(L) = INODE(K) + 1 ! 86: C TEST AGAINST LNODE BECAUSE SCRATCH ARRAY ! 87: C IS AS LONG AS NODE ARRAY ! 88: IF (IS+2.GT.LNODE) GO TO 50 ! 89: STACK(IS+2) = LL * L ! 90: K = NODE(L) + SYMLEN + 4 ! 91: STACK(IS+1) = IABS( LAT(K)) ! 92: IS = IS + 2 ! 93: GO TO 10 ! 94: 50 SYSERR = .TRUE. ! 95: CALL ERROR1(43H IN ASLEV, PATH LONGER THAN NUMBER OF NODES, 43) ! 96: GO TO 30 ! 97: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.