static char help[] = "Tests MatInvertVariableBlockEnvelope()\n\n"; #include extern PetscErrorCode MatIsDiagonal(Mat); extern PetscErrorCode BuildMatrix(const PetscInt*, PetscInt,const PetscInt *,Mat*); int main(int argc,char **argv) { Mat A,C,D,F; PetscInt i,j,rows[2],*parts,cnt, N = 21,nblocks,*blocksizes; PetscScalar values[2][2]; PetscReal rand; PetscRandom rctx; PetscMPIInt size; PetscCall(PetscInitialize(&argc,&argv,(char*) 0,help)); PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_DENSE)); PetscCall(MatCreate(PETSC_COMM_WORLD,&C)); PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,6,18)); PetscCall(MatSetFromOptions(C)); PetscCall(MatSetUp(C)); values[0][0] = 2; values[0][1] = 1; values[1][0] = 1; values[1][1] = 2; for (i=0;i<3;i++){ rows[0] = 2*i; rows[1] = 2*i + 1; PetscCall(MatSetValues(C,2,rows,2,rows,(PetscScalar*)values,INSERT_VALUES)); } PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); PetscCall(MatView(C,PETSC_VIEWER_STDOUT_WORLD)); PetscCall(MatMatTransposeMult(C,C,MAT_INITIAL_MATRIX,PETSC_DETERMINE,&A)); PetscCall(MatView(A,PETSC_VIEWER_STDOUT_WORLD)); PetscCall(MatInvertVariableBlockEnvelope(A,MAT_INITIAL_MATRIX,&D)); PetscCall(MatView(D,PETSC_VIEWER_STDOUT_WORLD)); PetscCall(MatMatMult(A,D,MAT_INITIAL_MATRIX,1.0,&F)); PetscCall(MatView(F,PETSC_VIEWER_STDOUT_WORLD)); PetscCall(MatIsDiagonal(F)); PetscCall(MatDestroy(&A)); PetscCall(MatDestroy(&D)); PetscCall(MatDestroy(&C)); PetscCall(MatDestroy(&F)); PetscCall(PetscRandomCreate(PETSC_COMM_SELF,&rctx)); PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); PetscCall(PetscMalloc1(size,&parts)); for (j=0; j<128; j++) { cnt = 0; for (i=0; i