xref: /petsc/src/mat/tests/ex177.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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 MatMult() */
54   ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
55   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 1: MatMult() for KAIJ matrix");
56   /* Test MatMultAdd() */
57   ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
58   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 1: MatMultAdd() for KAIJ matrix");
59 
60   ierr = MatDestroy(&TA);CHKERRQ(ierr);
61   ierr = MatDestroy(&B);CHKERRQ(ierr);
62 
63   /* Test KAIJ when S is NULL */
64 
65   /* create kaij matrix TA */
66   ierr = MatCreateKAIJ(A,p,q,NULL,T,&TA);CHKERRQ(ierr);
67   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
68   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
69 
70   ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
71 
72   /* Test MatMult() */
73   ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
74   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 2: MatMult() for KAIJ matrix");
75   /* Test MatMultAdd() */
76   ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
77   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 2: MatMultAdd() for KAIJ matrix");
78 
79   ierr = MatDestroy(&TA);CHKERRQ(ierr);
80   ierr = MatDestroy(&B);CHKERRQ(ierr);
81 
82   /* Test KAIJ when T is NULL */
83 
84   /* create kaij matrix TA */
85   ierr = MatCreateKAIJ(A,p,q,S,NULL,&TA);CHKERRQ(ierr);
86   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
87   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
88 
89   ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
90 
91   /* Test MatMult() */
92   ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
93   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 3: MatMult() for KAIJ matrix");
94   /* Test MatMultAdd() */
95   ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
96   if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 3: MatMultAdd() for KAIJ matrix");
97 
98   ierr = MatDestroy(&TA);CHKERRQ(ierr);
99   ierr = MatDestroy(&B);CHKERRQ(ierr);
100 
101   /* Test KAIJ when T is is an identity matrix */
102 
103   if (p == q) {
104     for (i=0; i<p; i++) {
105       for (j=0; j<q; j++) {
106         if (i==j) T[i+j*p] = 1.0;
107         else      T[i+j*p] = 0.0;
108       }
109     }
110 
111     /* create kaij matrix TA */
112     ierr = MatCreateKAIJ(A,p,q,S,T,&TA);CHKERRQ(ierr);
113     ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
114     ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
115 
116     ierr = MatConvert(TA,MATAIJ,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr);
117 
118     /* Test MatMult() */
119     ierr = MatMultEqual(TA,B,10,&flg);CHKERRQ(ierr);
120     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 4: MatMult() for KAIJ matrix");
121     /* Test MatMultAdd() */
122     ierr = MatMultAddEqual(TA,B,10,&flg);CHKERRQ(ierr);
123     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_CONV_FAILED,"Error in Test 4: MatMultAdd() for KAIJ matrix");
124 
125     ierr = MatDestroy(&TA);CHKERRQ(ierr);
126     ierr = MatDestroy(&B);CHKERRQ(ierr);
127   }
128 
129   /* Done with all tests */
130 
131   ierr = PetscFree2(S,T);CHKERRQ(ierr);
132   ierr = MatDestroy(&A);CHKERRQ(ierr);
133   ierr = PetscFinalize();
134   return ierr;
135 }
136 
137 /*TEST
138 
139   build:
140     requires: !complex
141 
142   test:
143     requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
144     output_file: output/ex176.out
145     nsize: {{1 2 3 4}}
146     args: -f ${DATAFILESPATH}/matrices/small -p {{2 3 7}} -q {{3 7}} -viewer_binary_skip_info
147 
148 TEST*/
149