On 3/16/19 7:16 AM, jane....@jandj-ltd.com wrote:
> So that's what I meant by having extra contributions. I thought you needed a 
> local_rhs = 0 after/within:
>           for (unsigned int face_n = 0;
>                face_n < GeometryInfo<dim>::faces_per_cell;
>                ++face_n)
>             if (cell->at_boundary(face_n))
>               {
>                 fe_face_values.reinit(cell, face_n);
> 
> In the same way that if you enforce them strongly, it basically ignores the 
> contributions to the cell vertices that are on the boundary. Because this is 
> a 
> Dirichlet condition, should we not reset the local_rhs contribution that have 
> accumulated just prior to the boundary condition? putting local_rhs = 0 again 
> within the boundary contribution terms seems to actually do the job.

You need to distinguish between Dirichlet/Neumann boundary conditions, and 
strong/weak boundary conditions. Weak boundary conditions are the ones that go 
into the weak formulation; for the typical Laplace equation, Neumann boundary 
conditions are weak and Dirichlet boundary conditions are strong. But for the 
mixed form you are using in step-20, it is the other way around.

As for whether you should reset local_rhs=0: Think about this from a data flow 
perspective. In the block you quote above, you are computing something for 
each face. You are *writing* it into local_rhs. But what are you *doing* with 
what you have computed? If you set local_rhs=0 between each face you visit, 
then you are simply throwing away what you have computed on previous faces, 
before you use it for something (namely, putting it into the global matrix).

So what the code is doing is to first accumulate the contributions of all 
(boundary) faces of a cell before it puts it into the global matrix. Then it 
moves to the next cell, sets local_rhs=0, accumulates contributions of all 
(boundary) faces of that cell, puts it into the global matrix, and so on.

If you reset local_rhs=0 between each two faces, then you are computing the 
contribution of each (boundary) face alright, but because you overwrite it 
with zeros when you move to the next face, the only thing that ends up in the 
global matrix are only the contributions of the last (boundary) face you visit 
on each cell.

If this makes a difference, you may ask why that is the case and when it 
actually matters. Specifically, if you put local_rhs=0 right before or after 
the call to fe_face_values.reinit(...) above, then you will be zeroing out any 
computation you may have done on the previous boundary faces of the current 
cell -- but this is only going to make a difference on cells that actually 
have two or more boundary faces, i.e., the ones in the corners of your domain. 
I don't know why that would matter in your case, but it's an observation that 
may help you think about what could be wrong in your program.


> For Stokes - normal component of the normal stress:
> Ok, that's interesting. I seems to be getting a non-zero contribution when I 
> do:
> 
> local_rhs(i) = topstress_values[q] * fe_face_values.normal_vector(q)*
>                              fe_face_values[velocities].value(i,q_point)*
>                             fe_face_values_rock.JxW(q);
> 
> where topstress_values is the value of the normal component of the normal 
> stress.

Yes, this may be nonzero, but when you call 
constraints.distribute_local_to_global(), it zeros out rows and columns that 
correspond to degrees of freedom with strong boundary conditions. So, for 
example, if topstress_values*normal_vector has a nonzero normal component, 
then you will get something nonzero here, but you have prescribed strong 
boundary conditions of the form u.n=0, then the nonzeroness here will be 
zeroed out by the constraints.

Best
  W.


-- 
------------------------------------------------------------------------
Wolfgang Bangerth          email:                 bange...@colostate.edu
                            www: http://www.math.colostate.edu/~bangerth/

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to dealii+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to