subroutine ma28cd(n, a, licn, icn, ikeep, rhs, w, mtype)
c
c this subroutine uses the factors from ma28a/ad or ma28b/bd to
c solve a system of equations without iterative refinement.
c the parameters are ...
c n integer order of matrix not altered by subroutine.
c a real/double precision array length licn. the same array as
c was used in the most recent call to ma28a/ad or ma28b/bd.
c licn integer length of arrays a and icn. not altered by
c subroutine.
c icn integer array of length licn. same array as output from
c ma28a/ad. unchanged by ma28c/cd.
c ikeep integer array of length 5*n. same array as output from
c ma28a/ad. unchanged by ma28c/cd.
c rhs real/double precision array length n. on entry, it holds the
c right hand side. on exit, the solution vector.
c w real/double precision array length n. used as workspace by
c ma30c/cd.
c mtype integer used to tell ma30c/cd to solve the direct equation
c (mtype=1) or its transpose (mtype.ne.1).
c
double precision a(licn), rhs(n), w(n), resid, mresid, eps, rmin
integer idisp(2)
integer icn(licn), ikeep(n,5)
logical abort1, abort2
c common block variables.
c unless otherwise stated common block variables are as in ma28a/ad.
c those variables referenced by ma28c/cd are mentioned below.
c resid real/double precision variable returns maximum residual of
c equations where pivot was zero.
c mresid real/double precision variable used by ma28c/cd to
c communicate between ma28f/fd and ma30h/hd.
c idisp integer array length 2 the same as that used by ma28a/ad.
c it is unchanged by ma28b/bd.
c
c further information on common block variables can be found in block
c data or ma28a/ad.
common /ma28fd/ eps, rmin, resid, irncp, icncp, minirn, minicn,
* irank, abort1, abort2
common /ma28gd/ idisp
common /ma30hd/ mresid
c
c this call performs the solution of the set of equations.
call ma30cd(n, icn, a, licn, ikeep, ikeep(1,4), ikeep(1,5),
* idisp, ikeep(1,2), ikeep(1,3), rhs, w, mtype)
c transfer common block information.
resid = mresid
return
end