[petsc-dev] getting data out of a PetscFE simulation
Matthew Knepley
knepley at gmail.com
Mon Mar 31 09:32:49 CDT 2014
On Mon, Mar 31, 2014 at 9:27 AM, David Fuentes <fuentesdt at gmail.com> wrote:
> Hi,
>
> I'm trying to get DMPlex to solve and display with Dirichlet boundary
> conditions.
>
> My global and local solution vectors are of different sizes. The length
> difference is the number of nodes read from the nodeset read in the exodus
> file.
> I am able to project the initial solution/boundary data that I want with
> with VecSetValuesSection. The initial condition looks ok with the global
> solution
> in the viewer. However, I seem to be losing the dirichlet boundary data on
> the solve ? I'm trying to use the suggested global to local scattering on
> the output.
>
I have just worked all this out in 'next', and most of it is in 'master'
now. I will talk through the process
1) Suppose you view a global vector, either VTK or HDF5
2) PETSc maps this to a local vector, and calls the local version, which is
the same as viewing a local vector
3) PETSc will insert the correct boundary values (via
DMPlexInsertBoundaryValuesFEM) if you specify them
using the Section interface + DMAddBoundary(). Otherwise, you can view
a local vector with the correct boundary values.
4) A scatter is created to a global vector including the boundary values
5) This expanded global vector is passes to the normal HDF5/VTK routines
It is still a little rough, but it should not be much effort to get it
working the way you want.
Matt
> {
>
>
>
> Vec localX;
>
>
>
> PetscSection section;
>
>
>
> PetscInt vStart, vEnd, v ;
>
> DMGetLocalVector(dm, &localX);
> DMGetDefaultSection(dm, §ion);
>
> DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);
> for (v = vStart; v < vEnd; ++v) {
> PetscScalar bcData = 101.0;
> VecSetValuesSection(localX, section, v, &bcData ,
> INSERT_BC_VALUES);
> }
> DMRestoreLocalVector(dm, &localX);
> DMLocalToGlobalBegin(dm, localX, INSERT_VALUES, u);
> DMLocalToGlobalEnd(dm, localX, INSERT_VALUES, u);
>
> PetscViewer viewer;
> char vtkfilename[PETSC_MAX_PATH_LEN] =
> "initialcondition.vtk";
> ierr =
> PetscViewerVTKOpen(PETSC_COMM_WORLD,vtkfilename,FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
> ierr = VecView(u,viewer);CHKERRQ(ierr);
> ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr)
> }
>
> .
> .
> ierr = SNESSolve(snes, NULL, u);CHKERRQ(ierr);
> .
> .
>
> if (write_output) {
> PetscViewer viewer;
> const char *name;
> Vec lv;
> DMGetLocalVector(dm, &lv);
> ierr = PetscObjectGetName((PetscObject) u,&name);CHKERRQ(ierr);
> ierr = PetscObjectSetName((PetscObject) lv, name);CHKERRQ(ierr);
> ierr = DMGlobalToLocalBegin(dm, u, INSERT_VALUES, lv);CHKERRQ(ierr);
> ierr = DMGlobalToLocalEnd(dm, u, INSERT_VALUES, lv);CHKERRQ(ierr);
> char vtkfilename[PETSC_MAX_PATH_LEN] = "solution.vtk";
> ierr =
> PetscViewerVTKOpen(PETSC_COMM_WORLD,vtkfilename,FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
> ierr = VecView(lv,viewer);CHKERRQ(ierr);
> ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
> ierr = DMRestoreLocalVector(dm, &lv);CHKERRQ(ierr);
> }
>
>
>
> On Wed, Jan 29, 2014 at 2:04 PM, Geoffrey Irving <irving at naml.us> wrote:
>
>> On Wed, Jan 29, 2014 at 12:00 PM, Jed Brown <jed at jedbrown.org> wrote:
>> > Local vectors are supposed to be just that: local. VecViewing a local
>> vector and expecting it to be parallel is perverse. So we need a real
>> interface.
>> >
>> > Placing 1.0 on the diagonal (and don't assemble into those rows and
>> columns) is the common way to deal with Dirichlet boundary nodes. See ex48
>> for one example. I have written about this in a few places; I can find the
>> more complete description when I have a keyboard.
>>
>> I'll look forward to the improved interface. For better or worse, I'd
>> like to be able to view simulations in the near future, so it looks
>> like I have to go with Matt's perverse but working version now.
>>
>> Geoffrey
>>
>> > On January 29, 2014 12:53:26 PM MST, Geoffrey Irving <irving at naml.us>
>> wrote:
>> >>On Wed, Jan 29, 2014 at 11:36 AM, Jed Brown <jed at jedbrown.org> wrote:
>> >>> Matt's sample code doesn't set it either. We need to fix (and the
>> >>*only* acceptable fix if that VecView always does the right thing,
>> >>because we have to be able to call it in analysis settings that know
>> >>nothing about your discretization).
>> >>
>> >>Matt's sample code doesn't set it either, but for Matt's sample code I
>> >>know where to insert the one line call to DMPlexProjectFunctionLocal.
>> >>For your version I never have explicit access to the local vector, so
>> >>I can't insert the fix.
>> >>
>> >>> The problem is that some vectors reside in a homogeneous space (e.g.
>> >>increments and eigenvectors) while others reside in the inhomogeneous
>> >>space (solutions). We can add a flag or BC attribute on the vector to
>> >>this effect, but this (and slip conditions) was the issue that led me
>> >>to conclude that removing boundary nodes was mostly a false economy.
>> >>
>> >>To leave the boundary conditions in, we would need efficient support
>> >>for a very large, very sparse MatNullSpace. This is doable via
>> >>shells, but is it easy to do in a way that doesn't interfere with the
>> >>user's other null spaces?
>> >>
>> >>Geoffrey
>> >
>>
>
>
--
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20140331/4bfbc392/attachment.html>
More information about the petsc-dev
mailing list