1 2 static char help[] = "Tests the various routines in MatBAIJ format.\n\ 3 Input arguments are:\n\ 4 -f <input_file> : file to load. For example see $PETSC_DIR/share/petsc/datafiles/matrices\n\n"; 5 6 #include <petscmat.h> 7 8 int main(int argc,char **args) 9 { 10 Mat A,B,C; 11 PetscViewer va,vb,vc; 12 Vec x,y; 13 PetscErrorCode ierr; 14 PetscInt i,j,row,m,n,ncols1,ncols2,ct,m2,n2; 15 const PetscInt *cols1,*cols2; 16 char file[PETSC_MAX_PATH_LEN]; 17 PetscBool tflg; 18 PetscScalar rval; 19 const PetscScalar *vals1,*vals2; 20 PetscReal norm1,norm2,rnorm; 21 PetscRandom r; 22 23 24 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 25 ierr = PetscOptionsGetString(NULL,NULL,"-f",file,PETSC_MAX_PATH_LEN,NULL);CHKERRQ(ierr); 26 27 /* Load the matrix as AIJ format */ 28 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&va);CHKERRQ(ierr); 29 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 30 ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr); 31 ierr = MatLoad(A,va);CHKERRQ(ierr); 32 ierr = PetscViewerDestroy(&va);CHKERRQ(ierr); 33 34 /* Load the matrix as BAIJ format */ 35 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&vb);CHKERRQ(ierr); 36 ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); 37 ierr = MatSetType(B,MATSEQBAIJ);CHKERRQ(ierr); 38 ierr = MatLoad(B,vb);CHKERRQ(ierr); 39 ierr = PetscViewerDestroy(&vb);CHKERRQ(ierr); 40 41 /* Load the matrix as BAIJ format */ 42 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&vc);CHKERRQ(ierr); 43 ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr); 44 ierr = MatSetType(C,MATSEQBAIJ);CHKERRQ(ierr); 45 ierr = MatSetFromOptions(C);CHKERRQ(ierr); 46 ierr = MatLoad(C,vc);CHKERRQ(ierr); 47 ierr = PetscViewerDestroy(&vc);CHKERRQ(ierr); 48 49 ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 50 ierr = MatGetSize(B,&m2,&n2);CHKERRQ(ierr); 51 if (m!=m2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Matrices are of different size. Cannot run this example"); 52 53 /* Test MatEqual() */ 54 ierr = MatEqual(B,C,&tflg);CHKERRQ(ierr); 55 if (!tflg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatEqual() failed"); 56 57 /* Test MatGetDiagonal() */ 58 ierr = VecCreateSeq(PETSC_COMM_SELF,m,&x);CHKERRQ(ierr); 59 ierr = VecCreateSeq(PETSC_COMM_SELF,m,&y);CHKERRQ(ierr); 60 61 ierr = MatGetDiagonal(A,x);CHKERRQ(ierr); 62 ierr = MatGetDiagonal(B,y);CHKERRQ(ierr); 63 64 ierr = VecEqual(x,y,&tflg);CHKERRQ(ierr); 65 if (!tflg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatGetDiagonal() failed"); 66 67 /* Test MatDiagonalScale() */ 68 ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr); 69 ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr); 70 ierr = VecSetRandom(x,r);CHKERRQ(ierr); 71 ierr = VecSetRandom(y,r);CHKERRQ(ierr); 72 73 ierr = MatDiagonalScale(A,x,y);CHKERRQ(ierr); 74 ierr = MatDiagonalScale(B,x,y);CHKERRQ(ierr); 75 ierr = MatMult(A,x,y);CHKERRQ(ierr); 76 ierr = VecNorm(y,NORM_2,&norm1);CHKERRQ(ierr); 77 ierr = MatMult(B,x,y);CHKERRQ(ierr); 78 ierr = VecNorm(y,NORM_2,&norm2);CHKERRQ(ierr); 79 rnorm = ((norm1-norm2)*100)/norm1; 80 if (rnorm<-0.1 || rnorm>0.01) SETERRQ2(PETSC_COMM_SELF,1,"MatDiagonalScale() failed Norm1 %g Norm2 %g",(double)norm1,(double)norm2); 81 82 /* Test MatGetRow()/ MatRestoreRow() */ 83 for (ct=0; ct<100; ct++) { 84 ierr = PetscRandomGetValue(r,&rval);CHKERRQ(ierr); 85 row = (int)(rval*m); 86 ierr = MatGetRow(A,row,&ncols1,&cols1,&vals1);CHKERRQ(ierr); 87 ierr = MatGetRow(B,row,&ncols2,&cols2,&vals2);CHKERRQ(ierr); 88 89 for (i=0,j=0; i<ncols1 && j<ncols2; i++) { 90 while (cols2[j] != cols1[i]) j++; 91 if (vals1[i] != vals2[j]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatGetRow() failed - vals incorrect."); 92 } 93 if (i<ncols1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatGetRow() failed - cols incorrect"); 94 95 ierr = MatRestoreRow(A,row,&ncols1,&cols1,&vals1);CHKERRQ(ierr); 96 ierr = MatRestoreRow(B,row,&ncols2,&cols2,&vals2);CHKERRQ(ierr); 97 } 98 99 ierr = MatDestroy(&A);CHKERRQ(ierr); 100 ierr = MatDestroy(&B);CHKERRQ(ierr); 101 ierr = MatDestroy(&C);CHKERRQ(ierr); 102 ierr = VecDestroy(&x);CHKERRQ(ierr); 103 ierr = VecDestroy(&y);CHKERRQ(ierr); 104 ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); 105 ierr = PetscFinalize(); 106 return ierr; 107 } 108 109 /*TEST 110 111 build: 112 requires: !complex 113 114 test: 115 args: -f ${DATAFILESPATH}/matrices/cfd.1.10 -mat_block_size 5 116 requires: !complex double datafilespath !define(PETSC_USE_64BIT_INDICES) 117 118 TEST*/ 119