home *** CD-ROM | disk | FTP | other *** search
- rank(mr,nr,nc,ncc,a,zmch,cons,nrank,ierr,lp,mp)
-
- /* purpose...solution of m equations in n unknowns.*/
-
- int *ierr,lp[],mp[],mr,nr,nc,ncc,*nrank;
- float a[],zmch,cons;
-
- {
- int m,mdn,mtr,mtt,mtra,mtxi,ncs,nrs,ntc,nx,ny,
- i,ii,iia,ics,icf,iiad,iisb,irev,is,ix,itemp,
- ia,iec,j,lpis,ntrad,nfin,nranka,nranks,
- k,kf,ks,krs,kcs,kx,ky,ircnt,nrtad,ntr;
- float temp,fj,fmr,x;
- extern double fabs();
-
- if(nr > mr || ncc > mr)
- {
- *ierr = 2;
- return;
- }
- fmr = mr;
- mdn = mr - nc;
- mtr = (nc-1) * mr + nc - 1;
- if(nr < nc) ny = nr;
- else ny = nc;
- *nrank = 0;
- *ierr = 0;
- nrs = nr - 1;
- ncs = nc - 1;
- for(i = 0; i <= nrs; i++)
- mp[i] = i + 1;
- for(i = 0; i <= ncs; i++)
- lp[i] = i + 1;
- ntc = nc + ncc;
- mtt = mr * nrs + ntc - 1;
- ix = nr;
- for(i = 0; i <= ny -1; i++)
- {
- ii = mr * i + i;
- iisb = ii - mr;
- iiad = ii + 1;
- ics = i;
- icf = i + (nr - 1) * mr;
- iec = i * mr + ntc - 1;
- iia = ii + mr;
- reit: temp = 0.;
-
- for(j = ii; j <= iec; j++)
- {
- if(i != 0)
- {
- kf = j - mr;
- ks = j - (i * mr);
- kx = i * mr;
- for(k = ks; k <= kf; k+= mr)
- {
- a[j] = a[j] - a[kx] * a[k];
- kx = kx + 1;
- }
- }
- if(j <= iec-ncc)
- {
- if(fabs(a[j]) > temp)
- {
- temp = fabs(a[j]);
-
- fj = j;
- x = fj / fmr + .5;
- nx = x;
- nx = j - nx * mr;
- }
- }
- }
- if(i != nc)
- {
- if(nx != i)
- {
- itemp = lp[nx];
- lp[nx] = lp[i];
- lp[i] = itemp;
- lpis = nx;
- for(k = ics; k <= icf; k += mr)
- {
- temp = a[k];
- a[k] = a[lpis];
- a[lpis] = temp;
- lpis = lpis + mr;
- }
- }
- }
- if((zmch - fabs(a[ii])) > 0)
- {
- mtxi = nr + i * mr;
- if(ncc != 0)
- {
- for(j = mtxi; j <= iec; j++)
- {
- if(abs(a[j]) > cons)
- {
- mp[i] = 0 - abs(mp[i]);
- a[j] = mp[i];
- *ierr = 1;
- }
- else a[j] = abs(mp[i]);
- }
- if(mp[i] > 0) mp[i] = 0;
- }
- if(i == (ix-1)) goto r78;
- itemp = mp[i];
- mp[i] = mp[ix-1];
- mp[ix-1] = itemp;
- k = i;
- for(j = ix -1; j <= iec; j++)
- {
- temp = a[k];
- a[k] = a[j];
- a[j] = temp;
- k = k + 1;
- }
- ix = ix - 1;
- goto reit;
- }
- *nrank = *nrank + 1;
- for(j = iiad; j <= iec; j++)
- {
- a[j] = a[j] / a[ii];
- }
- if(i == 0) goto ibr;
- {
- if(i == (ix-1)) goto r78;
- for(m = iia; m <= icf; m += mr)
- {
- if(m < mr) kx = 0;
- else kx = m / mr;
- kx = kx * mr;
- for(ky = ics; ky <= iisb; ky += mr)
- {
- a[m] = a[m] - a[kx] * a[ky];
- kx = kx + 1;
- }
- }
- }
- ibr: ;
- }
- if(ncc == 0) return;
- nranka = *nrank + 1;
- for(i = nranka; i <= ix; i++)
- {
- ia = nc + (i - 1) * mr;
- iec = ia / mr +1;
- iec = iec * (mr - 1) + ntc - 1;
- for( j = ia; j <= iec; j++)
- {
- if( j < mr) ky = 0;
- else ky = j / mr;
- ky = ky * mr;
-
- for(kx = i; kx <= (iec-mdn); kx++)
- {
- a[j] = a[j] - a[kx] * a[ky];
- ky = ky + mr;
- }
- if(fabs(a[j]) > cons)
- {
- mp[i-1] = 0 - abs(mp[i-1]);
- a[j] = mp[i-1];
- *ierr = 1;
- }
- else a[j] = abs(mp[i-1]);
- }
- if(mp[i-1] > 0) mp[i-1] = 0;
- }
- r78: if(ncc == 0) return;
- nrtad = nc + (*nrank - 1) * mr;
- nranks = *nrank - 1;
- nfin = nc - *nrank;
- ntr = mtr - nfin;
- for(i = 1; i <= nranks; i++)
- {
- irev = nrtad - i * mr;
- iec = irev / mr ;
- iec = iec * mr + nc + ncc - 1;
- krs = irev - i - nfin;
- for(ircnt = irev; ircnt <= iec; ircnt ++)
- {
- kcs = ircnt + mr;
- for(k = krs; k <= (iec-ncc); k++)
- {
- a[ircnt] = a[ircnt] - a[kcs] * a[k];
- kcs = kcs + mr;
- }
- }
- }
-
- for(i = 1; i <= nc; i++)
- {
- ics =lp[i-1] - 1;
- icf = ics + (ncc - 1) * mr;
- k = nc + ((i-1) * mr) - 1;
- for(j = ics; j <= icf; j += mr)
- {
- k = k + 1;
- if(i <= *nrank)
- {
- a[j] = a[k];
- a[k] = mp[i-1];
- }
- else a[j] = 0;
- }
- }
- for(i = 1; i <= nrs; i++)
- {
- mtxi = nc + (i - 1) * mr;
- ix = fabs(a[mtxi]);
- if(ix = i) goto ixe;
- itemp = mp[i-1];
- mp[i-1] = mp[ix-1];
- mp[ix-1] = itemp;
- j = nc + ix * mr;
- iec = mtxi / mr ;
- iec = iec * mr + nc + ncc - 1;
- for(k = mtxi; k <= iec; k++)
- {
- temp = a[k];
- a[k] = a[j];
- a[j] = temp;
- j = j + 1;
- }
- ixe: ;
- }
- if(*nrank != nc)
- {
- nranka = *nrank +1;
- for(i = nranka; i <= nc; i++)
- lp[i+1] = -lp[i+1];
- }
- ncs = nc - 1;
- for(i = 1; i <= ncs; i++)
- {
- while (abs(lp[i-1]) != i)
- {
- ix = abs(lp[i-1]);
- itemp = lp[i-1];
- lp[i-1] = lp[ix-1];
- lp[ix-1] = itemp;
- }
- }
- }
-