xref: /petsc/src/mat/tests/ex197.c (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
1 static char help[] = "Test MatMultHermitianTranspose() and MatMultHermitianTransposeAdd().\n\n";
2 
3 #include <petscmat.h>
4 
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, (char *)0, 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(VecCreate(PETSC_COMM_WORLD, &y));
42   PetscCall(VecSetSizes(y, PETSC_DECIDE, 2));
43   PetscCall(VecSetFromOptions(y));
44   PetscCall(VecDuplicate(y, &ys));
45   PetscCall(VecDuplicate(y, &x));
46 
47   i = 0;
48   v = 10.0 + 11.0 * PETSC_i;
49   PetscCall(VecSetValues(x, 1, &i, &v, INSERT_VALUES));
50   i = 1;
51   v = 100.0 + 120.0 * PETSC_i;
52   PetscCall(VecSetValues(x, 1, &i, &v, INSERT_VALUES));
53   PetscCall(VecAssemblyBegin(x));
54   PetscCall(VecAssemblyEnd(x));
55 
56   PetscCall(MatMultHermitianTranspose(A, x, y));
57   PetscCall(VecView(y, PETSC_VIEWER_STDOUT_WORLD));
58   PetscCall(MatMultHermitianTransposeAdd(A, x, y, ys));
59   PetscCall(VecView(ys, PETSC_VIEWER_STDOUT_WORLD));
60 
61   PetscCall(MatHermitianTranspose(A, MAT_INITIAL_MATRIX, &B));
62   PetscCall(MatCreateHermitianTranspose(A, &C));
63   PetscCall(MatMultHermitianTransposeEqual(B, C, 4, &flg));
64   PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "B^Hx != C^Hx");
65   PetscCall(MatMultHermitianTransposeAddEqual(B, C, 4, &flg));
66   PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "y+B^Hx != y+C^Hx");
67   PetscCall(MatDestroy(&C));
68   PetscCall(MatDestroy(&B));
69 
70   PetscCall(MatDestroy(&A));
71 
72   PetscCall(VecDestroy(&x));
73   PetscCall(VecDestroy(&y));
74   PetscCall(VecDestroy(&ys));
75   PetscCall(PetscFinalize());
76   return 0;
77 }
78 
79 /*TEST
80 
81    build:
82       requires: complex
83    test:
84 
85    test:
86       suffix: 2
87       nsize: 2
88 
89 TEST*/
90