<head><!-- BaNnErBlUrFlE-HeAdEr-start -->
<style>
  #pfptBannerwnejpqq { all: revert !important; display: block !important; 
    visibility: visible !important; opacity: 1 !important; 
    background-color: #D0D8DC !important; 
    max-width: none !important; max-height: none !important }
  .pfptPrimaryButtonwnejpqq:hover, .pfptPrimaryButtonwnejpqq:focus {
    background-color: #b4c1c7 !important; }
  .pfptPrimaryButtonwnejpqq:active {
    background-color: #90a4ae !important; }
</style>

<!-- BaNnErBlUrFlE-HeAdEr-end -->
</head><!-- BaNnErBlUrFlE-BoDy-start -->
<!-- Preheader Text : BEGIN -->
<div style="display:none !important;display:none;visibility:hidden;mso-hide:all;font-size:1px;color:#ffffff;line-height:1px;height:0px;max-height:0px;opacity:0;overflow:hidden;">
 On Fri, Mar 1, 2024 at 9: 28 AM Fabian Wermelinger <fab4100@ posteo. ch> wrote: Dear All, I am implementing a linear solver interface in a flow solver with support for PETSc. My application uses a parallel CSR representation and it manages
</div>
<!-- Preheader Text : END -->

<!-- Email Banner : BEGIN -->
<div style="display:none !important;display:none;visibility:hidden;mso-hide:all;font-size:1px;color:#ffffff;line-height:1px;height:0px;max-height:0px;opacity:0;overflow:hidden;">ZjQcmQRYFpfptBannerStart</div>

<!--[if ((ie)|(mso))]>
  <table border="0" cellspacing="0" cellpadding="0" width="100%" style="padding: 16px 0px 16px 0px; direction: ltr" ><tr><td>
    <table border="0" cellspacing="0" cellpadding="0" style="padding: 0px 10px 5px 6px; width: 100%; border-radius:4px; border-top:4px solid #90a4ae;background-color:#D0D8DC;"><tr><td valign="top">
      <table align="left" border="0" cellspacing="0" cellpadding="0" style="padding: 4px 8px 4px 8px">
        <tr><td style="color:#000000; font-family: 'Arial', sans-serif; font-weight:bold; font-size:14px; direction: ltr">
          This Message Is From an External Sender
        </td></tr>
        <tr><td style="color:#000000; font-weight:normal; font-family: 'Arial', sans-serif; font-size:12px; direction: ltr">
          This message came from outside your organization.
        </td></tr>

      </table>

    </td></tr></table>
  </td></tr></table>
<![endif]-->

<![if !((ie)|(mso))]>
  <div dir="ltr"  id="pfptBannerwnejpqq" style="all: revert !important; display:block !important; text-align: left !important; margin:16px 0px 16px 0px !important; padding:8px 16px 8px 16px !important; border-radius: 4px !important; min-width: 200px !important; background-color: #D0D8DC !important; background-color: #D0D8DC; border-top: 4px solid #90a4ae !important; border-top: 4px solid #90a4ae;">
    <div id="pfptBannerwnejpqq" style="all: unset !important; float:left !important; display:block !important; margin: 0px 0px 1px 0px !important; max-width: 600px !important;">
      <div id="pfptBannerwnejpqq" style="all: unset !important; display:block !important; visibility: visible !important; background-color: #D0D8DC !important; color:#000000 !important; color:#000000; font-family: 'Arial', sans-serif !important; font-family: 'Arial', sans-serif; font-weight:bold !important; font-weight:bold; font-size:14px !important; line-height:18px !important; line-height:18px">
        This Message Is From an External Sender
      </div>
      <div id="pfptBannerwnejpqq" style="all: unset !important; display:block !important; visibility: visible !important; background-color: #D0D8DC !important; color:#000000 !important; color:#000000; font-weight:normal; font-family: 'Arial', sans-serif !important; font-family: 'Arial', sans-serif; font-size:12px !important; line-height:18px !important; line-height:18px; margin-top:2px !important;">
This message came from outside your organization.
      </div>

    </div>

    <div style="clear: both !important; display: block !important; visibility: hidden !important; line-height: 0 !important; font-size: 0.01px !important; height: 0px"> </div>
  </div>
<![endif]>

<div style="display:none !important;display:none;visibility:hidden;mso-hide:all;font-size:1px;color:#ffffff;line-height:1px;height:0px;max-height:0px;opacity:0;overflow:hidden;">ZjQcmQRYFpfptBannerEnd</div>
<!-- Email Banner : END -->

<!-- BaNnErBlUrFlE-BoDy-end -->
<div dir="ltr"><div dir="ltr"><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 1, 2024 at 9:28 AM Fabian Wermelinger <<a href="mailto:fab4100@posteo.ch" target="_blank">fab4100@posteo.ch</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><u></u>


<div style="font-size:1px;color:rgb(255,255,255);line-height:1px;height:0px;max-height:0px;opacity:0;overflow:hidden;display:none">
 Dear All, I am implementing a linear solver interface in a flow solver with support for PETSc. My application uses a parallel CSR representation and it manages the memory for it. I would like to wrap PETSc matrices (and vectors) around it such
</div>



<div style="font-size:1px;color:rgb(255,255,255);line-height:1px;height:0px;max-height:0px;opacity:0;overflow:hidden;display:none">ZjQcmQRYFpfptBannerStart</div>



<u></u>
  <div dir="ltr" id="m_-4093479676107998636m_1695841591691327121pfptBannerftj3wpq" style="display:block;text-align:left;margin:16px 0px;padding:8px 16px;border-radius:4px;min-width:200px;background-color:rgb(208,216,220);border-top:4px solid rgb(144,164,174)">
    <div id="m_-4093479676107998636m_1695841591691327121pfptBannerftj3wpq" style="float:left;display:block;margin:0px 0px 1px;max-width:600px">
      <div id="m_-4093479676107998636m_1695841591691327121pfptBannerftj3wpq" style="display:block;background-color:rgb(208,216,220);color:rgb(0,0,0);font-family:Arial,sans-serif;font-weight:bold;font-size:14px;line-height:18px">
        This Message Is From an External Sender
      </div>
      <div id="m_-4093479676107998636m_1695841591691327121pfptBannerftj3wpq" style="font-weight:normal;display:block;background-color:rgb(208,216,220);color:rgb(0,0,0);font-family:Arial,sans-serif;font-size:12px;line-height:18px;margin-top:2px">
This message came from outside your organization.
      </div>

    </div>

    <div style="height:0px;clear:both;display:block;line-height:0;font-size:0.01px"> </div>
  </div>
<u></u>

<div style="font-size:1px;color:rgb(255,255,255);line-height:1px;height:0px;max-height:0px;opacity:0;overflow:hidden;display:none">ZjQcmQRYFpfptBannerEnd</div>








<div><pre style="font-family:sans-serif;font-size:100%;white-space:pre-wrap">Dear All,

I am implementing a linear solver interface in a flow solver with support for
PETSc.  My application uses a parallel CSR representation and it manages the
memory for it.  I would like to wrap PETSc matrices (and vectors) around it such
that I can use the PETSc solvers as well.  I plan to use
MatMPIBAIJSetPreallocationCSR and VecCreateMPIWithArray for lightweight
wrapping.  The matrix structure is static over the course of iterations.  I am
using a derived context class to host the PETSc related context.  This context
holds references to the PETSc matrix and vectors and KSP/PC required to call the
solver API later in the iteration loop.  I would like to create as much as
possible during creation of the context at the beginning of iterations (the
context will live through iterations).

My understanding is that MatMPIBAIJSetPreallocationCSR and VecCreateMPIWithArray
DO NOT copy such that I can wrap the PETSc types around the memory managed by
the hosting linear solver framework in the application.  The system matrix and
RHS (the pointers to these arrays are passed to MatMPIBAIJSetPreallocationCSR
and VecCreateMPIWithArray, respectively) is assembled by the application before
any call to a linear solver.</pre></div></div></blockquote><div><span style="font-family:sans-serif;font-size:13px">No. MatMPIBAIJSetPreallocationCSR() copies the data, but </span><span style="font-family:sans-serif;font-size:13px">VecCreateMPIWithArray() does not copy (only use pointers user provided).</span></div><div>PETSc MATMPIAIJ or MATMPIBAIJ has a complicated internal data structure. It is not easy for users to get it right.</div><div>I think your intention is to avoid memory copies.  Don't worry about it too much.  If it is MATMPIAIJ, we can do</div><div>    MatMPIAIJSetPreallocationCSR<span style="font-family:sans-serif;font-size:13px">(A, i, j, v); // let petsc copy i, j v</span></div></div><div class="gmail_quote"><pre style="font-size:13px;font-family:sans-serif">    // To quickly update A when you have an updated v[] </pre><pre style="font-size:13px;font-family:sans-serif">    MatUpdateMPIAIJWithArray(A, v); // copy v[], but faster than MatSetValues()</pre></div><div class="gmail_quote"><div>But it seems we currently do not have a MatUpdateMPIBAIJWithArray()  :(</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><pre style="font-family:sans-serif;font-size:100%;white-space:pre-wrap">Given this setting: for every iteration, my plan is the PETSc information from
the context (Mat, Vec, KSP) and simply call KSPSolve without any other PETSc
calls (still assuming the matrix structure is static during iteration).

What is not clear to me:

Are there any MatSetValues/VecSetValues calls followed by
MatAssembly/VecAssembly(Begin/End) calls required for this setting?  The data in
the arrays for which pointers have been passed to MatMPIBAIJSetPreallocationCSR
and VecCreateMPIWithArray is computed prior to any solver call in an iteration,
such that I am assuming no additional "set value" calls through PETSc are
required -> am I missing something important by assuming this?

Thank you for taking the time!

-- 
fabs
</pre></div>
</div></blockquote></div></div>