xref: /petsc/src/mat/tests/ex39.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests Elemental interface.\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown int main(int argc,char **args)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   Mat            Cdense,B,C,Ct;
9c4762a1bSJed Brown   Vec            d;
10c4762a1bSJed Brown   PetscInt       i,j,m = 5,n,nrows,ncols;
11c4762a1bSJed Brown   const PetscInt *rows,*cols;
12c4762a1bSJed Brown   IS             isrows,iscols;
13c4762a1bSJed Brown   PetscErrorCode ierr;
14c4762a1bSJed Brown   PetscScalar    *v;
15c4762a1bSJed Brown   PetscMPIInt    rank,size;
16c4762a1bSJed Brown   PetscReal      Cnorm;
17c4762a1bSJed Brown   PetscBool      flg,mats_view=PETSC_FALSE;
18c4762a1bSJed Brown 
19c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
20*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
21*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
22*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL));
23c4762a1bSJed Brown   n    = m;
24*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
25*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsHasName(NULL,NULL,"-mats_view",&mats_view));
26c4762a1bSJed Brown 
27*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C));
28*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(C,m,n,PETSC_DECIDE,PETSC_DECIDE));
29*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(C,MATELEMENTAL));
30*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetFromOptions(C));
31*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(C));
32*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetOwnershipIS(C,&isrows,&iscols));
33*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetLocalSize(isrows,&nrows));
34*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetIndices(isrows,&rows));
35*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetLocalSize(iscols,&ncols));
36*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetIndices(iscols,&cols));
37*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(nrows*ncols,&v));
38c4762a1bSJed Brown #if defined(PETSC_USE_COMPLEX)
39c4762a1bSJed Brown   PetscRandom rand;
40c4762a1bSJed Brown   PetscScalar rval;
41*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomCreate(PETSC_COMM_WORLD,&rand));
42*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomSetFromOptions(rand));
43c4762a1bSJed Brown   for (i=0; i<nrows; i++) {
44c4762a1bSJed Brown     for (j=0; j<ncols; j++) {
45*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscRandomGetValue(rand,&rval));
46c4762a1bSJed Brown       v[i*ncols+j] = rval;
47c4762a1bSJed Brown     }
48c4762a1bSJed Brown   }
49*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomDestroy(&rand));
50c4762a1bSJed Brown #else
51c4762a1bSJed Brown   for (i=0; i<nrows; i++) {
52c4762a1bSJed Brown     for (j=0; j<ncols; j++) {
53c4762a1bSJed Brown       v[i*ncols+j] = (PetscReal)(10000*rank+100*rows[i]+cols[j]);
54c4762a1bSJed Brown     }
55c4762a1bSJed Brown   }
56c4762a1bSJed Brown #endif
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetValues(C,nrows,rows,ncols,cols,v,INSERT_VALUES));
58*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISRestoreIndices(isrows,&rows));
59*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISRestoreIndices(iscols,&cols));
60*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY));
61*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY));
62*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISDestroy(&isrows));
63*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISDestroy(&iscols));
64c4762a1bSJed Brown 
65c4762a1bSJed Brown   /* Test MatView(), MatDuplicate() and out-of-place MatConvert() */
66*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicate(C,MAT_COPY_VALUES,&B));
67c4762a1bSJed Brown   if (mats_view) {
68*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Duplicated C:\n"));
69*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(B,PETSC_VIEWER_STDOUT_WORLD));
70c4762a1bSJed Brown   }
71*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&B));
72*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatConvert(C,MATMPIDENSE,MAT_INITIAL_MATRIX,&Cdense));
73*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMultEqual(C,Cdense,5,&flg));
742c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!flg,PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"Cdense != C. MatConvert() fails");
75c4762a1bSJed Brown 
76c4762a1bSJed Brown   /* Test MatNorm() */
77*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatNorm(C,NORM_1,&Cnorm));
78c4762a1bSJed Brown 
79c4762a1bSJed Brown   /* Test MatTranspose(), MatZeroEntries() and MatGetDiagonal() */
80*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatTranspose(C,MAT_INITIAL_MATRIX,&Ct));
81*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatConjugate(Ct));
82c4762a1bSJed Brown   if (mats_view) {
83*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"C's Transpose Conjugate:\n"));
84*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(Ct,PETSC_VIEWER_STDOUT_WORLD));
85c4762a1bSJed Brown   }
86*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatZeroEntries(Ct));
87*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCreate(PETSC_COMM_WORLD,&d));
88*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecSetSizes(d,m>n ? n : m,PETSC_DECIDE));
89*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecSetFromOptions(d));
90*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetDiagonal(C,d));
91c4762a1bSJed Brown   if (mats_view) {
92*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Diagonal of C:\n"));
93*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecView(d,PETSC_VIEWER_STDOUT_WORLD));
94c4762a1bSJed Brown   }
95c4762a1bSJed Brown   if (m>n) {
96*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDiagonalScale(C,NULL,d));
97c4762a1bSJed Brown   } else {
98*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDiagonalScale(C,d,NULL));
99c4762a1bSJed Brown   }
100c4762a1bSJed Brown   if (mats_view) {
101*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Diagonal Scaled C:\n"));
102*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(C,PETSC_VIEWER_STDOUT_WORLD));
103c4762a1bSJed Brown   }
104c4762a1bSJed Brown 
105c4762a1bSJed Brown   /* Test MatAXPY(), MatAYPX() and in-place MatConvert() */
106*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PETSC_COMM_WORLD,&B));
107*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(B,m,n,PETSC_DECIDE,PETSC_DECIDE));
108*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(B,MATELEMENTAL));
109*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetFromOptions(B));
110*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(B));
111*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetOwnershipIS(B,&isrows,&iscols));
112*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetLocalSize(isrows,&nrows));
113*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetIndices(isrows,&rows));
114*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetLocalSize(iscols,&ncols));
115*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetIndices(iscols,&cols));
116c4762a1bSJed Brown   for (i=0; i<nrows; i++) {
117c4762a1bSJed Brown     for (j=0; j<ncols; j++) {
118c4762a1bSJed Brown       v[i*ncols+j] = (PetscReal)(1000*rows[i]+cols[j]);
119c4762a1bSJed Brown     }
120c4762a1bSJed Brown   }
121*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetValues(B,nrows,rows,ncols,cols,v,INSERT_VALUES));
122*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(v));
123*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISRestoreIndices(isrows,&rows));
124*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISRestoreIndices(iscols,&cols));
125*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY));
126*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY));
127*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAXPY(B,2.5,C,SAME_NONZERO_PATTERN));
128*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAYPX(B,3.75,C,SAME_NONZERO_PATTERN));
129*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatConvert(B,MATDENSE,MAT_INPLACE_MATRIX,&B));
130c4762a1bSJed Brown   if (mats_view) {
131*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"B after MatAXPY and MatAYPX:\n"));
132*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(B,PETSC_VIEWER_STDOUT_WORLD));
133c4762a1bSJed Brown   }
134*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISDestroy(&isrows));
135*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ISDestroy(&iscols));
136*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&B));
137c4762a1bSJed Brown 
138c4762a1bSJed Brown   /* Test MatMatTransposeMult(): B = C*C^T */
139*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatTransposeMult(C,C,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&B));
140*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatScale(C,2.0));
141*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatTransposeMult(C,C,MAT_REUSE_MATRIX,PETSC_DEFAULT,&B));
142*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatTransposeMultEqual(C,C,B,10,&flg));
1432c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_ARG_INCOMP,"MatMatTransposeMult: B != C*B^T");
144c20d7725SJed Brown 
145c4762a1bSJed Brown   if (mats_view) {
146*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"C MatMatTransposeMult C:\n"));
147*5f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView(B,PETSC_VIEWER_STDOUT_WORLD));
148c4762a1bSJed Brown   }
149c4762a1bSJed Brown 
150*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&Cdense));
151*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(v));
152*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&B));
153*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&C));
154*5f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&Ct));
155*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&d));
156c4762a1bSJed Brown   ierr = PetscFinalize();
157c4762a1bSJed Brown   return ierr;
158c4762a1bSJed Brown }
159c4762a1bSJed Brown 
160c4762a1bSJed Brown /*TEST
161c4762a1bSJed Brown 
162c4762a1bSJed Brown    test:
163c4762a1bSJed Brown       nsize: 2
164c4762a1bSJed Brown       args: -m 3 -n 2
165c4762a1bSJed Brown       requires: elemental
166c4762a1bSJed Brown 
167c4762a1bSJed Brown    test:
168c4762a1bSJed Brown       suffix: 2
169c4762a1bSJed Brown       nsize: 6
170c4762a1bSJed Brown       args: -m 2 -n 3
171c4762a1bSJed Brown       requires: elemental
172c4762a1bSJed Brown 
173c20d7725SJed Brown    test:
174c20d7725SJed Brown       suffix: 3
175c20d7725SJed Brown       nsize: 1
176c20d7725SJed Brown       args: -m 2 -n 3
177c20d7725SJed Brown       requires: elemental
178c20d7725SJed Brown       output_file: output/ex39_1.out
179c20d7725SJed Brown 
180c4762a1bSJed Brown TEST*/
181