1 static char help[] = "Tests MatComputeOperator() and MatComputeOperatorTranspose()\n\n"; 2 3 #include <petscmat.h> 4 5 int main(int argc,char **argv) 6 { 7 Mat A,Ae,Aet; 8 char filename[PETSC_MAX_PATH_LEN]; 9 char expltype[128],*etype = NULL; 10 PetscInt bs = 1; 11 PetscBool flg, check = PETSC_TRUE; 12 PetscErrorCode ierr; 13 14 ierr = PetscInitialize(&argc,&argv,(char*) 0,help);if (ierr) return ierr; 15 16 ierr = PetscOptionsGetString(NULL,NULL,"-expl_type",expltype,sizeof(expltype),&flg);CHKERRQ(ierr); 17 if (flg) { 18 ierr = PetscStrallocpy(expltype,&etype);CHKERRQ(ierr); 19 } 20 ierr = PetscOptionsGetString(NULL,NULL,"-f",filename,sizeof(filename),&flg);CHKERRQ(ierr); 21 ierr = PetscOptionsGetInt(NULL,NULL,"-bs",&bs,NULL);CHKERRQ(ierr); 22 if (!flg) { 23 PetscInt M = 13,N = 6; 24 25 ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr); 26 ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr); 27 ierr = MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,M,N,NULL,&A);CHKERRQ(ierr); 28 ierr = MatSetBlockSize(A,bs);CHKERRQ(ierr); 29 ierr = MatSetRandom(A,NULL);CHKERRQ(ierr); 30 } else { 31 PetscViewer viewer; 32 33 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr); 34 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 35 ierr = MatSetBlockSize(A,bs);CHKERRQ(ierr); 36 ierr = MatSetFromOptions(A);CHKERRQ(ierr); 37 ierr = MatLoad(A,viewer);CHKERRQ(ierr); 38 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 39 } 40 ierr = PetscObjectSetName((PetscObject)A,"Matrix");CHKERRQ(ierr); 41 ierr = MatViewFromOptions(A,NULL,"-view_expl");CHKERRQ(ierr); 42 43 ierr = MatComputeOperator(A,etype,&Ae);CHKERRQ(ierr); 44 ierr = PetscObjectSetName((PetscObject)Ae,"Explicit matrix");CHKERRQ(ierr); 45 ierr = MatViewFromOptions(Ae,NULL,"-view_expl");CHKERRQ(ierr); 46 47 ierr = PetscOptionsGetBool(NULL,NULL,"-check",&check,NULL);CHKERRQ(ierr); 48 if (check) { 49 Mat A2; 50 PetscReal err,tol = PETSC_SMALL; 51 52 ierr = PetscOptionsGetReal(NULL,NULL,"-tol",&tol,NULL);CHKERRQ(ierr); 53 ierr = MatConvert(A,etype,MAT_INITIAL_MATRIX,&A2);CHKERRQ(ierr); 54 ierr = MatAXPY(A2,-1.0,Ae,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 55 ierr = MatNorm(A2,NORM_FROBENIUS,&err);CHKERRQ(ierr); 56 if (err > tol) { 57 ierr = PetscPrintf(PETSC_COMM_WORLD,"Error %g > %g (type %s)\n",(double)err,(double)tol,etype);CHKERRQ(ierr); 58 } 59 ierr = MatDestroy(&A2);CHKERRQ(ierr); 60 } 61 62 ierr = MatComputeOperatorTranspose(A,etype,&Aet);CHKERRQ(ierr); 63 ierr = PetscObjectSetName((PetscObject)Aet,"Explicit matrix transpose");CHKERRQ(ierr); 64 ierr = MatViewFromOptions(Aet,NULL,"-view_expl");CHKERRQ(ierr); 65 66 ierr = PetscFree(etype);CHKERRQ(ierr); 67 ierr = MatDestroy(&Ae);CHKERRQ(ierr); 68 ierr = MatDestroy(&Aet);CHKERRQ(ierr); 69 ierr = MatDestroy(&A);CHKERRQ(ierr); 70 ierr = PetscFinalize(); 71 return ierr; 72 } 73 74 /*TEST 75 76 test: 77 output_file: output/ex222_null.out 78 79 testset: 80 suffix: matexpl_rect 81 output_file: output/ex222_null.out 82 nsize: {{1 3}} 83 args: -expl_type {{dense aij baij}} 84 85 testset: 86 suffix: matexpl_square 87 output_file: output/ex222_null.out 88 nsize: {{1 3}} 89 args: -bs {{1 2 3}} -M 36 -N 36 -expl_type {{dense aij baij sbaij}} 90 91 TEST*/ 92