Date: 2026-03-31T05:46:26+00:00

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, NULL, 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*/