DMRG for 3D Ising model (Old version)
 
This program runs with NEC's ASL library
(Please contact me if you wish to know about ASL.)


C123456789012345678901234567890123456789012345678901234567890123456789012
C     -----                                                      -----
C     -----  Corner Tensor Renormalization Group Method          -----
C     -----  for the Cubic Lattice Ising Model Tc                -----
C     -----                                                      -----
C     -----                      '97/ 9/24, Ver.2.0 by T.Nishino -----
C     -----  Conditions:
C     -----              q = 2   Ising
C     -----         M1 = m = 2    Line Block Spin
C     -----         M2 = M = 2 Surface Block Spin
C     -----  Tensor Size:
C     -----              Type A:               q^6 =  2^6 =    64
C     -----              Type B:        q x (qm)^4 =  2^9 =   512
C     -----              Type C: (qm)^2 x (qmmM)^2 = 2^12 =  4096
C     -----              Type D:          (qmmM)^3 = 2^12 =  4096
C     -----              Type E:      ((qmmM)^2)^2 = 2^16 = 65536
C     -----              Type M:          (qmmM)^2 =  2^8 =   256
C
C     PARAMETER( MA=64, MB=512, MC=4096, MD=4096, ME=65536, MM=256 )
C
      PARAMETER( IQ=2, MS=3, ML=3 )
      PARAMETER( MA=IQ**6 )
      PARAMETER( MB=IQ*(IQ*MS)**4 )
      PARAMETER( MC=(IQ*MS)**2*(IQ*MS*MS*ML)**2 )
      PARAMETER( MD=(IQ*MS*MS*ML)**3 )
      PARAMETER( ME=(IQ*MS*MS*ML)**4 )
      PARAMETER( MM=(IQ*MS*MS*ML)**2 )
C
      INTEGER   M1,  M1X, M1N,   L
      INTEGER   M2,  M2X, M2N, ISW
      REAL*8    EA,   EB,  EC,  ED, KP1, Y
      REAL*8     T,   FB,  FC,  FD, KP2, Z, F
      REAL*8    A1(0:MA), A2(0:MA)
      REAL*8    B1(0:MB), B2(0:MB), B3(0:MB)
      REAL*8    C1(0:MC), C2(0:MC), C3(0:MC)
      REAL*8    D1(0:MD), D2(0:MD), D3(0:MD)
      REAL*8    E1(0:ME), E2(0:ME), E3(0:ME), E4(0:ME)
      REAL*8     DM1(MM),  DM2(MM), W1(0:MM), W2(0:MM), PM(0:MM)
C
C     ***** Initial Steps *****
      CALL GETPRM( L,M1X,M2X,             T )
C
C     Write(6,*) ' 0:Normal  1:T=0   2:T=inf.'
C      Read(5,*) ISW
                       CALL INITTT( A1, A2, B1, C1, D1, T )
C     IF( ISW .EQ. 1 ) CALL INITTZ( A1, A2, B1, C1, D1 )
C     IF( ISW .EQ. 2 ) CALL INITTI( A1, A2, B1, C1, D1 )
C
        M1 = 2
        M2 = 2
         K = 1
      PM(0)= 1.0D0
      PM(1)= 1.0D0
      CALL NORM( 2**6, A1, EA )
      CALL NRA2( 2**6, A2, EA )
        EA = LOG(EA)
        EB = 0.0D0
        EC = 0.0D0
        ED = 0.0D0
      Write(6,*) 'KP2, Kp1, F, F**(1/3), F/N, MG'
   10 CONTINUE
C
C     Write(6,*)                '--- Step Number ', K,' ---
C     ***** Stack Steps *****
      CALL  PROC1( M1,M2,            C1,   D1,D2          )
      CALL  PROC2( M1,M2,   B1,      C1,C2                )
      CALL  PROC3( M1,M2,               C2,   D2,D1       )
      CALL  PROC4( M1,   A1,B1,B2                         )
      CALL  PROC4( M1,   A2,B1,B3                         )
      CALL  PROC5( M1,M2,         B2,C2,C3                )
      CALL  PROC5( M1,M2,         B3,C2,C1                )
      CALL  PROC6( M1,M2,               C3,D1,D2          )
      CALL  PROC6( M1,M2,               C1,D1,D3          )
      CALL  PROC7( M1,M2,                     D2,E1       )
      CALL  PROC8( M1,M2,                        E1,E2    )
      CALL  PROC8( M1,M2,                           E2,E3 )
C
C     ***** Trace Steps *****
      CALL  CRDM2( M1,M2,                      E3,DM2     )
      CALL SYMCDM( M1,M2,                      PM,DM2     )
      CALL  CRDM1( M1,M2,                         DM2,DM1 )
      CALL   CREZ( M1,M2, Z,                   E3         )
C
C     ***** Observation Steps *****
      CALL  STEP7( M1,M2,                  D2,D3,E4       )
      CALL  STEP8( M1,M2,                        E1,E4,E3 )
      CALL  STEP8( M1,M2,                        E2,E3,E4 )
      CALL   CREZ( M1,M2, Y,                           E4 )
C
C     ***** Cut-off Steps *****
      CALL   DIAG( 2*M1*M1*M2, DM2,      E1, W2 )
        M2N = MIN( 2*M1*M1*M2, M2X              )
      CALL  KPTWT( 2*M1*M1*M2, M2N,     KP2, W2 )
      CALL PARITY(   M1,   M2, DM2,      PM, W2 )
      CALL   DIAG( 2*M1,       DM1,      E1, W1 )
        M1N = MIN( 2*M1,       M1X              )
      CALL  KPTWT( 2*M1,       M1N,     KP1, W1 )
