--- 09?12?2????, ming zhu <foolishzhu at yahoo.com.cn> ???
???: ming zhu <foolishzhu at yahoo.com.cn>
??: Re: How to copy global data to local ?
???: "petsc-maint Maintenance" <petsc-maint at mcs.anl..gov>
??: 2009?12?2?,??,??10:32
Sorry. OK
The problem is
if I use
// n is 5 the total column number for U
ierr = MatGetSubMatrix(U,ix,iy,n, MAT_INITIAL_MATRIX,&ui);CHKERRQ(ierr);
?
when I run mpiexec -np 2 ./program
it reports
Sum of local lengths 10 does not equal global length 5, my local length 5
if I use
ierr = MatGetSubMatrix(U,ix,iy,PETSC_DECIDE,
MAT_INITIAL_MATRIX,&ui);CHKERRQ(ierr);
it reports
Only local values currently supported!
--- 09?12?2????, Barry Smith <bsmith at mcs.anl.gov> ???
???: Barry Smith <bsmith at mcs.anl.gov>
??: Re: How to copy global data to local ?
???: "PETSc users list" <petsc-users at mcs.anl.gov>, "petsc-maint Maintenance"
<petsc-maint at mcs.anl.gov>
??: 2009?12?2?,??,??3:52
? Let's move this over to petsc-maint at mcs.anl.gov to cut the traffic on
petsc-users See below.
On Dec 2, 2009, at 12:33 AM, ming zhu wrote:
> OK. I am now use MatGetSubMatrix.My code is as follows
>
>???PetscMalloc(n*sizeof(PetscInt),&indices);
>???for (j = 0; j < n; j++)
>???{
>? ? ???indices[j] = j;
>???}
>???ISCreateGeneral(PETSC_COMM_SELF,n,indices,&iy); // get all columns
>? .....
>
>? ? PetscMalloc(2*sizeof(PetscInt),&indices);
>? ???indices[0] = i;
>? ???indices[1] = j;
>?
???ISCreateGeneral(PETSC_COMM_SELF,2,indices,&ix);? ???// only get i,j rows
>
>? ???Mat ui,uj;
> // I am not sure how to set the third parameter : how many "local " columns.
> Since I want all columns, I set it to n
>? ? ? ierr = MatGetSubMatrix(U,ix,iy,n, MAT_INITIAL_MATRIX,&ui);CHKERRQ(ierr);
>
> What I really hope is to
>
>? ???for (i = 0; i < n; i++)
> {
>? ? ? ? ? ? ? ???PetscInt row = 0;
>? ? ? ? ???MatGetValues(ui,1,&row,1,&i,&u_ik);
> }
> It does not work. I tried to change the n to PETSC_DECIDE, it still does not
> work
? ? ? ^^^^^^^^^^^^^^^? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???^^^^^^^^^^^^^^^^^
???Saying "it does not work" is extremely uninformative and makes it difficult
for us to know what happened and thus make useful suggestions. Please say
exactly what goes wrong and cut and paste all error messages. At this point we
would be totally guessing what is happening.
???Barry
>
> So, I really doubt that whether I can get the entire row of the matrix.
>
> BTW, the matrix is created as follows:
>?
>MatCreateMPIDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,&U)
>
> THank you
> --- 09?12?2????, Barry Smith <bsmith at mcs.anl.gov> ???
>
> ???: Barry Smith <bsmith at mcs.anl.gov>
> ??: Re: How to copy global data to local ?
> ???: "PETSc users list" <petsc-users at mcs.anl.gov>
> ??: 2009?12?2?,??,??1:46
>
>
>? ? Don't know what MatGetSubMatrixRaw() is, but based on the calling sequence
>you are asking for the ith row whatever that is, and n columns in the array
>indices
>
>? ? For MatGetSubMatrix() each process can ask for any rows it wants, but all
>the processors have to ask for the same columns that are wanted.
>
>? ? Barry
>
> On Dec 1, 2009, at 9:59 PM, ming zhu wrote:
>
> > Hi
> > I tried MatGetSubMatrix() but I am a little confused
by the column parameter. For example
> > My matrix is U (m * n). I want to get i,j rows to local.
> > my code is
> >
> > PetscInt* rowindex,colindex;
> > PetscMalloc...
> > for (k= 0; k < n; k++)
> >? ? colindex[k] = k;
> >
> > rowindex[0] = i;
> > rowindex[1] = j;
> >
> > MatGetSubMatrixRaw(U,1,&i,n,indices,n,MAT_INITIAL_MATRIX,&newmat);
> >
> > What I hope is newmat is 2 * n matrix. But I failed.
> >
> > Thank you
> >
> >
> > --- 09?12?1????, Barry Smith <bsmith at mcs.anl.gov> ???
> >
> > ???: Barry Smith <bsmith at mcs.anl.gov>
> > ??:
Re: How to copy global data to local ?
> > ???: "PETSc users list" <petsc-users at mcs.anl.gov>
> > ??: 2009?12?1?,??,??10:35
> >
> >
> >? ? You misunderstand the usage of MatGetSubMatrix(). Any process can
> >request ANY row, including rows that are not originally owned by that
> >process.
> >
> >? ? Barry
> >
> > On Dec 1, 2009, at 8:29 AM, ming zhu wrote:
> >
> > > It seems that MatGetSubMatrix() only get the local matrix for the
> > > processor? If U is global(PETSC_COMM_WORLD), the local matrix may not
> > > store the column or row I wanted. For example, if U is 4*4, and there are
> > > 4 processors, processors one has local matrix 2*2, but i need the third
> > > row, Then,MatGetSubmatrix() may not work
> > >
> >
> --- 09?12?1????, Barry Smith <bsmith at mcs.anl.gov> ???
> > >
> > > ???: Barry Smith <bsmith at mcs.anl.gov>
> > > ??: Re: How to copy global data to local ?
> > > ???: "PETSc users list" <petsc-users at mcs.anl.gov>
> > > ??: 2009?12?1?,??,??10:23
> > >
> > >
> > > On Nov 30, 2009, at 11:21 PM, ming zhu wrote:
> > >
> > > > Hi
> > > > I have a huge matrix U for all processors (PETSC_COMM_WORLD). I only
> > > > want to copy only two rows (i,j) for each local processor. i,j is
> > > > different for each
processor and not related to rank.? I was trying to use a vector filter (like,
00000010000). However, if the vector is PETSC_COMM_WORLD, it will be changed by
different processor. So, how to make it ?
> > >? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
> > >? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
> > >? ? ? ? ? ? ? ? ? ? ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > >
> > >? ? I do not understand what this means. To do the multiply
you can and should use a vector of PETSC_COMM_WORLD.
> > >
> > >? ? Also multiplying by a vector will not give you back "rows" of a
> > >matrix. Do you truly want the entire row of nonzeros of the matrix or
> > >something else. If you want the entire row or part of a row then you can
> > >use MatGetSubMatrix().
> > >
> > >? ? Barry
> > >
> > > > Thank you
> > > >
> > > > My original code is
> > > >
> > > > Vec filter
> > > > VecCreate(PETSC_COMM_WORLD,&filter);
> > > > VecSetsizes(filter,PETSC_DECIDE,m);
> > > > VecSetFromOptions(filter);
> > > >
> > > > Vecset(filter,0);
> > > > VecSetValue(filter,i,1,INSERT_VALUES);
> > > >
> > > > ...
> > > > MatMult(U, filter,ui);
>
> > >
> > > > If I create filter with PETSC_COMM_SELF, it is impossible for U and
> > > > filter to multiply.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > ?????????????????
> > >
> > >
> > > ?????????????????
> >
> >
> > ?????????????????
>
>
> ?????????????????
?????????????????
___________________________________________________________
?????????????????
http://card.mail.cn.yahoo.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20091203/b96e3fee/attachment.htm>