static char help[] = "Tests MatTransposeMatMult() on MatLoad() matrix \n\n"; #include int main(int argc,char **args) { Mat A,C,Bdense,Cdense; 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; PetscCall(PetscInitialize(&argc,&args,(char*)0,help)); PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); /* Determine file from which we read the matrix A */ PetscCall(PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&flg)); PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_USER,"Must indicate binary file with the -f option"); /* Load matrix A */ PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd)); PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); PetscCall(MatLoad(A,fd)); PetscCall(PetscViewerDestroy(&fd)); /* Print (for testing only) */ PetscCall(PetscOptionsHasName(NULL,NULL, "-view_mats", &viewmats)); if (viewmats) { if (rank == 0) printf("A_aij:\n"); PetscCall(MatView(A,0)); } /* Test MatTransposeMatMult_aij_aij() */ PetscCall(MatTransposeMatMult(A,A,MAT_INITIAL_MATRIX,fill,&C)); if (viewmats) { if (rank == 0) printf("\nC = A_aij^T * A_aij:\n"); PetscCall(MatView(C,0)); } PetscCall(MatDestroy(&C)); PetscCall(MatGetLocalSize(A,&m,&n)); /* create a dense matrix Bdense */ PetscCall(MatCreate(PETSC_COMM_WORLD,&Bdense)); PetscCall(MatSetSizes(Bdense,m,PETSC_DECIDE,PETSC_DECIDE,BN)); PetscCall(MatSetType(Bdense,MATDENSE)); PetscCall(MatSetFromOptions(Bdense)); PetscCall(MatSetUp(Bdense)); PetscCall(MatGetOwnershipRange(Bdense,&rstart,&rend)); PetscCall(PetscMalloc3(m,&rows,BN,&cols,m*BN,&array)); for (i=0; i