[petsc-users] How to efficiently fill in, in parallel, a PETSc matrix from a COO sparse matrix?

Barry Smith bsmith at petsc.dev
Tue Jun 20 11:13:23 CDT 2023


  Since you have 6 entries that needed to be added to the matrix you will need to call MatSetValues() six time for the six entries.

> On Jun 20, 2023, at 11:06 AM, Matthew Knepley <knepley at gmail.com> wrote:
> 
> On Tue, Jun 20, 2023 at 10:55 AM Diego Magela Lemos via petsc-users <petsc-users at mcs.anl.gov <mailto:petsc-users at mcs.anl.gov>> wrote:
>> Considering, for instance, the following COO sparse matrix format, with repeated indices:
>> 
>> std::vector<size_t> rows{0, 0, 1, 2, 3, 4};
>> std::vector<size_t> cols{0, 0, 1, 2, 3, 4};
>> std::vector<double> values{2, -1, 2, 3, 4, 5};
>> 
>> that represents a 5x5 diagonal matrix A.
>> 
>> So far, the code that I have is:
>> 
>> // fill_in_matrix.cc
>> 
>> static char help[] = "Fill in a parallel COO format sparse matrix.";
>> 
>> #include <petsc.h>
>> #include <vector>
>> 
>> int main(int argc, char **args)
>> {
>>     Mat A;
>>     PetscInt m = 5, i, Istart, Iend;
>> 
>>     PetscCall(PetscInitialize(&argc, &args, NULL, help));
>> 
>>     PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
>>     PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, m, m));
>>     PetscCall(MatSetFromOptions(A));
>>     PetscCall(MatSetUp(A));
>>     PetscCall(MatGetOwnershipRange(A, &Istart, &Iend));
>> 
>>     std::vector<PetscInt> II{0, 0, 1, 2, 3, 4};
>>     std::vector<PetscInt> JJ{0, 0, 1, 2, 3, 4};
>>     std::vector<PetscScalar> XX{2, -1, 2, 3, 4, 5};
>> 
>>     for (i = Istart; i < Iend; i++)
>>         PetscCall(MatSetValues(A, 1, &II.at(i), 1, &JJ.at(i), &XX.at(i), ADD_VALUES));
>> 
>>     PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
>>     PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
>>     PetscCall(MatView(A, PETSC_VIEWER_STDERR_WORLD));
>> 
>>     PetscCall(MatDestroy(&A));
>>     PetscCall(PetscFinalize());
>>     return 0;
>> }
>> When running it with
>> 
>> petscmpiexec -n 4 ./fill_in_matrix
>> 
>> I get
>> 
>>  Mat Object: 4 MPI processes
>>   type: mpiaij
>> row 0: (0, 1.) 
>> row 1: (1, 2.) 
>> row 2: (2, 3.) 
>> row 3: (3, 4.) 
>> row 4:
>> 
>> Which is missing the entry of the last row.
>> 
>> What am I missing? Even better, which would be the best way to fill in this matrix?
> We have a new interface for this:
> 
>   https://petsc.org/main/manualpages/Mat/MatSetValuesCOO/
> 
>   Thanks,
> 
>      Matt
> 
> -- 
> What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
> -- Norbert Wiener
> 
> https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20230620/59799a82/attachment-0001.html>


More information about the petsc-users mailing list