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