C
C     ***** Display Steps *****
      F = ( EA*8 +EB*24 +EC*24 +ED*8 +LOG(Z) )/LOG(2.0D0)
      Write(6,100) KP2, KP1, F/(K*2+2)**3, Y/Z
  100 FORMAT(1H ,'KW:',2F11.7,' f= ',F20.15,' m= ',F20.15 )
C
C     ***** Renormalization Steps *****
      CALL RENOB( M1,M1N,        DM1,          B2, B1 )
      CALL TRPOS( M1,    M2,      PM, DM2, W2         )
      CALL RENOC( M1,M1N,M2,M2N, DM1, DM2, W2, C3, C1 )
      CALL RENOD( M1,    M2,M2N,      DM2, W2, D2, D1 )
      M1 = M1N
      M2 = M2N
C
C     ***** Symmetry Check Steps *****
C     Write(6,*) ' - After Renorm -'
      CALL SYMCHA(        A1 )
      CALL SYMCHB( M1,    B1 )
      CALL SYMCHC( M1,M2, C1 )
      CALL SYMCHD(    M2, D1 )
C
   20 CONTINUE
C     ***** Normalization Steps *****
      CALL   NORM( 2*M1*M1*M1*M1, B1, FB )
      CALL   NORM(   M1*M1*M2*M2, C1, FC )
      CALL   NORM(      M2*M2*M2, D1, FD )
         ED = ED + LOG(FD) + EA + 3*EB + 3*EC
         EC = EC + LOG(FC) + EA + 2*EB
         EB = EB + LOG(FB) + EA
          K = K + 1
      IF( K .LT. L+1 ) GOTO 10
      STOP
      END
CCC
CC
C
      SUBROUTINE NZDUMP( N, A )
      INTEGER            N
      REAL*8                A(0:*)
      Write(6,*) 'dim.', N
      DO 10 I = 0, N-1
      IF( ABS(A(I)) .GT. 1.0E-8 ) Write(6,*) I, A(I)
   10 CONTINUE
      RETURN
      END
CCC
CC
C
      SUBROUTINE GETPRM( L, M1X, M2X, T )
      INTEGER            L, M1X, M2X
      REAL*8                          T
C
      Write(6,*) 'Input Max. States     m1x'
       Read(5,*)                        M1X
C                                       M1X =   2
      Write(6,*) 'Input Max. States     m2x'
       Read(5,*)                        M2X
C                                       M2X =   3
      Write(6,*) 'Input Max. Iteration #  L'
       Read(5,*)                          L
C                                         L = 100
      Write(6,*) 'Input Min. Temperature  T'
       Read(5,*)                          T
C                                         T = 2.0
      Write(6,*) ' m1x = ',M1X,' m2x = ',M2X
      Write(6,*) '   L = ',  L,'   T = ',  T
      RETURN
      END
CCC
CC
C
      SUBROUTINE INITTT(   A1, A2,  B, C, D, T )
      INTEGER      P1, P2, P3, P4
      REAL*8    T, XI, A1(0:*), A2(0:*), B(0:*), C(0:*), D(0:*)
C
C                                              A1: Vertex Weight
C     i j      i j         i j         i j     A2: Magnetization
C     |/       |/          |/          |/      
C     D---k    C---k   m---B---k   m---A---k   B,C,D
C             /           /           /|           --- Fixed B.C.
C            L           L           L n
C
C     note: All indices are equivalent;
C             order of indices (ijklmn) is irrelevant.
C
           XI = EXP(2.0D0/T) + SQRT( EXP(2.0D0/T)**2 - 1.0D0 )
      DO 10 I = 0, 1
      DO 10 J = 0, 1
      DO 10 K = 0, 1
           P1 = I*4 + J*2 + K
         D(P1)= XI**( I+J+K      -1.5D0) / 2.0D0**1.5D0
C    &        + XI**(-I-J-K      +1.5D0) / 2.0D0**1.5D0
      DO 10 L = 0, 1
           P2 = P1*2 + L
         C(P2)= XI**( I+J+K+L    -2.0D0) / 2.0D0**2.0D0
C    &        + XI**(-I-J-K-L    +2.0D0) / 2.0D0**2.0D0
      DO 10 M = 0, 1
           P3 = P2*2 + M
         B(P3)= XI**( I+J+K+L+M  -2.5D0) / 2.0D0**2.5D0
C    &        + XI**(-I-J-K-L-M  +2.5D0) / 2.0D0**2.5D0
      DO 10 N = 0, 1
           P4 = P3*2 + N
        A1(P4)= XI**( I+J+K+L+M+N-3.0D0) / 2.0D0**3.0D0
     &        + XI**(-I-J-K-L-M-N+3.0D0) / 2.0D0**3.0D0
        A2(P4)= XI**( I+J+K+L+M+N-3.0D0) / 2.0D0**3.0D0
     &        - XI**(-I-J-K-L-M-N+3.0D0) / 2.0D0**3.0D0
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE INITTZ(   A1, A2,  B, C, D )
      INTEGER      P1, P2, P3, P4
      REAL*8      A1(0:*), A2(0:*), B(0:*), C(0:*), D(0:*)
C
C                                              A1: Vertex Weight
C     i j      i j         i j         i j     A2: Magnetization
C     |/       |/          |/          |/      
C     D---k    C---k   m---B---k   m---A---k   B,C,D
C             /           /           /|           --- Fixed B.C.
C            L           L           L n
C
C     note: Zero Temperature
C
      Write(6,*) '--- Debug Mode T = 0'
