[petsc-users] Including constrained dofs in a matrix/vector created with DMCreateXXXX()
Jordan Wagner
j.wagner at rice.edu
Tue Feb 19 00:11:08 CST 2019
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.
Thanks a lot, as always.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20190219/482763a4/attachment.html>
More information about the petsc-users
mailing list