Example #1
0
PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
  PetscInt       dim             = user->dim;
  PetscBool      interpolate     = user->interpolate;
  PetscReal      refinementLimit = user->refinementLimit;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  ierr = PetscLogEventBegin(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
  ierr = DMMeshCreateBoxMesh(comm, dim, interpolate, dm);CHKERRQ(ierr);
  {
    DM refinedMesh = PETSC_NULL;

    /* Refine mesh using a volume constraint */
    ierr = DMMeshRefine(*dm, refinementLimit, interpolate, &refinedMesh);CHKERRQ(ierr);
    if (refinedMesh) {
      ierr = DMDestroy(dm);CHKERRQ(ierr);
      *dm  = refinedMesh;
    }
  }
  ierr = PetscObjectSetName((PetscObject) *dm, "Serial Mesh");CHKERRQ(ierr);
  ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
  ierr = PetscLogEventEnd(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
  user->dm = *dm;
  PetscFunctionReturn(0);
}
Example #2
0
PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
{
    PetscInt       dim             = user->dim;
    PetscBool      interpolate     = user->interpolate;
    PetscReal      refinementLimit = user->refinementLimit;
    PetscErrorCode ierr;

    PetscFunctionBegin;
    ierr = PetscLogEventBegin(user->createMeshEvent,0,0,0,0);
    CHKERRQ(ierr);
    ierr = DMMeshCreateBoxMesh(comm, dim, interpolate, dm);
    CHKERRQ(ierr);
    {
        DM         refinedMesh     = NULL;
        DM         distributedMesh = NULL;
        const char *partitioner    = user->partitioner;

        /* Refine mesh using a volume constraint */
        ierr = DMMeshRefine(*dm, refinementLimit, interpolate, &refinedMesh);
        CHKERRQ(ierr);
        if (refinedMesh) {
            ierr = DMDestroy(dm);
            CHKERRQ(ierr);
            *dm  = refinedMesh;
        }
        /* Distribute mesh over processes */
        ierr = DMMeshDistribute(*dm, partitioner, &distributedMesh);
        CHKERRQ(ierr);
        if (distributedMesh) {
            ierr = DMDestroy(dm);
            CHKERRQ(ierr);
            *dm  = distributedMesh;
        }
    }
    ierr     = DMSetFromOptions(*dm);
    CHKERRQ(ierr);
    ierr     = PetscLogEventEnd(user->createMeshEvent,0,0,0,0);
    CHKERRQ(ierr);
    user->dm = *dm;
    PetscFunctionReturn(0);
}