<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p>Hi Matt,</p>
    <p>Sorry if this is a stupid question. <br>
    </p>
    <p>In the previous code for unstructured grid, I create labels to
      mark the original node/cell index from VTK file and then
      distribute it so that each subdomain has a copy of its original
      node and cell index, as well as the PETSc numbering. Now I am
      trying to get avoid of using large number of keys in
      DMSetLabelValue since this costs lot of time for large problem. <br>
    </p>
    <p>I can get the coordinates of subdomain after distribution by
      using DMGetCoordinatesLocal and DMGetCoordinateDM.</p>
    <p>How can I get the vertex index of each cell after distribution?
      Would you please give me a hint or functions that I can use.<br>
    </p>
    Thanks,<br>
    <p>Danyang<br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 18-04-25 02:12 PM, Danyang Su wrote:<br>
    </div>
    <blockquote
      cite="mid:ee3e747f-86f8-085b-b5f6-be336dfcf840@gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      On 2018-04-25 09:47 AM, Matthew Knepley wrote:<br>
      <blockquote type="cite"
cite="mid:CAMYG4Gnm7DkxYzuEWewRzQED4SJp390ac3HXdSs930G-H6LJtw@mail.gmail.com">
        <div dir="ltr">
          <div class="gmail_extra">
            <div class="gmail_quote">On Wed, Apr 25, 2018 at 12:40 PM,
              Danyang Su <span dir="ltr"><<a
                  href="mailto:danyang.su@gmail.com" target="_blank"
                  moz-do-not-send="true">danyang.su@gmail.com</a>></span>
              wrote:<br>
              <blockquote class="gmail_quote" style="margin:0 0 0
                .8ex;border-left:1px #ccc solid;padding-left:1ex">
                <div text="#000000" bgcolor="#FFFFFF">
                  <p>Hi Matthew,</p>
                  <p>In the worst case, every node/cell may have
                    different label. <br>
                  </p>
                </div>
              </blockquote>
              <div>Do not use Label for this. Its not an appropriate
                thing. If every cell is different, just use the cell
                number.</div>
              <div>Labels are for mapping a relatively small number of
                keys (like material IDs) to sets of points (cells,
                vertices, etc.) </div>
              <div>Its not a great data structure for a permutation.</div>
            </div>
          </div>
        </div>
      </blockquote>
      Yes. If there is small number of keys, it runs very fast, even for
      more than one million DMSetLabelValue calls. The performance just
      deteriorates as the number of keys increases. <br>
      <br>
      I cannot get avoid of DMSetLabelValue as node/cell index of
      original mesh is needed for the previous input file that uses some
      of global node/cell index to set value. But if I can get the
      natural order of nodes/cells from DMPlex, I can discard the use of
      DMSetLabelValue. Is there any function can do this job? <br>
      <br>
      Thanks,<br>
      <br>
      Danyang<br>
      <blockquote type="cite"
