1 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4 c This file must be used under the terms of the CeCILL.
5 c This source file is licensed as described in the file COPYING, which
6 c you should have received as part of this distribution. The terms
7 c are also available at
8 c http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 subroutine intzgesv3(fname)
16 logical getrhsvar,createvar
17 logical checklhs,checkrhs
19 double precision ANORM, EPS, RCOND
20 double precision dlamch, zlange
22 external dlamch, zlange, vfinite
30 if(.not.checkrhs(fname,minrhs,maxrhs)) return
31 if(.not.checklhs(fname,minlhs,maxlhs)) return
33 if(.not.getrhsvar(1,'z', MA, NA, lA)) return
34 if(.not.getrhsvar(2,'z', MB, NRHS, lB)) return
45 if(M.eq.0 .or. N.eq.0) then
46 if(.not.createvar(3,'z', 0, 0, lX)) return
50 c Check if A and B matrices contains Inf or NaN's
51 if (vfinite(M*N*2, zstk(lA)).eq.0) then
55 if (vfinite(MB*NRHS*2, zstk(lB)).eq.0) then
60 if(.not.createvar(3,'z', M, N, lAF)) return
61 if(.not.createvar(4,'z', N, NRHS, lX)) return
62 if(.not.createvar(5,'z', max(M,N), NRHS, lXB)) return
63 if(.not.createvar(6,'i', 1, 1, lRANK)) return
64 if(.not.createvar(7,'i', 1, N, lIPIV)) return
65 if(.not.createvar(8,'i', 1, N, lJPVT)) return
66 if(.not.createvar(9,'d',1,2*N,lRWORK)) return
67 LWORKMIN = max( 2*N, min(M,N)+max( 2*min(M,N), N+1,
70 if(LWORK.le.LWORKMIN) then
71 err=2*(LWORK-LWORKMIN)
75 if(.not.createvar(10,'z',1,LWORK,lDWORK)) return
78 ANORM = zlange( '1', M, N, zstk(lA), M, zstk(lDWORK) )
84 call ZLACPY( 'F', N, N, zstk(lA), N, zstk(lAF), N )
85 c SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB )
86 call ZLACPY( 'F', N, NRHS, zstk(lB), N, zstk(lXB), N )
87 c SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB )
88 call ZGETRF( N, N, zstk(lAF), N, istk(lIPIV), INFO )
89 c SUBROUTINE ZGETRF( N, N, A, LDA, IPIV, INFO )
91 call ZGECON( '1', N, zstk(lAF), N, ANORM, RCOND,
92 $ zstk(lDWORK), stk(lRWORK), INFO )
93 c SUBROUTINE ZGECON( NORM, N, A, LDA, ANORM, RCOND, WORK,
95 if(RCOND.gt.sqrt(EPS)) then
96 call ZGETRS( 'N', N, NRHS, zstk(lAF), N, istk(lIPIV),
97 $ zstk(lXB), N, INFO )
98 c SUBROUTINE ZGETRS( TRANS, N, NRHS, A, LDA, IPIV,
100 call ZLACPY( 'F', N, NRHS, zstk(lXB), N, zstk(lX), N )
101 c SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB )
105 c . ill conditioned problem
106 call writebufzgesv3(buf,RCOND)
112 c M.ne.N or A singular
115 call ZLACPY( 'F', M, NRHS, zstk(lB), M, zstk(lXB), max(M,N) )
116 c SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB )
120 call ZGELSY1( M, N, NRHS, zstk(lA), M, zstk(lXB), max(M,N),
121 $ istk(lJPVT), RCOND, istk(lRANK), zstk(lDWORK),
122 $ LWORK, stk(lRWORK), INFO )
123 c SUBROUTINE ZGELSY1( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND,
124 c $ RANK, WORK, LWORK, RWORK, INFO )
128 if( M.ne.N .and. istk(lRANK).lt.min(M,N) )then
129 call msgs(9,istk(lRANK))
131 call ZLACPY( 'F', N, NRHS, zstk(lXB), max(M,N), zstk(lX), N )
132 c SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB )