Date: 2022-08-02T03:14:09+00:00

Actual source code: ex10.c

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

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

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

     23:   PetscInitialize(&argc,&args,(char*)0,help);
     24:   /*
     25:      Determine files from which we read the matrix
     26:   */
     27:   PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&flg);

     30:   /*
     31:      Open binary file.  Note that we use FILE_MODE_READ to indicate
     32:      reading from this file.
     33:   */
     34:   PetscViewerCreate(PETSC_COMM_WORLD,&fd);
     35:   PetscViewerSetType(fd,PETSCVIEWERBINARY);
     36:   PetscViewerSetFromOptions(fd);
     37:   PetscOptionsGetEnum(NULL,NULL,"-viewer_format",PetscViewerFormats,(PetscEnum*)&format,&flg);
     38:   if (flg) PetscViewerPushFormat(fd,format);
     39:   PetscViewerFileSetMode(fd,FILE_MODE_READ);
     40:   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:   MatCreate(PETSC_COMM_WORLD,&A);
     48:   MatSetOptionsPrefix(A,"a_");
     49:   PetscObjectSetName((PetscObject) A,"A");
     50:   MatSetFromOptions(A);
     51:   MatLoad(A,fd);
     52:   PetscViewerDestroy(&fd);

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

     61:   PetscObjectPrintClassNamePrefixType((PetscObject)A,PETSC_VIEWER_STDOUT_WORLD);
     62:   MatGetOption(A,MAT_SYMMETRIC,&flg);
     63:   PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"MAT_SYMMETRIC: %" PetscInt_FMT "\n",(PetscInt)flg);
     64:   MatViewFromOptions(A,NULL,"-mat_view");

     66:   MatDestroy(&A);
     67:   PetscFinalize();
     68:   return 0;
     69: }

     71: /*TEST

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

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

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

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

    101:    test:
    102:       # test for more processes than rows, complex
    103:       TODO: not yet implemented for MATLAB complex format
    104:       suffix: mpiaij_hdf5_tiny_complex
    105:       nsize: 8
    106:       requires: double complex !defined(PETSC_USE_64BIT_INDICES) hdf5 defined(PETSC_HDF5_HAVE_ZLIB)
    107:       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
    108:       args: -a_matload_symmetric

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

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

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

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

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

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

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

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

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

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