From: langou Date: Wed, 26 Jan 2011 05:47:42 +0000 (+0000) Subject: J'ai lu le code vite fait. Comme ca, ca devrait marcher. Je n'ai pas verifie. X-Git-Tag: accepted/tizen/5.0/unified/20181102.024111~865 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d267cb5ed4068c90c307c3ebc553576358846808;p=platform%2Fupstream%2Flapack.git J'ai lu le code vite fait. Comme ca, ca devrait marcher. Je n'ai pas verifie. 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. --- diff --git a/SRC/dsyswapr.f b/SRC/dsyswapr.f index f4aa054..0a09f4a 100644 --- a/SRC/dsyswapr.f +++ b/SRC/dsyswapr.f @@ -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 * @@ -98,7 +101,7 @@ * 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) diff --git a/SRC/dsytri2x.f b/SRC/dsytri2x.f index 64ddbf5..f7b2940 100644 --- a/SRC/dsytri2x.f +++ b/SRC/dsytri2x.f @@ -308,15 +308,15 @@ 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 @@ -487,12 +487,12 @@ 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