On Thu, Apr 19, 2012 at 10:18 AM, Zhenglun (Alan) Wei <span dir="ltr">&lt;<a href="mailto:zhenglun.wei@gmail.com">zhenglun.wei@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>
      <div>
        <div>&quot;</div>
        <div>    TESTVAR ***a, ***b, ***c;</div>
        <div>    TESTVAR **aa, **bb, **cc; </div>
        <div>    TESTVAR *arraya, *arrayb, *arrayc;</div>
      </div>
      <div><br>
      </div>
      <div>    arraya = (TESTVAR*) calloc(SIZE*SIZE*SIZE,
        sizeof(TESTVAR));</div>
      <div>    arrayb = (TESTVAR*) calloc(SIZE*SIZE*SIZE,
        sizeof(TESTVAR));</div>
      <div>    arrayc = (TESTVAR*) calloc(SIZE*SIZE*SIZE,
        sizeof(TESTVAR));</div>
      <div><br>
      </div>
      <div>    aa =(TESTVAR**) calloc(SIZE*SIZE, sizeof(TESTVAR*));</div>
      <div>    bb =(TESTVAR**) calloc(SIZE*SIZE, sizeof(TESTVAR*));</div>
      <div>    cc =(TESTVAR**) calloc(SIZE*SIZE, sizeof(TESTVAR*));</div>
      <div>    </div>
      <div>    for(i = 0; i &lt; SIZE*SIZE; i++) {</div>
      <div>      aa[i] = &amp;arraya[i*SIZE];</div>
      <div>      bb[i] = &amp;arrayb[i*SIZE];</div>
      <div>      cc[i] = &amp;arrayc[i*SIZE]; </div>
      <div>    }</div>
      <div><br>
      </div>
      <div>    a =(TESTVAR***) calloc(SIZE*SIZE, sizeof(TESTVAR**));</div>
      <div>    b =(TESTVAR***) calloc(SIZE*SIZE, sizeof(TESTVAR**));</div>
      <div>    c =(TESTVAR***) calloc(SIZE*SIZE, sizeof(TESTVAR**));</div>
      <div>    </div>
      <div>    for(i = 0; i &lt; SIZE; i++) {</div>
      <div>      a[i] = &amp;aa[i*SIZE];</div>
      <div>      b[i] = &amp;bb[i*SIZE];</div>
      <div>      c[i] = &amp;cc[i*SIZE];</div>
      <div>    }</div>
      <div>&quot;</div>
      <div>  It works. However, I wonder if there is any other good
        ideas for 3D problem other than this kinda of &#39;two-layer&#39;
        approach.</div>
    </div>
    <div><br>
    </div>
    <div><b><u>What is the reason for not using DMDA?</u><br>
      </b>In 2D, I established a 2D array for data communication between
      nodes by using MPI derived data type. It allows me to easily
      communicate both contiguous (i.e. MPI_TYPE_CONTIGUOUS) and
      non-contiguous (i.e. MPI_TYPE_VECTOR) data. That is why I use this
      similar approach in 3D, though an additional data type, i.e.
      MPI_TYPE_INDEXED, need to be used. Does DMDA have those type of
      function or derived data type?</div></div></blockquote><div><br></div><div>It definitely does communication between the local pieces. Do you want something else?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
    <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
      <div>
        <div>&quot;2, I have a little question on PETSc about 3D processor
          ordering. Does PETSc have any function giving me the
          nodes/rank number of neighboring nodes/ranks? Are those
          &#39;Application Ordering&#39; functions applicable for my case?&quot;</div>
      </div>
    </blockquote>
    <div><br>
    </div>
    <div><u><b>What do you mean by neighboring? If it is jsut stencil
          neighbors, then use a local vector.</b></u></div>
    <div>When I send and receive data with MPI_Send and MPI_RECV, I need
      provide the &#39;destination&#39; (in MPI_Send refer to&#39;<a href="http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Send.html" target="_blank">http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Send.html</a>&#39;)
      and &#39;source&#39; (in MPI_RECV refer to&#39;<a href="http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Recv.html" target="_blank">http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Recv.html</a>&#39;).
      In a 2D problem with Cartesian grid, 4 processes divide the whole
      domain to 4 sub-domain. <br>
      ---------------------------- <br>
            2      |      3      |<br>
      ----------------------------<br>
            0      |      1      |<br>
      ---------------------------<br>
       Then, for node 1, the neighboring nodes are &#39;0&#39; and &#39;3&#39;, which
      &#39;0&#39; is the left node and &#39;3&#39; is the top node. I wonder if PETSc
      has any function that I can call to obtain those neighboring nodes
      so that I do not need to construct my function. <br></div></div></blockquote><div><br></div><div>Yes, it looks like you should just use a DMDA. See the manual section.</div><div><br></div><div>   Matt</div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><div>
      I&#39;m sorry for confusing you. <br>
      <br>
      thanks in advance,<br>
      Alan <br>
    </div>
    <br>
    On 4/19/2012 4:52 AM, Matthew Knepley wrote:
    <blockquote type="cite">On Wed, Apr 18, 2012 at 3:52 PM, Alan Wei <span dir="ltr">&lt;<a href="mailto:zhenglun.wei@gmail.com" target="_blank">zhenglun.wei@gmail.com</a>&gt;</span>
      wrote:<br>
      <div class="gmail_quote">
        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          Dear all,
          <div>    I hope you&#39;re having a nice day. I have a further
            question on this issue in 3D.</div>
          <div>1, Following the idea of Dr. Brown and Dr. Knepley, I
            finished a 2D test, which works very fine. Here, I did it in
            3D by</div>
          <div>
            <div>
              <div>&quot;</div>
              <div>    TESTVAR ***a, ***b, ***c;</div>
              <div>    TESTVAR **aa, **bb, **cc; </div>
              <div>    TESTVAR *arraya, *arrayb, *arrayc;</div>
            </div>
            <div><br>
            </div>
            <div>    arraya = (TESTVAR*) calloc(SIZE*SIZE*SIZE,
              sizeof(TESTVAR));</div>
            <div>    arrayb = (TESTVAR*) calloc(SIZE*SIZE*SIZE,
              sizeof(TESTVAR));</div>
            <div>    arrayc = (TESTVAR*) calloc(SIZE*SIZE*SIZE,
              sizeof(TESTVAR));</div>
            <div><br>
            </div>
            <div>    aa =(TESTVAR**) calloc(SIZE*SIZE,
              sizeof(TESTVAR*));</div>
            <div>    bb =(TESTVAR**) calloc(SIZE*SIZE,
              sizeof(TESTVAR*));</div>
            <div>    cc =(TESTVAR**) calloc(SIZE*SIZE,
              sizeof(TESTVAR*));</div>
            <div>    </div>
            <div>    for(i = 0; i &lt; SIZE*SIZE; i++) {</div>
            <div>      aa[i] = &amp;arraya[i*SIZE];</div>
            <div>      bb[i] = &amp;arrayb[i*SIZE];</div>
            <div>      cc[i] = &amp;arrayc[i*SIZE]; </div>
            <div>    }</div>
            <div><br>
            </div>
            <div>    a =(TESTVAR***) calloc(SIZE*SIZE,
              sizeof(TESTVAR**));</div>
            <div>    b =(TESTVAR***) calloc(SIZE*SIZE,
              sizeof(TESTVAR**));</div>
            <div>    c =(TESTVAR***) calloc(SIZE*SIZE,
              sizeof(TESTVAR**));</div>
            <div>    </div>
            <div>    for(i = 0; i &lt; SIZE; i++) {</div>
            <div>      a[i] = &amp;aa[i*SIZE];</div>
            <div>      b[i] = &amp;bb[i*SIZE];</div>
            <div>      c[i] = &amp;cc[i*SIZE];</div>
            <div>    }</div>
            <div>&quot;</div>
            <div>  It works. However, I wonder if there is any other
              good ideas for 3D problem other than this kinda of
              &#39;two-layer&#39; approach.</div>
          </div>
        </blockquote>
        <div><br>
        </div>
        <div>What is the reason for not using DMDA?</div>
        <div> </div>
        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          <div>
            <div>2, I have a little question on PETSc about 3D processor
              ordering. Does PETSc have any function giving me the
              nodes/rank number of neighboring nodes/ranks? Are those
              &#39;Application Ordering&#39; functions applicable for my case?</div>
          </div>
        </blockquote>
        <div><br>
        </div>
        <div>What do you mean by neighboring? If it is jsut stencil
          neighbors, then use a local vector.</div>
        <div><br>
        </div>
        <div>   Matt</div>
        <div> </div>
        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          <div>
            <div>thanks,</div>
            <div>Alan</div>
            <br>
            <div class="gmail_quote">On Fri, Apr 13, 2012 at 5:41 PM,
              Jed Brown <span dir="ltr">&lt;<a href="mailto:jedbrown@mcs.anl.gov" target="_blank">jedbrown@mcs.anl.gov</a>&gt;</span>
              wrote:<br>
              <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                <div>
                  <div class="gmail_quote">On Fri, Apr 13, 2012 at
                    17:38, Zhenglun (Alan) Wei <span dir="ltr">&lt;<a href="mailto:zhenglun.wei@gmail.com" target="_blank">zhenglun.wei@gmail.com</a>&gt;</span>
                    wrote:<br>
                    <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                          I have a final question on it. Is it taken a
                      lot of memory for doing this? As I understand,
                      pointers won&#39;t occupy many memories and it works
                      like an alias. It will not, to my limit knowledge,
                      take much extra memory by doing this. </blockquote>
                  </div>
                  <br>
                </div>
                <div>A pointer takes about as much space as a floating
                  point value, so that array of pointers costs about 1*N
                  compared to the N*N matrix.</div>
              </blockquote>
            </div>
            <br>
          </div>
        </blockquote>
      </div>
      <br>
      <br clear="all"><span class="HOEnZb"><font color="#888888">
      <div><br>
      </div>
      -- <br>
      What most experimenters take for granted before they begin their
      experiments is infinitely more interesting than any results to
      which their experiments lead.<br>
      -- Norbert Wiener<br>
    </font></span></blockquote>
    <br>
  </div>

</blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener<br>