/* * Usage: ges [-debug] n m A[0,0] A[0,1] ... A[n-1,m-1] * * n : number of rows in matrix * m : number of columns in matrix * A[0,0] .. A[n-1,m-1] : entries of matrix (doubles) * * Computes reduced row-echelon form and prints intermediate steps. */ int main(int argc, char ** argv) { int numRows; int numCols; int k; double* matrix; int debug = 0; if (argc < 3) { printf("Too few arguments.\n"); printf("Usage: ges [-debug] n m A[0,0] A[0,1] ... A[n-1,m-1]\n"); printf(" n : number of rows in matrix\n"); printf(" m : number of columns in matrix\n"); printf(" A[0,0] .. A[n-1,m-1] : entries of matrix (doubles)\n"); exit(1); } if (!strcmp("-debug", argv[1])) { debug = 1; } sscanf(argv[1+debug], "%d", &numRows); sscanf(argv[2+debug], "%d", &numCols); if (argc != 3 + debug + numRows*numCols) { printf("Incorrect number of matrix entries: %d expected, %d given.\n", numRows*numCols, argc-3-debug); exit(1); } matrix = (double *) malloc(numRows*numCols * sizeof(double)); for (k = 0; k < numRows*numCols; k++) { sscanf(argv[k+3+debug], "%lf", &matrix[k]); } printMatrix("Original matrix:\n", matrix, numRows, numCols); gausselim(matrix, numRows, numCols, debug); printMatrix("Reduced row-echelon form:\n", matrix, numRows, numCols); return 0; }
/* * Usage: mpirun -np m a.out debug n m A[0,0] A[0,1] ... A[n-1,m-1] * * debug : debug flag, triggers output to screen at every step if non-zero * n : number of rows in matrix * m : number of columns in matrix * A[0,0] .. A[n-1,m-1] : entries of matrix (doubles) * * Computes reduced row-echelon form and prints intermediate steps. */ int main(int argc, char** argv) { int numRows; int numCols; int j; double* matrix; int rank, nprocs; int debug = 0; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (argc < 3) { if (rank == 0) { printf("Too few arguments.\n"); printf("Usage: ges [-debug] n m A[0,0] A[0,1] ... A[n-1,m-1]\n"); printf(" n : number of rows in matrix\n"); printf(" m : number of columns in matrix\n"); printf(" A[0,0] .. A[n-1,m-1] : entries of matrix (doubles)\n"); } exit(1); } if (!strcmp("-debug", argv[1])) { debug = 1; } sscanf(argv[1+debug], "%d", &numRows); sscanf(argv[2+debug], "%d", &numCols); if (argc != 3 + debug + numRows*numCols) { if (rank == 0) { printf("Incorrect number of matrix entries: %d expected, %d given.\n", numRows*numCols, argc-3-debug); } exit(1); } if (nprocs != numRows) { if (rank == 0) { printf("Number of processes must equal the number of rows: %d != %d \n", nprocs, numRows); } exit(1); } matrix = (double *) malloc(numCols * sizeof(double)); for (j = 0; j < numCols; j++) { sscanf(argv[rank*numCols+j+3+debug], "%lf", &matrix[j]); } printMatrix("Original matrix:\n", matrix, numRows, numCols); gausselim(matrix, numRows, numCols, debug); printMatrix("Reduced row-echelon form:\n", matrix, numRows, numCols); MPI_Finalize(); }