[petsc-users] Zero entries of a sparse matrix in a block-wise style

Mingchang Ding dmcvamos at udel.edu
Fri Jul 26 16:43:16 CDT 2019



> On Jul 26, 2019, at 3:32 PM, Mingchang Ding <dmcvamos at udel.edu> wrote:
> 
> 
>> On Jul 26, 2019, at 3:21 PM, Jed Brown <jed at jedbrown.org> wrote:
>> 
>> Please always use "reply-all" so that your messages go to the list.
>> This is standard mailing list etiquette.  It is important to preserve
>> threading for people who find this discussion later and so that we do
>> not waste our time re-answering the same questions that have already
>> been answered in private side-conversations.  You'll likely get an
>> answer faster that way too.
> 
>  Sorry for this.
> 
>> Mingchang Ding <dmcvamos at udel.edu> writes:
>> 
>>> Thank you for your quick reply. The code I have now is attached. The sparse matrix obtained from LDG discretization to u_xx is assembled in SetupMat routine of setup.h. When I choose my polynomial degree nk =1 (DOF = 2), only the first and last row of the output sparse matrix is as what I want. Again, I want to impose essential (Dirichlet) boundary condition to the problem.
>>> 
>>> Let me know if any explanation of the question is needed.
>> It appears that you are calling MatZeroRows with rows = {0, info.mx-1},
>> which will only affect the first and last rows.  The other entries are
>> how you have assembled them (with the matrix-matrix product).
> 
> Yes. I think so. Is there anyway I can fill in the rows array with all the first and last DOF rows index efficiently instead of only filling in one row index at one time?

  I think I misunderstood just now and know how to fix the problem. 

  Thank you!

>>     PetscInt        nrows = 0;
>>     PetscInt        *rows;
>> 
>>     ierr = DMDAGetLocalInfo(da, &info);CHKERRQ(ierr);
>> 
>>     PetscMalloc1(info.mx, &rows);
>> 
>>     for (j=info.xs; j<info.xs+info.xm; j++) {
>> 
>>         if (j == 0) {
>>             rows[nrows++] = j;
>> 
>> [...]
>> 
>>         }
>>         else if (j == info.mx - 1) {
>>             rows[nrows++] = j;
>> 
>> [...]
>> 
>> 
>>         }
>>         else {
>> 
>> [...]
>> 
>> 
>>         }
>> 
>>         /* Mass_inv */
>>         ierr = MatSetValuesBlocked(appctx->Mass_inv, 1, &j, 1, &j, &inv[0][0], INSERT_VALUES);CHKERRQ(ierr);
>> 
>>     }
>> 
>> 
>> [...]
>> 
>> 
>>     MatZeroRows(appctx->J_dif, nrows, rows, 1.0, NULL, NULL);
> 



More information about the petsc-users mailing list