The communicator used to construct the IS must be the same communicator as
used to construct the matrix, in your case PETSC_COMM_WORLD.
Barry
I will add an error check in the maint branch to catch these bugs in the future.
It just so happens that you can use the PETSC_COMM_SELF communicator for AIJ
matrices.
> On Jul 11, 2018, at 9:54 PM, Marius Buerkle <[email protected]> wrote:
>
> here some example code which works for MPIAIJ but fails for MPIDENSE. Maybe
> you can tell me what I am doing wrong
>
>
> program submatrix
> #include <petsc/finclude/petscmat.h>
> use petscmat
> implicit none
>
> Mat :: A,B
> PetscInt ::n,m,nl1,nl2,nlc1,nlc2,nproc,iproc,i,ncols,nrow,ncol
> PetscReal :: info(MAT_INFO_SIZE)
> PetscErrorCode :: ierr
> IS :: isrow,iscol
> integer,allocatable :: irow(:),icol(:),cols(:)
> character(256) :: stype,sdummy
>
> call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
>
> call MPI_COMM_SIZE(PETSC_COMM_WORLD, nproc,ierr)
>
> call MPI_Comm_rank(PETSC_COMM_WORLD, iproc, ierr )
>
> if (nproc.ne.3) then
> if (iproc.eq.0) write(0,*) "nproc.ne.3 ",nproc
> call PetscFinalize(ierr)
> stop
> end if
>
> n=3
> m=n
>
> call
> MatCreateDense(PETSC_COMM_WORLD,1,PETSC_DECIDE,n,m,PETSC_NULL_SCALAR,A,ierr)
> call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
> call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)
>
> allocate(irow(1),icol(1))
>
> !~ call MatConvert(A,MATAIJ, MAT_INPLACE_MATRIX,A,ierr)
>
> nrow=0
> ncol=1
> icol=iproc
> if (iproc.eq.0) then
> irow=iproc
> nrow=1
> end if
> call ISCreateGeneral(PETSC_COMM_SELF,nrow,irow,&
> & PETSC_COPY_VALUES,isrow,ierr)
>
> call ISCreateGeneral(PETSC_COMM_SELF,ncol,icol,&
> & PETSC_COPY_VALUES,iscol,ierr)
>
> call MatCreateSubMatrix(A,isrow,iscol,MAT_INITIAL_MATRIX,B,ierr)
>
> call MatGetType(B,stype,ierr)
> call MatGetInfo(B, MAT_LOCAL, info,ierr)
> call MatGetOwnershipRange(B,nl1,nl2,ierr)
> call MatGetOwnershipRangeColumn(B,nlc1,nlc2,ierr)
> call MatGetSize(B,m,n,ierr)
> write(sdummy,fmt='(A,25i16)')
> trim(stype),iproc,int(info(mat_info_nz_allocated)),int(info(mat_info_nz_used)),nl1,nl2,nlc1,nlc2,m,n
> call
> PetscSynchronizedPrintf(PETSC_COMM_WORLD,trim(sdummy)//NEW_LINE('A'),ierr)
> call PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT,ierr)
>
>
> call PetscFinalize(ierr)
>
> end program submatrix
>
>
>
>
>
> i see. but i doesn't work for me. maybe I made some mistake. If not I will
> try to make some example code where it fails.
>
>
>
> > On Jul 10, 2018, at 11:50 PM, Marius Buerkle <[email protected]> wrote:
> >
> > Sorry, I have yet another question. While it works well for MPIAIJ, I end
> > up in a deadlock if I use MatCreateSubmatrix on a MPIDENSE matrix. Should
> > MatCreateSubmatrix work on dense matricies ?
>
> yes
>
> > On Mon, Jul 9, 2018 at 10:02 PM Marius Buerkle <[email protected]> wrote:
> > MatGetSubmatrix is in the current PETSc released called MatCreateSubmatrix.
> > Is this correct ?
> >
> >
> > Yep. I am old and cannot follow API changes anymore.
> >
> > Matt
> >
> > On Mon, Jul 9, 2018 at 8:38 PM Marius Buerkle <[email protected]> wrote:
> > I see. What I want to do is to calculate the matrix product C=A*B' between
> > two sparse matrices A=(A11 0 , A21 0) and B=(B11 0 , B21 0) where C will be
> > dense in the end but I just want to calculate some selected entries C_ij of
> > C. At the moment I extract submatricies for the corresponding rows and
> > columns,
> >
> > I think that is the right way, but you should only need MatGetSubmatrix for
> > that.
> >
> > Thanks,
> >
> > Matt
> >
> > so I was wondering if there is a simpler or performancer-wise faster way. I
> > assume there is not such thing as a restricted MatMatMul which just
> > calculated the lets say predefined nonzero entries of C.
> >
> >
> > These are "internal" routines that we rarely expect end users to use since
> > they are specific for particular matrix implementations. As such they are
> > also kind of strange to use from Fortran since none of the AIJ data
> > structures can be made visible to Fortran.
> >
> > Could you explain why you want them from Fortran and maybe we'll have
> > alternative suggestions on how you can achieve the same effect.
> >
> > Barry
> >
> >
> > > On Jul 5, 2018, at 3:05 AM, Marius Buerkle <[email protected]> wrote:
> > >
> > > or MatMPIAIJGetLocalMatCondensed for that matter.
> > >
> > >
> > >
> > > Hi !
> > >
> > > Is MatMPIAIJGetSeqAIJ implemented for fortran?
> > >
> > > best,
> > > Marius
> >
> >
> >
> > --
> > What most experimenters take for granted before they begin their
> > experiments is infinitely more interesting than any results to which their
> > experiments lead.
> > -- Norbert Wiener
> >
> > https://www.cse.buffalo.edu/~knepley/
> >
> >
> > --
> > What most experimenters take for granted before they begin their
> > experiments is infinitely more interesting than any results to which their
> > experiments lead.
> > -- Norbert Wiener
> >
> > https://www.cse.buffalo.edu/~knepley/
>