1c4762a1bSJed Brown static char help[] = "Tests MatComputeOperator() and MatComputeOperatorTranspose()\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscmat.h> 4c4762a1bSJed Brown 5c4762a1bSJed Brown int main(int argc,char **argv) 6c4762a1bSJed Brown { 7c4762a1bSJed Brown Mat A,Ae,Aet; 8c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN]; 9c4762a1bSJed Brown char expltype[128],*etype = NULL; 10c4762a1bSJed Brown PetscInt bs = 1; 11c4762a1bSJed Brown PetscBool flg, check = PETSC_TRUE; 12c4762a1bSJed Brown 13*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,(char*) 0,help)); 14c4762a1bSJed Brown 155f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetString(NULL,NULL,"-expl_type",expltype,sizeof(expltype),&flg)); 16c4762a1bSJed Brown if (flg) { 175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(expltype,&etype)); 18c4762a1bSJed Brown } 195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetString(NULL,NULL,"-f",filename,sizeof(filename),&flg)); 205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-bs",&bs,NULL)); 21c4762a1bSJed Brown if (!flg) { 22c4762a1bSJed Brown PetscInt M = 13,N = 6; 23c4762a1bSJed Brown 245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL)); 255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL)); 265f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,M,N,NULL,&A)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetBlockSize(A,bs)); 285f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetRandom(A,NULL)); 29c4762a1bSJed Brown } else { 30c4762a1bSJed Brown PetscViewer viewer; 31c4762a1bSJed Brown 325f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer)); 335f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD,&A)); 345f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetBlockSize(A,bs)); 355f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(A)); 365f80ce2aSJacob Faibussowitsch CHKERRQ(MatLoad(A,viewer)); 375f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 38c4762a1bSJed Brown } 395f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)A,"Matrix")); 405f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(A,NULL,"-view_expl")); 41c4762a1bSJed Brown 425f80ce2aSJacob Faibussowitsch CHKERRQ(MatComputeOperator(A,etype,&Ae)); 435f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)Ae,"Explicit matrix")); 445f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(Ae,NULL,"-view_expl")); 45c4762a1bSJed Brown 465f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-check",&check,NULL)); 47c4762a1bSJed Brown if (check) { 48c4762a1bSJed Brown Mat A2; 49c4762a1bSJed Brown PetscReal err,tol = PETSC_SMALL; 50c4762a1bSJed Brown 515f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetReal(NULL,NULL,"-tol",&tol,NULL)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,etype,MAT_INITIAL_MATRIX,&A2)); 535f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(A2,-1.0,Ae,DIFFERENT_NONZERO_PATTERN)); 545f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(A2,NORM_FROBENIUS,&err)); 55c4762a1bSJed Brown if (err > tol) { 565f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Error %g > %g (type %s)\n",(double)err,(double)tol,etype)); 57c4762a1bSJed Brown } 585f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A2)); 59c4762a1bSJed Brown } 60c4762a1bSJed Brown 615f80ce2aSJacob Faibussowitsch CHKERRQ(MatComputeOperatorTranspose(A,etype,&Aet)); 625f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)Aet,"Explicit matrix transpose")); 635f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(Aet,NULL,"-view_expl")); 64c4762a1bSJed Brown 655f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(etype)); 665f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Ae)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Aet)); 685f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 69*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 70*b122ec5aSJacob Faibussowitsch return 0; 71c4762a1bSJed Brown } 72c4762a1bSJed Brown 73c4762a1bSJed Brown /*TEST 74c4762a1bSJed Brown 75c4762a1bSJed Brown test: 76c4762a1bSJed Brown output_file: output/ex222_null.out 77c4762a1bSJed Brown 78c4762a1bSJed Brown testset: 79c4762a1bSJed Brown suffix: matexpl_rect 80c4762a1bSJed Brown output_file: output/ex222_null.out 81c4762a1bSJed Brown nsize: {{1 3}} 82c4762a1bSJed Brown args: -expl_type {{dense aij baij}} 83c4762a1bSJed Brown 84c4762a1bSJed Brown testset: 85c4762a1bSJed Brown suffix: matexpl_square 86c4762a1bSJed Brown output_file: output/ex222_null.out 87c4762a1bSJed Brown nsize: {{1 3}} 88c4762a1bSJed Brown args: -bs {{1 2 3}} -M 36 -N 36 -expl_type {{dense aij baij sbaij}} 89c4762a1bSJed Brown 90c4762a1bSJed Brown TEST*/ 91