C
C***************************  TOPOL ************************************
C
C  routine per l'analisi topologica del reticolo nel caso di matrice
C  di rigidezza simmetrica
C
C***********************************************************************
C
      SUBROUTINE TOPOL(N,NT,TRIANG,JA,IA,NE,N1,IMAX)
C
      IMPLICIT    NONE
      INTEGER     I,J,K,L,M,III,KK,KKK,MM,MCONTR
      INTEGER     N,N1,NT,NE,IMAX
      INTEGER     I1(3),I2(3)
      INTEGER     IA(*),JA(*),TRIANG(3,*)
C
C  fissa gli elementi diagonali a distanza costante N1
C        
      NT=N1*N
      DO I=1,NT
         JA(I)=0
      END DO
      JA(1)=1
      DO K=1,NT-1
         IF (K/N1*N1 .EQ. K) JA(K+1)=K/N1+1
      END DO
C
C  ciclo su tutti gli elementi triangolari (NE)
C
C  TRIANG(3,NE) : matrice contenente la tabella della successione dei nodi
C                 per ciascun elemento
C
      DO 400 K=1,NE
         DO I=1,3
            I2(I)=TRIANG(I,K)
         END DO
C
C  ordina i nodi dell'elemento in senso crescente in I1(3) 
C
C  IMAX : e' un paramentro intero che rappresente il massimo intero 
C        rappresentabile dalla macchina sulla quale si lavora (viene 
C        definito in input dall'utente) per esempio: imax=2147483647
C
         DO J=1,3
            KKK=1
            KK=I2(1)
            DO I=2,3
               IF(I2(I).LT.KK) THEN
                  KK=I2(I)
                  KKK=I
               END IF
            END DO
            I1(J)=KK
            I2(KKK)=IMAX
         END DO
C
C  alla fine del ciclo in I1 abbiamo la terna ordinata 
C  mentre in I2 i valori sono tutti pari a IMAX
C  
C  costruzione del vettore JA
C
         DO 6 I=1,2
            J=I+1
            DO 7 L=J,3
               M=N1*(I1(I)-1)+L-J+2
               MCONTR=N1*I1(I)
    9          IF(I1(L)-JA(M))8,7,11
C
C  significato dell'istruzione: IF (expression) 100,200,300
C  GO TO 100 or 200 or 300 if (expression) < = > 0
C
   11          IF(JA(M).EQ.0)GO TO 10
               M=M+1
               IF(M-MCONTR.GE.0)GO TO 99
               GO TO 9
   10          JA(M)=I1(L)
               GO TO 7
    8          MM=M
   18          MM=MM+1
               IF(MM-MCONTR.GE.0) GO TO 99
               IF(JA(MM))18,13,18
   13          JA(MM)=JA(MM-1)
               MM=MM-1
               IF(MM.GT.M)GO TO 13
               JA(M)=I1(L)
    7       CONTINUE
    6    CONTINUE
  400 CONTINUE
C
C  costruzione del vettore IA
C
      IA(1)=1
      M=1
      J=1
      DO 20 K=1,NT,N1
         DO 21 I=1,N1
            IF(JA(K+I-1).EQ.0)GO TO 21
            M=M+1
   21    CONTINUE
         J=J+1
         IA(J)=M
   20 CONTINUE
C
C  compattazione del vettore JA 
C
      M=0
      DO 14 K=1,NT
         IF(JA(K).EQ.0) GO TO 14
         M=M+1
         JA(M)=JA(K)
   14 CONTINUE
      NT=M
C
      RETURN
   99 III=MCONTR/N1
      WRITE(6,101)III,K
  101 FORMAT(1X,'RIGA = ',I6,' TRIANGOLO = ',I6,'  AUMENTARE N1 ')
      STOP
      END
