static char help[] = "Tests the use of interface functions for MATIS matrices.\n\ This example tests: MatZeroRows(), MatZeroRowsLocal(), MatView(), MatDuplicate(),\n\ MatCopy(), MatCreateSubMatrix(), MatGetLocalSubMatrix(), MatAXPY(), MatShift()\n\ MatDiagonalSet(), MatTranspose() and MatPtAP(). It also tests some\n\ conversion routines.\n"; #include PetscErrorCode TestMatZeroRows(Mat,Mat,PetscBool,IS,PetscScalar); PetscErrorCode CheckMat(Mat,Mat,PetscBool,const char*); int main(int argc,char **args) { Mat A,B,A2,B2,T; Mat Aee,Aeo,Aoe,Aoo; Mat *mats; Vec x,y; MatInfo info; ISLocalToGlobalMapping cmap,rmap; IS is,is2,reven,rodd,ceven,codd; IS *rows,*cols; MatType lmtype; PetscScalar diag = 2.; PetscInt n,m,i; PetscInt rst,ren,cst,cen,nr,nc; PetscMPIInt rank,size; PetscBool testT,squaretest,isaij; PetscBool permute = PETSC_FALSE; PetscBool diffmap = PETSC_TRUE, symmetric = PETSC_FALSE; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); m = n = 2*size; ierr = PetscOptionsGetBool(NULL,NULL,"-symmetric",&symmetric,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); if (size > 1 && m < 4) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,"Number of rows should be larger or equal 4 for parallel runs"); if (size == 1 && m < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,"Number of rows should be larger or equal 2 for uniprocessor runs"); if (n < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,"Number of cols should be larger or equal 2"); if (symmetric) m = n = PetscMax(m,n); /* create a MATIS matrix */ ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,m,n);CHKERRQ(ierr); ierr = MatSetType(A,MATIS);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); /* This is not the proper setting for MATIS for finite elements, it is just used to test the routines */ ierr = ISCreateStride(PETSC_COMM_WORLD,n,0,1,&is);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingCreateIS(is,&cmap);CHKERRQ(ierr); ierr = ISDestroy(&is);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,NULL,"-permmap",&permute,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,NULL,"-diffmap",&diffmap,NULL);CHKERRQ(ierr); if (!symmetric && (diffmap || m != n)) { ierr = ISCreateStride(PETSC_COMM_WORLD,m,permute ? m -1 : 0,permute ? -1 : 1,&is);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingCreateIS(is,&rmap);CHKERRQ(ierr); ierr = ISDestroy(&is);CHKERRQ(ierr); if (m==n && !permute) squaretest = PETSC_TRUE; else squaretest = PETSC_FALSE; } else { ierr = PetscObjectReference((PetscObject)cmap);CHKERRQ(ierr); rmap = cmap; squaretest = PETSC_TRUE; } ierr = MatSetLocalToGlobalMapping(A,rmap,cmap);CHKERRQ(ierr); ierr = MatISStoreL2L(A,PETSC_FALSE);CHKERRQ(ierr); ierr = MatISSetPreallocation(A,3,NULL,0,NULL);CHKERRQ(ierr); for (i=0; i 3) { ierr = ISCreateStride(PETSC_COMM_WORLD,1,3,1,&is2);CHKERRQ(ierr); } else { ierr = ISCreateStride(PETSC_COMM_WORLD,0,0,1,&is2);CHKERRQ(ierr); } } else if (rank == 2 && n > 4) { ierr = ISCreateStride(PETSC_COMM_WORLD,0,0,1,&is);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_WORLD,n-4,4,1,&is2);CHKERRQ(ierr); } else { ierr = ISCreateStride(PETSC_COMM_WORLD,0,0,1,&is);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_WORLD,0,0,1,&is2);CHKERRQ(ierr); } ierr = MatCreateSubMatrix(A,is,is,MAT_INITIAL_MATRIX,&A2);CHKERRQ(ierr); ierr = MatCreateSubMatrix(B,is,is,MAT_INITIAL_MATRIX,&B2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_TRUE,"first MatCreateSubMatrix");CHKERRQ(ierr); ierr = MatCreateSubMatrix(A,is,is,MAT_REUSE_MATRIX,&A2);CHKERRQ(ierr); ierr = MatCreateSubMatrix(B,is,is,MAT_REUSE_MATRIX,&B2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"reuse MatCreateSubMatrix");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); if (!symmetric) { ierr = MatCreateSubMatrix(A,is,is2,MAT_INITIAL_MATRIX,&A2);CHKERRQ(ierr); ierr = MatCreateSubMatrix(B,is,is2,MAT_INITIAL_MATRIX,&B2);CHKERRQ(ierr); ierr = MatCreateSubMatrix(A,is,is2,MAT_REUSE_MATRIX,&A2);CHKERRQ(ierr); ierr = MatCreateSubMatrix(B,is,is2,MAT_REUSE_MATRIX,&B2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"second MatCreateSubMatrix");CHKERRQ(ierr); } ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); ierr = ISDestroy(&is);CHKERRQ(ierr); ierr = ISDestroy(&is2);CHKERRQ(ierr); /* Create an IS required by MatZeroRows(): just rank zero provides the rows to be eliminated */ if (size > 1) { if (rank == 0) { PetscInt st,len; st = (m+1)/2; len = PetscMin(m/2,PetscMax(m-(m+1)/2-1,0)); ierr = ISCreateStride(PETSC_COMM_WORLD,len,st,1,&is);CHKERRQ(ierr); } else { ierr = ISCreateStride(PETSC_COMM_WORLD,0,0,1,&is);CHKERRQ(ierr); } } else { ierr = ISCreateStride(PETSC_COMM_WORLD,1,0,1,&is);CHKERRQ(ierr); } if (squaretest) { /* tests for square matrices only, with same maps for rows and columns */ /* test MatDiagonalSet */ ierr = PetscPrintf(PETSC_COMM_WORLD,"Test MatDiagonalSet\n");CHKERRQ(ierr); ierr = MatDuplicate(A,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatDuplicate(B,MAT_COPY_VALUES,&B2);CHKERRQ(ierr); ierr = MatCreateVecs(A,NULL,&x);CHKERRQ(ierr); ierr = VecSetRandom(x,NULL);CHKERRQ(ierr); ierr = MatDiagonalSet(A2,x,INSERT_VALUES);CHKERRQ(ierr); ierr = MatDiagonalSet(B2,x,INSERT_VALUES);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"MatDiagonalSet");CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); /* test MatShift (MatShift_IS internally uses MatDiagonalSet_IS with ADD_VALUES) */ ierr = PetscPrintf(PETSC_COMM_WORLD,"Test MatShift\n");CHKERRQ(ierr); ierr = MatDuplicate(A,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatDuplicate(B,MAT_COPY_VALUES,&B2);CHKERRQ(ierr); ierr = MatShift(A2,2.0);CHKERRQ(ierr); ierr = MatShift(B2,2.0);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"MatShift");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); /* nonzero diag value is supported for square matrices only */ ierr = TestMatZeroRows(A,B,PETSC_TRUE,is,diag);CHKERRQ(ierr); } ierr = TestMatZeroRows(A,B,squaretest,is,0.0);CHKERRQ(ierr); ierr = ISDestroy(&is);CHKERRQ(ierr); /* test MatTranspose */ ierr = PetscPrintf(PETSC_COMM_WORLD,"Test MatTranspose\n");CHKERRQ(ierr); ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&A2);CHKERRQ(ierr); ierr = MatTranspose(B,MAT_INITIAL_MATRIX,&B2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"initial matrix MatTranspose");CHKERRQ(ierr); ierr = MatTranspose(A,MAT_REUSE_MATRIX,&A2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"reuse matrix (not in place) MatTranspose");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDuplicate(A,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatTranspose(A2,MAT_INPLACE_MATRIX,&A2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"reuse matrix (in place) MatTranspose");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&A2);CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"reuse matrix (different type) MatTranspose");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); /* test MatISFixLocalEmpty */ if (isaij) { PetscInt r[2]; r[0] = 0; r[1] = PetscMin(m,n)-1; ierr = PetscPrintf(PETSC_COMM_WORLD,"Test MatISFixLocalEmpty\n");CHKERRQ(ierr); ierr = MatDuplicate(A,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatISFixLocalEmpty(A2,PETSC_TRUE);CHKERRQ(ierr); ierr = MatAssemblyBegin(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = CheckMat(A2,B,PETSC_FALSE,"MatISFixLocalEmpty (null)");CHKERRQ(ierr); ierr = MatZeroRows(A2,2,r,0.0,NULL,NULL);CHKERRQ(ierr); ierr = MatViewFromOptions(A2,NULL,"-fixempty_view");CHKERRQ(ierr); ierr = MatDuplicate(B,MAT_COPY_VALUES,&B2);CHKERRQ(ierr); ierr = MatZeroRows(B2,2,r,0.0,NULL,NULL);CHKERRQ(ierr); ierr = MatISFixLocalEmpty(A2,PETSC_TRUE);CHKERRQ(ierr); ierr = MatAssemblyBegin(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatViewFromOptions(A2,NULL,"-fixempty_view");CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"MatISFixLocalEmpty (rows)");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDuplicate(A,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatZeroRows(A2,2,r,0.0,NULL,NULL);CHKERRQ(ierr); ierr = MatTranspose(A2,MAT_INPLACE_MATRIX,&A2);CHKERRQ(ierr); ierr = MatTranspose(B2,MAT_INPLACE_MATRIX,&B2);CHKERRQ(ierr); ierr = MatViewFromOptions(A2,NULL,"-fixempty_view");CHKERRQ(ierr); ierr = MatISFixLocalEmpty(A2,PETSC_TRUE);CHKERRQ(ierr); ierr = MatAssemblyBegin(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatViewFromOptions(A2,NULL,"-fixempty_view");CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"MatISFixLocalEmpty (cols)");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); if (squaretest) { ierr = MatDuplicate(A,MAT_COPY_VALUES,&A2);CHKERRQ(ierr); ierr = MatDuplicate(B,MAT_COPY_VALUES,&B2);CHKERRQ(ierr); ierr = MatZeroRowsColumns(A2,2,r,0.0,NULL,NULL);CHKERRQ(ierr); ierr = MatZeroRowsColumns(B2,2,r,0.0,NULL,NULL);CHKERRQ(ierr); ierr = MatViewFromOptions(A2,NULL,"-fixempty_view");CHKERRQ(ierr); ierr = MatISFixLocalEmpty(A2,PETSC_TRUE);CHKERRQ(ierr); ierr = MatAssemblyBegin(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatViewFromOptions(A2,NULL,"-fixempty_view");CHKERRQ(ierr); ierr = CheckMat(A2,B2,PETSC_FALSE,"MatISFixLocalEmpty (rows+cols)");CHKERRQ(ierr); ierr = MatDestroy(&A2);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); } } /* test MatInvertBlockDiagonal special cases for block-diagonal matrices */ if (m == n) { ISLocalToGlobalMapping map; Mat Abd,Bbd; IS is,bis; const PetscScalar *isbd,*aijbd; PetscScalar *vals; const PetscInt *sts,*idxs; PetscInt *idxs2,diff,perm,nl,bs,st,en,in; PetscBool ok; for (diff = 0; diff < 3; diff++) { for (perm = 0; perm < 3; perm++) { for (bs = 1; bs < 4; bs++) { ierr = PetscPrintf(PETSC_COMM_WORLD,"Test MatInvertBlockDiagonal blockdiag %D %D %D %D\n",n,diff,perm,bs);CHKERRQ(ierr); ierr = PetscMalloc1(bs*bs,&vals);CHKERRQ(ierr); ierr = MatGetOwnershipRanges(A,&sts);CHKERRQ(ierr); switch (diff) { case 1: /* inverted layout by processes */ in = 1; st = sts[size - rank - 1]; en = sts[size - rank]; nl = en - st; break; case 2: /* round-robin layout */ in = size; st = rank; nl = n/size; if (rank < n%size) nl++; break; default: /* same layout */ in = 1; st = sts[rank]; en = sts[rank + 1]; nl = en - st; break; } ierr = ISCreateStride(PETSC_COMM_WORLD,nl,st,in,&is);CHKERRQ(ierr); ierr = ISGetLocalSize(is,&nl);CHKERRQ(ierr); ierr = ISGetIndices(is,&idxs);CHKERRQ(ierr); ierr = PetscMalloc1(nl,&idxs2);CHKERRQ(ierr); for (i=0;i PETSC_SMALL) ok = PETSC_FALSE; if (!ok) { ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] ERROR block %d, entry %d %d: %g %g\n",rank,i,b1,b2,isbd[i*bs*bs+b1*bs + b2],aijbd[i*bs*bs+b1*bs + b2]);CHKERRQ(ierr); break; } } if (!ok) break; } if (!ok) break; } ierr = MatDestroy(&Abd);CHKERRQ(ierr); ierr = MatDestroy(&Bbd);CHKERRQ(ierr); ierr = PetscFree(vals);CHKERRQ(ierr); ierr = ISDestroy(&is);CHKERRQ(ierr); ierr = ISDestroy(&bis);CHKERRQ(ierr); } } } } /* free testing matrices */ ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = MatDestroy(&B);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; } PetscErrorCode CheckMat(Mat A, Mat B, PetscBool usemult, const char* func) { Mat Bcheck; PetscReal error; PetscErrorCode ierr; PetscFunctionBeginUser; if (!usemult && B) { PetscBool hasnorm; ierr = MatHasOperation(B,MATOP_NORM,&hasnorm);CHKERRQ(ierr); if (!hasnorm) usemult = PETSC_TRUE; } if (!usemult) { if (B) { MatType Btype; ierr = MatGetType(B,&Btype);CHKERRQ(ierr); ierr = MatConvert(A,Btype,MAT_INITIAL_MATRIX,&Bcheck);CHKERRQ(ierr); } else { ierr = MatConvert(A,MATAIJ,MAT_INITIAL_MATRIX,&Bcheck);CHKERRQ(ierr); } if (B) { /* if B is present, subtract it */ ierr = MatAXPY(Bcheck,-1.,B,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); } ierr = MatNorm(Bcheck,NORM_INFINITY,&error);CHKERRQ(ierr); if (error > PETSC_SQRT_MACHINE_EPSILON) { ISLocalToGlobalMapping rl2g,cl2g; ierr = PetscObjectSetName((PetscObject)Bcheck,"Assembled Bcheck");CHKERRQ(ierr); ierr = MatView(Bcheck,NULL);CHKERRQ(ierr); if (B) { ierr = PetscObjectSetName((PetscObject)B,"Assembled AIJ");CHKERRQ(ierr); ierr = MatView(B,NULL);CHKERRQ(ierr); ierr = MatDestroy(&Bcheck);CHKERRQ(ierr); ierr = MatConvert(A,MATAIJ,MAT_INITIAL_MATRIX,&Bcheck);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)Bcheck,"Assembled IS");CHKERRQ(ierr); ierr = MatView(Bcheck,NULL);CHKERRQ(ierr); } ierr = MatDestroy(&Bcheck);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)A,"MatIS");CHKERRQ(ierr); ierr = MatView(A,NULL);CHKERRQ(ierr); ierr = MatGetLocalToGlobalMapping(A,&rl2g,&cl2g);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingView(rl2g,NULL);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingView(cl2g,NULL);CHKERRQ(ierr); SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"ERROR ON %s: %g",func,error); } ierr = MatDestroy(&Bcheck);CHKERRQ(ierr); } else { PetscBool ok,okt; ierr = MatMultEqual(A,B,3,&ok);CHKERRQ(ierr); ierr = MatMultTransposeEqual(A,B,3,&okt);CHKERRQ(ierr); if (!ok || !okt) SETERRQ3(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"ERROR ON %s: mult ok ? %d, multtranspose ok ? %d",func,ok,okt); } PetscFunctionReturn(0); } PetscErrorCode TestMatZeroRows(Mat A, Mat Afull, PetscBool squaretest, IS is, PetscScalar diag) { Mat B,Bcheck,B2 = NULL,lB; Vec x = NULL, b = NULL, b2 = NULL; ISLocalToGlobalMapping l2gr,l2gc; PetscReal error; char diagstr[16]; const PetscInt *idxs; PetscInt rst,ren,i,n,N,d; PetscMPIInt rank; PetscBool miss,haszerorows; PetscErrorCode ierr; PetscFunctionBeginUser; if (diag == 0.) { ierr = PetscStrcpy(diagstr,"zero");CHKERRQ(ierr); } else { ierr = PetscStrcpy(diagstr,"nonzero");CHKERRQ(ierr); } ierr = ISView(is,NULL);CHKERRQ(ierr); ierr = MatGetLocalToGlobalMapping(A,&l2gr,&l2gc);CHKERRQ(ierr); /* tests MatDuplicate and MatCopy */ if (diag == 0.) { ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); } else { ierr = MatDuplicate(A,MAT_DO_NOT_COPY_VALUES,&B);CHKERRQ(ierr); ierr = MatCopy(A,B,SAME_NONZERO_PATTERN);CHKERRQ(ierr); } ierr = MatISGetLocalMat(B,&lB);CHKERRQ(ierr); ierr = MatHasOperation(lB,MATOP_ZERO_ROWS,&haszerorows);CHKERRQ(ierr); if (squaretest && haszerorows) { ierr = MatCreateVecs(B,&x,&b);CHKERRQ(ierr); ierr = MatDuplicate(B,MAT_COPY_VALUES,&B2);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMapping(b,l2gr);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMapping(x,l2gc);CHKERRQ(ierr); ierr = VecSetRandom(x,NULL);CHKERRQ(ierr); ierr = VecSetRandom(b,NULL);CHKERRQ(ierr); /* mimic b[is] = x[is] */ ierr = VecDuplicate(b,&b2);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMapping(b2,l2gr);CHKERRQ(ierr); ierr = VecCopy(b,b2);CHKERRQ(ierr); ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr); ierr = ISGetIndices(is,&idxs);CHKERRQ(ierr); ierr = VecGetSize(x,&N);CHKERRQ(ierr); for (i=0;i PETSC_SQRT_MACHINE_EPSILON) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"ERROR IN ZEROROWS ON B %g (diag %s)",error,diagstr); } /* test MatMissingDiagonal */ ierr = PetscPrintf(PETSC_COMM_WORLD,"Test MatMissingDiagonal\n");CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); ierr = MatMissingDiagonal(B,&miss,&d);CHKERRQ(ierr); ierr = MatGetOwnershipRange(B,&rst,&ren);CHKERRQ(ierr); ierr = PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD, "[%d] [%D,%D) Missing %d, row %D (diag %s)\n",rank,rst,ren,(int)miss,d,diagstr);CHKERRQ(ierr); ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&b);CHKERRQ(ierr); ierr = VecDestroy(&b2);CHKERRQ(ierr); /* check the result of ZeroRows with that from MPIAIJ routines assuming that MatConvert_IS_XAIJ and MatZeroRows_MPIAIJ work fine */ if (haszerorows) { ierr = MatDuplicate(Afull,MAT_COPY_VALUES,&Bcheck);CHKERRQ(ierr); ierr = MatSetOption(Bcheck,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);CHKERRQ(ierr); ierr = MatZeroRowsIS(Bcheck,is,diag,NULL,NULL);CHKERRQ(ierr); ierr = CheckMat(B,Bcheck,PETSC_FALSE,"Zerorows");CHKERRQ(ierr); ierr = MatDestroy(&Bcheck);CHKERRQ(ierr); } ierr = MatDestroy(&B);CHKERRQ(ierr); if (B2) { /* test MatZeroRowsColumns */ ierr = MatDuplicate(Afull,MAT_COPY_VALUES,&B);CHKERRQ(ierr); ierr = MatSetOption(B,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);CHKERRQ(ierr); ierr = MatZeroRowsColumnsIS(B,is,diag,NULL,NULL);CHKERRQ(ierr); ierr = CheckMat(B2,B,PETSC_FALSE,"MatZeroRowsColumns");CHKERRQ(ierr); ierr = MatDestroy(&B);CHKERRQ(ierr); ierr = MatDestroy(&B2);CHKERRQ(ierr); } PetscFunctionReturn(0); } /*TEST test: args: -test_trans test: suffix: 2 nsize: 4 args: -matis_convert_local_nest -nr 3 -nc 4 test: suffix: 3 nsize: 5 args: -m 11 -n 10 -matis_convert_local_nest -nr 2 -nc 1 test: suffix: 4 nsize: 6 args: -m 9 -n 12 -test_trans -nr 2 -nc 7 test: suffix: 5 nsize: 6 args: -m 12 -n 12 -test_trans -nr 3 -nc 1 test: suffix: 6 args: -m 12 -n 12 -test_trans -nr 2 -nc 3 -diffmap test: suffix: 7 args: -m 12 -n 12 -test_trans -nr 2 -nc 3 -diffmap -permmap test: suffix: 8 args: -m 12 -n 17 -test_trans -nr 2 -nc 3 -permmap test: suffix: 9 nsize: 5 args: -m 12 -n 12 -test_trans -nr 2 -nc 3 -diffmap test: suffix: 10 nsize: 5 args: -m 12 -n 12 -test_trans -nr 2 -nc 3 -diffmap -permmap test: suffix: vscat_default nsize: 5 args: -m 12 -n 17 -test_trans -nr 2 -nc 3 -permmap output_file: output/ex23_11.out test: suffix: 12 nsize: 3 args: -m 12 -n 12 -symmetric -matis_localmat_type sbaij -test_trans -nr 2 -nc 3 testset: output_file: output/ex23_13.out nsize: 3 args: -m 12 -n 17 -test_trans -nr 2 -nc 3 -diffmap -permmap filter: grep -v "type:" test: suffix: baij args: -matis_localmat_type baij test: requires: viennacl suffix: viennacl args: -matis_localmat_type aijviennacl test: requires: cuda suffix: cusparse args: -matis_localmat_type aijcusparse TEST*/