<div dir="ltr"><div><div>Thanks for your previous suggestion and the construction from little m to big M have accomplished. <br><br></div>For a MPI program, a arbitrary matrix is been shorted in different cups (i.e. 3), and each cup only contain part of then. So I think the matrix have two kinds of indexes, a local one indicate the location of values at the corresponding cup, and the global one indicate the location at the whole matrix. I would like to know the relation between them and find the way to shift the index from one to another. <br><br></div>I have one more question, the function VecGetArray() only return a pointer to the local data array. What should I do if I need a pointer to the whole data array? <br></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">Wayne</div></div>
<br><div class="gmail_quote">On Sat, Sep 17, 2016 at 9:00 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On Sep 16, 2016, at 7:52 PM, Ji Zhang <<a href="mailto:gotofd@gmail.com">gotofd@gmail.com</a>> wrote:<br>
><br>
> Sorry. What I mean is that, for example, I have a matrix<br>
>             [a1, a2, a3]<br>
>     mij = [b1, b2, b3] ,<br>
>             [c1, c2, c3]<br>
> and using 3 cups. Thus, mij in cpu 2 is<br>
>     mij_2 = [b1, b2, b3] .<br>
><br>
> The local index of element b1 is (1, 1) and it's global index is (2, 1). How can I get the global index from the local index, and local index from global index?<br>
<br>
</span>   That is something your code needs to generate and deal with, it is not something PETSc can do for you directly. You are defining the little m's and the big M and deciding where to put the little m's into the big ends. PETSc/we have no idea what the little m's represent in terms of the big M and where they would belong, that is completely the business of your application.<br>
<span class="HOEnZb"><font color="#888888"><br>
   Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
<br>
><br>
> Thanks.<br>
> 2016-09-17<br>
> Best,<br>
> Regards,<br>
> Zhang Ji<br>
> Beijing Computational Science Research Center<br>
> E-mail: <a href="mailto:gotofd@gmail.com">gotofd@gmail.com</a><br>
><br>
><br>
><br>
><br>
> Wayne<br>
><br>
> On Sat, Sep 17, 2016 at 2:24 AM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
>    "Gives wrong answers" is not very informative. What answer do you expect and what answer do you get?<br>
><br>
>   Note that each process is looping over mSizes?<br>
><br>
> for i in range(len(mSizes)):<br>
>     for j in range(len(mSizes)):<br>
><br>
>   Is this what you want? It doesn't seem likely that you want all processes to generate all information in the matrix. Each process should be doing a subset of the generation.<br>
><br>
>    Barry<br>
><br>
> > On Sep 16, 2016, at 11:03 AM, Ji Zhang <<a href="mailto:gotofd@gmail.com">gotofd@gmail.com</a>> wrote:<br>
> ><br>
> > Dear all,<br>
> ><br>
> > I have a number of small 'mpidense' matrices mij, and I want to construct them to a big 'mpidense' matrix M like this:<br>
> >      [  m11  m12  m13  ]<br>
> > M =  |  m21  m22  m23  |   ,<br>
> >      [  m31  m32  m33  ]<br>
> ><br>
> > And a short demo is below. I'm using python, but their grammar are similar.<br>
> > import numpy as np<br>
> > from petsc4py import PETSc<br>
> > import sys, petsc4py<br>
> ><br>
> ><br>
> > petsc4py.init(sys.argv)<br>
> > mSizes = (2, 2)<br>
> > mij = []<br>
> ><br>
> > # create sub-matrices mij<br>
> > for i in range(len(mSizes)):<br>
> >     for j in range(len(mSizes)):<br>
> >         temp_m = PETSc.Mat().create(comm=PETSc.<wbr>COMM_WORLD)<br>
> >         temp_m.setSizes(((None, mSizes[i]), (None, mSizes[j])))<br>
> >         temp_m.setType('mpidense')<br>
> >         temp_m.setFromOptions()<br>
> >         temp_m.setUp()<br>
> >         temp_m[:, :] = np.random.random_sample((<wbr>mSizes[i], mSizes[j]))<br>
> >         temp_m.assemble()<br>
> >         temp_m.view()<br>
> >         mij.append(temp_m)<br>
> ><br>
> > # Now we have four sub-matrices. I would like to construct them into a big matrix M.<br>
> > M = PETSc.Mat().create(comm=PETSc.<wbr>COMM_WORLD)<br>
> > M.setSizes(((None, np.sum(mSizes)), (None, np.sum(mSizes))))<br>
> > M.setType('mpidense')<br>
> > M.setFromOptions()<br>
> > M.setUp()<br>
> > mLocations = np.insert(np.cumsum(mSizes), 0, 0)    # mLocations = [0, mSizes]<br>
> > for i in range(len(mSizes)):<br>
> >     for j in range(len(mSizes)):<br>
> >         temp_m = mij[i*len(mSizes)+j].<wbr>getDenseArray()<br>
> >         for k in range(temp_m.shape[0]):<br>
> >             M.setValues(mLocations[i]+k, np.arange(mLocations[j],<wbr>mLocations[j+1],dtype='int32')<wbr>, temp_m[k, :])<br>
> > M.assemble()<br>
> > M.view()<br>
> > The code works well in a single cup, but give wrong answer for 2 and more cores.<br>
> ><br>
> > Thanks.<br>
> > 2016-09-17<br>
> > Best,<br>
> > Regards,<br>
> > Zhang Ji<br>
> > Beijing Computational Science Research Center<br>
> > E-mail: <a href="mailto:gotofd@gmail.com">gotofd@gmail.com</a><br>
> ><br>
> ><br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>