Hi Huan,

I also sometimes separate the matrix and right hand side assembly.
However, care must be taken because the method
distribute_local_to_global uses both the right hand side matrix and
the system matrix. Basically, the algorithm scales the Dirichlet
boundary condition relative to the size of the terms in the matrix. In
generally it will not work to apply the method to matrix and right
hand side separately (hence the method which takes both) or even to
apply the method again on a matrix that has had some of the terms
assembled already.

One option in the library is to use the FilteredMatrix class. (Which
should work as long as you don't need to add terms to the matrix.)
Another is to keep a copy of the matrix without the boundary
conditions applied which you keep initializing from, completing with
any extra terms and then use to apply the boundary conditions to.

Regards,
Michael

On Mon, May 17, 2010 at 8:18 PM, Huan Sun <[email protected]> wrote:
> Hi Markus,
>
> Yes, it works to use the original local stiffness matrix. But I want to
> later separate the assemblage of the matrix and the right-hand side,
> similar to what tutorial 32 does. So I was testing this easier case.
> Somehow it doesn't work with this auxiliary matrix. I am just wondering
> if there is anything wrong or missing in the code.
>
> Thanks,
>
> Huan
>
>
> On Mon, 2010-05-17 at 08:29 +0200, Markus Bürg wrote:
>> Hello Huan Sun,
>>
>> why do you create another matrix for the boundary conditions? You have
>> already created the problem's matrix for this cell right above. Thus
>> you can hand over just this matrix:
>> constraints.distribute_local_to_global (local_rhs, local_dof_indices,
>> rhs, local_matrix);
>>
>> Best Regards,
>> Markus
>>
>>
>>
>> Am 17.05.10 08:12, schrieb Huan Sun:
>> > Hi all,
>> >
>> > I was following tutorial 22 and 34 to implement inhomogeneous Dirichlet
>> > boundary conditions using the ConsraintMatrix class but couldn't get it
>> > right. I think the problem mainly lies in the assemblage part (i was
>> > solving the basic Poisson's eq.)
>> >
>> >     if(constraints.is_inhomogeneously_constrained
>> >        (local_dof_indices[i])){
>> >       for(unsigned int j=0; j <dofs_per_cell; ++j){
>> >         matrix_for_bc(j,i) +=
>> >           grad_basis_phi[i] * grad_basis_phi[j] *
>> >           fe_values.JxW(q);
>> >       }//j-loop
>> >     }//if
>> >     ...
>> >     constraints.distribute_local_to_global(local_rhs,
>> >                                        local_dof_indices,
>> >                                        rhs,
>> >                                        matrix_for_bc);
>> >
>> > However, when I comment out the if statement, the program seems to work
>> > correctly. The code is attached in this email.
>> > Your help will be greatly appreciated.
>> >
>> > Thanks!
>> >
>> > Huan
>> >
>> >
>> > _______________________________________________
>> > dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii
>> >
>> _______________________________________________
>> dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii
>
>
> _______________________________________________
> dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii
>
_______________________________________________
dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii

Reply via email to