C
      DO 10 I = 0, 1
      DO 10 J = 0, 1
      DO 10 K = 0, 1
           P1 = I*4 + J*2 + K
      IF( I+J+K .EQ. 3 ) THEN
         D(P1)= 1.0D0
        ELSE
         D(P1)= 0.0D0
        END IF
      DO 10 L = 0, 1
           P2 = P1*2 + L
      IF( I+J+K+L .EQ. 4 ) THEN
         C(P2)= 1.0D0
        ELSE
         C(P2)= 0.0D0
        END IF
      DO 10 M = 0, 1
           P3 = P2*2 + M
      IF( I+J+K+L+M .EQ. 5 ) THEN
         B(P3)= 1.0D0
        ELSE
         B(P3)= 0.0D0
        END IF
      DO 10 N = 0, 1
           P4 = P3*2 + N
        A1(P4)= 0.0D0
        A2(P4)= 0.0D0
      IF( I+J+K+L+M+N .EQ. 6 ) THEN
          A1(P4)= 1.0D0
          A2(P4)= 1.0D0
        END IF
      IF( I+J+K+L+M+N .EQ. 0 ) THEN
          A1(P4)= 1.0D0
          A2(P4)=-1.0D0
        END IF
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE INITTI(   A1, A2,  B, C, D )
      INTEGER      P1, P2, P3, P4
      REAL*8      A1(0:*), A2(0:*), B(0:*), C(0:*), D(0:*)
C
C                                              A1: Vertex Weight
C     i j      i j         i j         i j     A2: Magnetization
C     |/       |/          |/          |/      
C     D---k    C---k   m---B---k   m---A---k   B,C,D
C             /           /           /|           --- Free B.C.
C            L           L           L n
C
C     note: Infinite Temperature
C
      Write(6,*) '--- Debug Mode T = inf.'
C
      DO 10 I = 0, 1
      DO 10 J = 0, 1
      DO 10 K = 0, 1
           P1 = I*4 + J*2 + K
         D(P1)= 2.0D0 / 2.0D0**1.5D0
      DO 10 L = 0, 1
           P2 = P1*2 + L
         C(P2)= 2.0D0 / 2.0D0**2.0D0
      DO 10 M = 0, 1
           P3 = P2*2 + M
         B(P3)= 2.0D0 / 2.0D0**2.5D0
      DO 10 N = 0, 1
           P4 = P3*2 + N
        A1(P4)= 2.0D0 / 2.0D0**3.0D0
        A2(P4)= 0.0D0 
   10 CONTINUE
      RETURN
      END
CCC
CC
C
      SUBROUTINE PROC1( M1, M2, C1,      D1,      D2    )
      INTEGER           M1, M2, AC,     AD1,     AD2
      REAL*8                    C1(0:*), D1(0:*), D2(0:*)
C                        [n]
C                         |
C                         D--[m]
C                        /
C                     j[L]
C                     |/
C                     C---i 
C                    /
C                  [k]
C
      CALL MATCLR( M2 * M1*M2 * M1*M2, D2 )
      DO 10 I = 0, M1   -1
      DO 10 J = 0, M1   -1
      DO 10 K = 0,    M2-1
      DO 10 L = 0,    M2-1
          AC  =       ((I*M1+J)*M2+K)*M2+L
      DO 10 M = 0,    M2-1
      DO 10 N = 0,    M2-1
          AD1 =              (L*M2+M)*M2+N
          AD2 =(((K*M1+I)*M2+M)*M1+J)*M2+N
       D2(AD2)= D2(AD2) + C1(AC)*D1(AD1)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC2( M1, M2,  B,      C1,      C2    )
      INTEGER      S,T, M1, M2, AB,     AC1,     AC2
      REAL*8                     B(0:*), C1(0:*), C2(0:*)
C                    n
C                    | 
C               [s]--C--[t]
C                   /
C               (i)m
C                |/
C            j---B---L
C               /
C              k
C
      CALL MATCLR( M1 * 2*M1 * M1*M2 * M1*M2, C2 )
      DO 10 I = 0,  2-1
      DO 10 J = 0, M1-1
      DO 10 K = 0, M1-1
      DO 10 L = 0, M1-1
      DO 10 M = 0, M1-1
          AB  =             (((I*M1+J)*M1+K)*M1+L)*M1+M
      DO 10 N = 0, M1-1
      DO 10 S = 0, M2-1
      DO 10 T = 0, M2-1
          AC1 =                    ((M*M1+N)*M2+S)*M2+T
          AC2 =(((((K*2+I)*M1+N)*M1+J)*M2+S)*M1+L)*M2+T
       C2(AC2)= C2(AC2) + B(AB)*C1(AC1)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC3( M1, M2, C2,      D2,      D1 )
      INTEGER           M1, M2, AC,     AD2,     AD1
      REAL*8                    C2(0:*), D2(0:*), D1(0:*)
C                [n]      j
C                 |       |             j:2*M1
C                 D--[L]--C--[m]    L,m,n:  M1*M2
C                /       /
C              [k]      i
C                      
      CALL MATCLR( M1*M2 * M1*M2 * 2*M1*M1*M2, D1 )
      DO 10 I = 0,   M1   -1
      DO 10 J = 0, 2*M1   -1
      DO 10 K = 0,      M2-1
      DO 10 L = 0,   M1*M2-1
      DO 10 M = 0,   M1*M2-1
          AC  =    ((I*2*M1+J)*M1*M2+L)*M1*M2+M
      DO 10 N = 0,   M1*M2-1
          AD2 =             (K*M1*M2+L)*M1*M2+N
          AD1 =(((I*M2+K)*M1*M2+M)*2*M1+J)*M1*M2+N
       D1(AD1)= D1(AD1) + C2(AC)*D2(AD2)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC4( M1,  A,      B1,      B2    )
      INTEGER  Q,R,S,T, M1, AA,     AB1,     AB2
      REAL*8                 A(0:*), B1(0:*), B2(0:*)
