static char help[] = "Tests MatComputeOperator() and MatComputeOperatorTranspose()\n\n"; #include int main(int argc,char **argv) { Mat A,Ae,Aet; char filename[PETSC_MAX_PATH_LEN]; char expltype[128],*etype = NULL; PetscInt bs = 1; PetscBool flg, check = PETSC_TRUE; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&argv,(char*) 0,help);if (ierr) return ierr; ierr = PetscOptionsGetString(NULL,NULL,"-expl_type",expltype,sizeof(expltype),&flg);CHKERRQ(ierr); if (flg) { ierr = PetscStrallocpy(expltype,&etype);CHKERRQ(ierr); } ierr = PetscOptionsGetString(NULL,NULL,"-f",filename,sizeof(filename),&flg);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-bs",&bs,NULL);CHKERRQ(ierr); if (!flg) { PetscInt M = 13,N = 6; ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr); ierr = MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,M,N,NULL,&A);CHKERRQ(ierr); ierr = MatSetBlockSize(A,bs);CHKERRQ(ierr); ierr = MatSetRandom(A,NULL);CHKERRQ(ierr); } else { PetscViewer viewer; ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetBlockSize(A,bs);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatLoad(A,viewer);CHKERRQ(ierr); ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); } ierr = PetscObjectSetName((PetscObject)A,"Matrix");CHKERRQ(ierr); ierr = MatViewFromOptions(A,NULL,"-view_expl");CHKERRQ(ierr); ierr = MatComputeOperator(A,etype,&Ae);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)Ae,"Explicit matrix");CHKERRQ(ierr); ierr = MatViewFromOptions(Ae,NULL,"-view_expl");CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,NULL,"-check",&check,NULL);CHKERRQ(ierr); if (check) { Mat A2; PetscReal err,tol = PETSC_SMALL; ierr = PetscOptionsGetReal(NULL,NULL,"-tol",&tol,NULL);CHKERRQ(ierr); ierr = MatConvert(A,etype,MAT_INITIAL_MATRIX,&A2);CHKERRQ(ierr); ierr = MatAXPY(A2,-1.0,Ae,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); ierr = MatNorm(A2,NORM_FROBENIUS,&err);CHKERRQ(ierr); if (err > tol) { ierr = PetscPrintf(PETSC_COMM_WORLD,"Error %g > %g (type %s)\n",(double)err,(double)tol,etype);CHKERRQ(ierr); } ierr = MatDestroy(&A2);CHKERRQ(ierr); } ierr = MatComputeOperatorTranspose(A,etype,&Aet);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)Aet,"Explicit matrix transpose");CHKERRQ(ierr); ierr = MatViewFromOptions(Aet,NULL,"-view_expl");CHKERRQ(ierr); ierr = PetscFree(etype);CHKERRQ(ierr); ierr = MatDestroy(&Ae);CHKERRQ(ierr); ierr = MatDestroy(&Aet);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; } /*TEST test: output_file: output/ex222_null.out testset: suffix: matexpl_rect output_file: output/ex222_null.out nsize: {{1 3}} args: -expl_type {{dense aij baij}} testset: suffix: matexpl_square output_file: output/ex222_null.out nsize: {{1 3}} args: -bs {{1 2 3}} -M 36 -N 36 -expl_type {{dense aij baij sbaij}} TEST*/