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