Lines 276-296
Link Here
|
276 |
than SAFE2, then SAFE1 is added to the i-th component of the |
276 |
than SAFE2, then SAFE1 is added to the i-th component of the |
277 |
numerator and denominator before dividing. */ |
277 |
numerator and denominator before dividing. */ |
278 |
|
278 |
|
279 |
for (i = 0; i < A->nrow; ++i) rwork[i] = c_abs1( &Bptr[i] ); |
279 |
for (i = 0; i < A->nrow; ++i) rwork[i] = slu_c_abs1( &Bptr[i] ); |
280 |
|
280 |
|
281 |
/* Compute abs(op(A))*abs(X) + abs(B). */ |
281 |
/* Compute abs(op(A))*abs(X) + abs(B). */ |
282 |
if (notran) { |
282 |
if (notran) { |
283 |
for (k = 0; k < A->ncol; ++k) { |
283 |
for (k = 0; k < A->ncol; ++k) { |
284 |
xk = c_abs1( &Xptr[k] ); |
284 |
xk = slu_c_abs1( &Xptr[k] ); |
285 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) |
285 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) |
286 |
rwork[Astore->rowind[i]] += c_abs1(&Aval[i]) * xk; |
286 |
rwork[Astore->rowind[i]] += slu_c_abs1(&Aval[i]) * xk; |
287 |
} |
287 |
} |
288 |
} else { |
288 |
} else { |
289 |
for (k = 0; k < A->ncol; ++k) { |
289 |
for (k = 0; k < A->ncol; ++k) { |
290 |
s = 0.; |
290 |
s = 0.; |
291 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) { |
291 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) { |
292 |
irow = Astore->rowind[i]; |
292 |
irow = Astore->rowind[i]; |
293 |
s += c_abs1(&Aval[i]) * c_abs1(&Xptr[irow]); |
293 |
s += slu_c_abs1(&Aval[i]) * slu_c_abs1(&Xptr[irow]); |
294 |
} |
294 |
} |
295 |
rwork[k] += s; |
295 |
rwork[k] += s; |
296 |
} |
296 |
} |
Lines 298-306
Link Here
|
298 |
s = 0.; |
298 |
s = 0.; |
299 |
for (i = 0; i < A->nrow; ++i) { |
299 |
for (i = 0; i < A->nrow; ++i) { |
300 |
if (rwork[i] > safe2) |
300 |
if (rwork[i] > safe2) |
301 |
s = SUPERLU_MAX( s, c_abs1(&work[i]) / rwork[i] ); |
301 |
s = SUPERLU_MAX( s, slu_c_abs1(&work[i]) / rwork[i] ); |
302 |
else |
302 |
else |
303 |
s = SUPERLU_MAX( s, (c_abs1(&work[i]) + safe1) / |
303 |
s = SUPERLU_MAX( s, (slu_c_abs1(&work[i]) + safe1) / |
304 |
(rwork[i] + safe1) ); |
304 |
(rwork[i] + safe1) ); |
305 |
} |
305 |
} |
306 |
berr[j] = s; |
306 |
berr[j] = s; |
Lines 351-372
Link Here
|
351 |
inv(op(A)) * diag(W), |
351 |
inv(op(A)) * diag(W), |
352 |
where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ |
352 |
where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) */ |
353 |
|
353 |
|
354 |
for (i = 0; i < A->nrow; ++i) rwork[i] = c_abs1( &Bptr[i] ); |
354 |
for (i = 0; i < A->nrow; ++i) rwork[i] = slu_c_abs1( &Bptr[i] ); |
355 |
|
355 |
|
356 |
/* Compute abs(op(A))*abs(X) + abs(B). */ |
356 |
/* Compute abs(op(A))*abs(X) + abs(B). */ |
357 |
if ( notran ) { |
357 |
if ( notran ) { |
358 |
for (k = 0; k < A->ncol; ++k) { |
358 |
for (k = 0; k < A->ncol; ++k) { |
359 |
xk = c_abs1( &Xptr[k] ); |
359 |
xk = slu_c_abs1( &Xptr[k] ); |
360 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) |
360 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) |
361 |
rwork[Astore->rowind[i]] += c_abs1(&Aval[i]) * xk; |
361 |
rwork[Astore->rowind[i]] += slu_c_abs1(&Aval[i]) * xk; |
362 |
} |
362 |
} |
363 |
} else { |
363 |
} else { |
364 |
for (k = 0; k < A->ncol; ++k) { |
364 |
for (k = 0; k < A->ncol; ++k) { |
365 |
s = 0.; |
365 |
s = 0.; |
366 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) { |
366 |
for (i = Astore->colptr[k]; i < Astore->colptr[k+1]; ++i) { |
367 |
irow = Astore->rowind[i]; |
367 |
irow = Astore->rowind[i]; |
368 |
xk = c_abs1( &Xptr[irow] ); |
368 |
xk = slu_c_abs1( &Xptr[irow] ); |
369 |
s += c_abs1(&Aval[i]) * xk; |
369 |
s += slu_c_abs1(&Aval[i]) * xk; |
370 |
} |
370 |
} |
371 |
rwork[k] += s; |
371 |
rwork[k] += s; |
372 |
} |
372 |
} |
Lines 374-382
Link Here
|
374 |
|
374 |
|
375 |
for (i = 0; i < A->nrow; ++i) |
375 |
for (i = 0; i < A->nrow; ++i) |
376 |
if (rwork[i] > safe2) |
376 |
if (rwork[i] > safe2) |
377 |
rwork[i] = c_abs(&work[i]) + (iwork[i]+1)*eps*rwork[i]; |
377 |
rwork[i] = slu_c_abs(&work[i]) + (iwork[i]+1)*eps*rwork[i]; |
378 |
else |
378 |
else |
379 |
rwork[i] = c_abs(&work[i])+(iwork[i]+1)*eps*rwork[i]+safe1; |
379 |
rwork[i] = slu_c_abs(&work[i])+(iwork[i]+1)*eps*rwork[i]+safe1; |
380 |
kase = 0; |
380 |
kase = 0; |
381 |
|
381 |
|
382 |
do { |
382 |
do { |
Lines 424-436
Link Here
|
424 |
lstres = 0.; |
424 |
lstres = 0.; |
425 |
if ( notran && colequ ) { |
425 |
if ( notran && colequ ) { |
426 |
for (i = 0; i < A->nrow; ++i) |
426 |
for (i = 0; i < A->nrow; ++i) |
427 |
lstres = SUPERLU_MAX( lstres, C[i] * c_abs1( &Xptr[i]) ); |
427 |
lstres = SUPERLU_MAX( lstres, C[i] * slu_c_abs1( &Xptr[i]) ); |
428 |
} else if ( !notran && rowequ ) { |
428 |
} else if ( !notran && rowequ ) { |
429 |
for (i = 0; i < A->nrow; ++i) |
429 |
for (i = 0; i < A->nrow; ++i) |
430 |
lstres = SUPERLU_MAX( lstres, R[i] * c_abs1( &Xptr[i]) ); |
430 |
lstres = SUPERLU_MAX( lstres, R[i] * slu_c_abs1( &Xptr[i]) ); |
431 |
} else { |
431 |
} else { |
432 |
for (i = 0; i < A->nrow; ++i) |
432 |
for (i = 0; i < A->nrow; ++i) |
433 |
lstres = SUPERLU_MAX( lstres, c_abs1( &Xptr[i]) ); |
433 |
lstres = SUPERLU_MAX( lstres, slu_c_abs1( &Xptr[i]) ); |
434 |
} |
434 |
} |
435 |
if ( lstres != 0. ) |
435 |
if ( lstres != 0. ) |
436 |
ferr[j] /= lstres; |
436 |
ferr[j] /= lstres; |