subroutine y12mge(n,nn,a,snr,w,pivot,anorm,rcond,iha,ha * ,iflag,ifail) c c c purpose. c -------- c c this subroutine computes the number called rcond by c dongarra et al.(1979). this number is the reciprocal of the c condition number of matrix a . the subroutine can be c called immediately after the call of y12mce. the parameters c (except rcond and anorm ) have the same meaning as the c corresponding parameters in the subroutines of package y12m (the c subroutine can be call only if the lu decomposition of matrix c a computed by y12mce is not destroyed). subroutine y12mhe c should be called before the call of subroutine y12mce (this c subroutine calculates the one-norm of matrix a and c stores it in anorm. on successful exit rcond will c contain an approximation to the reciprocal of the condition c number of matrix a. more details, concerning the use c of similar subroutines for dense matrices, can be found c in j.dongarra, j.r.bunch, c.b.moler and g.w.stewart (1979): c "linpack - user's guide", siam, philadelphia. c c c c c declaration of the global variables and arrays. c c integer n, nn, iha, iflag, ifail integer snr, ha real a, w, pivot, rcond, anorm dimension a(nn),snr(nn),ha(iha,3),pivot(n),w(n),iflag(5) c c c declaration of the internal variables. c c real aa, ynorm, znorm, t integer l1, l2, l3, l, n7, n8 c c c check whether the entry is correct or not. c c if(ifail.ne.0) go to 180 if(iflag(5).ne.1) go to 10 ifail=26 go to 180 c c c no error detected. the computations will be continued. c c 10 n8=n+1 n7=n-1 c c c solve a system of the form u1*w=e where u1 is the c transpose of matrix u in the lu-factorization of matrix c a and e is a vector whose components are equal to +1 c or -1. c c w(1)=1.0/pivot(1) do 20 i=2,n 20 w(i)=0.0 do 50 i=2,n l1=ha(i,2) l2=ha(i,3) if(l1.gt.l2) go to 40 t=w(i-1) do 30 j=l1,l2 l=snr(j) 30 w(l)=w(l)+t*a(j) 40 if(w(i).gt.0.0) w(i)=w(i)+1.0 if(w(i).le.0.0) w(i)=w(i)-1.0 50 w(i)=-w(i)/pivot(i) c c c solve a system of the form l1*y=w where l1 is the c transpose of matrix l in the lu-factorization of c matrix a . the components of vector y are stored c array w (thus, the contents of array w are overwritten c by the components of vector y ). c c do 80 i=1,n7 l=n-i l1=ha(l,1) l2=ha(l,2)-1 if(l1.gt.l2) go to 70 t=w(l+1) do 60 j=l1,l2 l3=snr(j) 60 w(l3)=w(l3)-t*a(j) 70 continue 80 continue c c c calculate the one-norm of vector y . c c ynorm=0.0 do 90 i=1,n 90 ynorm=ynorm+abs(w(i)) c c c compute the solution of (lu)z=y . this means that c two systems with triangular matrices are solved using the c same ideas as above. the components of the calculated solution c are stored in array w . c c do 130 i=1,n l1=ha(i,1) l2=ha(i,2)-1 if(l1.gt.l2) go to 120 do 110 j=l1,l2 l=snr(j) 110 w(i)=w(i)-a(j)*w(l) 120 continue 130 continue do 160 i=1,n l3=n8-i l1=ha(l3,2) l2=ha(l3,3) if(l1.gt.l2) go to 150 do 140 j=l1,l2 l=snr(j) 140 w(l3)=w(l3)-a(j)*w(l) 150 continue 160 w(l3)=w(l3)/pivot(l3) c c c compute the one-norm of vector z (vector z is c the vector calculated above and stored in array w . c c znorm=0.0 do 170 i=1,n 170 znorm=znorm+abs(w(i)) c c c find the value of the required estimate for the reciprocal c of the condition number of matrix a . c c rcond=(ynorm/anorm)/znorm c c c end of the computations. c c 180 if(ifail.ne.0) rcond=-1.0 return end .