Actual source code: ex36.c
1: static char help[] = "Tests assembly of a matrix from another matrix's hash table.\n\n";
3: #include <petscmat.h>
5: PetscErrorCode SetValues(Mat A, PetscBool zero, PetscBool insertvals)
6: {
7: PetscInt m, n, i, j;
8: PetscScalar v;
10: PetscFunctionBeginUser;
11: PetscCall(MatGetSize(A, &m, &n));
12: for (i = 0; i < m; i++) {
13: for (j = 0; j < n; j++) {
14: v = zero ? 0.0 : 10.0 * i + j + 1;
15: PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, insertvals ? INSERT_VALUES : ADD_VALUES));
16: }
17: }
18: PetscFunctionReturn(PETSC_SUCCESS);
19: }
21: PetscErrorCode CreateAndViewB(Mat A)
22: {
23: Mat B;
25: PetscFunctionBeginUser;
26: PetscCall(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, &B));
27: PetscCall(MatCopyHashToXAIJ(A, B));
28: PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));
29: PetscCall(MatDestroy(&B));
30: PetscFunctionReturn(PETSC_SUCCESS);
31: }
33: PetscErrorCode AssembleAndViewA(Mat A)
34: {
35: PetscFunctionBeginUser;
36: PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
37: PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
38: PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
39: PetscFunctionReturn(PETSC_SUCCESS);
40: }
42: int main(int argc, char **argv)
43: {
44: Mat A, T;
45: PetscInt N, n, m;
46: PetscBool zero = PETSC_FALSE, ignorezero = PETSC_FALSE, insertvals = PETSC_FALSE;
48: PetscFunctionBeginUser;
49: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
50: PetscCall(PetscOptionsGetBool(NULL, NULL, "-zero", &zero, NULL));
51: PetscCall(PetscOptionsGetBool(NULL, NULL, "-ignorezero", &ignorezero, NULL));
52: PetscCall(PetscOptionsGetBool(NULL, NULL, "-insertvals", &insertvals, NULL));
54: PetscCall(MatCreate(PETSC_COMM_WORLD, &T));
55: PetscCall(MatSetSizes(T, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE));
56: PetscCall(MatSetFromOptions(T));
57: PetscCall(MatGetSize(T, NULL, &N));
58: PetscCall(MatGetLocalSize(T, &m, &n));
59: PetscCall(MatSeqAIJSetPreallocation(T, N, NULL));
60: PetscCall(MatMPIAIJSetPreallocation(T, n, NULL, N - n, NULL));
61: PetscCall(MatSetOption(T, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
62: PetscCall(MatSetUp(T));
63: PetscCall(SetValues(T, zero, insertvals));
64: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG T\n"));
65: PetscCall(AssembleAndViewA(T));
67: PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
68: PetscCall(MatSetSizes(A, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE));
69: PetscCall(MatSetFromOptions(A));
70: PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
71: PetscCall(MatSetUp(A));
73: PetscCall(SetValues(A, zero, insertvals));
74: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n"));
75: PetscCall(CreateAndViewB(A));
76: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n"));
77: PetscCall(AssembleAndViewA(A));
79: PetscCall(MatResetHash(A));
80: /* need to reset the option for MPIAIJ */
81: PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
83: PetscCall(SetValues(A, zero, insertvals));
84: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n"));
85: PetscCall(CreateAndViewB(A));
86: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n"));
87: PetscCall(AssembleAndViewA(A));
89: PetscCall(MatDestroy(&A));
90: PetscCall(MatDestroy(&T));
91: PetscCall(PetscFinalize());
92: return 0;
93: }
95: /*TEST
97: test:
98: suffix: seq
99: diff_args: -j
100: args: -mat_type seqaij
101: filter: grep -v "Mat Object"
103: test:
104: suffix: mpi
105: diff_args: -j
106: args: -mat_type mpiaij
107: nsize: 4
108: filter: grep -v "Mat Object"
110: test:
111: diff_args: -j
112: suffix: seq_ignore
113: args: -mat_type seqaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output}
114: filter: grep -v "Mat Object"
116: test:
117: diff_args: -j
118: suffix: mpi
119: args: -mat_type mpiaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output}
120: nsize: 4
121: filter: grep -v "Mat Object"
123: TEST*/