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);CHKERRMPI(ierr); 20 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 21 22 /* Load AIJ matrix A */ 23 ierr = PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&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 !defined(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