xref: /petsc/src/mat/tests/ex177.c (revision 967582eba84cc53dc1fbf6b54d6aa49b7d83bae6)
1 
2 static char help[] = "Tests various routines in MatKAIJ format.\n";
3 
4 #include <petscmat.h>
5 #define IMAX 15
6 
7 int main(int argc,char **args)
8 {
9   Mat            A,B,TA;
10   PetscScalar    *S,*T;
11   PetscViewer    fd;
12   char           file[PETSC_MAX_PATH_LEN];
13   PetscInt       m,n,M,N,p=1,q=1,i,j;
14   PetscMPIInt    rank,size;
15   PetscErrorCode ierr;
16   PetscBool      flg;
17 
18   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
19   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
20   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
21 
22   /* Load AIJ matrix A */
23   ierr = PetscOptionsGetString(NULL,NULL,"-f",file,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
24   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER,"Must indicate binary file with the -f option");
25   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd);CHKERRQ(ierr);
26   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
27   ierr = MatLoad(A,fd);CHKERRQ(ierr);
28   ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);
29 
30   /* Get dof, then create S and T */
31   ierr = PetscOptionsGetInt(NULL,NULL,"-p",&p,NULL);CHKERRQ(ierr);
32   ierr = PetscOptionsGetInt(NULL,NULL,"-q",&q,NULL);CHKERRQ(ierr);
33   ierr = PetscMalloc2(p*q,&S,p*q,&T);CHKERRQ(ierr);
34   for (i=0; i<p*q; i++) S[i] = 0;
35 
36   for (i=0; i<p; i++) {
37     for (j=0; j<q; j++) {
38       /* Set some random non-zero values */
39       S[i+p*j] = ((PetscReal) ((i+1)*(j+1))) / ((PetscReal) (p+q));
40       T[i+p*j] = ((PetscReal) ((p-i)+j)) / ((PetscReal) (p*q));
41     }
42   }
43 
44   /* Test KAIJ when both S & T are not NULL */
45 
46   /* Create KAIJ matrix TA */
47   ierr = MatCreateKAIJ(A,p,q,S,T,&TA);CHKERRQ(ierr);
48   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
49   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
50 
51   ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
52 
53   /* Test MatKAIJGetScaledIdentity() */
54   ierr = MatKAIJGetScaledIdentity(TA,&flg);CHKERRQ(ierr);
55   if (flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in Test 1: MatKAIJGetScaledIdentity()");
56   /* Test MatMult() */
57   ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
58   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 1: MatMult() for KAIJ matrix");
59   /* Test MatMultAdd() */
60   ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
61   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 1: MatMultAdd() for KAIJ matrix");
62 
63   ierr = MatDestroy(&TA);CHKERRQ(ierr);
64   ierr = MatDestroy(&B);CHKERRQ(ierr);
65 
66   /* Test KAIJ when S is NULL */
67 
68   /* Create KAIJ matrix TA */
69   ierr = MatCreateKAIJ(A,p,q,NULL,T,&TA);CHKERRQ(ierr);
70   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
71   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
72 
73   ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
74 
75   /* Test MatKAIJGetScaledIdentity() */
76   ierr = MatKAIJGetScaledIdentity(TA,&flg);CHKERRQ(ierr);
77   if (flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in Test 2: MatKAIJGetScaledIdentity()");
78   /* Test MatMult() */
79   ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
80   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 2: MatMult() for KAIJ matrix");
81   /* Test MatMultAdd() */
82   ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
83   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 2: MatMultAdd() for KAIJ matrix");
84 
85   ierr = MatDestroy(&TA);CHKERRQ(ierr);
86   ierr = MatDestroy(&B);CHKERRQ(ierr);
87 
88   /* Test KAIJ when T is NULL */
89 
90   /* Create KAIJ matrix TA */
91   ierr = MatCreateKAIJ(A,p,q,S,NULL,&TA);CHKERRQ(ierr);
92   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
93   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
94 
95   ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
96 
97   /* Test MatKAIJGetScaledIdentity() */
98   ierr = MatKAIJGetScaledIdentity(TA,&flg);CHKERRQ(ierr);
99   if (flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in Test 3: MatKAIJGetScaledIdentity()");
100   /* Test MatMult() */
101   ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
102   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 3: MatMult() for KAIJ matrix");
103   /* Test MatMultAdd() */
104   ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
105   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 3: MatMultAdd() for KAIJ matrix");
106 
107   ierr = MatDestroy(&TA);CHKERRQ(ierr);
108   ierr = MatDestroy(&B);CHKERRQ(ierr);
109 
110   /* Test KAIJ when T is is an identity matrix */
111 
112   if (p == q) {
113     for (i=0; i<p; i++) {
114       for (j=0; j<q; j++) {
115         if (i==j) T[i+j*p] = 1.0;
116         else      T[i+j*p] = 0.0;
117       }
118     }
119 
120     /* Create KAIJ matrix TA */
121     ierr = MatCreateKAIJ(A,p,q,S,T,&TA);CHKERRQ(ierr);
122     ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
123     ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
124 
125     ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
126 
127     /* Test MatKAIJGetScaledIdentity() */
128     ierr = MatKAIJGetScaledIdentity(TA,&flg);CHKERRQ(ierr);
129     if (flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in Test 4: MatKAIJGetScaledIdentity()");
130     /* Test MatMult() */
131     ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
132     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 4: MatMult() for KAIJ matrix");
133     /* Test MatMultAdd() */
134     ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
135     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 4: MatMultAdd() for KAIJ matrix");
136 
137     ierr = MatDestroy(&TA);CHKERRQ(ierr);
138     ierr = MatDestroy(&B);CHKERRQ(ierr);
139 
140     ierr = MatCreateKAIJ(A,p,q,NULL,T,&TA);CHKERRQ(ierr);
141     /* Test MatKAIJGetScaledIdentity() */
142     ierr = MatKAIJGetScaledIdentity(TA,&flg);CHKERRQ(ierr);
143     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in Test 5: MatKAIJGetScaledIdentity()");
144     ierr = MatDestroy(&TA);CHKERRQ(ierr);
145 
146     for (i=0; i<p; i++) {
147       for (j=0; j<q; j++) {
148         if (i==j) S[i+j*p] = T[i+j*p] = 2.0;
149         else      S[i+j*p] = T[i+j*p] = 0.0;
150       }
151     }
152     ierr = MatCreateKAIJ(A,p,q,S,T,&TA);CHKERRQ(ierr);
153     /* Test MatKAIJGetScaledIdentity() */
154     ierr = MatKAIJGetScaledIdentity(TA,&flg);CHKERRQ(ierr);
155     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in Test 6: MatKAIJGetScaledIdentity()");
156     ierr = MatDestroy(&TA);CHKERRQ(ierr);
157   }
158 
159   /* Done with all tests */
160 
161   ierr = PetscFree2(S,T);CHKERRQ(ierr);
162   ierr = MatDestroy(&A);CHKERRQ(ierr);
163   ierr = PetscFinalize();
164   return ierr;
165 }
166 
167 /*TEST
168 
169   build:
170     requires: !complex
171 
172   test:
173     requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
174     output_file: output/ex176.out
175     nsize: {{1 2 3 4}}
176     args: -f ${DATAFILESPATH}/matrices/small -p {{2 3 7}} -q {{3 7}} -viewer_binary_skip_info
177 
178 TEST*/
179