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