... >> Calling MatGetLocalSubMatrix results in an error: >> >> [0]PETSC ERROR: --------------------- Error Message >> -------------------------------------------------------------- >> [0]PETSC ERROR: Petsc has generated inconsistent data >> [0]PETSC ERROR: Blocksize of localtoglobalmapping 1 must match that of >> layout 2 > > Hmm, I'm concerned that this might not work right after some recent > changes to ISLocalToGlobalMapping. Can you reproduce this with some > code I can run?
Here we go: #include <petsc.h> int main(int argc, char **argv) { PetscErrorCode ierr; DM v; DM p; DM pack; PetscSection vsec; PetscSection psec; PetscInt rbs, cbs; PetscInt srbs, scbs; Mat mat; Mat submat; IS *ises; MPI_Comm c; PetscInitialize(&argc, &argv, NULL, NULL); c = PETSC_COMM_WORLD; ierr = DMDACreate1d(c, DM_BOUNDARY_NONE, 10, 2, 1, NULL, &v); CHKERRQ(ierr); ierr = DMDACreate1d(c, DM_BOUNDARY_NONE, 10, 1, 1, NULL, &p); CHKERRQ(ierr); ierr = DMSetFromOptions(v); CHKERRQ(ierr); ierr = DMSetFromOptions(p); CHKERRQ(ierr); ierr = DMCreateMatrix(v, &mat); CHKERRQ(ierr); ierr = MatGetBlockSizes(mat, &rbs, &cbs); CHKERRQ(ierr); ierr = PetscPrintf(c, "Global Mat block size (%d, %d)\n", rbs, cbs); CHKERRQ(ierr); ierr = DMCompositeCreate(c, &pack); CHKERRQ(ierr); ierr = DMCompositeAddDM(pack, v); CHKERRQ(ierr); ierr = DMCompositeAddDM(pack, p); CHKERRQ(ierr); ierr = DMSetFromOptions(pack); CHKERRQ(ierr); ierr = DMCompositeGetLocalISs(pack, &ises); CHKERRQ(ierr); ierr = DMCreateMatrix(pack, &mat); CHKERRQ(ierr); ierr = MatGetBlockSizes(mat, &rbs, &cbs); CHKERRQ(ierr); ierr = PetscPrintf(c, "Global Mat block size (%d, %d)\n", rbs, cbs); CHKERRQ(ierr); ierr = MatGetLocalSubMatrix(mat, ises[0], ises[0], &submat); CHKERRQ(ierr); ierr = MatGetBlockSizes(submat, &srbs, &scbs); CHKERRQ(ierr); ierr = PetscPrintf(c, "Local Mat block size (%d, %d)\n", srbs, scbs); CHKERRQ(ierr); ierr = MatDestroy(&submat); CHKERRQ(ierr); ierr = MatDestroy(&mat); CHKERRQ(ierr); ierr = PetscSectionDestroy(&vsec); CHKERRQ(ierr); ierr = PetscSectionDestroy(&psec); CHKERRQ(ierr); ierr = DMDestroy(&pack); CHKERRQ(ierr); ierr = DMDestroy(&v); CHKERRQ(ierr); ierr = DMDestroy(&p); CHKERRQ(ierr); ierr = ISDestroy(&(ises[0])); CHKERRQ(ierr); ierr = ISDestroy(&(ises[1])); CHKERRQ(ierr); ierr = PetscFree(ises); CHKERRQ(ierr); PetscFinalize(); return 0; } Cheers, Lawrence
signature.asc
Description: Message signed with OpenPGP using GPGMail