<div dir="ltr"><div dir="ltr">On Fri, Oct 10, 2025 at 11:15 AM Matteo Semplice <<a href="mailto:matteo.semplice@uninsubria.it">matteo.semplice@uninsubria.it</a>> wrote:</div><div class="gmail_quote gmail_quote_container"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>

  
  <div>
    <p>On 10/10/2025 16:39, Matthew Knepley
      wrote:</p>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div dir="ltr">On Fri, Oct 10, 2025 at 9:48 AM Matteo Semplice
          via petsc-users <<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a>>
          wrote:</div>
        <div class="gmail_quote">
          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Dear
            all,<br>
            <br>
                 I am wondering if there is a way to extract a subset of
            a DMDA and <br>
            use it as a mesh. The use case is to program a
            finite-difference method <br>
            in which the domain is defined by a levelset function: if I
            could <br>
            completely ignore the parts of the background DMDA that are
            "far away" <br>
            from the object, I guess I would avoid some cores having
            almost no <br>
            workload. I figure that I could setup a DMDA, load/compute
            the levelset <br>
            on the entire box, then mark the nodes to be retained,
            extract the <br>
            submesh and repartition it. I would also need a mean to
            transfer some <br>
            Vec data from the DMDA to the new mesh.<br>
            <br>
            I guess that the extracted mesh would then become a DMPlex
            and it would <br>
            not retain any DMDA flavour (like notions of which are the
            grid nodes <br>
            sitting on top/bottom, left/right of a given node), right?<br>
          </blockquote>
          <div><br>
          </div>
          <div>If you are planning on extracting a Plex anyway, I think
            it would be easier to just</div>
          <div>start with a Cartesian Plex, instead of a DA, and use
            DMPlexCreateSubmesh().  <br>
          </div>
        </div>
      </div>
    </blockquote>
    <p>Hmmm... doable, but I have a couple of questions.<br>
    </p>
    <p>By Cartesian Plex you mean a Plex created by DMPlexCreateBoxMesh
      with simplex=false, right? </p></div></blockquote><div>Yes, exactly</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><p>And, could you point me to the routines
      that can perform data tranfer from Vecs associated to the DM to
      the ones asscoiated to the subDM? Is DMPlexGetSubpointIS the way
      to go?<br></p></div></blockquote><div>Yes. You get the IS and then you can use</div><div><br></div><div>  <a href="https://urldefense.us/v3/__https://petsc.org/main/manualpages/Vec/VecISCopy/__;!!G_uCfscf7eWS!ZuU3KyjiAxEurYfyBPAqLwse3wiBnKnWg7CgVwR0lJDOM2Rp3loC13vFnsgCTd7FcZMhSe0CAY8ingyIUWji$">https://petsc.org/main/manualpages/Vec/VecISCopy/</a> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><p>
    </p>
    <p>Next, I will load the levelsets from the output of another code
      that is DA-based and that I'd really like to reuse some code in
      the setup phase which relies on the DA indexing. So maybe I'd
      rather, create the DMDA and the associated Vecs, do the setup
      phase, then DMConvert the DMDA to a "large" DMPlex that covers the
      entire box, transfer the DA Vecs to the "large" Plex vectors and
      then extract the submesh. Would this be feasible? If so, can you
      point me to the routines to transfer the vecs from the dmda to the
      large plex?</p></div></blockquote><div>Yes, this sounds doable, and once we write it, we should just put it in the library.</div><div><br></div><div>In serial this is completely trivial. The DA has a known ordering and the Plex has a known ordering. We can use an AO</div><div>or just a VecScatter to permute the Vec. In parallel, the DA is partitioned geometrically, whereas the Plex, by default, is partitioned using a graph partitioner, like ParMetis. To me, if this project is important, it seems worth it to build a simple partitioner for the Plex that mimics the DA. Then we are back to the trivial remapping. Finally, we probably want the Plex dual to the DA due to the way that DAs partition things.</div><div><br></div><div>  Thanks,</div><div><br></div><div>     Matt</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>
    <p>Thanks</p>
    <p>    Matteo<br>
    </p>
  </div>

</blockquote></div><div><br clear="all"></div><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><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="https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!ZuU3KyjiAxEurYfyBPAqLwse3wiBnKnWg7CgVwR0lJDOM2Rp3loC13vFnsgCTd7FcZMhSe0CAY8inlmYDKBF$" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>