Actual source code: ex197.c
1: static char help[] = "Test MatMultHermitianTranspose() and MatMultHermitianTransposeAdd().\n\n";
3: #include <petscmat.h>
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;
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));
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));
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));
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));
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));
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));
70: PetscCall(MatDestroy(&A));
72: PetscCall(VecDestroy(&x));
73: PetscCall(VecDestroy(&y));
74: PetscCall(VecDestroy(&ys));
75: PetscCall(PetscFinalize());
76: return 0;
77: }
79: /*TEST
81: build:
82: requires: complex
83: test:
85: test:
86: suffix: 2
87: nsize: 2
89: TEST*/