[petsc-users] Creating multi-field section using DMPlex
Shashwat Tiwari
shaswat121994 at gmail.com
Fri May 22 11:56:11 CDT 2020
Hi,
I am working on a Finite Volume scheme for a hyperbolic system of equations
equations with 6 variables on unstructured grids. I am trying to create a
section with 6 fields for this purpose, and have written a small test code
for creating the section by editing the example given at
src/dm/impls/plex/tutorials/ex1.c as follows:
int main(int argc, char **argv)
{
DM dm, dmDist = NULL;
Vec U;
PetscSection section;
PetscViewer viewer;
PetscInt dim = 2, numFields, numBC, i;
PetscInt numComp[6];
PetscInt numDof[18];
PetscBool interpolate = PETSC_TRUE, useCone = PETSC_TRUE, useClosure
= PETSC_TRUE;
PetscReal lower[3], upper[3]; // lower left and upper right
coordinates of domain
PetscInt cells[2];
PetscErrorCode ierr;
// define domain properties
cells[0] = 4; cells[1] = 4;
lower[0] = -1; lower[1] = -1; lower[2] = 0;
upper[0] = 1; upper[1] = 1; upper[2] = 0;
ierr = PetscInitialize(&argc, &argv, NULL, help); CHKERRQ(ierr);
// create the mesh
ierr = PetscPrintf(PETSC_COMM_WORLD, "Generating mesh ... ");
CHKERRQ(ierr);
ierr = DMPlexCreateBoxMesh(PETSC_COMM_WORLD, dim, PETSC_TRUE,
cells, lower, upper, NULL, interpolate, &dm);
CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD, "Done\n"); CHKERRQ(ierr);
// set cell adjacency
ierr = DMSetBasicAdjacency(dm, useCone, useClosure); CHKERRQ(ierr);
// Distribute mesh over processes
ierr = DMPlexDistribute(dm, 1, NULL, &dmDist);CHKERRQ(ierr);
if (dmDist) {ierr = DMDestroy(&dm);CHKERRQ(ierr); dm = dmDist;}
// Create scalar fields
numFields = 6;
numComp[0] = 1;
numComp[1] = 1;
numComp[2] = 1;
numComp[3] = 1;
numComp[4] = 1;
numComp[5] = 1;
for (i = 0; i < numFields*(dim+1); ++i) numDof[i] = 0;
numDof[0*(dim+1)+dim] = 1;
numDof[1*(dim+1)+dim] = 1;
numDof[2*(dim+1)+dim] = 1;
numDof[3*(dim+1)+dim] = 1;
numDof[4*(dim+1)+dim] = 1;
numDof[5*(dim+1)+dim] = 1;
numBC = 0;
// Create a PetscSection with this data layout
ierr = DMSetNumFields(dm, numFields);CHKERRQ(ierr);
ierr = DMPlexCreateSection(dm, NULL, numComp, numDof, numBC, NULL, NULL,
NULL, NULL, §ion);CHKERRQ(ierr);
// Name the Field variables
ierr = PetscSectionSetFieldName(section, 0, "h");CHKERRQ(ierr);
ierr = PetscSectionSetFieldName(section, 1, "m1");CHKERRQ(ierr);
ierr = PetscSectionSetFieldName(section, 2, "m2");CHKERRQ(ierr);
ierr = PetscSectionSetFieldName(section, 3, "E11");CHKERRQ(ierr);
ierr = PetscSectionSetFieldName(section, 4, "E12");CHKERRQ(ierr);
ierr = PetscSectionSetFieldName(section, 5, "E22");CHKERRQ(ierr);
// set adjacency for each field
ierr = DMSetAdjacency(dm, 0, useCone, useClosure); CHKERRQ(ierr);
ierr = DMSetAdjacency(dm, 1, useCone, useClosure); CHKERRQ(ierr);
ierr = DMSetAdjacency(dm, 2, useCone, useClosure); CHKERRQ(ierr);
ierr = DMSetAdjacency(dm, 3, useCone, useClosure); CHKERRQ(ierr);
ierr = DMSetAdjacency(dm, 4, useCone, useClosure); CHKERRQ(ierr);
ierr = DMSetAdjacency(dm, 5, useCone, useClosure); CHKERRQ(ierr);
ierr = PetscSectionView(section, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
// Tell the DM to use this data layout
ierr = DMSetLocalSection(dm, section);CHKERRQ(ierr);
ierr = DMView(dm, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
// Create a Vec with this layout and view it
ierr = DMGetGlobalVector(dm, &U);CHKERRQ(ierr);
ierr = PetscObjectSetName((PetscObject) U, "U"); CHKERRQ(ierr);
ierr = PetscViewerCreate(PETSC_COMM_WORLD, &viewer);CHKERRQ(ierr);
ierr = PetscViewerSetType(viewer, PETSCVIEWERVTK);CHKERRQ(ierr);
ierr = PetscViewerPushFormat(viewer,
PETSC_VIEWER_ASCII_VTK);CHKERRQ(ierr);
ierr = PetscViewerFileSetName(viewer, "sol.vtk");CHKERRQ(ierr);
//ierr = PetscViewerPushFormat(viewer,
PETSC_VIEWER_VTK_VTU);CHKERRQ(ierr);
//ierr = PetscViewerFileSetName(viewer, "sol.vtu");CHKERRQ(ierr);
ierr = VecView(U, viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
ierr = DMRestoreGlobalVector(dm, &U);CHKERRQ(ierr);
// Cleanup
ierr = PetscSectionDestroy(§ion);CHKERRQ(ierr);
ierr = DMDestroy(&dm);CHKERRQ(ierr);
ierr = PetscFinalize();
return ierr;
}
When exporting the vector data to "vtk" format, the code works fine and I
am able to see the 6 field names in the visualizer. But when I change it to
"vtu", I get the following error:
[0]PETSC ERROR: --------------------- Error Message
--------------------------------------------------------------
[0]PETSC ERROR: Petsc has generated inconsistent data
[0]PETSC ERROR: Total number of field components 1 != block size 6
[0]PETSC ERROR: See https://www.mcs.anl.gov/petsc/documentation/faq.html
for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.13.0, unknown
[0]PETSC ERROR: ./ex1 on a arch-linux2-c-debug named shashwat by shashwat
Fri May 22 22:11:13 2020
[0]PETSC ERROR: Configure options --with-cc=gcc --with-cxx=g++
--with-fc=gfortran --download-mpich --download-fblaslapack
--with-debugging=1 --download-triangle --download-metis --download-parmetis
--download-cmake
[0]PETSC ERROR: #1 DMPlexVTKWriteAll_VTU() line 334 in
/home/shashwat/local/petsc/src/dm/impls/plex/plexvtu.c
[0]PETSC ERROR: #2 DMPlexVTKWriteAll() line 688 in
/home/shashwat/local/petsc/src/dm/impls/plex/plexvtk.c
[0]PETSC ERROR: #3 PetscViewerFlush_VTK() line 100 in
/home/shashwat/local/petsc/src/sys/classes/viewer/impls/vtk/vtkv.c
[0]PETSC ERROR: #4 PetscViewerFlush() line 26 in
/home/shashwat/local/petsc/src/sys/classes/viewer/interface/flush.c
[0]PETSC ERROR: #5 PetscViewerDestroy() line 113 in
/home/shashwat/local/petsc/src/sys/classes/viewer/interface/view.c
[0]PETSC ERROR: #6 main() line 485 in ex1.c
[0]PETSC ERROR: No PETSc Option Table entries
[0]PETSC ERROR: ----------------End of Error Message -------send entire
error message to petsc-maint at mcs.anl.gov----------
application called MPI_Abort(MPI_COMM_SELF, 485077) - process 0
I would like to use the "vtu" format for visualiztion. Kindly have a look
and let me know I might be doing wrong here, and how can I make it work.
Regards,
Shashwat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20200522/7d3b741b/attachment.html>
More information about the petsc-users
mailing list