1*> \brief \b DGERFSX
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download DGERFSX + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgerfsx.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgerfsx.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgerfsx.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE DGERFSX( TRANS, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
22*                           R, C, B, LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
23*                           ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
24*                           WORK, IWORK, INFO )
25*
26*       .. Scalar Arguments ..
27*       CHARACTER          TRANS, EQUED
28*       INTEGER            INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
29*      $                   N_ERR_BNDS
30*       DOUBLE PRECISION   RCOND
31*       ..
32*       .. Array Arguments ..
33*       INTEGER            IPIV( * ), IWORK( * )
34*       DOUBLE PRECISION   A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
35*      $                   X( LDX , * ), WORK( * )
36*       DOUBLE PRECISION   R( * ), C( * ), PARAMS( * ), BERR( * ),
37*      $                   ERR_BNDS_NORM( NRHS, * ),
38*      $                   ERR_BNDS_COMP( NRHS, * )
39*       ..
40*
41*
42*> \par Purpose:
43*  =============
44*>
45*> \verbatim
46*>
47*>    DGERFSX improves the computed solution to a system of linear
48*>    equations and provides error bounds and backward error estimates
49*>    for the solution.  In addition to normwise error bound, the code
50*>    provides maximum componentwise error bound if possible.  See
51*>    comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
52*>    error bounds.
53*>
54*>    The original system of linear equations may have been equilibrated
55*>    before calling this routine, as described by arguments EQUED, R
56*>    and C below. In this case, the solution and error bounds returned
57*>    are for the original unequilibrated system.
58*> \endverbatim
59*
60*  Arguments:
61*  ==========
62*
63*> \verbatim
64*>     Some optional parameters are bundled in the PARAMS array.  These
65*>     settings determine how refinement is performed, but often the
66*>     defaults are acceptable.  If the defaults are acceptable, users
67*>     can pass NPARAMS = 0 which prevents the source code from accessing
68*>     the PARAMS argument.
69*> \endverbatim
70*>
71*> \param[in] TRANS
72*> \verbatim
73*>          TRANS is CHARACTER*1
74*>     Specifies the form of the system of equations:
75*>       = 'N':  A * X = B     (No transpose)
76*>       = 'T':  A**T * X = B  (Transpose)
77*>       = 'C':  A**H * X = B  (Conjugate transpose = Transpose)
78*> \endverbatim
79*>
80*> \param[in] EQUED
81*> \verbatim
82*>          EQUED is CHARACTER*1
83*>     Specifies the form of equilibration that was done to A
84*>     before calling this routine. This is needed to compute
85*>     the solution and error bounds correctly.
86*>       = 'N':  No equilibration
87*>       = 'R':  Row equilibration, i.e., A has been premultiplied by
88*>               diag(R).
89*>       = 'C':  Column equilibration, i.e., A has been postmultiplied
90*>               by diag(C).
91*>       = 'B':  Both row and column equilibration, i.e., A has been
92*>               replaced by diag(R) * A * diag(C).
93*>               The right hand side B has been changed accordingly.
94*> \endverbatim
95*>
96*> \param[in] N
97*> \verbatim
98*>          N is INTEGER
99*>     The order of the matrix A.  N >= 0.
100*> \endverbatim
101*>
102*> \param[in] NRHS
103*> \verbatim
104*>          NRHS is INTEGER
105*>     The number of right hand sides, i.e., the number of columns
106*>     of the matrices B and X.  NRHS >= 0.
107*> \endverbatim
108*>
109*> \param[in] A
110*> \verbatim
111*>          A is DOUBLE PRECISION array, dimension (LDA,N)
112*>     The original N-by-N matrix A.
113*> \endverbatim
114*>
115*> \param[in] LDA
116*> \verbatim
117*>          LDA is INTEGER
118*>     The leading dimension of the array A.  LDA >= max(1,N).
119*> \endverbatim
120*>
121*> \param[in] AF
122*> \verbatim
123*>          AF is DOUBLE PRECISION array, dimension (LDAF,N)
124*>     The factors L and U from the factorization A = P*L*U
125*>     as computed by DGETRF.
126*> \endverbatim
127*>
128*> \param[in] LDAF
129*> \verbatim
130*>          LDAF is INTEGER
131*>     The leading dimension of the array AF.  LDAF >= max(1,N).
132*> \endverbatim
133*>
134*> \param[in] IPIV
135*> \verbatim
136*>          IPIV is INTEGER array, dimension (N)
137*>     The pivot indices from DGETRF; for 1<=i<=N, row i of the
138*>     matrix was interchanged with row IPIV(i).
139*> \endverbatim
140*>
141*> \param[in] R
142*> \verbatim
143*>          R is DOUBLE PRECISION array, dimension (N)
144*>     The row scale factors for A.  If EQUED = 'R' or 'B', A is
145*>     multiplied on the left by diag(R); if EQUED = 'N' or 'C', R
146*>     is not accessed.
147*>     If R is accessed, each element of R should be a power of the radix
148*>     to ensure a reliable solution and error estimates. Scaling by
149*>     powers of the radix does not cause rounding errors unless the
150*>     result underflows or overflows. Rounding errors during scaling
151*>     lead to refining with a matrix that is not equivalent to the
152*>     input matrix, producing error estimates that may not be
153*>     reliable.
154*> \endverbatim
155*>
156*> \param[in] C
157*> \verbatim
158*>          C is DOUBLE PRECISION array, dimension (N)
159*>     The column scale factors for A.  If EQUED = 'C' or 'B', A is
160*>     multiplied on the right by diag(C); if EQUED = 'N' or 'R', C
161*>     is not accessed.
162*>     If C is accessed, each element of C should be a power of the radix
163*>     to ensure a reliable solution and error estimates. Scaling by
164*>     powers of the radix does not cause rounding errors unless the
165*>     result underflows or overflows. Rounding errors during scaling
166*>     lead to refining with a matrix that is not equivalent to the
167*>     input matrix, producing error estimates that may not be
168*>     reliable.
169*> \endverbatim
170*>
171*> \param[in] B
172*> \verbatim
173*>          B is DOUBLE PRECISION array, dimension (LDB,NRHS)
174*>     The right hand side matrix B.
175*> \endverbatim
176*>
177*> \param[in] LDB
178*> \verbatim
179*>          LDB is INTEGER
180*>     The leading dimension of the array B.  LDB >= max(1,N).
181*> \endverbatim
182*>
183*> \param[in,out] X
184*> \verbatim
185*>          X is DOUBLE PRECISION array, dimension (LDX,NRHS)
186*>     On entry, the solution matrix X, as computed by DGETRS.
187*>     On exit, the improved solution matrix X.
188*> \endverbatim
189*>
190*> \param[in] LDX
191*> \verbatim
192*>          LDX is INTEGER
193*>     The leading dimension of the array X.  LDX >= max(1,N).
194*> \endverbatim
195*>
196*> \param[out] RCOND
197*> \verbatim
198*>          RCOND is DOUBLE PRECISION
199*>     Reciprocal scaled condition number.  This is an estimate of the
200*>     reciprocal Skeel condition number of the matrix A after
201*>     equilibration (if done).  If this is less than the machine
202*>     precision (in particular, if it is zero), the matrix is singular
203*>     to working precision.  Note that the error may still be small even
204*>     if this number is very small and the matrix appears ill-
205*>     conditioned.
206*> \endverbatim
207*>
208*> \param[out] BERR
209*> \verbatim
210*>          BERR is DOUBLE PRECISION array, dimension (NRHS)
211*>     Componentwise relative backward error.  This is the
212*>     componentwise relative backward error of each solution vector X(j)
213*>     (i.e., the smallest relative change in any element of A or B that
214*>     makes X(j) an exact solution).
215*> \endverbatim
216*>
217*> \param[in] N_ERR_BNDS
218*> \verbatim
219*>          N_ERR_BNDS is INTEGER
220*>     Number of error bounds to return for each right hand side
221*>     and each type (normwise or componentwise).  See ERR_BNDS_NORM and
222*>     ERR_BNDS_COMP below.
223*> \endverbatim
224*>
225*> \param[out] ERR_BNDS_NORM
226*> \verbatim
227*>          ERR_BNDS_NORM is DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
228*>     For each right-hand side, this array contains information about
229*>     various error bounds and condition numbers corresponding to the
230*>     normwise relative error, which is defined as follows:
231*>
232*>     Normwise relative error in the ith solution vector:
233*>             max_j (abs(XTRUE(j,i) - X(j,i)))
234*>            ------------------------------
235*>                  max_j abs(X(j,i))
236*>
237*>     The array is indexed by the type of error information as described
238*>     below. There currently are up to three pieces of information
239*>     returned.
240*>
241*>     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
242*>     right-hand side.
243*>
244*>     The second index in ERR_BNDS_NORM(:,err) contains the following
245*>     three fields:
246*>     err = 1 "Trust/don't trust" boolean. Trust the answer if the
247*>              reciprocal condition number is less than the threshold
248*>              sqrt(n) * dlamch('Epsilon').
249*>
250*>     err = 2 "Guaranteed" error bound: The estimated forward error,
251*>              almost certainly within a factor of 10 of the true error
252*>              so long as the next entry is greater than the threshold
253*>              sqrt(n) * dlamch('Epsilon'). This error bound should only
254*>              be trusted if the previous boolean is true.
255*>
256*>     err = 3  Reciprocal condition number: Estimated normwise
257*>              reciprocal condition number.  Compared with the threshold
258*>              sqrt(n) * dlamch('Epsilon') to determine if the error
259*>              estimate is "guaranteed". These reciprocal condition
260*>              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
261*>              appropriately scaled matrix Z.
262*>              Let Z = S*A, where S scales each row by a power of the
263*>              radix so all absolute row sums of Z are approximately 1.
264*>
265*>     See Lapack Working Note 165 for further details and extra
266*>     cautions.
267*> \endverbatim
268*>
269*> \param[out] ERR_BNDS_COMP
270*> \verbatim
271*>          ERR_BNDS_COMP is DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
272*>     For each right-hand side, this array contains information about
273*>     various error bounds and condition numbers corresponding to the
274*>     componentwise relative error, which is defined as follows:
275*>
276*>     Componentwise relative error in the ith solution vector:
277*>                    abs(XTRUE(j,i) - X(j,i))
278*>             max_j ----------------------
279*>                         abs(X(j,i))
280*>
281*>     The array is indexed by the right-hand side i (on which the
282*>     componentwise relative error depends), and the type of error
283*>     information as described below. There currently are up to three
284*>     pieces of information returned for each right-hand side. If
285*>     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
286*>     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS < 3, then at most
287*>     the first (:,N_ERR_BNDS) entries are returned.
288*>
289*>     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
290*>     right-hand side.
291*>
292*>     The second index in ERR_BNDS_COMP(:,err) contains the following
293*>     three fields:
294*>     err = 1 "Trust/don't trust" boolean. Trust the answer if the
295*>              reciprocal condition number is less than the threshold
296*>              sqrt(n) * dlamch('Epsilon').
297*>
298*>     err = 2 "Guaranteed" error bound: The estimated forward error,
299*>              almost certainly within a factor of 10 of the true error
300*>              so long as the next entry is greater than the threshold
301*>              sqrt(n) * dlamch('Epsilon'). This error bound should only
302*>              be trusted if the previous boolean is true.
303*>
304*>     err = 3  Reciprocal condition number: Estimated componentwise
305*>              reciprocal condition number.  Compared with the threshold
306*>              sqrt(n) * dlamch('Epsilon') to determine if the error
307*>              estimate is "guaranteed". These reciprocal condition
308*>              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
309*>              appropriately scaled matrix Z.
310*>              Let Z = S*(A*diag(x)), where x is the solution for the
311*>              current right-hand side and S scales each row of
312*>              A*diag(x) by a power of the radix so all absolute row
313*>              sums of Z are approximately 1.
314*>
315*>     See Lapack Working Note 165 for further details and extra
316*>     cautions.
317*> \endverbatim
318*>
319*> \param[in] NPARAMS
320*> \verbatim
321*>          NPARAMS is INTEGER
322*>     Specifies the number of parameters set in PARAMS.  If <= 0, the
323*>     PARAMS array is never referenced and default values are used.
324*> \endverbatim
325*>
326*> \param[in,out] PARAMS
327*> \verbatim
328*>          PARAMS is DOUBLE PRECISION array, dimension (NPARAMS)
329*>     Specifies algorithm parameters.  If an entry is < 0.0, then
330*>     that entry will be filled with default value used for that
331*>     parameter.  Only positions up to NPARAMS are accessed; defaults
332*>     are used for higher-numbered parameters.
333*>
334*>       PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative
335*>            refinement or not.
336*>         Default: 1.0D+0
337*>            = 0.0:  No refinement is performed, and no error bounds are
338*>                    computed.
339*>            = 1.0:  Use the double-precision refinement algorithm,
340*>                    possibly with doubled-single computations if the
341*>                    compilation environment does not support DOUBLE
342*>                    PRECISION.
343*>              (other values are reserved for future use)
344*>
345*>       PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual
346*>            computations allowed for refinement.
347*>         Default: 10
348*>         Aggressive: Set to 100 to permit convergence using approximate
349*>                     factorizations or factorizations other than LU. If
350*>                     the factorization uses a technique other than
351*>                     Gaussian elimination, the guarantees in
352*>                     err_bnds_norm and err_bnds_comp may no longer be
353*>                     trustworthy.
354*>
355*>       PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code
356*>            will attempt to find a solution with small componentwise
357*>            relative error in the double-precision algorithm.  Positive
358*>            is true, 0.0 is false.
359*>         Default: 1.0 (attempt componentwise convergence)
360*> \endverbatim
361*>
362*> \param[out] WORK
363*> \verbatim
364*>          WORK is DOUBLE PRECISION array, dimension (4*N)
365*> \endverbatim
366*>
367*> \param[out] IWORK
368*> \verbatim
369*>          IWORK is INTEGER array, dimension (N)
370*> \endverbatim
371*>
372*> \param[out] INFO
373*> \verbatim
374*>          INFO is INTEGER
375*>       = 0:  Successful exit. The solution to every right-hand side is
376*>         guaranteed.
377*>       < 0:  If INFO = -i, the i-th argument had an illegal value
378*>       > 0 and <= N:  U(INFO,INFO) is exactly zero.  The factorization
379*>         has been completed, but the factor U is exactly singular, so
380*>         the solution and error bounds could not be computed. RCOND = 0
381*>         is returned.
382*>       = N+J: The solution corresponding to the Jth right-hand side is
383*>         not guaranteed. The solutions corresponding to other right-
384*>         hand sides K with K > J may not be guaranteed as well, but
385*>         only the first such right-hand side is reported. If a small
386*>         componentwise error is not requested (PARAMS(3) = 0.0) then
387*>         the Jth right-hand side is the first with a normwise error
388*>         bound that is not guaranteed (the smallest J such
389*>         that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0)
390*>         the Jth right-hand side is the first with either a normwise or
391*>         componentwise error bound that is not guaranteed (the smallest
392*>         J such that either ERR_BNDS_NORM(J,1) = 0.0 or
393*>         ERR_BNDS_COMP(J,1) = 0.0). See the definition of
394*>         ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information
395*>         about all of the right-hand sides check ERR_BNDS_NORM or
396*>         ERR_BNDS_COMP.
397*> \endverbatim
398*
399*  Authors:
400*  ========
401*
402*> \author Univ. of Tennessee
403*> \author Univ. of California Berkeley
404*> \author Univ. of Colorado Denver
405*> \author NAG Ltd.
406*
407*> \date December 2016
408*
409*> \ingroup doubleGEcomputational
410*
411*  =====================================================================
412      SUBROUTINE DGERFSX( TRANS, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
413     $                    R, C, B, LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
414     $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
415     $                    WORK, IWORK, INFO )
416*
417*  -- LAPACK computational routine (version 3.7.0) --
418*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
419*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
420*     December 2016
421*
422*     .. Scalar Arguments ..
423      CHARACTER          TRANS, EQUED
424      INTEGER            INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
425     $                   N_ERR_BNDS
426      DOUBLE PRECISION   RCOND
427*     ..
428*     .. Array Arguments ..
429      INTEGER            IPIV( * ), IWORK( * )
430      DOUBLE PRECISION   A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
431     $                   X( LDX , * ), WORK( * )
432      DOUBLE PRECISION   R( * ), C( * ), PARAMS( * ), BERR( * ),
433     $                   ERR_BNDS_NORM( NRHS, * ),
434     $                   ERR_BNDS_COMP( NRHS, * )
435*     ..
436*
437*  ==================================================================
438*
439*     .. Parameters ..
440      DOUBLE PRECISION   ZERO, ONE
441      PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
442      DOUBLE PRECISION   ITREF_DEFAULT, ITHRESH_DEFAULT
443      DOUBLE PRECISION   COMPONENTWISE_DEFAULT, RTHRESH_DEFAULT
444      DOUBLE PRECISION   DZTHRESH_DEFAULT
445      PARAMETER          ( ITREF_DEFAULT = 1.0D+0 )
446      PARAMETER          ( ITHRESH_DEFAULT = 10.0D+0 )
447      PARAMETER          ( COMPONENTWISE_DEFAULT = 1.0D+0 )
448      PARAMETER          ( RTHRESH_DEFAULT = 0.5D+0 )
449      PARAMETER          ( DZTHRESH_DEFAULT = 0.25D+0 )
450      INTEGER            LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
451     $                   LA_LINRX_CWISE_I
452      PARAMETER          ( LA_LINRX_ITREF_I = 1,
453     $                   LA_LINRX_ITHRESH_I = 2 )
454      PARAMETER          ( LA_LINRX_CWISE_I = 3 )
455      INTEGER            LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
456     $                   LA_LINRX_RCOND_I
457      PARAMETER          ( LA_LINRX_TRUST_I = 1, LA_LINRX_ERR_I = 2 )
458      PARAMETER          ( LA_LINRX_RCOND_I = 3 )
459*     ..
460*     .. Local Scalars ..
461      CHARACTER(1)       NORM
462      LOGICAL            ROWEQU, COLEQU, NOTRAN
463      INTEGER            J, TRANS_TYPE, PREC_TYPE, REF_TYPE
464      INTEGER            N_NORMS
465      DOUBLE PRECISION   ANORM, RCOND_TMP
466      DOUBLE PRECISION   ILLRCOND_THRESH, ERR_LBND, CWISE_WRONG
467      LOGICAL            IGNORE_CWISE
468      INTEGER            ITHRESH
469      DOUBLE PRECISION   RTHRESH, UNSTABLE_THRESH
470*     ..
471*     .. External Subroutines ..
472      EXTERNAL           XERBLA, DGECON, DLA_GERFSX_EXTENDED
473*     ..
474*     .. Intrinsic Functions ..
475      INTRINSIC          MAX, SQRT
476*     ..
477*     .. External Functions ..
478      EXTERNAL           LSAME, ILATRANS, ILAPREC
479      EXTERNAL           DLAMCH, DLANGE, DLA_GERCOND
480      DOUBLE PRECISION   DLAMCH, DLANGE, DLA_GERCOND
481      LOGICAL            LSAME
482      INTEGER            ILATRANS, ILAPREC
483*     ..
484*     .. Executable Statements ..
485*
486*     Check the input parameters.
487*
488      INFO = 0
489      TRANS_TYPE = ILATRANS( TRANS )
490      REF_TYPE = INT( ITREF_DEFAULT )
491      IF ( NPARAMS .GE. LA_LINRX_ITREF_I ) THEN
492         IF ( PARAMS( LA_LINRX_ITREF_I ) .LT. 0.0D+0 ) THEN
493            PARAMS( LA_LINRX_ITREF_I ) = ITREF_DEFAULT
494         ELSE
495            REF_TYPE = PARAMS( LA_LINRX_ITREF_I )
496         END IF
497      END IF
498*
499*     Set default parameters.
500*
501      ILLRCOND_THRESH = DBLE( N ) * DLAMCH( 'Epsilon' )
502      ITHRESH = INT( ITHRESH_DEFAULT )
503      RTHRESH = RTHRESH_DEFAULT
504      UNSTABLE_THRESH = DZTHRESH_DEFAULT
505      IGNORE_CWISE = COMPONENTWISE_DEFAULT .EQ. 0.0D+0
506*
507      IF ( NPARAMS.GE.LA_LINRX_ITHRESH_I ) THEN
508         IF ( PARAMS( LA_LINRX_ITHRESH_I ).LT.0.0D+0 ) THEN
509            PARAMS( LA_LINRX_ITHRESH_I ) = ITHRESH
510         ELSE
511            ITHRESH = INT( PARAMS( LA_LINRX_ITHRESH_I ) )
512         END IF
513      END IF
514      IF ( NPARAMS.GE.LA_LINRX_CWISE_I ) THEN
515         IF ( PARAMS( LA_LINRX_CWISE_I ).LT.0.0D+0 ) THEN
516            IF ( IGNORE_CWISE ) THEN
517               PARAMS( LA_LINRX_CWISE_I ) = 0.0D+0
518            ELSE
519               PARAMS( LA_LINRX_CWISE_I ) = 1.0D+0
520            END IF
521         ELSE
522            IGNORE_CWISE = PARAMS( LA_LINRX_CWISE_I ) .EQ. 0.0D+0
523         END IF
524      END IF
525      IF ( REF_TYPE .EQ. 0 .OR. N_ERR_BNDS .EQ. 0 ) THEN
526         N_NORMS = 0
527      ELSE IF ( IGNORE_CWISE ) THEN
528         N_NORMS = 1
529      ELSE
530         N_NORMS = 2
531      END IF
532*
533      NOTRAN = LSAME( TRANS, 'N' )
534      ROWEQU = LSAME( EQUED, 'R' ) .OR. LSAME( EQUED, 'B' )
535      COLEQU = LSAME( EQUED, 'C' ) .OR. LSAME( EQUED, 'B' )
536*
537*     Test input parameters.
538*
539      IF( TRANS_TYPE.EQ.-1 ) THEN
540        INFO = -1
541      ELSE IF( .NOT.ROWEQU .AND. .NOT.COLEQU .AND.
542     $         .NOT.LSAME( EQUED, 'N' ) ) THEN
543        INFO = -2
544      ELSE IF( N.LT.0 ) THEN
545        INFO = -3
546      ELSE IF( NRHS.LT.0 ) THEN
547        INFO = -4
548      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
549        INFO = -6
550      ELSE IF( LDAF.LT.MAX( 1, N ) ) THEN
551        INFO = -8
552      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
553        INFO = -13
554      ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
555        INFO = -15
556      END IF
557      IF( INFO.NE.0 ) THEN
558        CALL XERBLA( 'DGERFSX', -INFO )
559        RETURN
560      END IF
561*
562*     Quick return if possible.
563*
564      IF( N.EQ.0 .OR. NRHS.EQ.0 ) THEN
565         RCOND = 1.0D+0
566         DO J = 1, NRHS
567            BERR( J ) = 0.0D+0
568            IF ( N_ERR_BNDS .GE. 1 ) THEN
569               ERR_BNDS_NORM( J, LA_LINRX_TRUST_I) = 1.0D+0
570               ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 1.0D+0
571            END IF
572            IF ( N_ERR_BNDS .GE. 2 ) THEN
573               ERR_BNDS_NORM( J, LA_LINRX_ERR_I) = 0.0D+0
574               ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 0.0D+0
575            END IF
576            IF ( N_ERR_BNDS .GE. 3 ) THEN
577               ERR_BNDS_NORM( J, LA_LINRX_RCOND_I) = 1.0D+0
578               ERR_BNDS_COMP( J, LA_LINRX_RCOND_I ) = 1.0D+0
579            END IF
580         END DO
581         RETURN
582      END IF
583*
584*     Default to failure.
585*
586      RCOND = 0.0D+0
587      DO J = 1, NRHS
588         BERR( J ) = 1.0D+0
589         IF ( N_ERR_BNDS .GE. 1 ) THEN
590            ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 1.0D+0
591            ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 1.0D+0
592         END IF
593         IF ( N_ERR_BNDS .GE. 2 ) THEN
594            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 1.0D+0
595            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 1.0D+0
596         END IF
597         IF ( N_ERR_BNDS .GE. 3 ) THEN
598            ERR_BNDS_NORM( J, LA_LINRX_RCOND_I ) = 0.0D+0
599            ERR_BNDS_COMP( J, LA_LINRX_RCOND_I ) = 0.0D+0
600         END IF
601      END DO
602*
603*     Compute the norm of A and the reciprocal of the condition
604*     number of A.
605*
606      IF( NOTRAN ) THEN
607         NORM = 'I'
608      ELSE
609         NORM = '1'
610      END IF
611      ANORM = DLANGE( NORM, N, N, A, LDA, WORK )
612      CALL DGECON( NORM, N, AF, LDAF, ANORM, RCOND, WORK, IWORK, INFO )
613*
614*     Perform refinement on each right-hand side
615*
616      IF ( REF_TYPE .NE. 0 ) THEN
617
618         PREC_TYPE = ILAPREC( 'E' )
619
620         IF ( NOTRAN ) THEN
621            CALL DLA_GERFSX_EXTENDED( PREC_TYPE, TRANS_TYPE,  N,
622     $           NRHS, A, LDA, AF, LDAF, IPIV, COLEQU, C, B,
623     $           LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM,
624     $           ERR_BNDS_COMP, WORK(N+1), WORK(1), WORK(2*N+1),
625     $           WORK(1), RCOND, ITHRESH, RTHRESH, UNSTABLE_THRESH,
626     $           IGNORE_CWISE, INFO )
627         ELSE
628            CALL DLA_GERFSX_EXTENDED( PREC_TYPE, TRANS_TYPE,  N,
629     $           NRHS, A, LDA, AF, LDAF, IPIV, ROWEQU, R, B,
630     $           LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM,
631     $           ERR_BNDS_COMP, WORK(N+1), WORK(1), WORK(2*N+1),
632     $           WORK(1), RCOND, ITHRESH, RTHRESH, UNSTABLE_THRESH,
633     $           IGNORE_CWISE, INFO )
634         END IF
635      END IF
636
637      ERR_LBND = MAX( 10.0D+0, SQRT( DBLE( N ) ) ) * DLAMCH( 'Epsilon' )
638      IF ( N_ERR_BNDS .GE. 1 .AND. N_NORMS .GE. 1 ) THEN
639*
640*     Compute scaled normwise condition number cond(A*C).
641*
642         IF ( COLEQU .AND. NOTRAN ) THEN
643            RCOND_TMP = DLA_GERCOND( TRANS, N, A, LDA, AF, LDAF, IPIV,
644     $           -1, C, INFO, WORK, IWORK )
645         ELSE IF ( ROWEQU .AND. .NOT. NOTRAN ) THEN
646            RCOND_TMP = DLA_GERCOND( TRANS, N, A, LDA, AF, LDAF, IPIV,
647     $           -1, R, INFO, WORK, IWORK )
648         ELSE
649            RCOND_TMP = DLA_GERCOND( TRANS, N, A, LDA, AF, LDAF, IPIV,
650     $           0, R, INFO, WORK, IWORK )
651         END IF
652         DO J = 1, NRHS
653*
654*     Cap the error at 1.0.
655*
656            IF ( N_ERR_BNDS .GE. LA_LINRX_ERR_I
657     $           .AND. ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) .GT. 1.0D+0 )
658     $           ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 1.0D+0
659*
660*     Threshold the error (see LAWN).
661*
662            IF ( RCOND_TMP .LT. ILLRCOND_THRESH ) THEN
663               ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 1.0D+0
664               ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 0.0D+0
665               IF ( INFO .LE. N ) INFO = N + J
666            ELSE IF ( ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) .LT. ERR_LBND )
667     $     THEN
668               ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = ERR_LBND
669               ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 1.0D+0
670            END IF
671*
672*     Save the condition number.
673*
674            IF ( N_ERR_BNDS .GE. LA_LINRX_RCOND_I ) THEN
675               ERR_BNDS_NORM( J, LA_LINRX_RCOND_I ) = RCOND_TMP
676            END IF
677         END DO
678      END IF
679
680      IF ( N_ERR_BNDS .GE. 1 .AND. N_NORMS .GE. 2 ) THEN
681*
682*     Compute componentwise condition number cond(A*diag(Y(:,J))) for
683*     each right-hand side using the current solution as an estimate of
684*     the true solution.  If the componentwise error estimate is too
685*     large, then the solution is a lousy estimate of truth and the
686*     estimated RCOND may be too optimistic.  To avoid misleading users,
687*     the inverse condition number is set to 0.0 when the estimated
688*     cwise error is at least CWISE_WRONG.
689*
690         CWISE_WRONG = SQRT( DLAMCH( 'Epsilon' ) )
691         DO J = 1, NRHS
692            IF ( ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) .LT. CWISE_WRONG )
693     $           THEN
694               RCOND_TMP = DLA_GERCOND( TRANS, N, A, LDA, AF, LDAF,
695     $              IPIV, 1, X(1,J), INFO, WORK, IWORK )
696            ELSE
697               RCOND_TMP = 0.0D+0
698            END IF
699*
700*     Cap the error at 1.0.
701*
702            IF ( N_ERR_BNDS .GE. LA_LINRX_ERR_I
703     $           .AND. ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) .GT. 1.0D+0 )
704     $           ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 1.0D+0
705*
706*     Threshold the error (see LAWN).
707*
708            IF ( RCOND_TMP .LT. ILLRCOND_THRESH ) THEN
709               ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 1.0D+0
710               ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 0.0D+0
711               IF ( PARAMS( LA_LINRX_CWISE_I ) .EQ. 1.0D+0
712     $              .AND. INFO.LT.N + J ) INFO = N + J
713            ELSE IF ( ERR_BNDS_COMP( J, LA_LINRX_ERR_I )
714     $              .LT. ERR_LBND ) THEN
715               ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = ERR_LBND
716               ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 1.0D+0
717            END IF
718*
719*     Save the condition number.
720*
721            IF ( N_ERR_BNDS .GE. LA_LINRX_RCOND_I ) THEN
722               ERR_BNDS_COMP( J, LA_LINRX_RCOND_I ) = RCOND_TMP
723            END IF
724         END DO
725      END IF
726*
727      RETURN
728*
729*     End of DGERFSX
730*
731      END
732