xref: /petsc/src/mat/tests/ex247.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
1 
2 static char help[] = "Tests MATCENTERING matrix type.\n\n";
3 
4 #include <petscmat.h>
5 
6 int main(int argc,char **argv)
7 {
8   PetscInt       n;
9   Mat            C;
10   Vec            x,y;
11   PetscReal      norm;
12   PetscMPIInt    size;
13 
14   CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help));
15   CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
16 
17   /* Create a parallel vector with 10*size total entries, and fill it with 1s. */
18   n = 10*size;
19   CHKERRQ(VecCreate(PETSC_COMM_WORLD,&x));
20   CHKERRQ(VecSetSizes(x,PETSC_DECIDE,n));
21   CHKERRQ(VecSetFromOptions(x));
22   CHKERRQ(VecSet(x,1.0));
23 
24   /* Create a corresponding n x n centering matrix and use it to create a mean-centered y = C * x. */
25   CHKERRQ(VecDuplicate(x,&y));
26   CHKERRQ(MatCreateCentering(PETSC_COMM_WORLD,PETSC_DECIDE,n,&C));
27   CHKERRQ(MatMult(C,x,y));
28 
29   /* Verify that the centered vector y has norm 0. */
30   CHKERRQ(VecNorm(y,NORM_2,&norm));
31   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Vector norm after MatMult() with centering matrix applied to vector of ones is %f.\n",(double)norm));
32 
33   /* Now repeat, but using MatMultTranspose(). */
34   CHKERRQ(MatMultTranspose(C,x,y));
35   CHKERRQ(VecNorm(y,NORM_2,&norm));
36   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Vector norm after MatMultTranspose() with centering matrix applied to vector of ones is %f.\n",(double)norm));
37 
38   /* Clean up. */
39   CHKERRQ(VecDestroy(&x));
40   CHKERRQ(VecDestroy(&y));
41   CHKERRQ(MatDestroy(&C));
42   CHKERRQ(PetscFinalize());
43   return 0;
44 }
45 
46 /*TEST
47 
48     test:
49       suffix: 1
50       nsize: 1
51       output_file: output/ex247.out
52 
53     test:
54       suffix: 2
55       nsize: 2
56       output_file: output/ex247.out
57 
58 TEST*/
59