<div dir="ltr"><div>Hi, Maxime,</div><div>  Thanks for the introduction. It sounds to me it makes sense to share the COO information in MatDuplicate.  The data structure consumes a lot of memory, making it more justified.  I will add it.<br></div><div>  <br></div><div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">--Junchao Zhang</div></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Apr 27, 2023 at 2:15 PM Maxime Bouyges <<a href="mailto:maxime.bouyges@gmail.com">maxime.bouyges@gmail.com</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>
    <p>Thanks for the prompt confirmation! I have to admit that I hadn't
      tested yet the memory performance of using COO instead of the
      classical MatSetValues. I will keep both approach in my code and
      do more performance checks (CPU and memory) before I take a
      decision. In any case, calling "again" MatSetPreallocationCOO
      after MatDuplicate is working so I can live with that. I just
      wanted to be sure that it was a "bug" (or a missing feature I
      would say) and not a misuse from me.</p>
    <p>If you are curious, here is the context. I am using the Julia
      langage to solve an ODE using the DifferentialEquations.jl package
      (<a href="https://github.com/SciML/DifferentialEquations.jl" target="_blank">https://github.com/SciML/DifferentialEquations.jl</a>). The system
      jacobian matrix is a Julia SparseMatrix
      (<a href="https://docs.julialang.org/en/v1/stdlib/SparseArrays/" target="_blank">https://docs.julialang.org/en/v1/stdlib/SparseArrays/</a>) with CSC
      format. I am using PETSc as a backend for the linear algebra (with
      <a href="https://github.com/bmxam/PetscWrap.jl" target="_blank">https://github.com/bmxam/PetscWrap.jl</a>). So at some point I have to
      fill a PETSc matrix with the values of a Julia CSC sparse matrix.
      Recovering the COO information from the Julia matrix is trivial,
      and using MatSetValuesCOO with this information seems very
      efficient. However, the ODE solver does several matrix duplication
      (wrapped as MatDuplicate in my case) and that's why I stumbled
      accross this bug. But as explained above 1) I can call
      MatSetPreallocationCOO each time MatDuplicate is called and 2) I
      can keep the classical MatSetValues and use an other way to fill
      the PETSc matrix.</p>
    <p>Thanks again for your quick answer (and for the great library ;))
      !</p>
    <p>Best regards,</p>
    <p>Maxime Bouyges<br>
    </p>
    <div>On 26/04/2023 23:26, Junchao Zhang
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div>It sounds like we should do reference counting on the
          internal data structures used by COO>.<br>
        </div>
        <div>
          <div>
            <div dir="ltr">
              <div dir="ltr">--Junchao Zhang</div>
            </div>
          </div>
          <br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Wed, Apr 26, 2023 at
          3:59 PM Barry Smith <<a href="mailto:bsmith@petsc.dev" target="_blank">bsmith@petsc.dev</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"><br>
             Yes, it looks like a bug since no one tested this
          situation.<br>
          <br>
             MatSetPreallocationCOO() is pretty heavy memory-wise. It
          essentially keeps a copy of all the coo_i, coo_j indices
          within the Mat as well as the usual matrix information. So in
          your scenario, you will have two copies of all this stuff;
          lots of memory. Is this really what you need?<br>
          <br>
          <br>
          <br>
          > On Apr 26, 2023, at 4:07 PM, Maxime Bouyges <<a href="mailto:maxime.bouyges@gmail.com" target="_blank">maxime.bouyges@gmail.com</a>>
          wrote:<br>
          > <br>
          > Dear PETSc developers,<br>
          > <br>
          > I am trying to use the MatSetValuesCOO function (very
          appropriate and performant for my case) but I am encountering
          a problem when I use it on a Mat obtained with MatDuplicate.
          It seems that the non-zero pattern is preserved by
          MatDuplicate, but not the "COO information". Here are the few
          steps to reproduce the problem:<br>
          > MatCreate(comm, A)<br>
          > MatSetUp(A)<br>
          > MatSetPreallocationCOO(A, ncoo, coo_i, coo_j)<br>
          > MatSetValuesCOO(A, coo_v, INSERT_VALUES) # -> works ok<br>
          > MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B)<br>
          > MatSetValuesCOO(B, coo_v, INSERT_VALUES) # ->
          seg-fault<br>
          > <br>
          > Is this an expected behaviour? Of course if I call again
          MatSetPreallocationCOO on the duplicated matrix it's ok but
          the performance is lost in my case. Is there a way to fix it?
          Thank you in advance.<br>
          > <br>
          > Best regards,<br>
          > <br>
          > Maxime Bouyges<br>
          > <br>
          <br>
        </blockquote>
      </div>
    </blockquote>
  </div>

</blockquote></div>