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

Reply via email to