Thanks for reporting this. It is a bug. I have a fixed branch 
barry/2024-05-27/fix-bug-baij-setvaluesblocked/release  and associated merge 
request 
https://urldefense.us/v3/__https://gitlab.com/petsc/petsc/-/merge_requests/7578__;!!G_uCfscf7eWS!fqfhE-8CI9FL_VmWzwZRznl4gJgsMBvTJLtOwy_-xlB0_E7eNIPBulP0wrAkJxy-H-kmGyRmM9q4YX3bADC2MNo$
 

  Barry


> On May 26, 2024, at 10:45 PM, Adrian Croucher <[email protected]> 
> wrote:
> 
> 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 <[email protected]> 
>>> <mailto:[email protected]> 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: [email protected] <mailto:[email protected]>
>>> 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: [email protected] <mailto:[email protected]>
> tel: +64 (0)9 923 4611
> <3x3grid.exo><matmodify.F90>

Reply via email to