static char help[] = "Tests MatTransposeMatMult() on MatLoad() matrix \n\n"; #include int main(int argc,char **args) { Mat A,C,Bdense,Cdense; PetscErrorCode ierr; PetscViewer fd; /* viewer */ char file[PETSC_MAX_PATH_LEN]; /* input file name */ PetscBool flg,viewmats=PETSC_FALSE; PetscMPIInt rank,size; PetscReal fill=1.0; PetscInt m,n,i,j,BN=10,rstart,rend,*rows,*cols; PetscScalar *Barray,*Carray,rval,*array; Vec x,y; PetscRandom rand; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); /* Determine file from which we read the matrix A */ CHKERRQ(PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&flg)); PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_USER,"Must indicate binary file with the -f option"); /* Load matrix A */ CHKERRQ(PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd)); CHKERRQ(MatCreate(PETSC_COMM_WORLD,&A)); CHKERRQ(MatLoad(A,fd)); CHKERRQ(PetscViewerDestroy(&fd)); /* Print (for testing only) */ CHKERRQ(PetscOptionsHasName(NULL,NULL, "-view_mats", &viewmats)); if (viewmats) { if (rank == 0) printf("A_aij:\n"); CHKERRQ(MatView(A,0)); } /* Test MatTransposeMatMult_aij_aij() */ CHKERRQ(MatTransposeMatMult(A,A,MAT_INITIAL_MATRIX,fill,&C)); if (viewmats) { if (rank == 0) printf("\nC = A_aij^T * A_aij:\n"); CHKERRQ(MatView(C,0)); } CHKERRQ(MatDestroy(&C)); CHKERRQ(MatGetLocalSize(A,&m,&n)); /* create a dense matrix Bdense */ CHKERRQ(MatCreate(PETSC_COMM_WORLD,&Bdense)); CHKERRQ(MatSetSizes(Bdense,m,PETSC_DECIDE,PETSC_DECIDE,BN)); CHKERRQ(MatSetType(Bdense,MATDENSE)); CHKERRQ(MatSetFromOptions(Bdense)); CHKERRQ(MatSetUp(Bdense)); CHKERRQ(MatGetOwnershipRange(Bdense,&rstart,&rend)); CHKERRQ(PetscMalloc3(m,&rows,BN,&cols,m*BN,&array)); for (i=0; i