#include <petscdm.h>
#include <petscdmplex.h>


int main(int argc, char *argv[])
{
  DM               dm, pdm = NULL;
  PetscPartitioner part;
  PetscInt         faces[3], refine = 0;
  PetscErrorCode   ierr;

  ierr = PetscInitialize(&argc, &argv, NULL, NULL);CHKERRQ(ierr);
  /* get the refinement level and create the mesh */
  ierr = PetscOptionsGetInt(NULL, NULL, "-refine", &refine, NULL);CHKERRQ(ierr);
  faces[0] = faces[1] = faces[2] = refine;
  ierr = DMPlexCreateBoxMesh(PETSC_COMM_WORLD, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, &dm);CHKERRQ(ierr);
  ierr = DMView(dm, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
  ierr = DMPlexGetPartitioner(dm, &part);CHKERRQ(ierr);
  ierr = PetscPartitionerSetFromOptions(part);CHKERRQ(ierr);
  ierr = DMPlexDistribute(dm, 0, NULL, &pdm);CHKERRQ(ierr);
  if (pdm) {
    ierr = DMDestroy(&dm);CHKERRQ(ierr);
    dm   = pdm;
  }
  ierr = DMView(dm, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
  ierr = DMDestroy(&dm);CHKERRQ(ierr);
  ierr = PetscFinalize();
  return ierr;
}