C
C                (i L)
C                 |/
C            (m)--A--(k)
C                /|
C              (j n)s
C                 |/
C             t---B---r 
C                /
C               q
C
      CALL MATCLR( 2 * 2*M1 * 2*M1 * 2*M1 * 2*M1, B2 )
      DO 10 I = 0, 2   -1
      DO 10 J = 0, 2   -1
      DO 10 K = 0, 2   -1
      DO 10 L = 0, 2   -1
      DO 10 M = 0, 2   -1
      DO 10 N = 0, 2   -1
          AA  =                      ((((I*2+J)*2+K)*2+L)*2+M)*2+N
      DO 10 Q = 0,   M1-1
      DO 10 R = 0,   M1-1
      DO 10 S = 0,   M1-1
      DO 10 T = 0,   M1-1
          AB1 =                        (((N*M1+Q)*M1+R)*M1+S)*M1+T
          AB2 =(((((((I*2+J)*M1+Q)*2+K)*M1+R)*2+L)*M1+S)*2+M)*M1+T
       B2(AB2)= B2(AB2) + A(AA)*B1(AB1)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC5( M1, M2, B2,      C2,      C3    )
      INTEGER     S, T, M1, M2, AB,     AC2,     AC3
      REAL*8                    B2(0:*), C2(0:*), C3(0:*)
C                      
C                     k        Using Mirror Symmetry of B
C                     | 
C                 j---B---L    j,k,L,n:2*M1
C                    /|            s,t:  M1*M2
C                  (i)n
C                     |
C                [s]--C--[t]
C                    /
C                   m
C                      
      CALL MATCLR( 2*M1 * 2*M1 * 2*M1*M1*M2 * 2*M1*M1*M2, C3 )
      DO 10 I = 0, 2         -1
      DO 10 J = 0, 2*M1      -1
      DO 10 K = 0, 2*M1      -1
      DO 10 L = 0, 2*M1      -1
      DO 10 M = 0,   M1      -1
      DO 10 N = 0, 2*M1      -1
          AB  =                  (((I*2*M1+J)*2*M1+K)*2*M1+L)*2*M1+N
      DO 10 S = 0,      M1*M2-1
      DO 10 T = 0,      M1*M2-1
          AC2 =                         ((M*2*M1+N)*M1*M2+S)*M1*M2+T
          AC3 =(((((I*M1+M)*2*M1+K)*2*M1+J)*M1*M2+S)*2*M1+L)*M1*M2+T
       C3(AC3)= C3(AC3) + B2(AB)*C2(AC2)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC6( M1, M2, C3,      D1,      D2    )
      INTEGER           M1, M2, AC,     AD1,     AD2
      REAL*8                    C3(0:*), D1(0:*), D2(0:*)
C                [k]       
C                 |
C                 C---j
C                /|
C               i[n]          i,j:2*M1
C                 |           L,m:     M1*M2
C                 D--[m]      k,n:2*M1*M1*M2 (oriented)
C                /        
C              [L]       
C
      CALL MATCLR( 2*M1*M1*M2 * 2*M1*M1*M2 * 2*M1*M1*M2, D2 )
      DO 10 I = 0, 2*M1      -1
      DO 10 J = 0, 2*M1      -1
      DO 10 K = 0, 2*M1*M1*M2-1
      DO 10 L = 0,      M1*M2-1
      DO 10 M = 0,      M1*M2-1
      DO 10 N = 0, 2*M1*M1*M2-1
          AD1 =                   (L*M1*M2+M)*2*M1*M1*M2+N
          AC  =     ((I*2*M1+J)*2*M1*M1*M2+K)*2*M1*M1*M2+N
          AD2 =(((I*M1*M2+L)*2*M1+J)*M1*M2+M)*2*M1*M1*M2+K
       D2(AD2)= D2(AD2) + C3(AC)*D1(AD1)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC7( M1, M2,  D,       E    )
      INTEGER       MF, M1, M2, AD,  DD, AE
      REAL*8                     D(0:*),  E(0:*)
C
C                [M]     [k]
C                 |       |
C                *D*-[i]--D    Indices are oriented
C                /       /
C              [L]     [j]     *D* = Mirror of D
C
           MF = 2*M1*M1*M2
      CALL MATCLR( MF**4, E )
      DO 10 I = 0, MF-1
      DO 10 J = 0, MF-1
      DO 10 K = 0, MF-1
           AD =       (I*MF+J)*MF+K
      DO 10 L = 0, MF-1
      DO 10 M = 0, MF-1
           DD =       (I*MF+L)*MF+M
           AE =((J*MF+L)*MF+K)*MF+M
         E(AE)= E(AE) + D(AD)*D(DD)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE STEP7( M1, M2,  D2,      D3,      E4    )
      INTEGER       MF, M1, M2, AD2,     AD3,      AE
      REAL*8                     D2(0:*), D3(0:*), E4(0:*)
