<div dir="ltr"><div><div>Sorry. What I mean is that, for example, I have a matrix <br>            [a1, a2, a3]<br></div>    mij = [b1, b2, b3] , <br></div>            [c1, c2, c3]<br><div>and using 3 cups. Thus, mij in cpu 2 is <br></div><div>    mij_2 = [b1, b2, b3] .<br><br></div><div>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></div><div>Thanks. <br><div>2016-09-17</div><span><span><span><div>Best, </div><div>Regards,</div><div>Zhang Ji </div><div>Beijing Computational Science Research Center </div><div>E-mail: <a target="_blank" href="mailto:gotofd@gmail.com">gotofd@gmail.com</a><br></div></span></span></span><br><br><br></div></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 2:24 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"><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>
<span class=""><br>
for i in range(len(mSizes)):<br>
    for j in range(len(mSizes)):<br>
<br>
</span>  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>
<span class="HOEnZb"><font color="#888888"><br>
   Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><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>
</div></div></blockquote></div><br></div>