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