Actual source code: ex86.c
1: static char help[] = "Testing MatCreateMPIMatConcatenateSeqMat().\n\n";
3: #include <petscmat.h>
4: int main(int argc, char **argv)
5: {
6: Mat seqmat, mpimat;
7: PetscMPIInt rank;
8: PetscScalar value[3], *vals;
9: PetscInt i, col[3], n = 5, bs = 1;
12: PetscInitialize(&argc, &argv, (char *)0, help);
13: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
14: PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL);
16: /* Create seqaij matrices of size (n+rank) by n */
17: MatCreate(PETSC_COMM_SELF, &seqmat);
18: MatSetSizes(seqmat, (n + rank) * bs, PETSC_DECIDE, PETSC_DECIDE, n * bs);
19: MatSetFromOptions(seqmat);
20: MatSeqAIJSetPreallocation(seqmat, 3 * bs, NULL);
21: MatSeqBAIJSetPreallocation(seqmat, bs, 3, NULL);
23: if (bs == 1) {
24: value[0] = -1.0;
25: value[1] = 2.0;
26: value[2] = -1.0;
27: for (i = 1; i < n - 1; i++) {
28: col[0] = i - 1;
29: col[1] = i;
30: col[2] = i + 1;
31: MatSetValues(seqmat, 1, &i, 3, col, value, INSERT_VALUES);
32: }
33: i = n - 1;
34: col[0] = n - 2;
35: col[1] = n - 1;
36: MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES);
38: i = 0;
39: col[0] = 0;
40: col[1] = 1;
41: value[0] = 2.0;
42: value[1] = -1.0;
43: MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES);
44: } else {
45: PetscInt *rows, *cols, j;
46: PetscMalloc3(bs * bs, &vals, bs, &rows, bs, &cols);
47: /* diagonal blocks */
48: for (i = 0; i < bs * bs; i++) vals[i] = 2.0;
49: for (i = 0; i < n * bs; i += bs) {
50: for (j = 0; j < bs; j++) {
51: rows[j] = i + j;
52: cols[j] = i + j;
53: }
54: MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES);
55: }
56: /* off-diagonal blocks */
57: for (i = 0; i < bs * bs; i++) vals[i] = -1.0;
58: for (i = 0; i < (n - 1) * bs; i += bs) {
59: for (j = 0; j < bs; j++) {
60: rows[j] = i + j;
61: cols[j] = i + bs + j;
62: }
63: MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES);
64: }
66: PetscFree3(vals, rows, cols);
67: }
68: MatAssemblyBegin(seqmat, MAT_FINAL_ASSEMBLY);
69: MatAssemblyEnd(seqmat, MAT_FINAL_ASSEMBLY);
70: if (rank == 0) {
71: PetscPrintf(PETSC_COMM_SELF, "[%d] seqmat:\n", rank);
72: MatView(seqmat, PETSC_VIEWER_STDOUT_SELF);
73: }
75: MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_INITIAL_MATRIX, &mpimat);
76: MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_REUSE_MATRIX, &mpimat);
77: MatView(mpimat, PETSC_VIEWER_STDOUT_WORLD);
79: MatDestroy(&seqmat);
80: MatDestroy(&mpimat);
81: PetscFinalize();
82: return 0;
83: }
85: /*TEST
87: test:
88: nsize: 3
90: test:
91: suffix: 2
92: nsize: 3
93: args: -mat_type baij
95: test:
96: suffix: 3
97: nsize: 3
98: args: -mat_type baij -bs 2
100: TEST*/