[petsc-users] Segmentation Violation in getting DMPlex coordinates

Smith, Barry F. bsmith at mcs.anl.gov
Sat Apr 28 15:38:42 CDT 2018


  Added runtime error checking for such incorrect calls in barry/dmda-calls-type-check


> On Apr 28, 2018, at 9:19 AM, Matthew Knepley <knepley at gmail.com> wrote:
> 
> 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/



More information about the petsc-users mailing list