1 static char help[] = "Test MatMultHermitianTranspose() and MatMultHermitianTransposeAdd().\n\n";
2
3 #include <petscmat.h>
4
main(int argc,char ** args)5 int main(int argc, char **args)
6 {
7 Mat A, B, C;
8 Vec x, y, ys;
9 PetscInt i, j;
10 PetscScalar v;
11 PetscBool flg;
12
13 PetscFunctionBeginUser;
14 PetscCall(PetscInitialize(&argc, &args, NULL, help));
15 PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
16 PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 2, 2));
17 PetscCall(MatSetType(A, MATAIJ));
18 PetscCall(MatSetFromOptions(A));
19 PetscCall(MatSetUp(A));
20
21 i = 0;
22 j = 0;
23 v = 2.0;
24 PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, INSERT_VALUES));
25 i = 0;
26 j = 1;
27 v = 3.0 + 4.0 * PETSC_i;
28 PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, INSERT_VALUES));
29 i = 1;
30 j = 0;
31 v = 5.0 + 6.0 * PETSC_i;
32 PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, INSERT_VALUES));
33 i = 1;
34 j = 1;
35 v = 7.0 + 8.0 * PETSC_i;
36 PetscCall(MatSetValues(A, 1, &i, 1, &j, &v, INSERT_VALUES));
37 PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
38 PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
39
40 /* Create vectors */
41 PetscCall(MatCreateVecs(A, &x, &y));
42 PetscCall(VecDuplicate(y, &ys));
43
44 i = 0;
45 v = 10.0 + 11.0 * PETSC_i;
46 PetscCall(VecSetValues(x, 1, &i, &v, INSERT_VALUES));
47 i = 1;
48 v = 100.0 + 120.0 * PETSC_i;
49 PetscCall(VecSetValues(x, 1, &i, &v, INSERT_VALUES));
50 PetscCall(VecAssemblyBegin(x));
51 PetscCall(VecAssemblyEnd(x));
52
53 PetscCall(MatMultHermitianTranspose(A, x, y));
54 PetscCall(VecView(y, PETSC_VIEWER_STDOUT_WORLD));
55 PetscCall(MatMultHermitianTransposeAdd(A, x, y, ys));
56 PetscCall(VecView(ys, PETSC_VIEWER_STDOUT_WORLD));
57
58 PetscCall(MatHermitianTranspose(A, MAT_INITIAL_MATRIX, &B));
59 PetscCall(MatCreateHermitianTranspose(A, &C));
60 PetscCall(MatMultHermitianTransposeEqual(B, C, 4, &flg));
61 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "B^Hx != C^Hx");
62 PetscCall(MatMultHermitianTransposeAddEqual(B, C, 4, &flg));
63 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "y+B^Hx != y+C^Hx");
64 PetscCall(MatDestroy(&C));
65 PetscCall(MatDestroy(&B));
66
67 PetscCall(MatDestroy(&A));
68
69 PetscCall(VecDestroy(&x));
70 PetscCall(VecDestroy(&y));
71 PetscCall(VecDestroy(&ys));
72 PetscCall(PetscFinalize());
73 return 0;
74 }
75
76 /*TEST
77
78 build:
79 requires: complex
80
81 testset:
82 output_file: output/ex197_1.out
83 test:
84 suffix: 1
85 args: -mat_type {{aij dense}}
86 test:
87 suffix: 1_cuda
88 requires: cuda
89 args: -mat_type densecuda
90 filter: sed -e 's/seqcuda/seq/'
91
92 testset:
93 output_file: output/ex197_2.out
94 nsize: 2
95 test:
96 suffix: 2
97 args: -mat_type {{aij dense}}
98 test:
99 suffix: 2_scalapack
100 requires: scalapack
101 args: -mat_type scalapack
102
103 TEST*/
104