C
C                [M]     [k]
C                 |       |
C                 D3-[i]--D2    Indices are oriented
C                /       /
C              [L]     [j]
C
           MF = 2*M1*M1*M2
      CALL MATCLR( MF**4, E4 )
      DO 10 I = 0, MF-1
      DO 10 J = 0, MF-1
      DO 10 K = 0, MF-1
          AD2 =       (I*MF+J)*MF+K
      DO 10 L = 0, MF-1
      DO 10 M = 0, MF-1
          AD3 =       (I*MF+L)*MF+M
           AE =((J*MF+L)*MF+K)*MF+M
        E4(AE)= E4(AE) + D2(AD2)*D3(AD3)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE PROC8( M1, M2, EA,      EB    )
      INTEGER      MFF, M1, M2
      REAL*8                    EA(0:*), EB(0:*)
C               EA           *
C              /|           /|
C            (jXi)         EA|  
C               |         / (i)
C               EA       *   |
C              /         |   |
C            (k)        (j)  *    Orientation Free Step
C                           /
C                       (k)EA
C         Altnatively,   |/
C                        *
C
          MFF = (2*M1*M1*M2)**2
      CALL MATCLR( MFF*MFF, EB )
      DO 10 I = 0, MFF-1
      DO 10 J = 0, MFF-1
      DO 10 K = 0, MFF-1
      EB(J*MFF+K)= EB(J*MFF+K) + EA(I*MFF+J)*EA(I*MFF+K)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE STEP8( M1, M2, EA,      EB,      EC    )
      INTEGER      MFF, M1, M2
      REAL*8                    EA(0:*), EB(0:*), EC(0:*)
C
C     ***** Extension of Proc8 (Orientation Free Step) *****
C
          MFF = (2*M1*M1*M2)**2
      CALL MATCLR( MFF*MFF, EC )
      DO 10 I = 0, MFF-1
      DO 10 J = 0, MFF-1
      DO 10 K = 0, MFF-1
      EC(J*MFF+K)= EC(J*MFF+K) + EA(I*MFF+J)*EB(I*MFF+K)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE CREZ( M1,M2, Z, E )
      INTEGER     MFF, M1,M2
      REAL*8                  Z, E(0:*)
          MFF = (2*M1*M1*M2)**2
            Z = 0
      DO 10 I = 0, MFF-1
            Z = Z + E(I*MFF+I)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE CRDM2( M1, M2, E3,      DM2    )
      INTEGER       MF, M1, M2
      REAL*8                    E3(0:*), DM2(0:*)
           MF = 2*M1*M1*M2
      CALL MATCLR( MF*MF, DM2 )
      DO 10 I = 0, MF-1
      DO 10 J = 0, MF-1
      DO 10 K = 0, MF-1
      DM2(J*MF+K)= DM2(J*MF+K) + E3(((I*MF+J)*MF+I)*MF+K)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE CRDM1( M1, M2, DM2,      DM1    )
      INTEGER           M1, M2
      REAL*8                    DM2(0:*), DM1(0:*)
      CALL MATCLR( 2*M1 * 2*M1, DM1 )
      DO 10 I = 0,      M1*M2-1
      DO 10 J = 0, 2*M1      -1
      DO 10 K = 0, 2*M1      -1
      DM1(J*2*M1+K)= DM1(J*2*M1+K) + DM2(((J*M1*M2+I)*2*M1+K)*M1*M2+I)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE DIAG( N, A,      E,      W                )
      INTEGER          N, IERR
      REAL*8              A(0:*), E(0:*), W(0:*), WK(0:1000)
C
      IF( N .GT. 1000 ) THEN
          Write(6,*) '--- Matrix Size Over in Diag ---'
          STOP
       END IF
C
      CALL DCSMAA( A, N, N, W, WK, IERR )
      IF( IERR .NE. 0 ) THEN
          Write(6,*) '--- Error Number ',IERR,' in DCSMAA ---'
          STOP
        END IF
C
      CALL  REORD( N, A, E, W )
C     Write(6,*)
C     DO 10 I = 0, 3
C     Write(6,*) W(I)/W(0)
C  10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE KPTWT( N1, N2, KP, W )
      INTEGER           N1, N2
      REAL*8            S1, S2, KP, W(0:*)
           S1 = 0.0D0
      DO 10 I = 0, N1-1
           S1 = S1 + W(I)
   10 CONTINUE
           S2 = 0.0D0
      DO 20 I = 0, N2-1
           S2 = S2 + W(I)
   20 CONTINUE
           KP = S2 / S1
C     Write(6,*) '- Kept Weight -', KP
      RETURN
      END
CCC
      SUBROUTINE REORD( N, A, E, W )
      INTEGER           N
      REAL*8               A(0:*), E(0:*), W(0:*)
C
      DO 10 I = 0, N-1
          E(I)=  W(N-I-1)
   10 CONTINUE
      CALL MATCPY( N, E, W )
C
      DO 20 I = 0, N-1
      DO 20 J = 0, N-1
      E(I*N+J)= A((N-I-1)*N+J)
   20 CONTINUE
      CALL MATCPY( N*N, E, A )
      RETURN
      END
CCC
      SUBROUTINE PARITY( M1, M2, A,      PM,      W )
      INTEGER        MF, M1, M2
      REAL*8      T(0:1024),     A(0:*), PM(0:*), W(0:*)
           MF = 2*M1*M1*M2
      DO 10 I = 0, MF-1
          T(I)= 0.0D0
      DO 10 J = 0,  2-1
      DO 10 K = 0, M1-1
      DO 10 L = 0, M1-1
      DO 10 M = 0, M2-1
          T(I)= T(I) + A( I*MF + ((J*M1+K)*M1+L)*M2+M )
     &               * A( I*MF + ((J*M1+L)*M1+K)*M2+M ) * PM(M)
   10 CONTINUE
C
      DO 20 I = 0, 3
      Write(6,100) W(I)/W(0), T(I)
  100 Format(1H , 2F15.7 )
   20 CONTINUE
