Changeset 1289 for LMDZ4/trunk/libf


Ignore:
Timestamp:
Dec 18, 2009, 3:51:22 PM (15 years ago)
Author:
Ehouarn Millour
Message:

Minor improvement: Bring Jacobi into the XXIst century.
Routine can now handle matix of any size (tested on local Linux machines and IBM Power6 that this doesn't change results compared to old version).

EM

File:
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ4/trunk/libf/filtrez/jacobi.F90

    r1287 r1289  
    11!
    2 ! $Header$
     2! $Id$
    33!
    44      SUBROUTINE JACOBI(A,N,NP,D,V,NROT)
    5       PARAMETER (NMAX=400)
    6       DIMENSION A(NP,NP),D(NP),V(NP,NP),B(NMAX),Z(NMAX)
    7       IF (n.gt.nmax) THEN
    8          print*, 'n, nmax=', n, nmax
    9          print*, 'Surdimensionnement insuffisant dans jacobi'
    10          CALL abort
    11       ENDIF
    12       DO 12 IP=1,N
    13         DO 11 IQ=1,N
     5      implicit none
     6! Arguments:
     7      integer,intent(in) :: N
     8      integer,intent(in) :: NP
     9      integer,intent(out) :: NROT
     10      real,intent(inout) :: A(NP,NP)
     11      real,intent(out) :: D(NP)
     12      real,intent(out) :: V(NP,NP)
     13
     14! local variables:
     15      integer :: IP,IQ,I,J
     16      real :: SM,TRESH,G,H,T,THETA,C,S,TAU
     17      real :: B(N)
     18      real :: Z(N)
     19     
     20      DO IP=1,N
     21        DO IQ=1,N
    1422          V(IP,IQ)=0.
    15 11      CONTINUE
     23        ENDDO
    1624        V(IP,IP)=1.
    17 12    CONTINUE
    18       DO 13 IP=1,N
     25      ENDDO
     26      DO IP=1,N
    1927        B(IP)=A(IP,IP)
    2028        D(IP)=B(IP)
    2129        Z(IP)=0.
    22 13    CONTINUE
     30      ENDDO
    2331      NROT=0
    24       DO 24 I=1,50
     32      DO I=1,50 ! 50? I suspect this should be NP
     33                !     but convergence is fast enough anyway
    2534        SM=0.
    26         DO 15 IP=1,N-1
    27           DO 14 IQ=IP+1,N
     35        DO IP=1,N-1
     36          DO IQ=IP+1,N
    2837            SM=SM+ABS(A(IP,IQ))
    29 14        CONTINUE
    30 15      CONTINUE
     38          ENDDO
     39        ENDDO
    3140        IF(SM.EQ.0.)RETURN
    3241        IF(I.LT.4)THEN
     
    3544          TRESH=0.
    3645        ENDIF
    37         DO 22 IP=1,N-1
    38           DO 21 IQ=IP+1,N
     46        DO IP=1,N-1
     47          DO IQ=IP+1,N
    3948            G=100.*ABS(A(IP,IQ))
    40             IF((I.GT.4).AND.(ABS(D(IP))+G.EQ.ABS(D(IP)))
    41      *         .AND.(ABS(D(IQ))+G.EQ.ABS(D(IQ))))THEN
     49            IF((I.GT.4).AND.(ABS(D(IP))+G.EQ.ABS(D(IP))) &
     50               .AND.(ABS(D(IQ))+G.EQ.ABS(D(IQ))))THEN
    4251              A(IP,IQ)=0.
    4352            ELSE IF(ABS(A(IP,IQ)).GT.TRESH)THEN
     
    5968              D(IQ)=D(IQ)+H
    6069              A(IP,IQ)=0.
    61               DO 16 J=1,IP-1
     70              DO J=1,IP-1
    6271                G=A(J,IP)
    6372                H=A(J,IQ)
    6473                A(J,IP)=G-S*(H+G*TAU)
    6574                A(J,IQ)=H+S*(G-H*TAU)
    66 16            CONTINUE
    67               DO 17 J=IP+1,IQ-1
     75             ENDDO
     76              DO J=IP+1,IQ-1
    6877                G=A(IP,J)
    6978                H=A(J,IQ)
    7079                A(IP,J)=G-S*(H+G*TAU)
    7180                A(J,IQ)=H+S*(G-H*TAU)
    72 17            CONTINUE
    73               DO 18 J=IQ+1,N
     81              ENDDO
     82              DO J=IQ+1,N
    7483                G=A(IP,J)
    7584                H=A(IQ,J)
    7685                A(IP,J)=G-S*(H+G*TAU)
    7786                A(IQ,J)=H+S*(G-H*TAU)
    78 18            CONTINUE
    79               DO 19 J=1,N
     87              ENDDO
     88              DO J=1,N
    8089                G=V(J,IP)
    8190                H=V(J,IQ)
    8291                V(J,IP)=G-S*(H+G*TAU)
    8392                V(J,IQ)=H+S*(G-H*TAU)
    84 19            CONTINUE
     93              ENDDO
    8594              NROT=NROT+1
    8695            ENDIF
    87 21        CONTINUE
    88 22      CONTINUE
    89         DO 23 IP=1,N
     96          ENDDO
     97        ENDDO
     98        DO IP=1,N
    9099          B(IP)=B(IP)+Z(IP)
    91100          D(IP)=B(IP)
    92101          Z(IP)=0.
    93 23      CONTINUE
    94 24    CONTINUE
    95       STOP '50 iterations should never happen'
     102        ENDDO
     103      ENDDO ! of DO I=1,50
     104      STOP 'Jacobi: 50 iterations should never happen'
    96105      RETURN
    97       END
     106      END SUBROUTINE JACOBI
Note: See TracChangeset for help on using the changeset viewer.