[petsc-users] Segmentation Violation in getting DMPlex coordinates
Matthew Knepley
knepley at gmail.com
Sat Apr 28 09:19:23 CDT 2018
On Sat, Apr 28, 2018 at 2:08 AM, Danyang Su <danyang.su at gmail.com> wrote:
> Hi All,
>
> I use DMPlex and need to get coordinates back after distribution. However,
> I always get segmentation violation in getting coords values in the
> following codes if using multiple processors. If only one processor is
> used, it works fine.
>
> For each processors, the off value starts from 0 which looks good. I also
> tried 0-based index, which gives the same error. Would any one help to
> check what is wrong here?
>
> idof 1 off 0
> idof 2 off 0
> idof 1 off 2
> idof 2 off 2
> idof 1 off 4
> idof 2 off 4
> idof 1 off 6
> idof 2 off 6
> idof 1 off 8
> idof 2 off 8
>
>
> DM :: distributedMesh, cda
> Vec :: gc
> PetscScalar, pointer :: coords(:)
> PetscSection :: cs
>
> ...
>
> call DMGetCoordinatesLocal(dmda_flow%da,gc,ierr)
> CHKERRQ(ierr)
>
> call DMGetCoordinateDM(dmda_flow%da,cda,ierr)
> CHKERRQ(ierr)
>
> call DMGetDefaultSection(cda,cs,ierr)
> CHKERRQ(ierr)
>
> call PetscSectionGetChart(cs,istart,iend,ierr)
> CHKERRQ(ierr)
>
> !c get coordinates array
> call DMDAVecGetArrayF90(cda,gc,coords,ierr)
>
You cannot call DMDA function if you have a DMPlex. You jsut call
VecGetArrayF90()
Matt
> CHKERRQ(ierr)
>
> do ipoint = istart, iend-1
>
> call PetscSectionGetDof(cs,ipoint,dof,ierr)
> CHKERRQ(ierr)
>
> call PetscSectionGetOffset(cs,ipoint,off,ierr)
> CHKERRQ(ierr)
>
> inode = ipoint-istart+1
>
> if (cell_coords == coords_xyz) then
> nodes(inode)%x = coords(off+1)
> nodes(inode)%y = coords(off+2)
> nodes(inode)%z = coords(off+3)
> else if (cell_coords == coords_xy) then
> nodes(inode)%x = coords(off+1)
> nodes(inode)%y = coords(off+2)
> nodes(inode)%z = 0.0d0
> else if (cell_coords == coords_yz) then
> nodes(inode)%x = 0.0d0
> nodes(inode)%y = coords(off+1)
> nodes(inode)%z = coords(off+2)
> else if (cell_coords ==coords_xz) then
> nodes(inode)%x = coords(off+1)
> nodes(inode)%y = 0.0d0
> nodes(inode)%z = coords(off+2)
> end if
> end do
>
> call DMDAVecRestoreArrayF90(cda,gc,coords,ierr)
> CHKERRQ(ierr)
>
> Thanks,
>
> Danyang
>
>
>
--
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
https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/~mk51/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180428/1262311e/attachment-0001.html>
More information about the petsc-users
mailing list