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;
11: PetscFunctionBeginUser;
12: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
13: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
14: PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
16: /* Create seqaij matrices of size (n+rank) by n */
17: PetscCall(MatCreate(PETSC_COMM_SELF, &seqmat));
18: PetscCall(MatSetSizes(seqmat, (n + rank) * bs, PETSC_DECIDE, PETSC_DECIDE, n * bs));
19: PetscCall(MatSetFromOptions(seqmat));
20: PetscCall(MatSeqAIJSetPreallocation(seqmat, 3 * bs, NULL));
21: PetscCall(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: PetscCall(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: PetscCall(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: PetscCall(MatSetValues(seqmat, 1, &i, 2, col, value, INSERT_VALUES));
44: } else {
45: PetscInt *rows, *cols, j;
46: PetscCall(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: PetscCall(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: PetscCall(MatSetValues(seqmat, bs, rows, bs, cols, vals, INSERT_VALUES));
64: }
66: PetscCall(PetscFree3(vals, rows, cols));
67: }
68: PetscCall(MatAssemblyBegin(seqmat, MAT_FINAL_ASSEMBLY));
69: PetscCall(MatAssemblyEnd(seqmat, MAT_FINAL_ASSEMBLY));
70: if (rank == 0) {
71: PetscCall(PetscPrintf(PETSC_COMM_SELF, "[%d] seqmat:\n", rank));
72: PetscCall(MatView(seqmat, PETSC_VIEWER_STDOUT_SELF));
73: }
75: PetscCall(MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_INITIAL_MATRIX, &mpimat));
76: PetscCall(MatCreateMPIMatConcatenateSeqMat(PETSC_COMM_WORLD, seqmat, PETSC_DECIDE, MAT_REUSE_MATRIX, &mpimat));
77: PetscCall(MatView(mpimat, PETSC_VIEWER_STDOUT_WORLD));
79: PetscCall(MatDestroy(&seqmat));
80: PetscCall(MatDestroy(&mpimat));
81: PetscCall(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*/