Actual source code: ex10.c

  1: static char help[] = "Reads a PETSc matrix and computes the 2 norm of the columns\n\n";

  3: /*
  4:   Include "petscmat.h" so that we can use matrices.
  5:   automatically includes:
  6:      petscsys.h       - base PETSc routines   petscvec.h    - vectors
  7:      petscmat.h    - matrices
  8:      petscis.h     - index sets            petscviewer.h - viewers
  9: */
 10: #include <petscmat.h>

 12: int main(int argc, char **args)
 13: {
 14:   Mat               A;                        /* matrix */
 15:   PetscViewer       fd;                       /* viewer */
 16:   char              file[PETSC_MAX_PATH_LEN]; /* input file name */
 17:   PetscReal        *norms;
 18:   PetscInt          n, cstart, cend;
 19:   PetscBool         flg;
 20:   PetscViewerFormat format;

 22:   PetscFunctionBeginUser;
 23:   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
 24:   /*
 25:      Determine files from which we read the matrix
 26:   */
 27:   PetscCall(PetscOptionsGetString(NULL, NULL, "-f", file, sizeof(file), &flg));
 28:   PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER, "Must indicate binary file with the -f option");

 30:   /*
 31:      Open binary file.  Note that we use FILE_MODE_READ to indicate
 32:      reading from this file.
 33:   */
 34:   PetscCall(PetscViewerCreate(PETSC_COMM_WORLD, &fd));
 35:   PetscCall(PetscViewerSetType(fd, PETSCVIEWERBINARY));
 36:   PetscCall(PetscViewerSetFromOptions(fd));
 37:   PetscCall(PetscOptionsGetEnum(NULL, NULL, "-viewer_format", PetscViewerFormats, (PetscEnum *)&format, &flg));
 38:   if (flg) PetscCall(PetscViewerPushFormat(fd, format));
 39:   PetscCall(PetscViewerFileSetMode(fd, FILE_MODE_READ));
 40:   PetscCall(PetscViewerFileSetName(fd, file));

 42:   /*
 43:     Load the matrix; then destroy the viewer.
 44:     Matrix type is set automatically but you can override it by MatSetType() prior to MatLoad().
 45:     Do that only if you really insist on the given type.
 46:   */
 47:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 48:   PetscCall(MatSetOptionsPrefix(A, "a_"));
 49:   PetscCall(PetscObjectSetName((PetscObject)A, "A"));
 50:   PetscCall(MatSetFromOptions(A));
 51:   PetscCall(MatLoad(A, fd));
 52:   PetscCall(PetscViewerDestroy(&fd));

 54:   PetscCall(MatGetSize(A, NULL, &n));
 55:   PetscCall(MatGetOwnershipRangeColumn(A, &cstart, &cend));
 56:   PetscCall(PetscMalloc1(n, &norms));
 57:   PetscCall(MatGetColumnNorms(A, NORM_2, norms));
 58:   PetscCall(PetscRealView(cend - cstart, norms + cstart, PETSC_VIEWER_STDOUT_WORLD));
 59:   PetscCall(PetscFree(norms));

 61:   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)A, PETSC_VIEWER_STDOUT_WORLD));
 62:   PetscCall(MatViewFromOptions(A, NULL, "-mat_view"));

 64:   PetscCall(MatDestroy(&A));
 65:   PetscCall(PetscFinalize());
 66:   return 0;
 67: }

 69: /*TEST

 71:    test:
 72:       suffix: mpiaij
 73:       nsize: 2
 74:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
 75:       args: -f ${DATAFILESPATH}/matrices/small -a_mat_type mpiaij
 76:       args: -a_matload_symmetric

 78:    test:
 79:       suffix: mpiaij_hdf5
 80:       nsize: 2
 81:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
 82:       args: -f ${DATAFILESPATH}/matrices/matlab/small.mat -a_mat_type mpiaij -viewer_type hdf5 -viewer_format hdf5_mat
 83:       args: -a_matload_symmetric

 85:    test:
 86:       suffix: mpiaij_rect_hdf5
 87:       nsize: 2
 88:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
 89:       args: -f ${DATAFILESPATH}/matrices/matlab/small_rect.mat -a_mat_type mpiaij -viewer_type hdf5 -viewer_format hdf5_mat

 91:    test:
 92:       # test for more processes than rows
 93:       suffix: mpiaij_hdf5_tiny
 94:       nsize: 8
 95:       requires: double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
 96:       args: -f ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system_with_x0.mat -a_mat_type mpiaij -viewer_type hdf5 -viewer_format hdf5_mat
 97:       args: -a_matload_symmetric

 99:    test:
100:       # test for more processes than rows, complex
101:       TODO: not yet implemented for MATLAB complex format
102:       suffix: mpiaij_hdf5_tiny_complex
103:       nsize: 8
104:       requires: double complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
105:       args: -f ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system_with_x0_complex.mat -a_mat_type mpiaij -viewer_type hdf5 -viewer_format hdf5_mat
106:       args: -a_matload_symmetric

108:    test:
109:       TODO: mpibaij not supported yet
110:       suffix: mpibaij_hdf5
111:       nsize: 2
112:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
113:       args: -f ${DATAFILESPATH}/matrices/matlab/small.mat -a_mat_type mpibaij -a_mat_block_size 2 -viewer_type hdf5 -viewer_format hdf5_mat
114:       args: -a_matload_symmetric

116:    test:
117:       suffix: mpidense
118:       nsize: 2
119:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
120:       args: -f ${DATAFILESPATH}/matrices/small -a_mat_type mpidense
121:       args: -a_matload_symmetric

123:    test:
124:       suffix: seqaij
125:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
126:       args: -f ${DATAFILESPATH}/matrices/small -a_mat_type seqaij
127:       args: -a_matload_symmetric

129:    test:
130:       suffix: seqaij_hdf5
131:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
132:       args: -f ${DATAFILESPATH}/matrices/matlab/small.mat -a_mat_type seqaij -viewer_type hdf5 -viewer_format hdf5_mat
133:       args: -a_matload_symmetric

135:    test:
136:       suffix: seqaij_rect_hdf5
137:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
138:       args: -f ${DATAFILESPATH}/matrices/matlab/small_rect.mat -a_mat_type seqaij -viewer_type hdf5 -viewer_format hdf5_mat

140:    test:
141:       suffix: seqdense
142:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
143:       args: -f ${DATAFILESPATH}/matrices/small -a_mat_type seqdense
144:       args: -a_matload_symmetric

146:    test:
147:       suffix: seqdense_hdf5
148:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
149:       args: -f ${DATAFILESPATH}/matrices/matlab/small_dense.mat -a_mat_type seqdense -viewer_type hdf5 -viewer_format hdf5_mat
150:       args: -a_matload_symmetric

152:    test:
153:       suffix: seqdense_rect_hdf5
154:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
155:       args: -f ${DATAFILESPATH}/matrices/matlab/small_rect_dense.mat -a_mat_type seqdense -viewer_type hdf5 -viewer_format hdf5_mat

157:    test:
158:       suffix: mpidense_hdf5
159:       nsize: 2
160:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
161:       args: -f ${DATAFILESPATH}/matrices/matlab/small_dense.mat -a_mat_type mpidense -viewer_type hdf5 -viewer_format hdf5_mat
162:       args: -a_matload_symmetric

164:    test:
165:       suffix: mpidense_rect_hdf5
166:       nsize: 2
167:       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
168:       args: -f ${DATAFILESPATH}/matrices/matlab/small_rect_dense.mat -a_mat_type mpidense -viewer_type hdf5 -viewer_format hdf5_mat
169: TEST*/