C
      CALL MATCPY( MF, T, PM )
C
      RETURN
      END
CCC
      SUBROUTINE TRPOS( M1, M2, PM,      DM,      RM    )
      INTEGER       MF, M1, M2
      REAL*8                    PM(0:*), DM(0:*), RM(0:*)
           MF = 2*M1*M1*M2
      DO 10 I = 0, MF-1
      DO 10 J = 0,  2-1
      DO 10 K = 0, M1-1
      DO 10 L = 0, M1-1
      DO 10 M = 0, M2-1
          RM( I*MF + ((J*M1+K)*M1+L)*M2+M ) =
     &    DM( I*MF + ((J*M1+L)*M1+K)*M2+M )
C    &    DM( I*MF + ((J*M1+L)*M1+K)*M2+M ) * PM(M)
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE RENOB( M1, M1N, DM,      B2,      B1    )
      INTEGER           M1, M1N,  R,     AD2,     AD1
      REAL*8                     DM(0:*), B2(0:*), B1(0:*)
C
      CALL MATCLR( 2* 2*M1 * 2*M1 * 2*M1 * M1N, B1 )
      DO 10 I = 0, 2   -1
      DO 10 J = 0, 2*M1-1
      DO 10 K = 0, 2*M1-1
      DO 10 L = 0, 2*M1-1
      DO 10 M = 0, 2*M1-1
      DO 10 R = 0,  M1N-1
          AD2 =(((I*2*M1+J)*2*M1+K)*2*M1+L)*2*M1+M
          AD1 =(((I*2*M1+J)*2*M1+K)*2*M1+L)*M1N +R
       B1(AD1)= B1(AD1)  + B2(AD2) * DM(R*2*M1+M)
   10 CONTINUE
C
      CALL MATCLR( 2* 2*M1 * 2*M1 *  M1N * M1N, B2 )
      DO 20 I = 0, 2   -1
      DO 20 J = 0, 2*M1-1
      DO 20 K = 0, 2*M1-1
      DO 20 L = 0, 2*M1-1
      DO 20 R = 0,  M1N-1
      DO 20 M = 0,  M1N-1
          AD1 =(((I*2*M1+J)*2*M1+K)*2*M1+L)*M1N +M
          AD2 =(((I*2*M1+J)*2*M1+K)*M1N +R)*M1N +M
       B2(AD2)= B2(AD2)  + B1(AD1) * DM(R*2*M1+L)
   20 CONTINUE
C
      CALL MATCLR( 2* 2*M1 *  M1N *  M1N * M1N, B1 )
      DO 30 I = 0, 2   -1
      DO 30 J = 0, 2*M1-1
      DO 30 K = 0, 2*M1-1
      DO 30 R = 0,  M1N-1
      DO 30 L = 0,  M1N-1
      DO 30 M = 0,  M1N-1
          AD2 =(((I*2*M1+J)*2*M1+K)*M1N +L)*M1N +M
          AD1 =(((I*2*M1+J)*M1N +R)*M1N +L)*M1N +M
       B1(AD1)= B1(AD1)  + B2(AD2) * DM(R*2*M1+K)
   30 CONTINUE
C
      CALL MATCLR( 2*  M1N *  M1N *  M1N * M1N, B2 )
      DO 40 I = 0, 2   -1
      DO 40 J = 0, 2*M1-1
      DO 40 R = 0,  M1N-1
      DO 40 K = 0,  M1N-1
      DO 40 L = 0,  M1N-1
      DO 40 M = 0,  M1N-1
          AD1 =(((I*2*M1+J)*M1N +K)*M1N +L)*M1N +M
          AD2 =(((I*M1N +R)*M1N +K)*M1N +L)*M1N +M
       B2(AD2)= B2(AD2)  + B1(AD1) * DM(R*2*M1+J)
   40 CONTINUE
C
      CALL MATCPY( 2 * M1N * M1N * M1N * M1N, B2, B1 )
      RETURN
      END
CCC
      SUBROUTINE RENOC( M1,M1N, M2,M2N, DM1, DM2, RM2,  C3, C1 )
      INTEGER    R, MF, M1,M1N, M2,M2N,                 A3, A1
      REAL*8          DM1(0:*), DM2(0:*), C3(0:*),RM2(0:*), C1(0:*)
C
                    MF = 2*M1*M1*M2
      CALL MATCLR( 2*M1 * 2*M1 *  MF * M2N, C1 )
      DO 10 I = 0, 2*M1-1
      DO 10 J = 0, 2*M1-1
      DO 10 K = 0,   MF-1
      DO 10 L = 0,   MF-1
      DO 10 R = 0,  M2N-1
           A3 =((I*2*M1+J)*MF +K)*MF +L
           A1 =((I*2*M1+J)*MF +K)*M2N+R
        C1(A1)= C1(A1) + C3(A3) * DM2(R*MF+L)
C                               *Normal*
   10 CONTINUE
C
      CALL MATCLR( 2*M1 * 2*M1 * M2N * M2N, C3 )
      DO 20 I = 0, 2*M1-1
      DO 20 J = 0, 2*M1-1
      DO 20 K = 0,   MF-1
      DO 20 R = 0,  M2N-1
      DO 20 L = 0,  M2N-1
           A1 =((I*2*M1+J)*MF +K)*M2N+L
           A3 =((I*2*M1+J)*M2N+R)*M2N+L
        C3(A3)= C3(A3) + C1(A1) * RM2(R*MF+K)
C                               *Reflct*
   20 CONTINUE
