Dear all, Here is a minimal working example that I'm testing: #include "petscsys.h" #include "petscdmda.h" int main(int argc, char **argv) { PetscInitialize(&argc, &argv, 0, 0); PetscInt rank; MPI_Comm_rank(PETSC_COMM_WORLD, &rank); DM da; DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, -9, 1, 0, NULL, &da); PetscInt n_local_cells, n_cell_nodes; const PetscInt *local_indices; DMDAGetElements(da, &n_local_cells, &n_cell_nodes, &local_indices); PetscSynchronizedPrintf(PETSC_COMM_WORLD, "rank %d n_local_cells %d n_cell_nodes %d\n", rank, n_local_cells, n_cell_nodes); PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT); DMDARestoreElements(da, &n_local_cells, &n_cell_nodes, &local_indices); PetscFinalize(); return 0; } I believe it creates a 1D DM object, and outputs the number of local cells assigned to each process. Here is what I have as an output: $ mpirun -np 1 ./test rank 0 n_local_cells 8 n_cell_nodes 2 // OK $ mpirun -np 2 ./test rank 0 n_local_cells 4 n_cell_nodes 2 // OK rank 1 n_local_cells 3 n_cell_nodes 2 // I expected 4 local cells here $ mpirun -np 4 ./test rank 0 n_local_cells 2 n_cell_nodes 2 // OK rank 1 n_local_cells 1 n_cell_nodes 2 // I expected 2 local cells here rank 2 n_local_cells 1 n_cell_nodes 2 // I expected 2 local cells here rank 3 n_local_cells 1 n_cell_nodes 2 // I expected 2 local cells here What am I missing? Thank you. Best, Mikhail