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