static char help[] = "Tests MatIncreaseOverlap(), MatCreateSubMatrices() for parallel MatSBAIJ format.\n"; /* Example of usage: mpiexec -n 2 ./ex92 -nd 2 -ov 3 -mat_block_size 2 -view_id 0 -test_overlap -test_submat */ #include int main(int argc,char **args) { Mat A,Atrans,sA,*submatA,*submatsA; PetscMPIInt size,rank; PetscInt bs=1,mbs=10,ov=1,i,j,k,*rows,*cols,nd=2,*idx,rstart,rend,sz,M,N,Mbs; PetscScalar *vals,rval,one=1.0; IS *is1,*is2; PetscRandom rand; PetscBool flg,TestOverlap,TestSubMat,TestAllcols,test_sorted=PETSC_FALSE; PetscInt vid = -1; #if defined(PETSC_USE_LOG) PetscLogStage stages[2]; #endif PetscFunctionBeginUser; PetscCall(PetscInitialize(&argc,&args,(char*)0,help)); PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-mat_block_size",&bs,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-mat_mbs",&mbs,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-ov",&ov,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-nd",&nd,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-view_id",&vid,NULL)); PetscCall(PetscOptionsHasName(NULL,NULL, "-test_overlap", &TestOverlap)); PetscCall(PetscOptionsHasName(NULL,NULL, "-test_submat", &TestSubMat)); PetscCall(PetscOptionsHasName(NULL,NULL, "-test_allcols", &TestAllcols)); PetscCall(PetscOptionsGetBool(NULL,NULL,"-test_sorted",&test_sorted,NULL)); PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); PetscCall(MatSetSizes(A,mbs*bs,mbs*bs,PETSC_DECIDE,PETSC_DECIDE)); PetscCall(MatSetType(A,MATBAIJ)); PetscCall(MatSeqBAIJSetPreallocation(A,bs,PETSC_DEFAULT,NULL)); PetscCall(MatMPIBAIJSetPreallocation(A,bs,PETSC_DEFAULT,NULL,PETSC_DEFAULT,NULL)); PetscCall(PetscRandomCreate(PETSC_COMM_WORLD,&rand)); PetscCall(PetscRandomSetFromOptions(rand)); PetscCall(MatGetOwnershipRange(A,&rstart,&rend)); PetscCall(MatGetSize(A,&M,&N)); Mbs = M/bs; PetscCall(PetscMalloc1(bs,&rows)); PetscCall(PetscMalloc1(bs,&cols)); PetscCall(PetscMalloc1(bs*bs,&vals)); PetscCall(PetscMalloc1(M,&idx)); /* Now set blocks of values */ for (j=0; j= 0 && vid < size) { PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"A:\n")); PetscCall(MatView(A,PETSC_VIEWER_STDOUT_WORLD)); PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"sA:\n")); PetscCall(MatView(sA,PETSC_VIEWER_STDOUT_WORLD)); } /* Test sA==A through MatMult() */ PetscCall(MatMultEqual(A,sA,10,&flg)); PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in MatConvert(): A != sA"); /* Test MatIncreaseOverlap() */ PetscCall(PetscMalloc1(nd,&is1)); PetscCall(PetscMalloc1(nd,&is2)); for (i=0; i