[petsc-users] Including constrained dofs in a matrix/vector created with DMCreateXXXX()

Jordan Wagner j.wagner at rice.edu
Wed Feb 20 14:38:32 CST 2019


On 2/19/19 7:40 AM, Matthew Knepley wrote:
> On Tue, Feb 19, 2019 at 1:13 AM Jordan Wagner via petsc-users 
> <petsc-users at mcs.anl.gov <mailto:petsc-users at mcs.anl.gov>> wrote:
>
>     Hi,
>
>     Over the past few months, I have implemented dmplex/section in my
>     preexisting finite element code. We already had our own
>     implementations for things like the finite element space, boundary
>     conditions, projections, etc, so I am mostly using dmplex/section
>     at its lowest level; no DT/DS stuff for the moment. Everything is
>     working fine at this level, and I am overall very happy with how
>     it ties into the code that we already have.
>
>     I am currently doing my own preallocation for the system Jacobian
>     but am wanting to use DMCreateMatrix() instead, as it seems
>     pointless to keep using my own crappy function when this one is
>     just sitting there waiting. However, I dislike how I am currently
>     implementing this and was hoping to get some suggestions or some
>     advice. My problem is handling nicely the Dirichlet dofs. My code
>     takes the approach of first assembling the entire Jacobian matrix
>     and load vector as if no constraints are imposed. We then have a
>     function that applies the essential conditions after assembly and
>     extracts a submatrix and subvector similar to the way ex49
>     <https://www.mcs.anl.gov/petsc/petsc-current/src/ksp/ksp/examples/tutorials/ex49.c.html>
>     is doing.
>
>     Since DMCreateMatrix() automatically partitions out the
>     constraints specified in the section, I find myself having to
>     create two nearly identical sections: one that has constraints and
>     one that does not, and then I clone the DM and set the default
>     section of each respectively. I can then use DMCreateMatrix() on
>     the one dm/section with no constraints to preallocate the larger
>     matrix that I am assembling. Then I use the dm/section with
>     constraints to do all of my boundary condition and projection
>     operations on the previously created matrix and vector.
>     Essentially, I am using an unconstrained section only for
>     allocation and a constrained section for most everything else.
>
>     This process actually works fine for me, but its pretty ugly, and
>     I am sure there is a better way. I am wondering if I am missing
>     something that could keep me from having to go through this
>     process of creating two sections that differ only in the
>     constraints. It seems to me if there were an option for
>     DMCreateMatrix()/DMCreateVector() to either include or not include
>     the dofs, that would completely solve my problem. That way, I can
>     use the same section for both creation and allocation.
>
>     So, the main question I have is just whether there is a function
>     or option that I am missing like DMCreateXXXX() but with the
>     ability to retain the constrained rows and columns rather than
>     compressing them out.
>
> I do not completely understand the above, but here is how Section 
> works. A _local_ Section contains all dofs and is intended for 
> assembly using local Vecs. To communicate with the solver, you make a 
> _global_ Section using PetscSectionCreateGlobalSection(). This has an 
> option to include or exclude constraints. For example, I make a global 
> Section with constraints when I output for visualization. Maybe you 
> can use that to do what you want.
>
Thanks for the prompt reply and sorry for the unclear initial question. 
I think this helps in my understanding of how this tool was intended to 
be used.

> What I do not understand is why you do not just use a global Section 
> without constraints to assemble your matrix, rather than eliminating 
> the rows/columns later. The global Section gives back negative indices 
> for unknown that are constrained or not owned. These are ignored by 
> MatSetValues() and VecSetValues(). This is how the default Plex 
> assembly makes operators without constrained variables.
>
I have rarely used a global section directly because I have never been 
able to  make sense of exactly what it was giving me. For instance as 
you mentioned (and I have seen written elsewhere), the global section 
should give negative indices for unowned or constrained dofs. This seems 
to work fine for me with the unowned points---I clearly get a negative 
size and offset from the section on these points. But my problem is for 
points that have constraints. I don't see where I would get negative 
indices from. The sizes and offsets for these points are not negative.  
Of course, from the constraint size and constraint indices on these 
points, I can manually find out which should be negative and go from 
there. However, that leads me to the next problem I am having with 
global section...

For some reason, when I am creating the global section from the local 
one, my constrained component indices are getting messed up. The sizes 
are right but the order seems to be random and/or nonsensical. For 
instance, here is a snippet from my code being run in serial

Local section:

   (17615) dim  2 offset 794 constrained 0
   (17616) dim  2 offset 796 constrained 0 1
   (17617) dim  2 offset 798 constrained 0 1
   (17618) dim  2 offset 800 constrained 0 1
   (17619) dim  2 offset 802 constrained 0 1
   (17620) dim  2 offset 804 constrained 0 1
   (17621) dim  2 offset 806 constrained 0 1

Global section:

   (17615) dim  2 offset  80 constrained 1
   (17616) dim  2 offset  81 constrained 0 0
   (17617) dim  2 offset  81 constrained 0 0
   (17618) dim  2 offset  81 constrained 0 0
   (17619) dim  2 offset  81 constrained 0 0
   (17620) dim  2 offset  81 constrained 0 0
   (17621) dim  2 offset  81 constrained 0 1

So using the global section, I am unable to even manually tell which 
components are constrained. Is this normal for the global section or is 
it something going wrong in its creation? or am I completely 
misunderstanding something?

Thanks very much.


>   Thanks,
>
>      Matt
>
>     Thanks a lot, as always.
>
>
>
> -- 
> What most experimenters take for granted before they begin their 
> experiments is infinitely more interesting than any results to which 
> their experiments lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/ 
> <http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20190220/b238b4d7/attachment.html>


More information about the petsc-users mailing list