[petsc-users] Modify matrix nonzero structure

Adrian Croucher a.croucher at auckland.ac.nz
Sun May 26 21:45:34 CDT 2024


hi,

I've been trying creating a matrix with DMCreateMatrix() and then adding 
extra blocks of nonzeros into it using MatSetValuesBlocked(), but 
getting some unexpected results if I set the matrix type to BAIJ. It 
seems to behave as expected if I use matrix type AIJ.

I've attached a minimal example program. It reads in the DMPlex from 
file, sets up a section on it, creates a matrix (blocksize 2) and then 
inserts a single 2x2 block at global block indices (0,7). It views the 
matrix before and after the insertion.

If I run with "-dm_mat_type aij" it gives the expected results, but with 
"-dm_mat_type baij" it doesn't - e.g. if run in serial, it adds the new 
nonzeros in the right place but also adds a whole lot of other 
duplicated entries in block row 0.

Is there something I'm not understanding about BAIJ, or about 
MatSetValuesBlocked()? or possibly some other mistake?

- Adrian

On 20/05/24 12:24 pm, Barry Smith wrote:
>
>    You can call MatSetOption(mat,MAT_NEW_NONZERO_LOCATION_ERR) then 
> insert the new values. If it is just a handful of new insertions the 
> extra time should be small.
>
>     Making a copy of the matrix won't give you a new matrix that is 
> any faster to insert into so best to just use the same matrix.
>
>   Barry
>
>
>> On May 19, 2024, at 7:44 PM, Adrian Croucher 
>> <a.croucher at auckland.ac.nz> wrote:
>>
>> This Message Is From an External Sender
>> This message came from outside your organization.
>> hi,
>>
>> I have a Jacobian matrix created using DMCreateMatrix(). What would be
>> the best way to add extra nonzero entries into it?
>>
>> I'm guessing that DMCreateMatrix() allocates the storage so the nonzero
>> structure can't really be easily modified. Would it be a case of
>> creating a new matrix, copying the nonzero entries from the original one
>> and then adding the extra ones, before calling MatSetUp() or similar? If
>> so, how exactly would you copy the nonzero structure from the original
>> matrix?
>>
>> Background: the flow problem I'm solving (on a DMPlex with finite volume
>> method) has complex source terms that depend on the solution (e.g.
>> pressure), and can also depend on other source terms. A simple example
>> is when fluid is extracted from one location, with a pressure-dependent
>> flow rate, and some of it is then reinjected in another location. This
>> can result in poor nonlinear solver convergence. I think the reason is
>> that there are effectively missing Jacobian entries in the row for the
>> reinjection cell, which should have an additional dependence on the
>> solution in the cell where fluid is extracted.
>>
>> - Adrian
>>
>> -- 
>> Dr Adrian Croucher
>> Senior Research Fellow
>> Department of Engineering Science
>> Waipapa Taumata Rau / University of Auckland, New Zealand
>> email:a.croucher at auckland.ac.nz
>> tel: +64 (0)9 923 4611
>>
>>
>
-- 
Dr Adrian Croucher
Senior Research Fellow
Department of Engineering Science
Waipapa Taumata Rau / University of Auckland, New Zealand
email:a.croucher at auckland.ac.nz
tel: +64 (0)9 923 4611
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20240527/bf3b47b5/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 3x3grid.exo
Type: application/octet-stream
Size: 3296 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20240527/bf3b47b5/attachment-0001.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: matmodify.F90
Type: text/x-fortran
Size: 4025 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20240527/bf3b47b5/attachment-0001.bin>


More information about the petsc-users mailing list