C
      CALL MATCLR( 2*M1 *  M1N * M2N * M2N, C1 )
      DO 30 I = 0, 2*M1-1
      DO 30 J = 0, 2*M1-1
      DO 30 R = 0,  M1N-1
      DO 30 K = 0,  M2N-1
      DO 30 L = 0,  M2N-1
           A3 =((I*2*M1+J)*M2N+K)*M2N+L
           A1 =((I*M1N +R)*M2N+K)*M2N+L
        C1(A1)= C1(A1) + C3(A3) * DM1(R*2*M1+J)
   30 CONTINUE
C
      CALL MATCLR(  M1N *  M1N * M2N * M2N, C3 )
      DO 40 I = 0, 2*M1-1
      DO 40 R = 0,  M1N-1
      DO 40 J = 0,  M1N-1
      DO 40 K = 0,  M2N-1
      DO 40 L = 0,  M2N-1
           A1 =((I*M1N +J)*M2N+K)*M2N+L
           A3 =((R*M1N +J)*M2N+K)*M2N+L
        C3(A3)= C3(A3) + C1(A1) * DM1(R*2*M1+I)
   40 CONTINUE
C
      CALL MATCPY(  M1N *  M1N * M2N * M2N, C3, C1 )
      RETURN
      END
CCC
      SUBROUTINE RENOD( M1, M2, M2N, DM,  RM,  D2,      D1    )
      INTEGER       MF, M1, M2, M2N,  R,      AD2,     AD1
      REAL*8                RM(0:*), DM(0:*),  D2(0:*), D1(0:*)
C
           MF = 2*M1*M1*M2
      CALL MATCLR( MF*MF*M2N, D1 )
      DO 10 I = 0, MF -1
      DO 10 J = 0, MF -1
      DO 10 K = 0, MF -1
      DO 10 R = 0, M2N-1
          AD2 = (I*MF +J)*MF +K
          AD1 = (I*MF +J)*M2N+R
       D1(AD1)= D1(AD1) + D2(AD2) * RM(R*MF+K)
C                                 *Rflct*
   10 CONTINUE
C
      CALL MATCLR( MF*M2N*M2N, D2 )
      DO 20 I = 0, MF -1
      DO 20 J = 0, MF -1
      DO 20 R = 0, M2N-1
      DO 20 K = 0, M2N-1
          AD1 = (I*MF +J)*M2N+K
          AD2 = (I*M2N+R)*M2N+K
       D2(AD2)= D2(AD2) + D1(AD1) * DM(R*MF+J)
C                                 *Norml*
   20 CONTINUE
C
      CALL MATCLR( M2N*M2N*M2N, D1 )
      DO 30 I = 0, MF -1
      DO 30 R = 0, M2N-1
      DO 30 J = 0, M2N-1
      DO 30 K = 0, M2N-1
          AD2 = (I*M2N+J)*M2N+K
          AD1 = (R*M2N+J)*M2N+K
       D1(AD1)= D1(AD1) + D2(AD2) * RM(R*MF+I)
C                                 *Rflct*
   30 CONTINUE
      RETURN
      END
CCC
CC
C
      SUBROUTINE NORM( L, V,      W )
      INTEGER          L
      REAL*8              V(0:*), W
C
      CALL FMAX( L, V, W )
      DO 20 I = 0, L-1
          V(I)= V(I) / W
   20 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE NRA2( N, A,      EA )
      INTEGER          N
      REAL*8              A(0:*), EA
      DO 10 I = 0, N-1
          A(I)= A(I) / EA
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE FMAX( L, V,      W )
      INTEGER          L
      REAL*8              V(0:*), W
            W = 0.0D0
      DO 10 I = 0, L-1
      IF( ABS(V(I)) .GT. W ) W = ABS(V(I))
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE SYMCHA( A )
      REAL*8          W, A(0:*)
      DO 10 I = 0, 1
      DO 10 J = 0, 1
      DO 10 K = 0, 1
      DO 10 L = 0, 1
      DO 10 M = 0, 1
      DO 10 N = 0, 1
            W = ABS( A( ((((I*2+J)*2+K)*2+L)*2+M)*2+N )
     &              -A( ((((J*2+K)*2+L)*2+M)*2+N)*2+I ) )
      IF( W .GT. 1.0E-10 ) THEN
          Write(6,*)'-A-',I,J,K,L,M,N,A(((((I*2+J)*2+K)*2+L)*2+M)*2+N)
          Write(6,*)'-A-',J,K,L,M,N,I,A(((((J*2+K)*2+L)*2+M)*2+N)*2+I)
          STOP
        END IF
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE SYMCHB( M1, B )
      INTEGER        EC, M1
      REAL*8         FX,  W, B(0:*)
C
      CALL FMAX( 2*M1*M1*M1*M1, B, FX )
C     Write(6,*) 'Maximum Element in B = ',FX
           EC = 0
      DO 10 I = 0,  2-1
      DO 10 J = 0, M1-1
      DO 10 K = 0, M1-1
      DO 10 L = 0, M1-1
      DO 10 M = 0, M1-1
            W = ABS( B( (((I*M1+J)*M1+K)*M1+L)*M1+M )
     &             - B( (((I*M1+K)*M1+L)*M1+M)*M1+J ) )
     &        + ABS( B( (((I*M1+K)*M1+L)*M1+M)*M1+J )
     &             - B( (((I*M1+L)*M1+M)*M1+J)*M1+K ) )
     &        + ABS( B( (((I*M1+L)*M1+M)*M1+J)*M1+K )
     &             - B( (((I*M1+M)*M1+J)*M1+K)*M1+L ) )
     &        + ABS( B( (((I*M1+M)*M1+J)*M1+K)*M1+L )
     &             - B( (((I*M1+J)*M1+K)*M1+L)*M1+M ) )
      IF( W/FX .GT. 1.0E-10 .AND. EC .LE. 10 ) THEN
