xref: /petsc/src/mat/tests/ex49.c (revision 6a98f8dc3f2c9149905a87dc2e9d0fedaf64e09a)
1 
2 static char help[] = "Tests MatTranspose(), MatNorm(), and MatAXPY().\n\n";
3 
4 #include <petscmat.h>
5 
6 int main(int argc,char **argv)
7 {
8   Mat            mat,tmat = 0;
9   PetscInt       m = 4,n,i,j;
10   PetscErrorCode ierr;
11   PetscMPIInt    size,rank;
12   PetscInt       rstart,rend,rect = 0;
13   PetscBool      flg;
14   PetscScalar    v;
15   PetscReal      normf,normi,norm1;
16   MatInfo        info;
17 
18   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
19   ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr);
20   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
21   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
22   n    = m;
23   ierr = PetscOptionsHasName(NULL,NULL,"-rect1",&flg);CHKERRQ(ierr);
24   if (flg) {n += 2; rect = 1;}
25   ierr = PetscOptionsHasName(NULL,NULL,"-rect2",&flg);CHKERRQ(ierr);
26   if (flg) {n -= 2; rect = 1;}
27 
28   /* Create and assemble matrix */
29   ierr = MatCreate(PETSC_COMM_WORLD,&mat);CHKERRQ(ierr);
30   ierr = MatSetSizes(mat,PETSC_DECIDE,PETSC_DECIDE,m,n);CHKERRQ(ierr);
31   ierr = MatSetFromOptions(mat);CHKERRQ(ierr);
32   ierr = MatSetUp(mat);CHKERRQ(ierr);
33   ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr);
34   for (i=rstart; i<rend; i++) {
35     for (j=0; j<n; j++) {
36       v    = 10*i+j;
37       ierr = MatSetValues(mat,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);
38     }
39   }
40   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
41   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
42 
43   /* Print info about original matrix */
44   ierr = MatGetInfo(mat,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
45   ierr = PetscPrintf(PETSC_COMM_WORLD,"original matrix nonzeros = %D, allocated nonzeros = %D\n",
46                      (PetscInt)info.nz_used,(PetscInt)info.nz_allocated);CHKERRQ(ierr);
47   ierr = MatNorm(mat,NORM_FROBENIUS,&normf);CHKERRQ(ierr);
48   ierr = MatNorm(mat,NORM_1,&norm1);CHKERRQ(ierr);
49   ierr = MatNorm(mat,NORM_INFINITY,&normi);CHKERRQ(ierr);
50   ierr = PetscPrintf(PETSC_COMM_WORLD,"original: Frobenious norm = %g, one norm = %g, infinity norm = %g\n",(double)normf,(double)norm1,(double)normi);CHKERRQ(ierr);
51   ierr = MatView(mat,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
52 
53   /* Form matrix transpose */
54   ierr = PetscOptionsHasName(NULL,NULL,"-in_place",&flg);CHKERRQ(ierr);
55   if (flg) {
56     ierr = MatTranspose(mat,MAT_INPLACE_MATRIX,&mat);CHKERRQ(ierr);   /* in-place transpose */
57     tmat = mat; mat = 0;
58   } else {      /* out-of-place transpose */
59     ierr = MatTranspose(mat,MAT_INITIAL_MATRIX,&tmat);CHKERRQ(ierr);
60   }
61 
62   /* Print info about transpose matrix */
63   ierr = MatGetInfo(tmat,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
64   ierr = PetscPrintf(PETSC_COMM_WORLD,"transpose matrix nonzeros = %D, allocated nonzeros = %D\n",
65                      (PetscInt)info.nz_used,(PetscInt)info.nz_allocated);CHKERRQ(ierr);
66   ierr = MatNorm(tmat,NORM_FROBENIUS,&normf);CHKERRQ(ierr);
67   ierr = MatNorm(tmat,NORM_1,&norm1);CHKERRQ(ierr);
68   ierr = MatNorm(tmat,NORM_INFINITY,&normi);CHKERRQ(ierr);
69   ierr = PetscPrintf(PETSC_COMM_WORLD,"transpose: Frobenious norm = %g, one norm = %g, infinity norm = %g\n",(double)normf,(double)norm1,(double)normi);CHKERRQ(ierr);
70   ierr = MatView(tmat,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
71 
72 
73   /* Test MatAXPY */
74   if (mat && !rect) {
75     PetscScalar alpha = 1.0;
76     ierr = PetscOptionsGetScalar(NULL,NULL,"-alpha",&alpha,NULL);CHKERRQ(ierr);
77     ierr = PetscPrintf(PETSC_COMM_WORLD,"matrix addition:  B = B + alpha * A\n");CHKERRQ(ierr);
78     ierr = MatAXPY(tmat,alpha,mat,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
79     ierr = MatView(tmat,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
80   }
81 
82   /* Free data structures */
83   ierr = MatDestroy(&tmat);CHKERRQ(ierr);
84   if (mat) {ierr = MatDestroy(&mat);CHKERRQ(ierr);}
85 
86   ierr = PetscFinalize();
87   return ierr;
88 }
89 
90 /*TEST
91 
92    test:
93 
94    testset:
95      args: -rect1
96      test:
97        suffix: r1
98        output_file: output/ex49_r1.out
99      test:
100        suffix: r1_inplace
101        args: -in_place
102        output_file: output/ex49_r1.out
103      test:
104        suffix: r1_par
105        nsize: 2
106        output_file: output/ex49_r1_par.out
107      test:
108        suffix: r1_par_inplace
109        args: -in_place
110        nsize: 2
111        output_file: output/ex49_r1_par.out
112 
113 TEST*/
114