>From https://petsc.org/release/src/ksp/ksp/tutorials/ex77.c.html
114: MatDenseGetArrayWrite <https://petsc.org/release/docs/manualpages/Mat/MatDenseGetArrayWrite.html#MatDenseGetArrayWrite>(B,&x);115: for (i=0; i<m*N; ++i) x[i] = 1.0;116: MatDenseRestoreArrayWrite <https://petsc.org/release/docs/manualpages/Mat/MatDenseRestoreArrayWrite.html#MatDenseRestoreArrayWrite>(B,&x); --Junchao Zhang On Tue, Dec 14, 2021 at 1:05 PM Rohan Yadav <[email protected]> wrote: > Hi, > > I'm having trouble setting all entries of a matrix to a constant value, > similar to the `VecSet` method on vectors. I have a dense matrix that I > want to initialize all entries to 1. The only related method I see on the > `Mat` interface is `MatZeroEntries`, which sets all entries to 0. The > obvious first attempt is to use the `MatSetValue` function to set all > entries to the constant. > > ``` > Mat C; > > MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, k, j, > NULL, &C); > > for (int kk = 0; kk < k; kk++) { > > for (int jj = 0; jj < j; jj++) { > > MatSetValue(C, kk, jj, 1, INSERT_VALUES); > > } > > } > > MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY); > > MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY); > ``` > > However, when run with a relatively large matrix C (5GB) and a > rank-per-core on my 40-core machine this code OOMs and crashes. It does not > OOM with only 1 and 10 rank, leading me to believe that this API call is > somehow causing the entire matrix to be replicated on each rank. > > Despite looking through the documentation, I could not find another API > call that would allow me to set all the values in the matrix to a constant. > What should I do here? > > Thanks, > > Rohan >
