C
C**************************  STRTRN ************************************
C
C  routine per l'analisi topologica del reticolo nel caso non simmetrico
C
C***********************************************************************
C
      SUBROUTINE STRTRN(N,NTERM,TRIANG,JA,TOPOL,NT,N1,IMAX)
C
      IMPLICIT  NONE
      INTEGER   I,J,K,L,M,III,KK,KKK,MM,MCONTR
      INTEGER   N,N1,NT,NTERM,IMAX
      INTEGER   I1(3),I2(3)
      INTEGER   TOPOL(*),JA(*),TRIANG(4,*)
C
C  fissa gli elementi diagonali a distanza costante N1
C
      NTERM=N1*N
      DO K=1,NTERM
         JA(K)=0
      END DO
C
C  ciclo su tutti gli elementi triangolari (NE)
C
C  TRIANG(4,NE) : matrice contenente la tabella degli elementi del
C                 file "topol"
C
      DO 2 K=1,NT
         DO I=1,3
            I2(I)=TRIANG(I,K)
         END DO
C
C  ordina i nodi dell'elemento in senso crescente
C
C  IMAX : massimo intero rappresentabile dalla macchina (definito 
C         dall'utente)
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
C  genera il vettore JA
C
         DO 6 I=1,3
            DO 7 L=1,3
               M=N1*(I1(I)-1)+L
               MCONTR=N1*I1(I)
C
C  significato dell'istruzione: IF (expression) 100,200,300
C  GO TO 100 or 200 or 300 if (expression) < = > 0
C
    9          IF(I1(L)-JA(M))8,7,11
   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
    2 CONTINUE
C
C  costruisce il vettore TOPOL
C
      TOPOL(1)=1
      M=1
      J=1
      DO K=1,NTERM,N1
         DO I=1,N1
            IF(JA(K+I-1).NE.0) M=M+1
         END DO
         J=J+1
         TOPOL(J)=M
      END DO
C
C  compatta il vettore JA eliminando gli zeri
C
      M=0
      DO K=1,NTERM
         IF(JA(K).NE.0) THEN
            M=M+1
            JA(M)=JA(K)
         END IF
      END DO
      NTERM=M
      RETURN
   99 III=MCONTR/N1
      WRITE(IOUT1,101)III,K
      CALL CLOSIO
      STOP
  101 FORMAT(1X,//,'RIGA = ',I6,' TRIANGOLO = ',I6,'  AUMENTARE N1 ')
      END
