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>
