[petsc-users] Segmentation Violation in getting DMPlex coordinates

Danyang Su danyang.su at gmail.com
Sat Apr 28 01:08:14 CDT 2018


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)
       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




More information about the petsc-users mailing list