1c4762a1bSJed Brown static char help[] = "Read a non-complex sparse matrix from a Matrix Market (v. 2.0) file\n\ 2c4762a1bSJed Brown and write it to a file in petsc sparse binary format. If the matrix is symmetric, the binary file is in \n\ 3c4762a1bSJed Brown PETSc MATSBAIJ format, otherwise it is in MATAIJ format \n\ 4c4762a1bSJed Brown Usage: ./ex72 -fin <infile> -fout <outfile> \n\ 5c4762a1bSJed Brown (See https://math.nist.gov/MatrixMarket/ for details.)\n\ 6ba4e87b7SRey Koki The option -permute <natural,rcm,nd,...> permutes the matrix using the ordering type.\n\ 7c4762a1bSJed Brown The option -aij_only allows to use MATAIJ for all cases.\n\\n"; 8c4762a1bSJed Brown 9c4762a1bSJed Brown /* 100e3d61c9SBarry Smith NOTES: 110e3d61c9SBarry Smith 120e3d61c9SBarry Smith 1) Matrix Market files are always 1-based, i.e. the index of the first 130e3d61c9SBarry Smith element of a matrix is (1,1), not (0,0) as in C. ADJUST THESE 140e3d61c9SBarry Smith OFFSETS ACCORDINGLY offsets accordingly when reading and writing 150e3d61c9SBarry Smith to files. 160e3d61c9SBarry Smith 170e3d61c9SBarry Smith 2) ANSI C requires one to use the "l" format modifier when reading 180e3d61c9SBarry Smith double precision floating point numbers in scanf() and 190e3d61c9SBarry Smith its variants. For example, use "%lf", "%lg", or "%le" 200e3d61c9SBarry Smith when reading doubles, otherwise errors will occur. 21c4762a1bSJed Brown */ 22c4762a1bSJed Brown #include <petscmat.h> 2389928cc5SHong Zhang #include "mmloader.h" 24c4762a1bSJed Brown 25d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 26d71ae5a4SJacob Faibussowitsch { 27c4762a1bSJed Brown MM_typecode matcode; 28c4762a1bSJed Brown FILE *file; 2989928cc5SHong Zhang PetscInt M, N, nz; 30c4762a1bSJed Brown Mat A; 31c4762a1bSJed Brown char filein[PETSC_MAX_PATH_LEN], fileout[PETSC_MAX_PATH_LEN]; 32ba4e87b7SRey Koki char ordering[256] = MATORDERINGRCM; 33c4762a1bSJed Brown PetscViewer view; 3489928cc5SHong Zhang PetscBool flag, symmetric = PETSC_FALSE, aijonly = PETSC_FALSE, permute = PETSC_FALSE; 35ba4e87b7SRey Koki IS rowperm = NULL, colperm = NULL; 36d0609cedSBarry Smith PetscMPIInt size; 37c4762a1bSJed Brown 38*3ba16761SJacob Faibussowitsch PetscFunctionBeginUser; 39*3ba16761SJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 409566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 41ba4e87b7SRey Koki PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!"); 42c4762a1bSJed Brown 43d0609cedSBarry Smith PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "Matrix Market example options", ""); 44ba4e87b7SRey Koki { 459566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-fin", "Input Matrix Market file", "", filein, filein, sizeof(filein), &flag)); 46ba4e87b7SRey Koki PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER_INPUT, "Please use -fin <filename> to specify the input file name!"); 479566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-fout", "Output file in petsc sparse binary format", "", fileout, fileout, sizeof(fileout), &flag)); 48ba4e87b7SRey Koki PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER_INPUT, "Please use -fout <filename> to specify the output file name!"); 499566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-aij_only", "Use MATAIJ for all cases", "", aijonly, &aijonly, NULL)); 509566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-permute", "Permute matrix and vector to solving in new ordering", "", MatOrderingList, ordering, ordering, sizeof(ordering), &permute)); 51ba4e87b7SRey Koki } 52d0609cedSBarry Smith PetscOptionsEnd(); 53c4762a1bSJed Brown 5489928cc5SHong Zhang PetscCall(MatCreateFromMTX(&A, filein, aijonly)); 559566063dSJacob Faibussowitsch PetscCall(PetscFOpen(PETSC_COMM_SELF, filein, "r", &file)); 56*3ba16761SJacob Faibussowitsch PetscCallExternal(mm_read_banner, file, &matcode); 57c4762a1bSJed Brown if (mm_is_symmetric(matcode)) symmetric = PETSC_TRUE; 58*3ba16761SJacob Faibussowitsch PetscCallExternal(mm_write_banner, stdout, matcode); 59*3ba16761SJacob Faibussowitsch PetscCallExternal(mm_read_mtx_crd_size, file, &M, &N, &nz); 609566063dSJacob Faibussowitsch PetscCall(PetscFClose(PETSC_COMM_SELF, file)); 6189928cc5SHong Zhang PetscCall(PetscPrintf(PETSC_COMM_SELF, "M: %d, N: %d, nnz: %d\n", M, N, nz)); 629566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "Reading matrix completes.\n")); 63ba4e87b7SRey Koki if (permute) { 64ba4e87b7SRey Koki Mat Aperm; 659566063dSJacob Faibussowitsch PetscCall(MatGetOrdering(A, ordering, &rowperm, &colperm)); 669566063dSJacob Faibussowitsch PetscCall(MatPermute(A, rowperm, colperm, &Aperm)); 679566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 68ba4e87b7SRey Koki A = Aperm; /* Replace original operator with permuted version */ 69ba4e87b7SRey Koki } 70ba4e87b7SRey Koki 71c4762a1bSJed Brown /* Write out matrix */ 729566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "Writing matrix to binary file %s using PETSc %s format ...\n", fileout, (symmetric && !aijonly) ? "SBAIJ" : "AIJ")); 739566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fileout, FILE_MODE_WRITE, &view)); 749566063dSJacob Faibussowitsch PetscCall(MatView(A, view)); 759566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&view)); 769566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "Writing matrix completes.\n")); 77c4762a1bSJed Brown 789566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 799566063dSJacob Faibussowitsch PetscCall(ISDestroy(&rowperm)); 809566063dSJacob Faibussowitsch PetscCall(ISDestroy(&colperm)); 819566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 82c4762a1bSJed Brown return 0; 83c4762a1bSJed Brown } 84c4762a1bSJed Brown 85c4762a1bSJed Brown /*TEST 86c4762a1bSJed Brown 87c4762a1bSJed Brown build: 88dfd57a17SPierre Jolivet requires: !complex double !defined(PETSC_USE_64BIT_INDICES) 8989928cc5SHong Zhang depends: mmloader.c mmio.c 90c4762a1bSJed Brown 91c4762a1bSJed Brown test: 92c4762a1bSJed Brown suffix: 1 93c4762a1bSJed Brown args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/amesos2_test_mat0.mtx -fout petscmat.aij 94c4762a1bSJed Brown output_file: output/ex72_1.out 95c4762a1bSJed Brown 96c4762a1bSJed Brown test: 97c4762a1bSJed Brown suffix: 2 98c4762a1bSJed Brown args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/LFAT5.mtx -fout petscmat.sbaij 99c4762a1bSJed Brown output_file: output/ex72_2.out 100c4762a1bSJed Brown 101c4762a1bSJed Brown test: 102c4762a1bSJed Brown suffix: 3 103c4762a1bSJed Brown args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/m_05_05_crk.mtx -fout petscmat2.aij 104c4762a1bSJed Brown output_file: output/ex72_3.out 105ba4e87b7SRey Koki 106ba4e87b7SRey Koki test: 107ba4e87b7SRey Koki suffix: 4 108ba4e87b7SRey Koki args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/amesos2_test_mat0.mtx -fout petscmat.aij -permute rcm 109ba4e87b7SRey Koki output_file: output/ex72_4.out 110c4762a1bSJed Brown TEST*/ 111