Hi, all:
Thanks for your kind reply. Matt's course notes looks very nice.
Thanks,
leejearl
On 2017年05月12日 17:10, Matthew Knepley wrote:
On Fri, May 12, 2017 at 3:48 AM, Lawrence Mitchell
<[email protected]
<mailto:[email protected]>> wrote:
> On 12 May 2017, at 04:57, 李季 <[email protected]
<mailto:[email protected]>> wrote:
>
> Hi developers:
> I have such a question that I want to get the vertices of a
cell. I know I can get the points by
> 1. Getting the faces of a cell such as "DMPlexGetCone(dm, c,
&faces";
> 2. Getting the vertices of every face of the cell such as
"DMPlexGetCone(dm, f, &vertices)".
>
> Then I can obtain the vertices belongs to a cell. Is there
any concise routine which I can choose to get the
> vertices of a cell directly?
You should use the interface for the transitive closure.
Find bounds of points that are vertices:
DMPlexGetDepthStratum(dm, &vStart, &vEnd);
...
DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &nclosure, &closure);
for (PetscInt i = 0; i < nclosure; i++) {
const PetscInt p = closure[2*i];
if (p >= vStart && p < vEnd) {
p is a vertex
}
}
This works regardless of the topological dimension of the "cell"
point you are using (the same code is good to find the vertices in
the closure of a facet, say).
Matt's course notes (http://www.caam.rice.edu/~caam519/CSBook.pdf
<http://www.caam.rice.edu/%7Ecaam519/CSBook.pdf>) have nice
pictures that help understand this language in section 7.1.
Also note that this is fine for getting vertices if you want to do
topological things. However, if what you really want is
some function over the vertices (like coordinates), you should use
http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/DM/DMPlexVecGetClosure.html
Thanks,
Matt
Cheers,
Lawrence
--
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