[petsc-dev] DMSetUseNatural() and DMPlexConstructGhostCells()

Adrian Croucher a.croucher at auckland.ac.nz
Sun Jul 19 23:46:16 CDT 2015


I am testing out the new DMSetUseNatural(), DMPlexNaturalToGlobalBegin() 
etc. functions- along the lines of 
src/dm/impls/plex/examples/tests/ex15.c, but kinda the other way around.

What I want to do is set initial conditions in vector on a distributed 
DM representing a finite volume mesh. If I just do this using 
VecSetValues() they all end up in the wrong places on the mesh- in the 
global order rather than the natural order, with results dependent on 
number of processors.

So I'm trying:

- calling DMSetUseNatural(dm, PETSC_TRUE) before distributing the DM
- creating a separate 'natural' vector, and using VecSetValues() to set 
its values from the program input
- using DMPlexNaturalToGlobalBegin() / DMPlexNaturalToGlobalEnd() to 
fill my 'global' vector from the natural one
- viewing the final global vector with a VTK viewer to make sure the 
values are ending up in the right physical locations on the mesh.

It is all working ok until I also put in a DMPlexConstructGhostCells() 
(just after distributing) to fill the 'ghost' label on the DM. If I do 
that, when it gets to the DMPlexNaturalToGlobalBegin() call, it errors 
out with the following:

[0]PETSC ERROR: --------------------- Error Message 
[0]PETSC ERROR: Object is in wrong state
[0]PETSC ERROR: DM global to natural SF was not created.
You must call DMPlexSetUseNaturalSF() before DMPlexDistribute().

[0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html 
for trouble shooting.
[0]PETSC ERROR: Petsc Development GIT revision: v3.6-512-g8d76ee9  GIT 
Date: 2015-07-19 12:15:50 -0400
[0]PETSC ERROR: supermodel on a linux-gnu-c-opt named des108 by acro018 
Mon Jul 20 16:32:22 2015
[0]PETSC ERROR: Configure options --download-netcdf --download-exodusii 
--with-hdf5-dir=/usr --download-triangle --download-ptscotch
--download-chaco --download-ctetgen
[0]PETSC ERROR: #1 DMPlexNaturalToGlobalBegin() line 203 in 

So it thinks I haven't called DMSetUseNatural(), but I have. (There is 
also a typo in the error message- it's saying I should call 
'DMPlexSetUseNaturalSF()', but I think it means DMSetUseNatural()).

It looks a bit like DMPlexConstructGhostCells() might be messing with 
the DM's sfNatural property? or does this not work the way I think it 

- Adrian

Dr Adrian Croucher
Senior Research Fellow
Department of Engineering Science
University of Auckland, New Zealand
email: a.croucher at auckland.ac.nz
tel: +64 (0)9 923 84611

More information about the petsc-dev mailing list