cite="mid:CAMYG4Gnm7DkxYzuEWewRzQED4SJp390ac3HXdSs930G-H6LJtw@mail.gmail.com">
        <div dir="ltr">
          <div class="gmail_extra">
            <div class="gmail_quote">
              <div><br>
              </div>
              <div>However, I still do not believe these numbers. The
                old code does a string comparison every time. I will
                setup a test.</div>
              <div><br>
              </div>
              <div>   Matt</div>
              <blockquote class="gmail_quote" style="margin:0 0 0
                .8ex;border-left:1px #ccc solid;padding-left:1ex">
                <div text="#000000" bgcolor="#FFFFFF">
                  <p>Below is one of the worst scenario with 102299
                    nodes and 102299 different labels for test. I found
                    the time cost increase during the loop. The first
                    9300 loop takes least time (<0.5) while the last
                    9300 loops takes much more time (>7.7), as shown
                    below. If I use larger mesh with >1 million
                    nodes, it runs very very slowly in this part. The
                    PETSc is configured with optimization on.</p>
                  <p>Configure options --with-cc=gcc --with-cxx=g++
                    --with-fc=gfortran --download-mpich
                    --download-scalapack --download-parmetis
                    --download-metis --download-ptscotch
                    --download-fblaslapack --download-hypre
                    --download-superlu_dist --download-hdf5=yes
                    --download-ctetgen --with-debugging=0 COPTFLAGS="-O3
                    -march=native -mtune=native" CXXOPTFLAGS="-O3
                    -march=native -mtune=native" FOPTFLAGS="-O3
                    -march=native -mtune=native"</p>
                  <p> </p>
                  <table border="0" height="245" cellspacing="0"
                    width="816">
                    <colgroup span="6" width="85"></colgroup> <tbody>
                      <tr>
                        <td align="left" height="32">istart</td>
                        <td align="left">iend</td>
                        <td align="left">progress</td>
                        <td align="left">CPU_Time</td>
                        <td align="left">time cost - old (sec) </td>
                        <td align="left">time cost - new (sec)</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">0</td>
                        <td align="right">9299</td>
                        <td align="right">0</td>
                        <td align="right">1524670045.51166</td>
                        <td align="left"><br>
                        </td>
                        <td align="left"><br>
                        </td>
                      </tr>
                      <tr>
                        <td align="right" height="17">9300</td>
                        <td align="right">18599</td>
                        <td align="right">0.100010753</td>
                        <td align="right">1524670045.99605</td>
                        <td align="right">0.4843890667</td>
                        <td align="right">0.497246027</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">18600</td>
                        <td align="right">27899</td>
                        <td align="right">0.200010747</td>
                        <td align="right">1524670047.32635</td>
                        <td align="right">1.330302</td>
                        <td align="right">1.3820912838</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">27900</td>
                        <td align="right">37199</td>
                        <td align="right">0.300010741</td>
                        <td align="right">1524670049.3066</td>
                        <td align="right">1.9802515507</td>
                        <td align="right">2.2439446449</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">37200</td>
                        <td align="right">46499</td>
                        <td align="right">0.400010765</td>
                        <td align="right">1524670052.1594</td>
                        <td align="right">2.852804184</td>
                        <td align="right">3.0739262104</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">46500</td>
                        <td align="right">55799</td>
                        <td align="right">0.500010729</td>
                        <td align="right">1524670055.90961</td>
                        <td align="right">3.7502081394</td>
                        <td align="right">3.9270553589</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">55800</td>
                        <td align="right">65099</td>
                        <td align="right">0.600010753</td>
                        <td align="right">1524670060.47654</td>
                        <td align="right">4.5669286251</td>
                        <td align="right">4.7571902275</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">65100</td>
                        <td align="right">74399</td>
                        <td align="right">0.700010777</td>
                        <td align="right">1524670066.0941</td>
                        <td align="right">5.6175630093</td>
                        <td align="right">5.7428796291</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">74400</td>
                        <td align="right">83699</td>
                        <td align="right">0.800010741</td>
                        <td align="right">1524670072.53886</td>
                        <td align="right">6.44475317</td>
                        <td align="right">6.5761549473</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">83700</td>
                        <td align="right">92998</td>
                        <td align="right">0.900010765</td>
                        <td align="right">1524670079.99072</td>
                        <td align="right">7.4518604279</td>
                        <td align="right">7.4606924057</td>
                      </tr>
                      <tr>
                        <td align="right" height="17">92999</td>
                        <td align="right">102298</td>
                        <td align="right">1</td>
                        <td align="right">1524670087.71066</td>
                        <td align="right">7.7199423313</td>
                        <td align="right">8.2424075603</td>
                      </tr>
                    </tbody>
                  </table>
                  <br>
                  <br>
                  old code<br>
                  <br>
                          do ipoint = 0, istart-1<br>
                            !c output time cost, use 1 processor to test<br>
                            if (b_enable_output .and. rank == 0) then<br>
                              if (mod(ipoint,iprogress) == 0 .or. ipoint
                  == istart-1) then<br>
                                !write(*,'(f3.1,1x)',advance="<wbr>no")
                  (ipoint+1.0)/istart<br>
                                write(*,*) ipoint,
                  (ipoint+1.0)/istart,"time",<wbr>MPI_Wtime()<br>
                              end if<br>
                            end if<br>
                  <br>
                            call DMSetLabelValue(dmda_flow%da,"<wbr>cid_lg2g",ipoint,        
                  &<br>
                                                 ipoint+1,ierr)<br>
                            CHKERRQ(ierr)<br>
                          end do<br>
                  <br>
                  <br>
                  new code<br>
                  <br>
                          call DMCreateLabel(dmda_flow%da,'<wbr>cid_lg2g',ierr)<br>
                          CHKERRQ(ierr)<br>
                  <br>
                          call DMGetLabel(dmda_flow%da,'cid_<wbr>lg2g',label,
                  ierr)<br>
                          CHKERRQ(ierr)<br>
                  <br>
                          do ipoint = 0, istart-1<br>
                            !c output time cost, use 1 processor to test<br>
                            if (b_enable_output .and. rank == 0) then<br>
                              if (mod(ipoint,iprogress) == 0 .or. ipoint
                  == istart-1) then<br>
                                !write(*,'(f3.1,1x)',advance="<wbr>no")
                  (ipoint+1.0)/istart<br>
                                write(*,*) ipoint,
                  (ipoint+1.0)/istart,"time",<wbr>MPI_Wtime()<br>
                              end if<br>
                            end if<br>
                  <br>
                            call DMLabelSetValue(label,ipoint,<wbr>ipoint+1,ierr)<br>
                            CHKERRQ(ierr)<br>
                          end do<br>
                  <br>
                  Thanks,<br>
                  <br>
                  Danyang<br>
                  <br>
                  <div class="m_-7982693774986852993moz-cite-prefix">On
                    2018-04-25 03:16 AM, Matthew Knepley wrote:<br>
                  </div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">On Tue, Apr 24, 2018 at
                          11:57 PM, Danyang Su <span dir="ltr"><<a
                              href="mailto:danyang.su@gmail.com"
                              target="_blank" moz-do-not-send="true">danyang.su@gmail.com</a>></span>
                          wrote:<br>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex">Hi All,<br>
                            <br>
                            I use DMPlex in unstructured grid code and
                            recently found DMSetLabelValue takes a lot
                            of time for large problem, e.g., num. of
                            cells > 1 million. In my code, I use<br>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>I read your code wrong. For large loop,
                            you should not use the convenience function.
                            You should use</div>
                          <div> </div>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex">
                            DMPlexCreateFromCellList ()</blockquote>
                          <div><br>
                          </div>
                          <div>DMGetLabel(dm, name, &label)</div>
                          <div> </div>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex"> </blockquote>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex"> <br>
                            Loop over all cells/nodes{<br>
                            <br>
                            DMSetLabelValue<br>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>Replace this by DMLabelSetValue(label,
                            point, val)</div>
                          <div> </div>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex"> }<br>
                            <br>
                            DMPlexDistribute<br>
                            <br>
                            The code works fine except DMSetLabelValue
                            takes a lot of time for large problem. I use
                            DMSetLabelValue to set material id for all
                            the nodes or cells so that each subdomain
                            has a copy of material id. Is there any
                            other functions that can be used more
                            efficient, e.g. set labels by array, not 1
                            by 1?<br>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>That should take much less time.</div>
                          <div><br>
                          </div>
                          <div>  Thanks,</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"> Thanks,<br>
                            <br>
                            Danyang<br>
                            <br>
                          </blockquote>
                        </div>
                        <br>
                        <br clear="all">
                        <span class="HOEnZb"><font color="#888888">
                            <div><br>
                            </div>
                            -- <br>
                            <div
                              class="m_-7982693774986852993gmail_signature"
                              data-smartmail="gmail_signature">
                              <div dir="ltr">
                                <div>
                                  <div dir="ltr">
                                    <div>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</div>
                                    <div><br>
                                    </div>
                                    <div><a
                                        href="http://www.caam.rice.edu/%7Emk51/"
                                        target="_blank"
                                        moz-do-not-send="true">https://www.cse.buffalo.edu/~<wbr>knepley/</a><br>
                                    </div>
                                  </div>
                                </div>
                              </div>
                            </div>
                          </font></span></div>
                    </div>
                  </blockquote>
                  <br>
                </div>
              </blockquote>
            </div>
            <br>
            <br clear="all">
            <div><br>
            </div>
            -- <br>
            <div class="gmail_signature"
              data-smartmail="gmail_signature">
              <div dir="ltr">
                <div>
                  <div dir="ltr">
                    <div>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</div>
                    <div><br>
                    </div>
                    <div><a href="http://www.caam.rice.edu/%7Emk51/"
                        target="_blank" moz-do-not-send="true">https://www.cse.buffalo.edu/~knepley/</a><br>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>