On 18-02-15 05:57 PM, Matthew Knepley wrote:
On Thu, Feb 15, 2018 at 7:40 PM, Danyang Su <danyang...@gmail.com
<mailto:danyang...@gmail.com>> wrote:
Hi Matt,
I have a question on DMPlexCreateFromCellList and
DMPlexCreateFromFile. When use DMPlexCreateFromFile with Gmsh file
input, it works fine and each processor gets its own part.
However, when use DMPlexCreateFromCellList, all the processors
have the same global mesh. To my understand, I should put the
global mesh as input, right?
No. Each process should get part of the mesh in CreateFromCellList(),
but the most common thing to do is to
feed the whole mesh in on proc 0, and nothing in on the other procs.
Thanks for the explanation. It works now.
Danyang
Thanks,
Matt
Otherwise, I should use DMPlexCreateFromCellListParallel instead
if the input is local mesh.
Below is the test code I use, results from method 1 is wrong and
that from method 2 is correct. Would you please help to check if I
did anything wrong with DMPlexCreateFromCellList input?
!test with 4 processor, global num_cells = 8268, global num_nodes
= 4250
!correct results
check rank 2 istart 2034 iend 3116
check rank 3 istart 2148 iend 3293
check rank 1 istart 2044 iend 3133
check rank 0 istart 2042 iend 3131
!wrong results
check rank 0 istart 8268 iend 12518
check rank 1 istart 8268 iend 12518
check rank 2 istart 8268 iend 12518
check rank 3 istart 8268 iend 12518
!c ************* test part *********************
!c method 1: create DMPlex from cell list, same duplicated
global meshes over all processors
!c the input parameters num_cells, num_nodes, dmplex_cells,
dmplex_verts are all global parameters (global mesh data)
call DMPlexCreateFromCellList(Petsc_Comm_World,ndim,num_cells, &
num_nodes,num_nodes_per_cell, &
Petsc_True,dmplex_cells,ndim, &
dmplex_verts,dmda_flow%da,ierr)
CHKERRQ(ierr)
!c method 2: create DMPlex from Gmsh file, for test purpose,
this works fine, each processor gets its own part
call DMPlexCreateFromFile(Petsc_Comm_World, &
prefix(:l_prfx)//'.msh',0, &
dmda_flow%da,ierr)
CHKERRQ(ierr)
!c *************end of test part*********************
distributedMesh = PETSC_NULL_OBJECT
!c distribute mesh over processes
call DMPlexDistribute(dmda_flow%da,0,PETSC_NULL_OBJECT, &
distributedMesh,ierr)
CHKERRQ(ierr)
!c destroy original global mesh after distribution
if (distributedMesh /= PETSC_NULL_OBJECT) then
call DMDestroy(dmda_flow%da,ierr)
CHKERRQ(ierr)
!c set the global mesh as distributed mesh
dmda_flow%da = distributedMesh
end if
!c get coordinates
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)
#ifdef DEBUG
if(info_debug > 0) then
write(*,*) "check rank ",rank," istart ",istart," iend
",iend
end if
#endif
Thanks and regards,
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/%7Emk51/>