C         Write(6,*) '-B- ',I,J,K,L,M,' = ', W
          Write(6,*) '    ',I,J,K,L,M,'   ',
     &                                 B( (((I*M1+J)*M1+K)*M1+L)*M1+M )
          Write(6,*) '    ',I,K,L,M,J,'   ',
     &                                 B( (((I*M1+K)*M1+L)*M1+M)*M1+J )
          Write(6,*) '    ',I,L,M,J,K,'   ',
     &                                 B( (((I*M1+L)*M1+M)*M1+J)*M1+K )
          Write(6,*) '    ',I,M,J,K,L,'   ',
     &                                 B( (((I*M1+M)*M1+J)*M1+K)*M1+L )
          EC = EC + 1
C          IF( EC .GT. 10 ) STOP
        END IF
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE SYMCHC( M1, M2, C )
      INTEGER        EC, M1, M2
      REAL*8         FX,      W, C(0:*)
C
      CALL FMAX( M1*M1*M2*M2, C, FX )
C     Write(6,*) 'Maximum Element in C = ',FX
           EC = 0
      DO 10 I = 0, M1-1
      DO 10 J = 0, M1-1
      DO 10 K = 0, M2-1
      DO 10 L = 0, M2-1
            W = ABS( ABS(C(((I*M1+J)*M2+K)*M2+L))
     &              -ABS(C(((J*M1+I)*M2+K)*M2+L)) )
     &        + ABS( ABS(C(((I*M1+J)*M2+K)*M2+L))
     &              -ABS(C(((I*M1+J)*M2+L)*M2+K)) )
      IF( W/FX .GT. 1.0E-10 .AND. EC .LE. 10 ) THEN
C         Write(6,*) '-C- ',I,J,K,L,' = ', W
          Write(6,*) '    ',I,J,K,L,'   ', C(((I*M1+J)*M2+K)*M2+L)
          Write(6,*) '    ',J,I,K,L,'   ', C(((J*M1+I)*M2+K)*M2+L)
          Write(6,*) '    ',I,J,L,K,'   ', C(((I*M1+J)*M2+L)*M2+K)
          EC = EC + 1
C         IF(  EC .GT. 10 ) STOP
        END IF
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE SYMCHD( M2, D )
      INTEGER        EC, M2
      REAL*8         FX,  W, D(0:*)
C
      CALL FMAX( M2*M2*M2, D, FX )
C     Write(6,*) 'Maximum Element in D = ',FX
           EC = 0
      DO 10 I = 0, M2-1
      DO 10 J = 0, M2-1
      DO 10 K = 0, M2-1
            W = ABS( ABS(D((I*M2+J)*M2+K)) - ABS(D((J*M2+K)*M2+I)) )
     &        + ABS( ABS(D((J*M2+K)*M2+I)) - ABS(D((K*M2+I)*M2+J)) )
     &        + ABS( ABS(D((K*M2+I)*M2+J)) - ABS(D((I*M2+J)*M2+K)) )
      IF( W/FX .GT. 1.0E-10 .AND. EC .LE. 10 ) THEN
C         Write(6,*) '-D- ',I,J,K,' = ', W
          Write(6,*) '    ',I,J,K,'   ', D((I*M2+J)*M2+K)
          Write(6,*) '    ',J,K,I,'   ', D((J*M2+K)*M2+I)
          Write(6,*) '    ',K,I,J,'   ', D((K*M2+I)*M2+J)
          EC = EC + 1
C         IF(  EC .GT. 10 ) STOP
        END IF
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE SYMCDM( M1, M2, PM,      DM    )
      INTEGER        EC, M1, M2,  Q, R, S, T
      REAL*8         FX,  W,     PM(0:*), DM(0:*)
      CALL FMAX((2*M1*M1*M2)**2, DM,  FX )
C     Write(6,*) 'Maximum Element in DM = ',FX
           EC = 0
      DO 10 I = 0,  2-1
      DO 10 J = 0, M1-1
      DO 10 K = 0, M1-1
      DO 10 L = 0, M2-1
      DO 10 Q = 0,  2-1
      DO 10 R = 0, M1-1
      DO 10 S = 0, M1-1
      DO 10 T = 0, M2-1
            W = DM(((((((I*M1+J)*M1+K)*M2+L)*2+Q)*M1+R)*M1+S)*M2+T)
     &        - DM(((((((I*M1+K)*M1+J)*M2+L)*2+Q)*M1+S)*M1+R)*M2+T)
     &                                *PM(L)                 *PM(T)
      IF( ABS(W)/FX .GT. 1.0E-10 .AND. EC .LE. 10 ) THEN
          Write(6,*) '-DM ',I,J,K,L,Q,R,S,T,' = ', W
          EC = EC + 1
C         IF(  EC .GT. 10 ) STOP
        END IF
   10 CONTINUE
      RETURN
      END
CCC
CC
C
      SUBROUTINE MATCLR( N, A )
      INTEGER            N
      REAL*8                A(0:*)
      DO 10 I = 0, N-1
          A(I)= 0.0D0
   10 CONTINUE
      RETURN
      END
CCC
      SUBROUTINE MATCPY( N, A,      B    )
      INTEGER            N
      REAL*8                A(0:*), B(0:*)
      DO 10 I = 0, N-1
          B(I)= A(I)
   10 CONTINUE
      RETURN
      END