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