/*! @file zreadrb.c * \brief Read a matrix stored in Rutherford-Boeing format * *
 * -- SuperLU routine (version 4.0) --
 * Lawrence Berkeley National Laboratory.
 * June 30, 2009
 * 
* * Purpose * ======= * * Read a DOUBLE COMPLEX PRECISION matrix stored in Rutherford-Boeing format * as described below. * * Line 1 (A72, A8) * Col. 1 - 72 Title (TITLE) * Col. 73 - 80 Matrix name / identifier (MTRXID) * * Line 2 (I14, 3(1X, I13)) * Col. 1 - 14 Total number of lines excluding header (TOTCRD) * Col. 16 - 28 Number of lines for pointers (PTRCRD) * Col. 30 - 42 Number of lines for row (or variable) indices (INDCRD) * Col. 44 - 56 Number of lines for numerical values (VALCRD) * * Line 3 (A3, 11X, 4(1X, I13)) * Col. 1 - 3 Matrix type (see below) (MXTYPE) * Col. 15 - 28 Compressed Column: Number of rows (NROW) * Elemental: Largest integer used to index variable (MVAR) * Col. 30 - 42 Compressed Column: Number of columns (NCOL) * Elemental: Number of element matrices (NELT) * Col. 44 - 56 Compressed Column: Number of entries (NNZERO) * Elemental: Number of variable indeces (NVARIX) * Col. 58 - 70 Compressed Column: Unused, explicitly zero * Elemental: Number of elemental matrix entries (NELTVL) * * Line 4 (2A16, A20) * Col. 1 - 16 Fortran format for pointers (PTRFMT) * Col. 17 - 32 Fortran format for row (or variable) indices (INDFMT) * Col. 33 - 52 Fortran format for numerical values of coefficient matrix * (VALFMT) * (blank in the case of matrix patterns) * * The three character type field on line 3 describes the matrix type. * The following table lists the permitted values for each of the three * characters. As an example of the type field, RSA denotes that the matrix * is real, symmetric, and assembled. * * First Character: * R Real matrix * C Complex matrix * I integer matrix * P Pattern only (no numerical values supplied) * Q Pattern only (numerical values supplied in associated auxiliary value * file) * * Second Character: * S Symmetric * U Unsymmetric * H Hermitian * Z Skew symmetric * R Rectangular * * Third Character: * A Compressed column form * E Elemental form * * */ #include "slu_zdefs.h" /*! \brief Eat up the rest of the current line */ static int zDumpLine(FILE *fp) { register int c; while ((c = fgetc(fp)) != '\n') ; return 0; } static int zParseIntFormat(char *buf, int *num, int *size) { char *tmp; tmp = buf; while (*tmp++ != '(') ; sscanf(tmp, "%d", num); while (*tmp != 'I' && *tmp != 'i') ++tmp; ++tmp; sscanf(tmp, "%d", size); return 0; } static int zParseFloatFormat(char *buf, int *num, int *size) { char *tmp, *period; tmp = buf; while (*tmp++ != '(') ; *num = atoi(tmp); /*sscanf(tmp, "%d", num);*/ while (*tmp != 'E' && *tmp != 'e' && *tmp != 'D' && *tmp != 'd' && *tmp != 'F' && *tmp != 'f') { /* May find kP before nE/nD/nF, like (1P6F13.6). In this case the num picked up refers to P, which should be skipped. */ if (*tmp=='p' || *tmp=='P') { ++tmp; *num = atoi(tmp); /*sscanf(tmp, "%d", num);*/ } else { ++tmp; } } ++tmp; period = tmp; while (*period != '.' && *period != ')') ++period ; *period = '\0'; *size = atoi(tmp); /*sscanf(tmp, "%2d", size);*/ return 0; } static int ReadVector(FILE *fp, int n, int *where, int perline, int persize) { register int i, j, item; char tmp, buf[100]; i = 0; while (i < n) { fgets(buf, 100, fp); /* read a line at a time */ for (j=0; j