subroutine y12mfe(n,a,snr,nn,rnr,nn1,a1,sn,nz,ha,iha,b,b1,x,y, 1 aflag,iflag,ifail) implicit real(a-b,d,g,p,t-y),integer(c,f,h-n,r-s,z) double precision ext,er,er1,er2,err,e real a(nn),b(n),b1(n),x(n),y(n),a1(nz),aflag(11) integer snr(nn),rnr(nn1),ha(iha,13),sn(nz),iflag(12) c c store the non-zero elements,their column numbers,information about c row starts,information about row ends and the right-hand side. c ifail=0 nres=0 dres=0.0 state=iflag(5) kit=1 it=iflag(11) if(state.eq.1)ifail=10 if(it.lt.2)ifail=23 if(ifail.ne.0)go to 160 do 10 i=1,n 10 b1(i)=b(i) if(state.eq.3)go to 70 call y12mbe(n,nz,a,snr,nn,rnr,nn1,ha,iha,aflag,iflag,ifail) if(ifail.ne.0)go to 160 do 20 i=1,nz sn(i)=snr(i) 20 a1(i)=a(i) do 30 i=1,n ha(i,12)=ha(i,1) 30 ha(i,13)=ha(i,3) if(aflag(2).ge.0.0)go to 60 gt1=aflag(6) do 50 i=1,n l1=ha(i,1) l2=ha(i,3) gt2=0.0 do 40 j=l1,l2 d=abs(a(j)) 40 if(gt2.lt.d)gt2=d 50 if(gt2.lt.gt1)gt1=gt2 aflag(2)=-gt1*aflag(2) c c find the first solution. c 60 call y12mce(n,nz,a,snr,nn,rnr,nn1,y,b,ha,iha,aflag,iflag,ifail) if(ifail.ne.0)go to 160 70 call y12mde(n,a,nn,b,y,snr,ha,iha,iflag,ifail) if(ifail.ne.0)go to 160 c c prepare the data in order to begin the iterations. c dd=0.0 do 80 i=1,n x(i)=b(i) xx=abs(b(i)) 80 if(dd.lt.xx)dd=xx xm=dd if(dd.eq.0.)go to 160 c c begin to iterate. c 90 d=dd dres=0. do 110 i=1,n er=b1(i) l1=ha(i,12) l2=ha(i,13) do 100 j=l1,l2 er1=a1(j) l3=sn(j) er2=x(l3) 100 er=er-er1*er2 c c store residuals rounded to single precision. c b(i)=er xx=dabs(er) 110 if(dres.lt.xx)dres=xx if(dres.eq.0.)go to 160 if(nres.eq.1) go to 150 if(dres.gt.1.0e+4*xm)go to 150 kit=kit+1 iflag(5)=3 call y12mde(n,a,nn,b,y,snr,ha,iha,iflag,ifail) if(ifail.ne.0)go to 160 c c compute the uniform norm of the current solution vector. c dd=0. do 120 i=1,n xx=abs(b(i)) 120 if(dd.lt.xx)dd=xx if(dd.eq.0.0)go to 160 c c check the convergence criterion. c if(dd.gt.d.and.kit.gt.2)go to 160 c c calculate an improved solution. c dcor=dd xm=0.0 do 130 i=1,n x(i)=x(i)+b(i) xx=abs(x(i)) 130 if(xx.gt.xm) xm=xx c c check the stopping criteria. c if(10.0+dd/xm.eq.10.0) go to 140 if(kit.lt.it) go to 90 c c end of the iterations. c 140 nres=1 go to 90 150 dd=abs(dd) 160 iflag(5)=state iflag(12)=kit aflag(9)=dd aflag(10)=dres aflag(11)=xm return end