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
