xref: /petsc/src/mat/tests/ex114.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
1 
2 static char help[] = "Tests MatGetRowMax(), MatGetRowMin(), MatGetRowMaxAbs()\n";
3 
4 #include <petscmat.h>
5 
6 #define M 5
7 #define N 6
8 
9 int main(int argc,char **args)
10 {
11   Mat            A;
12   Vec            min,max,maxabs;
13   PetscInt       m,n;
14   PetscInt       imin[M],imax[M],imaxabs[M],indices[N],row;
15   PetscScalar    values[N];
16   PetscErrorCode ierr;
17   MatType        type;
18   PetscMPIInt    size;
19   PetscBool      doTest=PETSC_TRUE;
20 
21   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
22   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
23 
24   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
25   ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
26   ierr = MatSetFromOptions(A);CHKERRQ(ierr);
27   ierr = MatSetUp(A);CHKERRQ(ierr);
28   row  = 0;
29 
30   indices[0] = 0;   indices[1] = 1;  indices[2] = 2;  indices[3] = 3;  indices[4] = 4;  indices[5] = 5;
31   values[0]  = -1.0; values[1] = 0.0; values[2] = 1.0; values[3] = 3.0; values[4] = 4.0; values[5] = -5.0;
32 
33   ierr = MatSetValues(A,1,&row,6,indices,values,INSERT_VALUES);CHKERRQ(ierr);
34   row  = 1;
35   ierr = MatSetValues(A,1,&row,3,indices,values,INSERT_VALUES);CHKERRQ(ierr);
36   row  = 4;
37   ierr = MatSetValues(A,1,&row,1,indices+4,values+4,INSERT_VALUES);CHKERRQ(ierr);
38   row  = 4;
39   ierr = MatSetValues(A,1,&row,2,indices+4,values+4,INSERT_VALUES);CHKERRQ(ierr);
40   ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
41   ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
42   ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
43 
44   ierr = MatGetLocalSize(A, &m,&n);CHKERRQ(ierr);
45   ierr = VecCreate(PETSC_COMM_WORLD,&min);CHKERRQ(ierr);
46   ierr = VecSetSizes(min,m,PETSC_DECIDE);CHKERRQ(ierr);
47   ierr = VecSetFromOptions(min);CHKERRQ(ierr);
48   ierr = VecDuplicate(min,&max);CHKERRQ(ierr);
49   ierr = VecDuplicate(min,&maxabs);CHKERRQ(ierr);
50 
51   /* Test MatGetRowMin, MatGetRowMax and MatGetRowMaxAbs */
52   if (size == 1) {
53     ierr = MatGetRowMin(A,min,imin);CHKERRQ(ierr);
54     ierr = MatGetRowMax(A,max,imax);CHKERRQ(ierr);
55     ierr = MatGetRowMaxAbs(A,maxabs,imaxabs);CHKERRQ(ierr);
56 
57     ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Minimums\n");CHKERRQ(ierr);
58     ierr = VecView(min,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
59     ierr = PetscIntView(5,imin,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
60     ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Maximums\n");CHKERRQ(ierr);
61     ierr = VecView(max,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
62     ierr = PetscIntView(5,imax,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
63     ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Maximum Absolute Values\n");CHKERRQ(ierr);
64     ierr = VecView(maxabs,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
65     ierr = PetscIntView(5,imaxabs,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
66 
67   } else {
68     ierr = MatGetType(A,&type);CHKERRQ(ierr);
69     ierr = PetscPrintf(PETSC_COMM_WORLD,"\nMatrix type: %s\n",type);CHKERRQ(ierr);
70     /* AIJ */
71     ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&doTest);CHKERRQ(ierr);
72     if (doTest) {
73       ierr = MatGetRowMaxAbs(A,maxabs,NULL);CHKERRQ(ierr);
74       ierr = MatGetRowMaxAbs(A,maxabs,imaxabs);CHKERRQ(ierr);
75       ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Maximum Absolute Values:\n");CHKERRQ(ierr);
76       ierr = VecView(maxabs,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
77     }
78     /* BAIJ */
79     ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIBAIJ,&doTest);CHKERRQ(ierr);
80     if (doTest) {
81       ierr = MatGetRowMaxAbs(A,maxabs,NULL);CHKERRQ(ierr);
82       ierr = MatGetRowMaxAbs(A,maxabs,imaxabs);CHKERRQ(ierr);
83       ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Maximum Absolute Values:\n");CHKERRQ(ierr);
84       ierr = VecView(maxabs,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
85     }
86   }
87 
88   if (size == 1) {
89     ierr = MatConvert(A,MATDENSE,MAT_INPLACE_MATRIX,&A);CHKERRQ(ierr);
90 
91     ierr = MatGetRowMin(A,min,imin);CHKERRQ(ierr);
92     ierr = MatGetRowMax(A,max,imax);CHKERRQ(ierr);
93     ierr = MatGetRowMaxAbs(A,maxabs,imaxabs);CHKERRQ(ierr);
94 
95     ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
96     ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Minimums\n");CHKERRQ(ierr);
97     ierr = VecView(min,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
98     ierr = PetscIntView(5,imin,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
99     ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Maximums\n");CHKERRQ(ierr);
100     ierr = VecView(max,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
101     ierr = PetscIntView(5,imax,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
102     ierr = PetscPrintf(PETSC_COMM_WORLD,"Row Maximum Absolute Values\n");CHKERRQ(ierr);
103     ierr = VecView(maxabs,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
104     ierr = PetscIntView(5,imaxabs,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
105   }
106 
107   ierr = VecDestroy(&min);CHKERRQ(ierr);
108   ierr = VecDestroy(&max);CHKERRQ(ierr);
109   ierr = VecDestroy(&maxabs);CHKERRQ(ierr);
110   ierr = MatDestroy(&A);CHKERRQ(ierr);
111   ierr = PetscFinalize();
112   return ierr;
113 }
114 
115 
116 
117 /*TEST
118 
119    test:
120       output_file: output/ex114.out
121 
122    test:
123       suffix: 2
124       nsize: 2
125 
126    test:
127       suffix: 3
128       nsize: 2
129       args: -mat_type baij
130 
131 TEST*/
132