Changeset 7103
- Timestamp:
- May 9, 2006, 3:02:55 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMatrix.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMatrix.c
r7101 r7103 21 21 * @author Robert DeSonia, MHPCC 22 22 * 23 * @version $Revision: 1.3 7$ $Name: not supported by cvs2svn $24 * @date $Date: 2006-05-10 0 0:48:50$23 * @version $Revision: 1.38 $ $Name: not supported by cvs2svn $ 24 * @date $Date: 2006-05-10 01:02:55 $ 25 25 * 26 26 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 312 312 psVector *b) 313 313 { 314 int *indxc,*indxr,*ipiv;315 int icol, irow;316 int i, j, k, l, ll;317 float big, dum, pivinv;318 314 psF64 *vector = b->data.F64; 319 315 psF64 **matrix = a->data.F64; 320 321 316 int Nx = a->numCols; 322 323 indxc = psAlloc(Nx*sizeof(int)); 324 indxr = psAlloc(Nx*sizeof(int)); 325 ipiv = psAlloc(Nx*sizeof(int)); 326 for (j = 0; j < Nx; j++) { 327 ipiv[j] = 0; 328 } 329 330 irow = icol = 0; 331 big = fabs(matrix[0][0]); 332 333 for (i = 0; i < Nx; i++) { 334 big = 0.0; 335 for (j = 0; j < Nx; j++) { 317 int *indxc = psAlloc(Nx*sizeof(int)); 318 int *indxr = psAlloc(Nx*sizeof(int)); 319 int *ipiv = psAlloc(Nx*sizeof(int)); 320 memset(ipiv, 0, Nx*sizeof(int)); 321 322 int irow = 0; 323 int icol = 0; 324 325 for (int i = 0; i < Nx; i++) { 326 double big = 0.0; 327 for (int j = 0; j < Nx; j++) { 336 328 if (!isfinite(matrix[i][j])) { 337 psTrace (__func__, 3, "Input matrix contains NaNs: matrix[%d][%d] is %.2f\n", i, j, matrix[i][j]); 329 psError(PS_ERR_BAD_PARAMETER_VALUE, 3, 330 "Input matrix contains non-finite elements: matrix[%d][%d] is %.2f\n", 331 i, j, matrix[i][j]); 338 332 goto fescape; 339 333 } 340 334 if (ipiv[j] != 1) { 341 for ( k = 0; k < Nx; k++) {335 for (int k = 0; k < Nx; k++) { 342 336 if (ipiv[k] == 0) { 343 if (fabs (matrix[j][k]) >= big) {337 if (fabs(matrix[j][k]) >= big) { 344 338 big = fabs(matrix[j][k]); 345 339 irow = j; … … 357 351 ipiv[icol]++; 358 352 if (irow != icol) { 359 for ( l = 0; l < Nx; l++) {353 for (int l = 0; l < Nx; l++) { 360 354 PS_SWAP(matrix[irow][l], matrix[icol][l]); 361 355 } … … 368 362 goto fescape; 369 363 } 370 pivinv = 1.0 / matrix[icol][icol];364 double pivinv = 1.0 / matrix[icol][icol]; 371 365 matrix[icol][icol] = 1.0; 372 for ( l = 0; l < Nx; l++) {366 for (int l = 0; l < Nx; l++) { 373 367 matrix[icol][l] *= pivinv; 374 368 } 375 369 vector[icol] *= pivinv; 376 370 377 for ( ll = 0; ll < Nx; ll++) {371 for (int ll = 0; ll < Nx; ll++) { 378 372 if (ll != icol) { 379 d um = matrix[ll][icol];373 double dum = matrix[ll][icol]; 380 374 matrix[ll][icol] = 0.0; 381 for ( l = 0; l < Nx; l++) {375 for (int l = 0; l < Nx; l++) { 382 376 matrix[ll][l] -= matrix[icol][l]*dum; 383 377 } … … 387 381 } 388 382 389 for ( l = Nx - 1; l >= 0; l--) {383 for (int l = Nx - 1; l >= 0; l--) { 390 384 if (indxr[l] != indxc[l]) { 391 for ( k = 0; k < Nx; k++) {385 for (int k = 0; k < Nx; k++) { 392 386 PS_SWAP(matrix[k][indxr[l]], matrix[k][indxc[l]]); 393 387 }
Note:
See TracChangeset
for help on using the changeset viewer.
