HiI tried?MatGetSubMatrix() but I am a little confused by the column parameter.
For exampleMy 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/20091202/37a23483/attachment.htm>