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*327415f7SBarry Smith PetscFunctionBeginUser; 149566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,(char*) 0,help)); 15c4762a1bSJed Brown 169566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL,NULL,"-expl_type",expltype,sizeof(expltype),&flg)); 17c4762a1bSJed Brown if (flg) { 189566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(expltype,&etype)); 19c4762a1bSJed Brown } 209566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL,NULL,"-f",filename,sizeof(filename),&flg)); 219566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-bs",&bs,NULL)); 22c4762a1bSJed Brown if (!flg) { 23c4762a1bSJed Brown PetscInt M = 13,N = 6; 24c4762a1bSJed Brown 259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL)); 269566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL)); 279566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,M,N,NULL,&A)); 289566063dSJacob Faibussowitsch PetscCall(MatSetBlockSize(A,bs)); 299566063dSJacob Faibussowitsch PetscCall(MatSetRandom(A,NULL)); 30c4762a1bSJed Brown } else { 31c4762a1bSJed Brown PetscViewer viewer; 32c4762a1bSJed Brown 339566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer)); 349566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); 359566063dSJacob Faibussowitsch PetscCall(MatSetBlockSize(A,bs)); 369566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(A)); 379566063dSJacob Faibussowitsch PetscCall(MatLoad(A,viewer)); 389566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 39c4762a1bSJed Brown } 409566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)A,"Matrix")); 419566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A,NULL,"-view_expl")); 42c4762a1bSJed Brown 439566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A,etype,&Ae)); 449566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Ae,"Explicit matrix")); 459566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Ae,NULL,"-view_expl")); 46c4762a1bSJed Brown 479566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL,NULL,"-check",&check,NULL)); 48c4762a1bSJed Brown if (check) { 49c4762a1bSJed Brown Mat A2; 50c4762a1bSJed Brown PetscReal err,tol = PETSC_SMALL; 51c4762a1bSJed Brown 529566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(NULL,NULL,"-tol",&tol,NULL)); 539566063dSJacob Faibussowitsch PetscCall(MatConvert(A,etype,MAT_INITIAL_MATRIX,&A2)); 549566063dSJacob Faibussowitsch PetscCall(MatAXPY(A2,-1.0,Ae,DIFFERENT_NONZERO_PATTERN)); 559566063dSJacob Faibussowitsch PetscCall(MatNorm(A2,NORM_FROBENIUS,&err)); 56c4762a1bSJed Brown if (err > tol) { 579566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Error %g > %g (type %s)\n",(double)err,(double)tol,etype)); 58c4762a1bSJed Brown } 599566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A2)); 60c4762a1bSJed Brown } 61c4762a1bSJed Brown 629566063dSJacob Faibussowitsch PetscCall(MatComputeOperatorTranspose(A,etype,&Aet)); 639566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Aet,"Explicit matrix transpose")); 649566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Aet,NULL,"-view_expl")); 65c4762a1bSJed Brown 669566063dSJacob Faibussowitsch PetscCall(PetscFree(etype)); 679566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Ae)); 689566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Aet)); 699566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 709566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 71b122ec5aSJacob Faibussowitsch return 0; 72c4762a1bSJed Brown } 73c4762a1bSJed Brown 74c4762a1bSJed Brown /*TEST 75c4762a1bSJed Brown 76c4762a1bSJed Brown test: 77c4762a1bSJed Brown output_file: output/ex222_null.out 78c4762a1bSJed Brown 79c4762a1bSJed Brown testset: 80c4762a1bSJed Brown suffix: matexpl_rect 81c4762a1bSJed Brown output_file: output/ex222_null.out 82c4762a1bSJed Brown nsize: {{1 3}} 83c4762a1bSJed Brown args: -expl_type {{dense aij baij}} 84c4762a1bSJed Brown 85c4762a1bSJed Brown testset: 86c4762a1bSJed Brown suffix: matexpl_square 87c4762a1bSJed Brown output_file: output/ex222_null.out 88c4762a1bSJed Brown nsize: {{1 3}} 89c4762a1bSJed Brown args: -bs {{1 2 3}} -M 36 -N 36 -expl_type {{dense aij baij sbaij}} 90c4762a1bSJed Brown 91c4762a1bSJed Brown TEST*/ 92