1fe1fc275SAlexander static char help[] = "Tests assembly of a matrix from another matrix's hash table.\n\n";
2fe1fc275SAlexander
3fe1fc275SAlexander #include <petscmat.h>
4fe1fc275SAlexander
SetValues(Mat A,PetscBool zero,PetscBool insertvals)5*9680b7ceSStefano Zampini PetscErrorCode SetValues(Mat A, PetscBool zero, PetscBool insertvals)
6fe1fc275SAlexander {
7fe1fc275SAlexander PetscInt m, n, i, j;
8fe1fc275SAlexander PetscScalar v;
9fe1fc275SAlexander
10fe1fc275SAlexander PetscFunctionBeginUser;
11674b392bSAlexander PetscCall(MatGetSize(A, &m, &n));
12674b392bSAlexander for (i = 0; i < m; i++) {
13674b392bSAlexander for (j = 0; j < n; j++) {
14*9680b7ceSStefano Zampini v = zero ? 0.0 : 10.0 * i + j + 1;
15*9680b7ceSStefano Zampini PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, insertvals ? INSERT_VALUES : ADD_VALUES));
16674b392bSAlexander }
17674b392bSAlexander }
18674b392bSAlexander PetscFunctionReturn(PETSC_SUCCESS);
19674b392bSAlexander }
20674b392bSAlexander
CreateAndViewB(Mat A)21674b392bSAlexander PetscErrorCode CreateAndViewB(Mat A)
22674b392bSAlexander {
23674b392bSAlexander Mat B;
24674b392bSAlexander
25674b392bSAlexander PetscFunctionBeginUser;
26674b392bSAlexander PetscCall(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, &B));
27674b392bSAlexander PetscCall(MatCopyHashToXAIJ(A, B));
28674b392bSAlexander PetscCall(MatView(B, PETSC_VIEWER_STDOUT_WORLD));
29674b392bSAlexander PetscCall(MatDestroy(&B));
30674b392bSAlexander PetscFunctionReturn(PETSC_SUCCESS);
31674b392bSAlexander }
32674b392bSAlexander
AssembleAndViewA(Mat A)33674b392bSAlexander PetscErrorCode AssembleAndViewA(Mat A)
34674b392bSAlexander {
35674b392bSAlexander PetscFunctionBeginUser;
36674b392bSAlexander PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
37674b392bSAlexander PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
38674b392bSAlexander PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
39674b392bSAlexander PetscFunctionReturn(PETSC_SUCCESS);
40674b392bSAlexander }
41674b392bSAlexander
main(int argc,char ** argv)42674b392bSAlexander int main(int argc, char **argv)
43674b392bSAlexander {
44*9680b7ceSStefano Zampini Mat A, T;
45*9680b7ceSStefano Zampini PetscInt N, n, m;
46*9680b7ceSStefano Zampini PetscBool zero = PETSC_FALSE, ignorezero = PETSC_FALSE, insertvals = PETSC_FALSE;
47674b392bSAlexander
48674b392bSAlexander PetscFunctionBeginUser;
49fe1fc275SAlexander PetscCall(PetscInitialize(&argc, &argv, NULL, help));
50*9680b7ceSStefano Zampini PetscCall(PetscOptionsGetBool(NULL, NULL, "-zero", &zero, NULL));
51*9680b7ceSStefano Zampini PetscCall(PetscOptionsGetBool(NULL, NULL, "-ignorezero", &ignorezero, NULL));
52*9680b7ceSStefano Zampini PetscCall(PetscOptionsGetBool(NULL, NULL, "-insertvals", &insertvals, NULL));
53fe1fc275SAlexander
54*9680b7ceSStefano Zampini PetscCall(MatCreate(PETSC_COMM_WORLD, &T));
55*9680b7ceSStefano Zampini PetscCall(MatSetSizes(T, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE));
56*9680b7ceSStefano Zampini PetscCall(MatSetFromOptions(T));
57*9680b7ceSStefano Zampini PetscCall(MatGetSize(T, NULL, &N));
58*9680b7ceSStefano Zampini PetscCall(MatGetLocalSize(T, &m, &n));
59*9680b7ceSStefano Zampini PetscCall(MatSeqAIJSetPreallocation(T, N, NULL));
60*9680b7ceSStefano Zampini PetscCall(MatMPIAIJSetPreallocation(T, n, NULL, N - n, NULL));
61*9680b7ceSStefano Zampini PetscCall(MatSetOption(T, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
62*9680b7ceSStefano Zampini PetscCall(MatSetUp(T));
63*9680b7ceSStefano Zampini PetscCall(SetValues(T, zero, insertvals));
64*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG T\n"));
65*9680b7ceSStefano Zampini PetscCall(AssembleAndViewA(T));
66*9680b7ceSStefano Zampini
67fe1fc275SAlexander PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
68fe1fc275SAlexander PetscCall(MatSetSizes(A, 1, 1, PETSC_DETERMINE, PETSC_DETERMINE));
69fe1fc275SAlexander PetscCall(MatSetFromOptions(A));
70*9680b7ceSStefano Zampini PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
71fe1fc275SAlexander PetscCall(MatSetUp(A));
72fe1fc275SAlexander
73*9680b7ceSStefano Zampini PetscCall(SetValues(A, zero, insertvals));
74*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n"));
75674b392bSAlexander PetscCall(CreateAndViewB(A));
76*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n"));
77674b392bSAlexander PetscCall(AssembleAndViewA(A));
78fe1fc275SAlexander
79674b392bSAlexander PetscCall(MatResetHash(A));
80*9680b7ceSStefano Zampini /* need to reset the option for MPIAIJ */
81*9680b7ceSStefano Zampini PetscCall(MatSetOption(A, MAT_IGNORE_ZERO_ENTRIES, ignorezero));
82674b392bSAlexander
83*9680b7ceSStefano Zampini PetscCall(SetValues(A, zero, insertvals));
84*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG B\n"));
85674b392bSAlexander PetscCall(CreateAndViewB(A));
86*9680b7ceSStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "DEBUG A\n"));
87674b392bSAlexander PetscCall(AssembleAndViewA(A));
88fe1fc275SAlexander
89fe1fc275SAlexander PetscCall(MatDestroy(&A));
90*9680b7ceSStefano Zampini PetscCall(MatDestroy(&T));
91fe1fc275SAlexander PetscCall(PetscFinalize());
92fe1fc275SAlexander return 0;
93fe1fc275SAlexander }
94fe1fc275SAlexander
95fe1fc275SAlexander /*TEST
96fe1fc275SAlexander
97fe1fc275SAlexander test:
98fe1fc275SAlexander suffix: seq
99*9680b7ceSStefano Zampini diff_args: -j
100fe1fc275SAlexander args: -mat_type seqaij
101fe1fc275SAlexander filter: grep -v "Mat Object"
102fe1fc275SAlexander
103fe1fc275SAlexander test:
104fe1fc275SAlexander suffix: mpi
105*9680b7ceSStefano Zampini diff_args: -j
106fe1fc275SAlexander args: -mat_type mpiaij
107fe1fc275SAlexander nsize: 4
108fe1fc275SAlexander filter: grep -v "Mat Object"
109fe1fc275SAlexander
110*9680b7ceSStefano Zampini test:
111*9680b7ceSStefano Zampini diff_args: -j
112*9680b7ceSStefano Zampini suffix: seq_ignore
113*9680b7ceSStefano Zampini args: -mat_type seqaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output}
114*9680b7ceSStefano Zampini filter: grep -v "Mat Object"
115*9680b7ceSStefano Zampini
116*9680b7ceSStefano Zampini test:
117*9680b7ceSStefano Zampini diff_args: -j
118*9680b7ceSStefano Zampini suffix: mpi
119*9680b7ceSStefano Zampini args: -mat_type mpiaij -zero {{0 1}separate output} -ignorezero {{0 1}separate output} -insertvals {{0 1}separate output}
120*9680b7ceSStefano Zampini nsize: 4
121*9680b7ceSStefano Zampini filter: grep -v "Mat Object"
122*9680b7ceSStefano Zampini
123fe1fc275SAlexander TEST*/
124