J'ai lu le code vite fait. Comme ca, ca devrait marcher. Je n'ai pas verifie.
authorlangou <langou@users.noreply.github.com>
Wed, 26 Jan 2011 05:47:42 +0000 (05:47 +0000)
committerlangou <langou@users.noreply.github.com>
Wed, 26 Jan 2011 05:47:42 +0000 (05:47 +0000)
Je n'ai meme pas essaye de compiler en fait. En gros mettre LDA en parametre,
definir A comme etant A( LDA, N ) et pour l'increment du swap mettre LDA a la
place de N quand tu travailles sur les lignes. Donc c'est tout con.

Donc il faut ecrire un driver qui teste ca avec une LDA differente de N ... Et
appliquer les modifications aux autres routines CHE, CSY, ZHE, ZSY et SSY.

Sinon pourquoi dans DSYSWAPR, est ce que tu utilises DSWAP de temps en temps,
et de temps en temps tu le fais a la main?  Je n'ai pas regarde les details.

JL.

SRC/dsyswapr.f
SRC/dsytri2x.f

index f4aa054..0a09f4a 100644 (file)
@@ -1,4 +1,4 @@
-      SUBROUTINE DSYSWAPR( UPLO, N, A, I1, I2)
+      SUBROUTINE DSYSWAPR( UPLO, N, A, LDA, I1, I2)
 *
 *  -- LAPACK auxiliary routine (version 3.3.0) --
 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
@@ -7,10 +7,10 @@
 *
 *     .. Scalar Arguments ..
       CHARACTER        UPLO
-      INTEGER          I1, I2, N
+      INTEGER          I1, I2, LDA, N
 *     ..
 *     .. Array Arguments ..
-      DOUBLE PRECISION A(N,N)
+      DOUBLE PRECISION A( LDA, N )
 *
 *  Purpose
 *  =======
@@ -41,6 +41,9 @@
 *          inverse is formed and the part of A above the diagonal is
 *          not referenced.
 *
+*  LDA     (input) INTEGER
+*          The leading dimension of the array A.  LDA >= max(1,N).
+*
 *  I1      (input) INTEGER
 *          Index of the first row to swap
 *
 *         LOWER
 *         first swap
 *          - swap row I1 and I2 from I1 to I1-1 
-         CALL DSWAP( I1-1, A(I1,1), N, A(I2,1), N )
+         CALL DSWAP( I1-1, A(I1,1), LDA, A(I2,1), LDA )
 *
 *         second swap :
 *          - swap A(I1,I1) and A(I2,I2)
index 64ddbf5..f7b2940 100644 (file)
             DO WHILE ( I .LE. N )
                IF( IPIV(I) .GT. 0 ) THEN
                   IP=IPIV(I)
-                 IF (I .LT. IP) CALL DSYSWAPR( UPLO, N, A, I ,IP )
-                 IF (I .GT. IP) CALL DSYSWAPR( UPLO, N, A, IP ,I )
+                 IF (I .LT. IP) CALL DSYSWAPR( UPLO, N, A, LDA, I ,IP )
+                 IF (I .GT. IP) CALL DSYSWAPR( UPLO, N, A, LDA, IP ,I )
                ELSE
                  IP=-IPIV(I)
                  I=I+1
                  IF ( (I-1) .LT. IP) 
-     $                  CALL DSYSWAPR( UPLO, N, A, I-1 ,IP )
+     $                  CALL DSYSWAPR( UPLO, N, A, LDA, I-1 ,IP )
                  IF ( (I-1) .GT. IP) 
-     $                  CALL DSYSWAPR( UPLO, N, A, IP ,I-1 )
+     $                  CALL DSYSWAPR( UPLO, N, A, LDA, IP ,I-1 )
               ENDIF
                I=I+1
             END DO
             DO WHILE ( I .GE. 1 )
                IF( IPIV(I) .GT. 0 ) THEN
                   IP=IPIV(I)
-                 IF (I .LT. IP) CALL DSYSWAPR( UPLO, N, A, I ,IP  )
-                 IF (I .GT. IP) CALL DSYSWAPR( UPLO, N, A, IP ,I )
+                 IF (I .LT. IP) CALL DSYSWAPR( UPLO, N, A, LDA, I ,IP  )
+                 IF (I .GT. IP) CALL DSYSWAPR( UPLO, N, A, LDA, IP ,I )
                ELSE
                  IP=-IPIV(I)
-                 IF ( I .LT. IP) CALL DSYSWAPR( UPLO, N, A, I ,IP )
-                 IF ( I .GT. IP) CALL DSYSWAPR(  UPLO, N, A, IP ,I )
+                 IF ( I .LT. IP) CALL DSYSWAPR( UPLO, N, A, LDA, I ,IP )
+                 IF ( I .GT. IP) CALL DSYSWAPR(  UPLO, N, A, LDA, IP ,I )
                  I=I-1
                ENDIF
                I=I-1