[petsc-users] Help initializing matrix to a constant

Rohan Yadav rohany at alumni.cmu.edu
Tue Dec 14 15:08:16 CST 2021


I see, thanks all!

Rohan Yadav 

> On Dec 14, 2021, at 3:55 PM, Junchao Zhang <junchao.zhang at gmail.com> wrote:
> 
> 
> MatDenseGetArrayWrite() only returns the pointer to the local array, so it does not need any extra memory. 
> 2130: PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array)
> 2131: {
> 2132:   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
> 
> 2135:   if (mat->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
> 2136:   *array = mat->v;
> 2137:   return(0);
> 2138: }
> 
> --Junchao Zhang
> 
> 
>> On Tue, Dec 14, 2021 at 2:29 PM Rohan Yadav <rohany at alumni.cmu.edu> wrote:
>> Thanks Mark, I will try that -- that seems to be what I want.
>> 
>> Junchao, that excerpt seems like it runs into the same problem as above right? If every rank tries to get the whole matrix then the process will surely OOM.
>> 
>> Rohan
>> 
>>> On Tue, Dec 14, 2021 at 3:27 PM Junchao Zhang <junchao.zhang at gmail.com> wrote:
>>> From https://petsc.org/release/src/ksp/ksp/tutorials/ex77.c.html
>>> 114:       MatDenseGetArrayWrite(B,&x);
>>> 115:       for (i=0; i<m*N; ++i) x[i] = 1.0;
>>> 116:       MatDenseRestoreArrayWrite(B,&x);
>>> --Junchao Zhang
>>> 
>>> 
>>>> On Tue, Dec 14, 2021 at 1:05 PM Rohan Yadav <rohany at alumni.cmu.edu> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20211214/03eaa82d/attachment.html>


More information about the petsc-users mailing list